Looking for the overview — what this API returns, what it costs, and a call you can run without a key? See the TCGplayer API page →
E-commerce & Marketplaces

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.

7 actionsLive JSON1,000 free credits$0.67–$1.50 / 1,000 creditsMCP-ready
Get a free keyOpen in playground

🤖 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.

Reference

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.

Productmarket_price (NM)lowest listing + shippingLightly Played SKUDamaged 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.

Live example

Real request and response JSON

Captured from the indexed primary action, search, on .

Captured request
{
  "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"
  }
}
Captured response
{
  "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"
  }
}
Actions

What the TCGplayer API does

ActionDescriptionConcrete use caseKey params
searchSearch 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/detailOne 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/listingsEvery 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/salesThe 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_historyTCGplayer'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
setsEvery 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
gamesEvery 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
Code samples

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"}'
MCP one-liner
Ask your MCP-connected assistant: call reefapi.tcgplayer.search with {"query":"charizard","game":"pokemon"}.
Use cases

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.
FAQ

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.

docs / tcgplayer

TCGplayer

The US trading-card marketplace: market price per condition, every listing with shipping, sales history.

base /tcgplayer/v17 endpoints
post/tcgplayer/v1/product/detail1 credit

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.

ParameterAllowed / rangeDescription
product_idrequiredTCGplayer's numeric product id (from any search row) or a tcgplayer.com/product/<id> URL.
max_rotations = 3optional1–5How many fresh exits to try before giving up.
Try in playground →
post/tcgplayer/v1/product/listings1 credit

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.

ParameterAllowed / rangeDescription
product_idrequiredTCGplayer's numeric product id (from any search row) or a tcgplayer.com/product/<id> URL.
conditionoptionalOne or more of near_mint, lightly_played, moderately_played, heavily_played, damaged, unopened (comma-separated or a list).
printingoptionalPrinting exactly as TCGplayer names it for this product (Normal, Foil, Holofoil, 1st Edition Holofoil…; see available_filters).
languageoptionalCard language as TCGplayer names it (English, Japanese…; see available_filters).
listing_type = alloptionalall · standard · with_photosStandard listings, listings with the seller's own photos, or both.
direct_only = falseoptionalOnly TCGplayer Direct listings (fulfilled by TCGplayer).
sort = price_with_shipping_ascoptionalprice_with_shipping_asc · price_asc · price_descTCGplayer's own Price + Shipping order (its default; see sort_price: shipping counts as free for sellers and Direct listings that ship free over an order threshold), or by item price.
page = 1optional1–9999Result page (1-based). TCGplayer serves results up to position 9 999.
per_page = 50optional1–50Listings per page, up to 50.
max_rotations = 3optional1–5How many fresh exits to try before giving up.
Try in playground →
post/tcgplayer/v1/product/sales1 credit

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.

ParameterAllowed / rangeDescription
product_idrequiredTCGplayer's numeric product id (from any search row) or a tcgplayer.com/product/<id> URL.
conditionoptionalOne or more of near_mint, lightly_played, moderately_played, heavily_played, damaged, unopened (comma-separated or a list).
listing_type = alloptionalall · standard · with_photosStandard listings, listings with the seller's own photos, or both.
max_rotations = 3optional1–5How many fresh exits to try before giving up.
Try in playground →
post/tcgplayer/v1/product/price_history1 credit

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.

ParameterAllowed / rangeDescription
product_idrequiredTCGplayer's numeric product id (from any search row) or a tcgplayer.com/product/<id> URL.
range = quarteroptionalmonth · quarter · semi_annual · annualHistory window; TCGplayer picks the bucket size.
conditionoptionalOne or more of near_mint, lightly_played, moderately_played, heavily_played, damaged, unopened (comma-separated or a list).
max_rotations = 3optional1–5How many fresh exits to try before giving up.
Try in playground →
post/tcgplayer/v1/sets1 credit

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.

ParameterAllowed / rangeDescription
gamerequiredmagic · yugioh · pokemon · d-and-d-miniatures · heroclix · wow · cardfight-vanguard · force-of-will · dice-masters · future-card-buddyfight · weiss-schwarz · dragon-ball-z-tcg · final-fantasy-tcg · universus · star-wars-destiny · dragon-ball-super-ccg · dragoborne · funko · metax-tcg · card-sleeves · deck-boxes · card-storage-tins · life-counters · playmats · zombie-world-order-tcg · the-caster-chronicles · my-little-pony-ccg · books · exodus-tcg · lightseekers-tcg · protective-pages · storage-albums · collectible-storage · supply-bundles · munchkin-ccg · warhammer-age-of-sigmar-champions-tcg · bulk-lots · transformers-tcg · bakugan-tcg · keyforge · chrono-clash-system · argent-saga-tcg · flesh-and-blood-tcg · digimon-card-game · alternate-souls · gate-ruler · metazoo · wixoss · one-piece-card-game · lorcana-tcg · battle-spirits-saga · shadowverse-evolve · grand-archive · akora · kryptik-tcg · sorcery-contested-realm · alpha-clash · star-wars-unlimited · dragon-ball-super-fusion-world · union-arena · tcgplayer-supplies · elestrals · pokemon-japan · gundam-card-game · hololive-official-card-game · godzilla-card-game · riftbound-league-of-legends-trading-card-game · cookierun-braverse-tcg · palworld-official-card-game · cyberpunk-tcgTCGplayer product line (url_name from the games action).
active_only = falseoptionalOnly sets TCGplayer marks active.
max_rotations = 3optional1–5How many fresh exits to try before giving up.
Try in playground →
post/tcgplayer/v1/games1 credit

Every TCGplayer product line (games and supplies) with its id, name, url_name and whether TCGplayer Direct sells it.

ParameterAllowed / rangeDescription
max_rotations = 3optional1–5How many fresh exits to try before giving up.
Try in playground →