Cardmarket Scraper - Pokemon Card & Booster Box Prices
Daily Cardmarket prices for Pokemon, Magic, Yu-Gi-Oh and 18 more games: single cards and sealed products like booster boxes and ETBs.
Daily Cardmarket prices for Pokemon, Magic, Yu-Gi-Oh and 18 more games: single cards and sealed products like booster boxes and ETBs. Trend, low, 1/7/30-day averages.
$1.00 / 1,000 · 99.7% success over 967 public runs in the last 30 days.
Run it on Apify → Free to try - runs bill per result on your own account.
What you give it
Every field is optional unless marked; sensible defaults do the rest.
| Field | Type | What it does | Default |
|---|---|---|---|
game |
string | Which trading card game to price. | pokemon |
productType |
string | Single cards, or the sealed products Cardmarket prices in the same daily guide: booster boxes (displays), boosters, elite trainer boxes, tins, box sets, theme decks and more. Sealed lists exist for Pokémon, Magic, Yu-Gi-Oh!, One Piece and Lorcana among others. | cards |
searchQuery |
string | Case-insensitive name filter, e.g. "charizard", "black lotus" or, for sealed products, "booster box" or "151". Leave empty for the whole game. | charizard |
expansionIds |
array | Cardmarket expansion ids to keep. Ids are numeric because Cardmarket publishes no public list of set names: run once with a name filter, read expansionId off the rows you want (the run log also lists the dominant ids), then re-run with just the ids. Opening any row's productUrl shows which set an id belongs to. | - |
priceMinEur |
integer | Keep products whose trend price is at least this. | - |
priceMaxEur |
integer | Keep products whose trend price is at most this. | - |
onlyPriced |
boolean | Skip products without any regular-variant price data. | True |
sortBy |
string | Order of the delivered rows. | trend_desc |
maxItems |
integer | Upper bound on delivered rows. | 1000 |
reportFailures |
boolean | When a run fails, send the developer the actor name and build, an error category, the error message (truncated) and a one-way hash of your input - so a bug can be fixed without anyone asking you to reproduce it. Your input itself, your results and your identity are never sent, and successful runs send nothing at all. Switch this off and the actor behaves exactly the same. | True |
What you get back
One JSON object per result, with exactly these fields - no seller identities, no contact data, ever.
A real result row from a recent run:
{
"avg1DayEur": 20750,
"avg30DayEur": 6633.22,
"avg7DayEur": 12292.63,
"category": "Pokémon Single",
"currency": "EUR",
"expansionId": 4159,
"expansionName": "Plasma Blast",
"foilAvg1DayEur": null,
"foilAvg30DayEur": null,
"foilAvg7DayEur": null,
"foilAvgEur": null,
"foilLowEur": null,
"foilTrendEur": 0,
"game": "Pokémon",
"listedSince": "2021-03-19 12:11:55",
"name": "Mario Pikachu [Coin Gather | Super Jump]",
"priceAvgEur": 20750,
"priceGuideDate": "2026-10-17",
"priceLowEur": 7700,
"priceTrendEur": 11309.41,
"productId": 552569,
"productType": "card",
"productUrl": "https://www.cardmarket.com/en/Pokemon/Products?idProduct=552569",
"trendVsAvg30Pct": 70.5
}
| Field | Type | Meaning |
|---|---|---|
productId |
integer | Cardmarket product id. |
name |
string | Card name and version. |
game |
string | Trading card game this card belongs to. |
expansionId |
['integer', 'null'] | Cardmarket expansion id. |
expansionName |
['string', 'null'] | The set the expansion id refers to. Empty for the few games Cardmarket publishes no expansion index for, and for a set too new to have been harvested. |
priceLowEur |
['number', 'null'] | Cheapest live offer, the same figure the card page leads with as From. Use this for what a copy costs today. |
priceAvgEur |
['number', 'null'] | Average sale price in EUR. |
priceTrendEur |
['number', 'null'] | Cardmarket's trend price: what the card has been selling for. Not the cheapest copy on sale - that is priceLowEur. |
avg1DayEur |
['number', 'null'] | 1-day average sale price in EUR. |
avg7DayEur |
['number', 'null'] | 7-day average sale price in EUR. |
avg30DayEur |
['number', 'null'] | 30-day average sale price in EUR. |
foilLowEur |
['number', 'null'] | Lowest listed foil/holo price in EUR. |
foilAvgEur |
['number', 'null'] | Average foil/holo sale price in EUR. |
foilTrendEur |
['number', 'null'] | Foil/holo trend price in EUR. |
foilAvg1DayEur |
['number', 'null'] | 1-day foil/holo average in EUR. |
foilAvg7DayEur |
['number', 'null'] | 7-day foil/holo average in EUR. |
foilAvg30DayEur |
['number', 'null'] | 30-day foil/holo average in EUR. |
trendVsAvg30Pct |
['number', 'null'] | Trend vs the 30-day average, in percent - positive means the card is heating up. |
listedSince |
['string', 'null'] | When the product entered the Cardmarket catalog. |
currency |
string | All prices are EUR. |
priceGuideDate |
string | Date of the daily price guide behind this row. |
productUrl |
['string', 'null'] | The card's own page on Cardmarket. It opens the offers list, where the headline From price is priceLowEur, not the trend. |
Health
99.7% success over 967 public runs in the last 30 days. Live record, failures included: status page.
Full documentation, examples and the AI-assistant prompt live on the store page.
Questions
Where do the prices come from?
From Cardmarket's own daily price guide, the same figures shown on product pages: trend price, lowest offer and the averages of actual sales over one, seven and thirty days, with the same five for foil variants. Every row carries the date of the guide it was read from.
Does it include booster boxes and other sealed products?
Yes. Set productType to sealed or both and every sealed row says its category: booster box, display or elite trainer box. Sealed products carry no one, seven or thirty day averages because Cardmarket does not compute them.
How fresh is the data?
Cardmarket refreshes the guide once a day. A daily schedule after the refresh, early morning Central European time, gives a continuous price history if you keep the datasets, and every row carries its priceGuideDate so two days are never confused.
How much does it cost?
$1.00 per 1,000 rows, one row per priced product, billed only for what is delivered. Filter by expansion, price band or product type and cap the run with maxItems to keep a watch cheap.
Does it include graded cards?
No. Cardmarket trades raw cards, so the guide prices raw singles and sealed products. Graded cards are a different market and are not on Cardmarket.
Can I see individual offers or sellers?
Not here: this is the aggregate guide. For the live offers on specific cards, including the ones priced well under trend, use the Cardmarket Listings Scraper. Neither tool extracts seller identities.
What does a free Apify account get?
Five rows per run, the first of exactly what the same input returns in full on a paid plan, so you can check the shape on your own query before paying. A paid plan removes the cap and bills per row; a run that returns nothing bills nothing.
The history behind this tool
This tool answers what a source shows today. Its output also feeds a series recorded every day and kept: Trading card price history, daily, 21 games. A run gives you the current market; the series is the part that cannot be reconstructed afterwards, because the source overwrites it.