TCGplayer API & Scraper
The TCGplayer API turns the United States' largest trading-card marketplace into clean JSON, in seven actions: search, product/detail, product/listings, product/sales, product/price_history, sets and games.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
It covers all 70 TCGplayer product lines, including Magic: The Gathering, Pokémon, Yu-Gi-Oh!, One Piece, Disney Lorcana, Flesh and Blood, Star Wars: Unlimited, Digimon and Pokémon Japan. A search returns up to 50 products per call with the TCGplayer product id, name, set, set code, collector number, rarity, market price, lowest listing price with and without shipping and the listed median, filterable by game, set, rarity, product type and market-price range. product/detail returns the card or sealed product with its text and attributes, the market price for each printing (Normal, Foil) and for each SKU - condition by printing by language - the live number of listings, sellers and copies, the 10 cheapest listings and the 5 latest sales. product/listings pages through every live listing with TCGplayer's own filters: condition, printing, language, listings with photos, and TCGplayer Direct. Every listing carries the price, the shipping for one copy, the seller's name, rating, sales count and Gold Star badge. product/price_history returns daily or weekly market price, quantity sold and low and high sale price per SKU for up to a year. A verification on 2026-09-16 read 11 products across six games twice, once through the API and once from the product page: listing count, the As low as price, the Near Mint price for each printing and 99 of 99 listings' price, shipping and free-shipping note matched. No TCGplayer account, no developer key, no browser - one ReefAPI key and the standard { ok, data, meta, error } envelope.
TCGplayer shows three different prices for one card, and none of them is simply the price
Market Price is what the card has been selling for, and it describes a Near Mint copy. The lowest listing is the cheapest copy for sale in any condition, with shipping on top. And TCGplayer's own Price + Shipping order counts shipping as free for sellers that ship free above an order total, even though one copy alone still pays shipping. This API returns each figure as its own field, plus the market price for every condition, so a Damaged copy never passes for the card's value.
| Product | market_price (NM) | lowest listing + shipping | Lightly Played SKU | Damaged SKU |
|---|---|---|---|---|
| Charizard (Base Set, Holofoil) | $882.02 | $183.58 + $1.50 | $535.43 | $183.58 |
| Lightning Bolt (Commander: Marvel, Foil) | $4.41 | $1.55 + $1.49 | - | - |
| Lightning Bolt (Commander: Marvel, Normal) | $1.04 | $0.42 ($0.75 with shipping) | - | - |
| Mega Charizard X ex Ultra Premium Collection | $232.40 | $220.00 ($234.00 with shipping) | - | - (sealed: Unopened) |
Figures from 2026-09-16 and they move daily. On the Mega Charizard X Ultra Premium Collection, the cheapest listings were photo listings of parts only - a deck box, a playmat - at $7.99 to $14.99, which is what the page's As low as showed; every listing carries its type, title and description so you can drop them. The product page's own Market Price box follows whichever copy is selected (on Base Set Charizard it showed the Damaged price, $183.58); the API returns the Near Mint figure and every condition separately.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/tcgplayer/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "charizard",
"game": "pokemon"
}
}{
"ok": true,
"meta": {
"api": "tcgplayer",
"endpoint": "search",
"mode": "live",
"latency_ms": 1650,
"record_count": 24,
"bytes": 109026,
"cache_hit": false,
"upstream_requests": 1,
"pagination": {
"page": 1,
"has_more": true,
"page_size": 24,
"total": 381
}
},
"data": {
"results": [
{
"product_id": 654213,
"name": "Mega Charizard X ex Ultra Premium Collection",
"url": "https://www.tcgplayer.com/product/654213",
"image": "https://tcgplayer-cdn.tcgplayer.com/product/654213_in_1000x1000.jpg",
"game": "Pokemon",
"game_url_name": "pokemon",
"game_id": 3,
"set": "Miscellaneous Cards & Products",
"set_id": 2374,
"set_code": "MCAP",
"number": null,
"rarity": null,
"foil_only": false,
"release_date": null,
"currency": "USD",
"market_price": 231.69,
"lowest_price": 220,
"lowest_price_with_shipping": 234,
"listed_median_price": 299.94,
"search_index_listings_count": 221
},
{
"product_id": 219059,
"name": "Charizard GX - 9/68 (#60 Charizard Stamped)",
"url": "https://www.tcgplayer.com/product/219059",
"image": "https://tcgplayer-cdn.tcgplayer.com/product/219059_in_1000x1000.jpg",
"game": "Pokemon",
"game_url_name": "pokemon",
"game_id": 3,
"set": "Battle Academy",
"set_id": 2686,
"set_code": "BTA",
"number": "009/068",
"rarity": "Promo",
"foil_only": true,
"release_date": "2020-07-31",
"currency": "USD",
"market_price": 14.6,
"lowest_price": 7,
"lowest_price_with_shipping": 9.15,
"listed_median_price": null,
"search_index_listings_count": 111
},
{
"product_id": 679554,
"name": "[redacted-name]",
"url": "https://www.tcgplayer.com/product/679554",
"image": "https://tcgplayer-cdn.tcgplayer.com/product/679554_in_1000x1000.jpg",
"game": "Pokemon",
"game_url_name": "pokemon",
"game_id": 3,
"set": "Miscellaneous Cards & Products",
"set_id": 2374,
"set_code": "MCAP",
"number": null,
"rarity": null,
"foil_only": false,
"release_date": null,
"currency": "USD",
"market_price": 215.92,
"lowest_price": 210,
"lowest_price_with_shipping": 234.79,
"listed_median_price": 242.39,
"search_index_listings_count": 8
}
],
"count": 24,
"total": 381,
"page": 1,
"per_page": 24,
"has_more": true,
"corrected_query": null,
"facets": {
"games": [
{
"name": "[redacted-name]",
"url_name": "pokemon-japan",
"count": 406
},
{
"name": "Pokemon",
"url_name": "pokemon",
"count": 381
},
{
"name": "[redacted-name]",
"url_name": "storage-albums",
"count": 28
}
],
"sets": [
{
"name": "SWSH: Crown Zenith",
"url_name": "swsh-crown-zenith",
"count": 7
},
{
"name": "[redacted-name]",
"url_name": "base-set",
"count": 2
},
{
"name": "Base Set 2",
"url_name": "base-set-2",
"count": 1
}
],
"product_types": [
{
"name": "Cards",
"url_name": "Cards",
"count": 254
},
{
"name": "[redacted-name]",
"url_name": "Sealed Products",
"count": 127
}
],
"rarities": [
{
"name": "Common",
"url_name": "Common",
"count": 1
},
{
"name": "[redacted-name]",
"url_name": "Double Rare",
"count": 10
},
{
"name": "[redacted-name]",
"url_name": "Special Illustration Rare",
"count": 4
}
]
},
"query": "charizard",
"filters_applied": {
"game": "pokemon"
},
"sort": "best_match",
"currency": "USD"
}
}What the TCGplayer API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | Search TCGplayer products by name and/or browse a game or set: product id, name, set, set code, collector number, rarity, TCGplayer market price, lowest listing price (with and without shipping), listed median price and image. Filter by game, set, rarity, product type and market-price range; sort by best match, best selling, name or market price; page through results. | Pricing teams call search to search TCGplayer products by name and/or browse a game or set. | query, game, set, rarity, product_type, ... |
| product/detail | One TCGplayer product by id or URL: name, set, number, rarity, images, card text and attributes, TCGplayer market price, lowest listing price with and without shipping, listed median, listing and seller counts; market price per printing (Normal / Foil) and per SKU (condition × printing × language); the 10 cheapest listings including shipping; the 5 latest sales. | Marketplace operators call product/detail to get one TCGplayer product by id or URL. | product_id, max_rotations |
| product/listings | Every live listing on one product, 50 per page: price, shipping, price with shipping, quantity, condition, printing, language, listing type (with the seller's photos, title and description when present), TCGplayer Direct flag and the seller's name, rating, sales, Gold Star and Certified Hobby Shop badges. Filter with TCGplayer's own filters: condition, printing, language, listing type, Direct only. | Catalog enrichment teams call product/listings to get every live listing on one product, 50 per page. | product_id, condition, printing, language, listing_type, ... |
| product/sales | The latest sales of one product as TCGplayer shows them without an account (the 5 most recent): date, price, shipping, quantity, condition, printing, language and listing type. Filter by condition and listing type. | Retail analysts call product/sales to get the latest sales of one product as TCGplayer shows them without an account (the 5 most recent). | product_id, condition, listing_type, max_rotations |
| product/price_history | TCGplayer's price history for one product, per SKU (condition × printing × language): market price, quantity sold, number of sales and the low/high sale price (with and without shipping) per bucket, for the last month, quarter, six months or year. | Pricing teams call product/price_history to get tCGplayer's price history for one product, per SKU (condition × printing × language). | product_id, range, condition, max_rotations |
| sets | Every set TCGplayer lists for a game, newest first: set id, name, url_name (the search `set` filter), set code, release date, supplemental and active flags. | Marketplace operators call sets to get every set TCGplayer lists for a game, newest first. | game, active_only, max_rotations |
| games | Every TCGplayer product line (games and supplies) with its id, name, url_name and whether TCGplayer Direct sells it. | Catalog enrichment teams call games to get every TCGplayer product line (games and supplies) with its id, name, url_name and whether TCG…. | max_rotations |
Call search from your stack
curl -X POST https://api.reefapi.com/tcgplayer/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"charizard","game":"pokemon"}'import requests
r = requests.post(
"https://api.reefapi.com/tcgplayer/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "charizard",
"game": "pokemon"
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/tcgplayer/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "charizard",
"game": "pokemon"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.tcgplayer.search with {"query":"charizard","game":"pokemon"}.Who uses this API and why
- Collection trackers value cards by condition with the per-SKU market prices from product/detail instead of the cheapest damaged copy.
- Card shops reprice inventory from product/listings filtered to Near Mint English copies, comparing price plus shipping the way buyers see it.
- Price-history dashboards chart a year of weekly market price and sales volume per condition with product/price_history.
- Sealed-product traders track booster boxes and premium collections across Pokémon, Magic, One Piece and Lorcana, dropping photo listings that sell parts only.
Questions developers ask before integrating
Which games does the TCGplayer API cover?
All 70 product lines TCGplayer lists: Magic: The Gathering, Pokémon, Pokémon Japan, Yu-Gi-Oh!, One Piece Card Game, Disney Lorcana, Flesh and Blood, Star Wars: Unlimited, Digimon, Dragon Ball Super: Fusion World, Riftbound, Gundam Card Game, Sorcery, Weiss Schwarz and more, plus supplies such as sleeves and deck boxes. The games action returns the full list with ids. Sports cards are not sold on TCGplayer. Prices are always US dollars.
What is the difference between market_price, lowest_price and as_low_as?
market_price is TCGplayer's figure from recent sales for a Near Mint copy of the product's main printing. lowest_price is the cheapest listing in any condition, without shipping, and lowest_price_with_shipping the cheapest once shipping is added. as_low_as is the figure TCGplayer prints as As low as: its own Price + Shipping ranking, which counts shipping as free for sellers that ship free above an order total. On Base Set Charizard these were $882.02, $183.58, $185.00 and $185.00. For the value of a specific copy, use skus, which carries the market price per condition, printing and language.
Does a listing's price include shipping?
No. Each listing has price, shipping_price (what TCGplayer shows for one copy), price_with_shipping (the two added) and sort_price, TCGplayer's own ranking figure. free_shipping_over_threshold is true when the seller ships free above an order total, which is why TCGplayer ranks a $3.60 + $1.49 listing above a $2.44 + $1.49 one. The threshold amount itself is not part of the listing data.
Can I filter listings by condition, printing or language?
Yes, with TCGplayer's own filters on product/listings: condition (near_mint, lightly_played, moderately_played, heavily_played, damaged, unopened, one or several), printing exactly as TCGplayer names it (Normal, Foil, Holofoil, 1st Edition Holofoil and so on), language, listing_type (standard or with_photos) and direct_only for TCGplayer Direct. Each filter was checked live against every returned listing. Listings come 50 per page, sorted by TCGplayer's Price + Shipping or by item price.
How many past sales can I get?
product/sales returns the 5 most recent sales, which is what TCGplayer shows without an account, filterable by condition and by listings with photos. For volume over time, product/price_history returns TCGplayer's market price, quantity sold, number of sales and low and high sale price per SKU, daily for the last month or in 3-day or weekly buckets for up to a year. Days without a sale return null for the low and high price, never 0.
Are search results padded when nothing matches?
No. Eight nonsense searches all returned zero results. Misspellings such as charizrd or dark magican return TCGplayer's corrected results with corrected_query set. Search also matches card text, so luffy returns One Piece cards that mention Luffy, not only cards named Luffy. Results page up to position 9,999; narrow with game, set or rarity to reach everything.
What does TCGplayer NOT publish?
The shipping threshold amount per seller, more than 5 recent sales without an account, buylist prices, barcodes, and product ratings or reviews. Sealed products have no collector number or rarity, and most non-English SKUs have no market price. Those fields come back as null, never guessed.
What is the TCGplayer API?
TCGplayer API is a ReefAPI endpoint group for the us trading-card marketplace: market price per condition, every listing with shipping, sales history. It returns live JSON through POST requests under /tcgplayer/v1.
Is the TCGplayer API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. TCGplayer calls use the same shared credit balance as every other ReefAPI engine.
Do I need a TCGplayer login or account?
No login to TCGplayer is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the TCGplayer data?
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the TCGplayer API use?
TCGplayer actions currently cost 1 credit per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.
Can I call TCGplayer from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call tcgplayer actions with the same key, credit pool and JSON envelope used by normal REST requests.
Is the TCGplayer API a TCGplayer scraper?
It is the managed alternative to a DIY TCGplayer scraper. Instead of building and maintaining your own scraper — proxies, headless browsers, captcha and constant breakage — you call one ReefAPI endpoint and get the same the us trading-card marketplace: market price per condition, every listing with shipping, sales history back as clean JSON.