Cardmarket price data
Cardmarket price data for Pokémon cards, over a REST API
European asking prices in euro, read daily and served per card and per printing language, with the Cardmarket product id on every card so you can join your own data.
- Currency
- EUR, as published
- Basis
- ASKING: what sellers list, not what buyers paid
- Granularity
- Per card, per printing language
- Join key
cardmarket_idon the card object
If your users are in Europe, a price in dollars from a US guide is the wrong number: it is a different market with different supply. The rows with source: "CARDMARKET" are European asking prices in euro, one series per printing language, because an Italian and an English copy of the same card do not sell for the same money.
Filter to them with ?source=CARDMARKET on any price route, or take everything and let your code pick. Next to them you get CardTrader (also EUR, per language and condition) and a composite EUR index with its sample size, so a card that one source does not list still has a figure.
One call, and what comes back
The price rows of one card. Add `?source=CARDMARKET` to keep only the Cardmarket ones; the shape does not change.
curl -s "https://api.pokemontcgapi.com/v1/cards/base1-4/prices" \
-H "X-Api-Key: $PTCG_API_KEY"{
"data": {
"card_id": "base1-4",
"index": {
"eur": 556.23,
"as_of": "2026-09-02",
"sample_n": 16,
"by_locale": [
{
"locale": "en",
"printing": null,
"eur": 556.23,
"as_of": "2026-09-02",
"sample_n": 16
},
{
"locale": "fr",
"printing": null,
"eur": 900.58,
"as_of": "2026-09-02",
"sample_n": 3
},
{
"locale": "de",
"printing": null,
"eur": 399.95,
"as_of": "2026-09-02",
"sample_n": 5
},
{
"locale": "es",
"printing": null,
"eur": 1313.14,
"as_of": "2026-09-02",
"sample_n": 8
},
{
"locale": "it",
"printing": null,
"eur": 400.64,
"as_of": "2026-09-02",
"sample_n": 11
}
]
},
"quotes": [
{
"source": "CARDMARKET",
"variant": "LOW",
"basis": "ASKING",
"amount": 599.9,
"currency": "EUR",
"locale": "en",
"condition": "NEAR_MINT",
"printing": null,
"grading": null,
"as_of": "2026-09-01",
"sample_n": null,
"provenance": "Cardmarket"
},
{
"source": "CARDTRADER",
"variant": "LOW",
"basis": "ASKING",
"amount": 1250.64,
"currency": "EUR",
"locale": "en",
"condition": "NEAR_MINT",
"printing": null,
"grading": null,
"as_of": "2026-09-01",
"sample_n": 4,
"provenance": "CardTrader"
},
{
"source": "TCGPLAYER",
"variant": "LOW",
"basis": "GUIDE",
"amount": 510,
"currency": "USD",
"locale": "en",
"condition": null,
"printing": "HOLOFOIL",
"grading": null,
"as_of": "2026-07-30",
"sample_n": null,
"provenance": "TCGplayer"
},
{
"source": "EBAY",
"variant": "MEDIAN_GRADED",
"basis": "ASKING",
"amount": 400,
"currency": "USD",
"locale": "en",
"condition": null,
"printing": null,
"grading": {
"company": "PSA",
"score": "1"
},
"as_of": "2026-08-26",
"sample_n": 7,
"provenance": "eBay"
},
{
"source": "PRICECHARTING",
"variant": "MEDIAN_GRADED",
"basis": "GUIDE",
"amount": 20061.4,
"currency": "USD",
"locale": "en",
"condition": null,
"printing": null,
"grading": {
"company": "PSA",
"score": "10"
},
"as_of": "2026-08-24",
"sample_n": null,
"provenance": "PriceCharting"
}
]
},
"meta": {
"quotes": 5,
"delayed_hours": 0
}
}Languages and plans
The trial and its English-language rows are enough to prove the integration. Price rows for the other printing languages (German, French, Italian, Spanish and the rest) come with Developer (€29/month) and above; below that, meta.withheld says non_english_locales so you know the rows exist.
History follows the plan too: 7 days on the trial, 30 on Developer, the full series from Growth. GET /v1/cards/{id}/prices/history takes source, variant, locale and a bucket of day, week or month.
Matching your cards
Every card carries cardmarket_id where the pairing is known, alongside tcgplayer_id, so once you hold the card you can join it to a database keyed on Cardmarket product ids. The lookup itself goes by card id, set code and number: GET /v1/cards/batch resolves up to 100 ids a call and tells you which ones it could not find, with a suggestion when the id is an old alias. There is no search by marketplace id.
What it is not
Read this before you build on it. Every line here is a support ticket somebody else already opened.
- This is not the Cardmarket API
- You cannot list, buy, sell or read your Cardmarket account here. This API serves price data read from the market, with attribution, for applications that display or analyse card values.
- Asking prices, daily
- Rows are asking prices published with a 24-hour delay. They move with listings, not with each sale, and they are not a live feed.
- Attribution travels with the row
- Each row carries a
provenancestring. Show it next to the number: it is what your users will ask for the first time a price looks wrong.
Questions people ask before signing up
- Is this the official Cardmarket API?
- No. pokemontcgapi.com is an independent service and is not affiliated with, endorsed by or a reseller of Cardmarket. Cardmarket appears here as the stated source of a price row, the same way a newspaper names the exchange a quote came from. If you need to list, buy or sell on Cardmarket, you need Cardmarket's own tools; this API is for reading card and price data.
- Do I need a Cardmarket seller account to use it?
- No. You need a pokemontcgapi.com key, and the trial one is free: 800 credits, once, valid 30 days, no card. Free trial key
- Are prices split by card language?
- Yes. Each Cardmarket row carries the printing language in locale. English rows are on every plan; the other languages come with Developer and above. Pricing
- Can I get Cardmarket price history?
- Yes, from GET /v1/cards/{id}/prices/history with source=CARDMARKET. The window depends on the plan: 7 days on the trial, 30 on Developer, everything we hold from Growth.