CardTrader API & Scraper: parameters and responses
This is the reference for the 6 CardTrader endpoints under /cardtrader/v1 (search, expansion/products, expansions, games, product/detail and product/offers) and their 30 parameters. Each endpoint lists its parameters, required or optional, with allowed values and defaults, and comes with a cURL, Python and JavaScript call; every response uses the same { ok, data, meta, error } envelope.
The CardTrader API returns cardtrader.com - the European marketplace for Magic, Pokémon, Yu-Gi-Oh!, One Piece, Lorcana, Flesh and Blood, Digimon, Dragon Ball Super, Star Wars Unlimited, Riftbound and six more games - as clean JSON.
🤖 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.
search finds cards and sealed products by name in one game, narrowed to a set, a category (singles, booster boxes, bundles…) or a rarity and sorted by name, price, collector number, rarity or release date; add a card language, a minimum condition or foil and every row comes back with its three cheapest matching offers. product/detail returns one card with the four price figures CardTrader prints on the card page (CT Min Price, CT Market Price, Best Deal and US Market Price), the daily CT market and US market price of the last ~35 days, the number of copies for sale, every other printing, and the cheapest offers. product/offers returns every offer - up to 1,000 rows, cheapest first - with the buyer's price and the seller's price, quantity, condition, card language, foil or reverse holo, first edition, signed, altered, graded, the seller's name, type, country, rating and feedback count, the shipping 'from' price and whether the copy ships direct or through CardTrader Zero, filterable on all of them. Prices come in euro or in CardTrader's own US-dollar prices, for the ship-to country you choose (34 countries), because CardTrader only shows the offers that ship there. On 2026-11-07 the offer table of five card pages and their price boxes were compared row by row with the page a shopper sees: 92 of 92 rows and every price box matched. No account, no browser - one ReefAPI key and the standard { ok, data, meta, error } envelope.
CardTrader prints four prices on every card page - here is what each one means
The cheapest offer is rarely the price a card trades at. CardTrader shows four figures on the card page and the API returns all four, computed exactly as the page computes them, next to the full offer list (live, 2026-11-07, ship-to Germany unless noted).
| Card | ct_min_price (cheapest offer) | ct_market_price | best_deal_price (CT Zero, English, NM+) | us_market_price |
|---|---|---|---|---|
| Sol Ring, Commander: TMNT (Magic) | €0.18 | €1.24 | €1.35 | €1.63 |
| Llanowar Elves, Foundations (Magic) | €0.11 | €0.11 | €0.13 | €0.29 |
| Skilled Dark Magician, Yugi Reloaded (Yu-Gi-Oh!) | €0.11 | €0.14 | €0.34 | — |
| Sol Ring, Commander: TMNT - ship to the US, in USD | $1.69 | $1.83 | $1.69 | $1.83 |
ct_market_price is the average of the first 15 offers after dropping outliers, as the page shows it today; the daily CT market series behind the price chart can differ (Sol Ring: €1.44 on the chart's latest day) and is returned separately as ct_market_price_daily with its history. Best Deal only counts copies that can ship through CardTrader Zero, in English and Near Mint or better, so it can sit well above the cheapest offer. US-dollar prices are CardTrader's own, not a conversion: the same Sol Ring offer costs €0.18 or $0.23.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/cardtrader/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"game": "pokemon",
"query": "charizard",
"sort": "price_desc"
}
}{
"ok": true,
"meta": {
"api": "cardtrader",
"endpoint": "search",
"mode": "live",
"latency_ms": 1914,
"record_count": 12,
"bytes": 69714,
"cache_hit": false,
"pagination": {
"page": 1,
"has_more": true,
"page_size": 12
},
"charged_credits": 2,
"version": "0.1.0",
"request_id": "7a6cdde401614b17",
"queue_ms": 2,
"fetched_at": "2026-11-08T13:04:20.262Z"
},
"data": {
"query": "charizard",
"game": "pokemon",
"game_name": "Pokémon",
"language": "en",
"currency": "EUR",
"country": "DE",
"sort": "price_desc",
"expansion": null,
"category": null,
"results": [
{
"product_id": 140759,
"name": "Charizard ☆ Gold Star δ Delta Species",
"translated_name": "Charizard ☆ Gold Star δ Delta Species",
"version": "Shiny Rare | 052/068",
"collector_number": "052",
"rarity": null,
"url": "https://www.cardtrader.com/en-EU/cards/140759-charizard-gold-star-delta-species-shiny-rare-052-068-offense-and-defense-of-the-furthest-ends",
"game_id": 5,
"category": {
"id": 73,
"slug": "pokemon-singles",
"name": "Singles",
"is_single": true
},
"expansion": {
"id": 2004,
"slug": "offense-and-defense-of-the-furthest-ends",
"code": "odffe",
"name": "Offense and Defense of the Furthest Ends",
"translated_name": "Offense and Defense of the Furthest Ends",
"release_date": "2006-06-29",
"presale": false
},
"offers_count": 1,
"lowest_price": 55000.64,
"currency": "EUR",
"lowest_price_formatted": "€55,000.64",
"image": "https://www.cardtrader.com/uploads/blueprints/image/140759/show_charizard-gold-star-delta-species-holo-rare-052-068-offense-and-defense-of-the-furthest-ends.jpg",
"image_full": "https://www.cardtrader.com/uploads/blueprints/image/140759/charizard-gold-star-delta-species-holo-rare-052-068-offense-and-defense-of-the-furthest-ends.jpg"
},
{
"product_id": 137153,
"name": "Shining Charizard Lv.61",
"translated_name": "Shining Charizard Lv.61",
"version": "Shining Holo Rare | No.006",
"collector_number": null,
"rarity": null,
"url": "https://www.cardtrader.com/en-EU/cards/137153-shining-charizard-lv-61-shining-holo-rare-no-006-darkness-and-to-light",
"game_id": 5,
"category": {
"id": 73,
"slug": "pokemon-singles",
"name": "Singles",
"is_single": true
},
"expansion": {
"id": 1983,
"slug": "darkness-and-to-light",
"code": "del",
"name": "Darkness, and to Light...",
"translated_name": "Darkness, and to Light...",
"release_date": "2001-03-09",
"presale": false
},
"offers_count": 1,
"lowest_price": 15000.63,
"currency": "EUR",
"lowest_price_formatted": "€15,000.63",
"image": "https://www.cardtrader.com/uploads/blueprints/image/137153/show_shining-charizard-lv-61-shining-holo-rare-no-006-darkness-and-to-light.jpg",
"image_full": "https://www.cardtrader.com/uploads/blueprints/image/137153/shining-charizard-lv-61-shining-holo-rare-no-006-darkness-and-to-light.jpg"
},
{
"product_id": 252786,
"name": "Charizard",
"translated_name": "Charizard",
"version": "Indonesian KFC Promo 181/SM-P | Holo Rare",
"collector_number": "181",
"rarity": null,
"url": "https://www.cardtrader.com/en-EU/cards/252786-charizard-indonesian-kfc-promo-181-sm-p-holo-rare-sm-p-sun-moon-promos",
"game_id": 5,
"category": {
"id": 73,
"slug": "pokemon-singles",
"name": "Singles",
"is_single": true
},
"expansion": {
"id": 1649,
"slug": "sun-moon-promos",
"code": "sm-p",
"name": "SM-P: Sun & Moon Promos",
"translated_name": "SM-P: Sun & Moon Promos",
"release_date": "2017-02-02",
"presale": false
},
"offers_count": 1,
"lowest_price": 13183.13,
"currency": "EUR",
"lowest_price_formatted": "€13,183.13",
"image": "https://www.cardtrader.com/uploads/blueprints/image/252786/show_charizard-indonesian-kfc-promo-181-sm-p-sun-moon-promos(2).jpg",
"image_full": "https://www.cardtrader.com/uploads/blueprints/image/252786/charizard-indonesian-kfc-promo-181-sm-p-sun-moon-promos(2).jpg"
}
],
"count": 12,
"page": 1,
"per_page": 12,
"has_more": true,
"filters_applied": {},
"offer_filters_applied": null,
"rarity_options": [],
"rows_dropped_without_offers": 0
}
}What the CardTrader API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | Search CardTrader for one game by card or product name: product id, name, version, collector number, set, category, number of offers, the lowest price and the image. Narrow to a set, a category (singles, booster boxes…) or a rarity; sort by name, price, collector number, rarity or release date; page through 12 rows at a time. Add card_language / min_condition / foil / first_edition to get, per row, the 3 cheapest offers matching them (CardTrader's own search filter), and rows without a matching offer dropped. | Pricing teams call search to search CardTrader for one game by card or product name. | query, game, expansion, category, rarity, ... |
| expansion/products | Every product of one set with the same rows as search, by collector number by default; filter by category, rarity and name, or by offer condition / language / foil. | Marketplace operators call expansion/products to get every product of one set with the same rows as search, by collector number by default; filter…. | expansion, query, game, category, rarity, ... |
| expansions | Every set CardTrader lists for a game, newest first: slug (for search and expansion/products), name, set code and release date. | Catalog enrichment teams call expansions to get every set CardTrader lists for a game, newest first. | game, query, max_rotations |
| games | Every game CardTrader sells, with its id, slug and product categories (Singles, Booster Boxes, Boosters, Bundles, Complete Sets…) with their ids and slugs. | Retail analysts call games to get every game CardTrader sells, with its id, slug and product categories (Singles, Booster Boxes…. | max_rotations |
| product/detail | One CardTrader card or product by id or URL: name, set, collector number, rarity, images, the card page's price boxes (CT Min Price, CT Market Price, Best Deal, US Market Price), the ~35-day daily CT market and US market price history (plus foil), the price summary (lowest price overall, with CardTrader Zero, with direct shipping, in Near Mint or better), the number of copies for sale, other printings, and the cheapest offers with condition, card language, foil, seller, seller country and shipping 'from' price for the ship-to country. | Pricing teams call product/detail to get one CardTrader card or product by id or URL. | product_id, offers_limit, language, currency, country, ... |
| product/offers | Every public offer on one card or product, cheapest first, as CardTrader shows them to a shopper in the ship-to country: price (with the seller price and CardTrader's buyer fee), quantity, condition, card language, foil / reverse holo, first edition, signed, altered, graded, the seller's name, type, country, rating and feedback count, the shipping 'from' price, whether the seller ships direct or only through CardTrader Zero, and CardTrader Zero hub stock. Filter by card language, minimum condition, foil, first edition, signed, altered, graded, seller country, seller type, CardTrader Zero or direct shipping and price; every filtered field is returned per offer so the filtering can be checked. Reads up to 1 000 offer rows. | Marketplace operators call product/offers to get every public offer on one card or product, cheapest first, as CardTrader shows them to a shop…. | product_id, card_language, min_condition, foil, reverse_holo, ... |
Call search from your stack
curl -X POST https://api.reefapi.com/cardtrader/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"game":"pokemon","query":"charizard","sort":"price_desc"}'import os
import requests
REEF_KEY = os.environ["REEF_KEY"]
r = requests.post(
"https://api.reefapi.com/cardtrader/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"game": "pokemon",
"query": "charizard",
"sort": "price_desc"
},
timeout=90,
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/cardtrader/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"game": "pokemon",
"query": "charizard",
"sort": "price_desc"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.cardtrader.search with {"game":"pokemon","query":"charizard","sort":"price_desc"}.Who uses this API and why
- Price two European marketplaces at once: the same card on CardTrader and Cardmarket, by condition and language
- Arbitrage between EU and US buyers: euro and dollar prices for the same offers, per ship-to country
- Buylist and repricing tools: the cheapest Near Mint English copy that ships through CardTrader Zero
- Set trackers: every card of a new set with offer counts and the lowest price, by collector number or rarity
Questions developers ask before integrating
Why do I get different offers for different countries?
Because CardTrader only shows a shopper the offers whose seller ships to the shopper's country, directly or through CardTrader Zero. Set country to the ship-to country (DE by default; 34 countries). Measured on the same card in the same minute: 99 offers starting at €0.18 for Germany, 100 for Italy, 99 for France, 96 for the United Kingdom and 89 starting at $1.69 for the United States - the cheapest Italian and Croatian sellers do not ship there.
Is the price the seller's price or what I pay?
price is what the buyer pays, as CardTrader displays it. CardTrader adds a small fee on top of the seller's price; every offer also carries seller_price and buyer_fee (for example €1.25 + €0.10 = €1.35), so you can work with either.
Can I filter offers by condition, language, foil or seller country?
Yes. product/offers takes card_language, min_condition (mint, near_mint, slightly_played, moderately_played, played, poor - or NM, SP, MP, PL, PO), foil, reverse_holo for Pokémon, first_edition, signed, altered, graded, seller_country, seller_type (private or professional), ct_zero_only, direct_shipping_only and a price range. Every filtered field is returned on each offer so you can check the result. search takes card_language, min_condition, foil, reverse_holo and first_edition and returns the three cheapest matching offers per card.
How many offers do I get for a popular card?
All of them, up to 1,000 rows per call, cheapest first. The biggest card we measured, Llanowar Elves from Foundations, had 386 offer rows holding 7,150 copies for German buyers; product/offers read all 386 in one call and returned the 4 German-language Near Mint ones, from €0.31.
Does it include sold prices?
No - CardTrader does not publish completed sales to visitors. What it does publish is its daily CT market price and the US market price for each card over the last ~35 days, which product/detail returns as price_history.
How does this compare with the Cardmarket API?
The actions and parameter names follow our Cardmarket API (search, expansion/products, expansions, product/detail, product/offers, game, query, expansion, card_language, min_condition, seller_country…), so the same code can price a card on both European marketplaces. CardTrader adds US-dollar prices, the ship-to country and CardTrader Zero; Cardmarket adds its price guide and sell-price averages.
What is the CardTrader API?
CardTrader API is a ReefAPI endpoint group for europe's other big card marketplace: every offer, ct zero best deal and market price, in eur or usd, for any ship-to country. It returns live JSON through POST requests under /cardtrader/v1.
Is the CardTrader API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. CardTrader calls use the same shared credit balance as every other ReefAPI engine.
Do I need a CardTrader login or account?
No login to CardTrader 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 CardTrader 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 CardTrader API use?
CardTrader actions currently cost 1-3 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call CardTrader from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call cardtrader actions with the same key, credit pool and JSON envelope used by normal REST requests.
Is the CardTrader API a CardTrader scraper?
It is the managed alternative to a DIY CardTrader 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 europe's other big card marketplace: every offer, ct zero best deal and market price, in eur or usd, for any ship-to country back as clean JSON.
Why does my CardTrader scraper keep getting blocked?
Most CardTrader scrapers break on anti-bot defenses, rate limits and IP bans that need rotating residential proxies and browser fingerprinting to clear. ReefAPI handles all of that for you — no proxies, no captchas, no maintenance — and returns live JSON. Blocked calls are free.