TCGplayer price data
TCGplayer prices for Pokémon cards, without a TCGplayer API key
US guide figures in dollars, low and market, per printing, next to European prices in euro from the same endpoint. Signing up takes one request and no application form.
- Currency
- USD, as published
- Variants
- LOW and MARKET, per printing
- Basis
- GUIDE: a published reference figure
- Join key
tcgplayer_idon the card object
Developers look for TCGplayer prices because that is the figure the US hobby quotes. The rows with source: "TCGPLAYER" are those figures: low and market, in USD, one row per printing, so a holofoil and a reverse holo of the same card stay separate.
They arrive in the same response as the European rows and the EUR index. An app with users on both sides of the Atlantic shows each of them their own market from one call, instead of converting one currency into the other and being wrong for everybody.
One call, and what comes back
The price rows of one card. `?source=TCGPLAYER` keeps only the US guide rows; `?variant=MARKET` keeps only market.
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
}
}Moving an existing integration
If your code stores card ids in the set-number form, those resolve directly, including the historical aliases, and GET /v1/cards/batch reports the ones it cannot resolve instead of dropping them. tcgplayer_id is a field of the card where the pairing is known, so a table keyed on TCGplayer product ids can be joined once the cards are read; there is no search by marketplace id.
The price object is flat and explicit: amount and currency rather than a nested map keyed by printing name. A row you do not understand is a row you can skip, and a new printing never breaks your parser.
Cost
The trial key is 800 credits, granted once and valid for 30 days, with no credit card. It reaches every catalogue route and the current prices, with 7 days of price history. Paid plans start at €29/month for 50,000 credits a month. A nightly refresh of a 5,000-card collection through /v1/prices/current is 800 credits.
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 TCGplayer API
- No listings, orders, inventory or seller tools. It serves price data with attribution for applications that display or analyse card values.
- Guide figures, daily
- Rows are published once a day with a 24-hour delay and carry the day they refer to in
as_of. Check it before you call a number current. - Western printings
- These rows exist for the cards the US guide lists, which is mostly the international print line. The coverage page shows what each print region holds.
Questions people ask before signing up
- Is this the official TCGplayer API?
- No. pokemontcgapi.com is an independent service and is not affiliated with, endorsed by or a reseller of TCGplayer. TCGplayer 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 TCGplayer, you need TCGplayer's own tools; this API is for reading card and price data.
- Can I look a card up by TCGplayer product id?
- Not directly. tcgplayer_id is a field of the card where the pairing is known, so you can join on it after reading the cards, but searches go by name, set, number and the other catalogue fields. Reading a whole set is one paginated call.
- Do you have both low and market price?
- Yes. They are separate rows, variant LOW and variant MARKET, each per printing, in USD, with the day they refer to.
- Do I get EUR prices too?
- Yes, in the same response: Cardmarket and CardTrader rows in EUR and a composite EUR index. Nothing is converted between currencies. Cardmarket price data