# TCGplayer API scraper — the US trading-card marketplace (tcgplayer.com): Magic: The Gathering, Pokémon, Yu-Gi-Oh!, One Piece, Lorcana, Flesh and Blood and 60+ product lines. Search, TCGplayer market price per printing and per condition, every live listing with seller rating and shipping, latest sales and price history, in US dollars. No account, no browser.

> 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.
> ReefAPI engine `tcgplayer` · 7 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/tcgplayer/v1/<action>` with a JSON body.
- **Auth:** header `x-api-key: <YOUR_REEFAPI_KEY>` — create one free (1,000 credits, no card): https://reefapi.com/signup
- **Response (every call):** `{ ok: boolean, data: ..., meta: { record_count, credits, ... }, error: { code, message } }` — branch on `ok`. Failed calls are free except verified SHEIN NOT_FOUND on product/detail and price (4 credits).
- **One key + one shared credit pool** across every ReefAPI API. Per-call credits are listed on each endpoint below.
- **Use it from an AI agent (MCP):** connect `https://api.reefapi.com/mcp` (remote streamable-http, `Authorization: Bearer <key>`) and your assistant can call these actions directly.

## Endpoints

### POST /tcgplayer/v1/search — 1 credit
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.

**Parameters:**
- `query` (string, optional) — Card or product name as typed in TCGplayer's search box. Optional when game or set is given (browse a whole product line or set).
- `game` (enum, optional) — TCGplayer product line (url_name from the games action). The display name, the numeric id and the aliases mtg, ygo, ptcg, onepiece, lorcana, fab and swu are accepted too. [one of: magic, 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-tcg]
- `set` (string, optional) — Set url_name from the sets action or from search facets (e.g. base-set, sv-scarlet-and-violet-151).
- `rarity` (string, optional) — Rarity exactly as TCGplayer names it (e.g. Holo Rare, Mythic, Secret Rare).
- `product_type` (string, optional) — TCGplayer product type, e.g. Cards or Sealed Products (see facets.product_types of a search).
- `min_market_price` (number, optional) — Only products whose market price is at least this many US dollars.
- `max_market_price` (number, optional) — Only products whose market price is at most this many US dollars.
- `sort` (enum, optional, default "best_match") — TCGplayer's own orderings: best match, best selling, name A-Z, market price. [one of: best_match, best_selling, name_asc, market_price_asc, market_price_desc]
- `page` (integer, optional, default 1) — Result page (1-based). TCGplayer serves results up to position 9 999.
- `per_page` (integer, optional, default 24) — Rows per page, up to 50 (TCGplayer's own limit).
- `max_rotations` (integer, optional, default 3) — How many fresh exits to try before giving up.

**Returns:** results[]{product_id, name, url, image, game, game_url_name, game_id, set, set_id, set_code, number, rarity, foil_only, release_date, currency, market_price, lowest_price, lowest_price_with_shipping, listed_median_price, search_index_listings_count}, count, total, page, per_page, has_more, corrected_query, facets{games[], sets[], product_types[]}{name, url_name, count}, query, filters_applied, sort

**Example request body:**
```json
{
  "query": "charizard",
  "game": "pokemon"
}
```

### POST /tcgplayer/v1/product/detail — 1 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.

**Parameters:**
- `product_id` (string, required) — TCGplayer's numeric product id (from any search row) or a tcgplayer.com/product/<id> URL.
- `max_rotations` (integer, optional, default 3) — How many fresh exits to try before giving up.

**Returns:** product{product_id, name, url, images[], game, game_url_name, game_id, set, set_id, set_code, number, rarity, product_type, product_type_id, sealed, foil_only, normal_only, release_date, description, flavor_text, note, attributes{label: text}, currency, market_price, lowest_price, lowest_price_with_shipping, listed_median_price, record_listings_count, listings_count, sellers_count, quantity_available, as_low_as}, market_price_by_printing[]{printing, market_price, listed_median_price}, skus[]{sku_id, condition, printing, language, market_price, market_price_low, market_price_high, market_price_sample_size, market_price_calculated_at}, cheapest_listings[] (same shape as product/listings), latest_sales[] (same shape as product/sales)

**Example request body:**
```json
{
  "product_id": "42382"
}
```

### POST /tcgplayer/v1/product/listings — 1 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.

**Parameters:**
- `product_id` (string, required) — TCGplayer's numeric product id (from any search row) or a tcgplayer.com/product/<id> URL.
- `condition` (string, optional) — One or more of near_mint, lightly_played, moderately_played, heavily_played, damaged, unopened (comma-separated or a list).
- `printing` (string, optional) — Printing exactly as TCGplayer names it for this product (Normal, Foil, Holofoil, 1st Edition Holofoil…; see available_filters).
- `language` (string, optional) — Card language as TCGplayer names it (English, Japanese…; see available_filters).
- `listing_type` (enum, optional, default "all") — Standard listings, listings with the seller's own photos, or both. [one of: all, standard, with_photos]
- `direct_only` (boolean, optional, default false) — Only TCGplayer Direct listings (fulfilled by TCGplayer).
- `sort` (enum, optional, default "price_with_shipping_asc") — TCGplayer'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. [one of: price_with_shipping_asc, price_asc, price_desc]
- `page` (integer, optional, default 1) — Result page (1-based). TCGplayer serves results up to position 9 999.
- `per_page` (integer, optional, default 50) — Listings per page, up to 50.
- `max_rotations` (integer, optional, default 3) — How many fresh exits to try before giving up.

**Returns:** product{product_id, name, url, game, set, number, rarity, market_price, lowest_price, lowest_price_with_shipping, record_listings_count, currency}, listings[]{listing_id, sku_id, price, shipping_price, price_with_shipping, sort_price, shipping_included, free_shipping_over_threshold, currency, quantity, condition, printing, language, language_code, listing_type (standard|with_photos), title, description, photos[], listed_at, direct_listing, seller{name, key, id, rating_pct, sales_count, sales_count_is_lower_bound, gold_star, certified_hobby_shop, direct_seller, programs[], location{city, state, country}}}, count, total, page, per_page, has_more, sellers_count, quantity_available, filters_applied, available_filters{conditions[], printings[], languages[], listing_types[]}{name, count}, sort

**Example request body:**
```json
{
  "product_id": "42382"
}
```

### POST /tcgplayer/v1/product/sales — 1 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.

**Parameters:**
- `product_id` (string, required) — TCGplayer's numeric product id (from any search row) or a tcgplayer.com/product/<id> URL.
- `condition` (string, optional) — One or more of near_mint, lightly_played, moderately_played, heavily_played, damaged, unopened (comma-separated or a list).
- `listing_type` (enum, optional, default "all") — Standard listings, listings with the seller's own photos, or both. [one of: all, standard, with_photos]
- `max_rotations` (integer, optional, default 3) — How many fresh exits to try before giving up.

**Returns:** product{product_id, name, url, game, set, market_price, currency}, sales[]{sold_at, price, shipping_price, price_with_shipping, currency, quantity, condition, printing, language, listing_type, title}, count, filters_applied

**Example request body:**
```json
{
  "product_id": "42382"
}
```

### POST /tcgplayer/v1/product/price_history — 1 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.

**Parameters:**
- `product_id` (string, required) — TCGplayer's numeric product id (from any search row) or a tcgplayer.com/product/<id> URL.
- `range` (enum, optional, default "quarter") — History window; TCGplayer picks the bucket size. [one of: month, quarter, semi_annual, annual]
- `condition` (string, optional) — One or more of near_mint, lightly_played, moderately_played, heavily_played, damaged, unopened (comma-separated or a list).
- `max_rotations` (integer, optional, default 3) — How many fresh exits to try before giving up.

**Returns:** product{product_id, name, url, game, set, market_price, currency}, series[]{sku_id, condition, printing, language, currency, average_daily_quantity_sold, average_daily_transactions, total_quantity_sold, total_transactions, points[]{date, market_price, quantity_sold, transactions, low_sale_price, low_sale_price_with_shipping, high_sale_price, high_sale_price_with_shipping}}, count, range

**Example request body:**
```json
{
  "product_id": "42382"
}
```

### POST /tcgplayer/v1/sets — 1 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.

**Parameters:**
- `game` (enum, required) — TCGplayer product line (url_name from the games action). [one of: magic, 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-tcg]
- `active_only` (boolean, optional, default false) — Only sets TCGplayer marks active.
- `max_rotations` (integer, optional, default 3) — How many fresh exits to try before giving up.

**Returns:** sets[]{set_id, name, url_name, code, release_date, supplemental, active}, count, game

**Example request body:**
```json
{
  "game": "pokemon"
}
```

### POST /tcgplayer/v1/games — 1 credit
Every TCGplayer product line (games and supplies) with its id, name, url_name and whether TCGplayer Direct sells it.

**Parameters:**
- `max_rotations` (integer, optional, default 3) — How many fresh exits to try before giving up.

**Returns:** games[]{game_id, name, url_name, direct_eligible}, count

## More
- Try it live, no code: https://reefapi.com/playground?engine=tcgplayer
- Human docs page: https://reefapi.com/docs/tcgplayer
- Overview page: https://reefapi.com/tcgplayer-api
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
