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.
| Field | Type | What it does | Default |
|---|---|---|---|
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"
}
| Field | Type | Meaning |
|---|---|---|
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.