TCGplayer & Cardmarket Scraper - Card Price Arbitrage

EU vs US card prices in one run: Cardmarket trend (EUR) against TCGplayer market (USD), matched card-by-card via collector number, converted at the daily...

EU vs US card prices in one run: Cardmarket trend (EUR) against TCGplayer market (USD), matched card-by-card via collector number, converted at the daily ECB rate. Spread percent, cheaper side and both product links per row. Aggregate prices only - no listings, no sellers.

$5.00 / 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.

FieldTypeWhat it doesDefault
game string Pokémon for now - the cross-market card matching is verified for its numbering scheme. pokemon
searchQuery string Required. Cards to compare across markets, e.g. "umbreon gx", "charizard vmax". umbreon gx
minSpreadPct integer Only report cards whose EU and US market prices differ by at least this much. 20
priceMinEur integer Skip cards under this Cardmarket trend price - spreads on bulk are noise. 5
eurPerUsd string Leave empty to use the daily ECB reference rate automatically. -
maxItems integer Upper bound on delivered spread rows. 50
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:

{
  "avg30EurCardmarket": 13.73,
  "cardNumber": "80",
  "cheaperSide": "EU",
  "eurPerUsd": 0.89381,
  "fromEurCardmarket": 1.99,
  "game": "Pokémon",
  "listingsUs": 217,
  "lowestUsdTcgplayer": 4.99,
  "marketUsdInEur": 21.83,
  "marketUsdTcgplayer": 24.42,
  "name": "Umbreon GX  (SUM 80)",
  "priceGuideDate": "2026-10-12",
  "rarity": "Ultra Rare",
  "setCodeEu": "SUM",
  "setNameUs": "SM Base Set",
  "spreadPct": 46.3,
  "trendEurCardmarket": 14.92,
  "urlCardmarket": "https://www.cardmarket.com/en/Pokemon/Products/Singles/Sun-Moon/Umbreon-GX-V1-SUM80?language=1",
  "urlTcgplayer": "https://www.tcgplayer.com/product/126952"
}
FieldTypeMeaning
name string Card name with the EU set code and number.
game string Trading card game.
cardNumber ['string', 'null'] Collector number used to match both markets.
setCodeEu ['string', 'null'] Cardmarket set code.
setNameUs ['string', 'null'] TCGplayer set name.
rarity ['string', 'null'] Rarity as listed on TCGplayer.
trendEurCardmarket number Cardmarket trend price in EUR.
avg30EurCardmarket ['number', 'null'] Cardmarket 30-day average in EUR.
fromEurCardmarket ['number', 'null'] Cheapest live Cardmarket listing in EUR.
marketUsdTcgplayer number TCGplayer market price in USD.
lowestUsdTcgplayer ['number', 'null'] Cheapest live TCGplayer listing in USD.
marketUsdInEur number TCGplayer market price converted to EUR at the ECB rate.
spreadPct number Price gap between the two markets, as percent of the cheaper one.
cheaperSide string Which market is cheaper: EU or US.
eurPerUsd number The EUR/USD rate used.
listingsUs ['number', 'null'] Live listings on TCGplayer.
urlCardmarket string The card's Cardmarket offers, pre-filtered to English copies - the printing the US-side price refers to.
urlTcgplayer string TCGplayer product page.
priceGuideDate string Date of the Cardmarket price guide used.

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.