Cardmarket Listings Scraper - Live Offers, Stock & Prices

Cardmarket listings scraper and deal finder in one: every live offer of the cards you search (price, condition, language, ship-from country), or only...

Cardmarket listings scraper and deal finder in one: every live offer of the cards you search (price, condition, language, ship-from country), or only offers 25%+ under the official trend price - condition- and language-aware. Pokémon, Magic, Yu-Gi-Oh!, Lorcana and 11 more. No seller data.

$10.00 / 1,000 · 92.6% success over 176 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.

FieldTypeWhat it doesDefault
game string Which trading card game to hunt deals in. pokemon
searchQuery string Required. One or two distinctive words work best. For single cards: "charizard", "umbreon vmax", "black lotus". For sealed products, search the set name as Cardmarket writes it - it often differs from the name on the box (Disney Lorcana's first set is "The First Chapter", not "Chapter 1"). If nothing matches, the run tells you the closest names it found. charizard
productType string Single cards, or the sealed products Cardmarket lists in the same catalogue: booster boxes (displays), boosters, elite trainer boxes, tins, box sets and more. Sealed offers carry no condition, so the minimum condition below is ignored for them. cards
minDiscountPct integer An offer counts as a deal when it undercuts the card's trend price by at least this much. Set 0 for listings mode: every offer of the matched products, like a classic Cardmarket scraper (minus seller data). 25
minCondition string Ignore offers below this condition - a cheap damaged card is not a deal. EX
languages array Only count offers in these languages. Japanese and Korean prints trade far below the trend price, so mixing them in fakes discounts. Empty = all languages. ["English", "German", "French", "Italian", "Spanish"]
priceMinEur integer Skip cards whose trend price is below this - filters bulk noise. 2
priceMaxEur integer Skip cards whose trend price is above this. -
maxProducts integer How many candidate products to open and inspect per run. 10
maxItems integer Upper bound on delivered deal rows. 100
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:

{
  "avg30Eur": 12.59,
  "category": null,
  "condition": "NM",
  "currency": "EUR",
  "discountPct": 69.7,
  "game": "Pokémon",
  "language": "Italian",
  "locationCountry": "Italy",
  "name": "Charizard ex  (SVP 056)",
  "priceEur": 4,
  "priceGuideDate": "2026-10-12",
  "productId": 740401,
  "productType": "card",
  "productUrl": "https://www.cardmarket.com/en/Pokemon/Products/Singles/SV-Black-Star-Promos/Charizard-ex-V1-SVP056?language=5&minCondition=2",
  "quantity": 1,
  "trendEur": 13.21
}
FieldTypeMeaning
productId integer Cardmarket product id.
name string Card name and set code.
game string Trading card game.
productUrl string The product's offers on Cardmarket, pre-filtered to this row's language and, for single cards, its condition, cheapest first. Only undominated offers are reported, so this row's offer is the first row of the linked page.
condition ['string', 'null'] Card condition of the offer (MT/NM/EX/GD/LP/PL/PO). Empty on sealed products, which Cardmarket does not grade.
productType string Whether the row is a single card or a sealed product.
category ['string', 'null'] Cardmarket's own category for the product, e.g. "Pokémon Elite Trainer Boxes".
language ['string', 'null'] Card language of the offer.
priceEur number Offer price in EUR.
quantity integer Copies available at this price.
locationCountry ['string', 'null'] Country the item ships from.
trendEur number The product's Cardmarket trend price in EUR.
avg30Eur ['number', 'null'] 30-day average sale price in EUR.
discountPct number How far the offer undercuts the trend price, in percent.
currency string All prices are EUR.
priceGuideDate string Date of the daily price guide used as the benchmark.

Health

92.6% success over 176 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

Why did a run find nothing?

Because nothing on the market cleared your bar at that moment. Deals well under trend price on liquid cards are bought fast, so a schedule catches them when they appear, and a run that finds nothing bills nothing.

Why does condition matter?

A played copy far under a near-mint trend price is not a deal, it is a fair price. The default minimum condition keeps the comparison honest; loosen it deliberately if you also trade played copies.

How much does it cost?

$10.00 per 1,000 offers delivered, so you pay per offer found, not per search. One query per run works best; several tasks in parallel stay cheap for the same reason.

Does it return seller names?

No. An offer row carries price, condition, language, quantity and ship-from country. The seller behind it is never extracted; that is enforced by a test on every build.

Why the special proxy setting?

The live offer pages sit behind anti-bot protection, so the default input is preconfigured with the proxy that gets through. Keep it and everything works; the price already covers it.

Which games does it cover?

Pokémon, Magic, Yu-Gi-Oh!, Lorcana, One Piece and a dozen more, one game per run through the game input.

What does a free Apify account get?

Five offers 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 offer; a run that returns nothing bills nothing.