Cardmarket Scraper - Pokemon & Magic Price Spike Alerts
Pokemon and Magic cards whose Cardmarket price is really moving, or an alert when a card or booster box on your watchlist moves.
Pokemon and Magic cards whose Cardmarket price is really moving, or an alert when a card or booster box on your watchlist moves. Corroborated moves only, 21 games.
$19.90 / 1,000 · 100.0% success over 26 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 scan. Pokemon is the busiest market on Cardmarket. | 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 and more. | cards |
mode |
string | Movers ranks the products moving right now and works on the very first run. Alerts remembers today’s prices and tells you only when one of yours moves later. | movers |
direction |
string | Prices going up, going down, or both. | gainers |
window |
string | Which pair of averages the headline change compares. | 7d |
minChangePct |
integer | Ignore anything that moved less than this. | 15 |
minPriceEur |
integer | A 2-cent common doubling to 4 cents is a 100% move and means nothing. The floor is what keeps bulk out. | 2 |
maxPriceEur |
integer | Optional ceiling, for watching a budget bracket. | - |
cardNames |
array | Partial names, one per line: charizard, umbreon, or for sealed products booster box, 151. Leave empty to scan the whole game. | [] |
expansionIds |
array | Cardmarket expansion ids, as they appear in the output rows. | - |
includeFoil |
boolean | Foils are priced separately and often move on their own. Sealed products have no foil prices. | True |
requireCorroboration |
boolean | Requires the 30-day average, the 7-day average and today’s trend to all point the same way, with the cheapest live offer already repriced. Without it, roughly half the catalogue looks like it is moving. | True |
maxWatched |
integer | Caps the monitor memory. When a whole game overflows it, the most valuable products are kept. | 5000 |
resetState |
boolean | Forget the recorded prices and take a fresh baseline. | False |
stateStoreName |
string | Named key-value store holding the prices this monitor last reported. | tcg-movers-state |
maxItems |
integer | Stop after this many rows. Biggest movers come first. | 200 |
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": 300,
"avg30DayEur": 14.2,
"avg7DayEur": 140.11,
"cardName": "Celebratory Fanfare",
"category": "Pokémon Single",
"changePct": 886.7,
"comparisonWindow": "7-day vs 30-day average",
"currency": "EUR",
"direction": "up",
"expansionId": 3214,
"expansionName": "SWSH Black Star Promos",
"game": "Pokémon",
"idProduct": 573615,
"isAlert": false,
"lowEur": 179,
"movedFromEur": 14.2,
"movedToEur": 140.11,
"priceEur": 230.12,
"priceGuideDate": "2026-10-04",
"productType": "card",
"productUrl": "https://www.cardmarket.com/en/Pokemon/Products?idProduct=573615",
"trendEur": 230.12,
"variant": "regular",
"vs30DayPct": 1520.6
}
| Field | Type | Meaning |
|---|---|---|
game |
string | Trading card game the row belongs to. |
cardName |
string | Card name as Cardmarket's catalog spells it, attacks included. |
idProduct |
integer | Cardmarket product id. Stable, and what productUrl links to. |
expansionId |
['integer', 'null'] | Expansion id. Reusable as the expansionIds input. |
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. |
variant |
string | regular or foil - they are priced separately and move separately. |
priceEur |
['number', 'null'] | Cardmarket's trend price: what the card has been selling for. Not the cheapest copy on sale - that is lowEur, the figure the card page shows as From. |
movedFromEur |
['number', 'null'] | The older of the two averages this row compares. |
movedToEur |
['number', 'null'] | The newer of the two. Not the same as priceEur unless the window is the trend. |
changePct |
number | Move between them, in percent. Negative for a fall. Rows are sorted by its size. |
direction |
string | up or down. Filter on this. |
comparisonWindow |
string | Which two figures were compared, in words. |
vs30DayPct |
['number', 'null'] | Today's trend against the 30-day average - the plain hot-or-not number. |
trendEur |
['number', 'null'] | Cardmarket's own trend price. |
lowEur |
['number', 'null'] | Cheapest live offer, the same figure the card page leads with as From. On a real rise the offers have already repriced. |
avg1DayEur |
['number', 'null'] | Average of yesterday's sales. Absent when nothing sold. |
avg7DayEur |
['number', 'null'] | Average of the last 7 days of sales. |
avg30DayEur |
['number', 'null'] | Average of the last 30 days of sales. |
currency |
string | Always EUR: Cardmarket is a European marketplace. |
priceGuideDate |
string | Date of the price guide the row was read from. One per day. |
productUrl |
['string', 'null'] | The card on Cardmarket. Null for the few games with no public path. |
isAlert |
boolean | True in alerts mode: the card moved since this monitor last looked. |
previousSeenAt |
['string', 'null'] | Alerts mode only: when the previous price was recorded (ISO). |
Health
100.0% success over 26 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.
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.