pokemontcg.io · Pokémon only
Pokémon TCG API alternative to pokemontcg.io
pokemontcg.io goes offline on 1 March 2027. Moving a Pokémon TCG API integration to TCGGraph: ids, fields, queries and prices, checked against both APIs.
pokemontcg.io goes offline on 1 March 2027
Its maintainers have deprecated the Pokémon TCG API. New registrations are closed, existing keys keep working until 1 March 2027, and they name Scrydex as the successor, which keeps the old card ids. The card data stays on GitHub as JSON for historical use. This page sets out what moving to TCGGraph involves instead, so you can weigh the two.
What Pokémon TCG API does well
- Free for over a decade, and the default choice for Pokémon projects for most of it.
- A complete English card pool with clean attack, weakness and resistance modelling.
- One Lucene-style q parameter that covers most searches.
- A large ecosystem of community libraries built on top of it.
Where TCGGraph differs
- Your stored ids carry over by rule. Our English catalogue follows its set codes and numbering, so sv3pt5-199 is pkm_sv3pt5_199: pkm_ in front, each hyphen an underscore, case kept (bw11-RC1 is pkm_bw11_RC1).
- Coverage does not stop at Pokémon. The same key and schema serve Magic, One Piece, Yu-Gi-Oh!, Lorcana, SW: Unlimited, Digimon, Grand Archive, Dragon Ball Super.
- The Japanese card pool is a catalogue of its own: 453 sets and 30,332 cards under language ja, each card with its own TCGplayer USD quote and, on 18,748 of them, the Cardmarket EUR guide for its Japanese product. The French, German, Spanish and Italian printings of each English card are rows of their own too. pokemontcg.io holds English only.
- Prices are read daily from Cardmarket and TCGplayer per printing and finish, with history behind them. When we checked seven cards on 28 October 2026, the TCGplayer prices pokemontcg.io returned were dated 15 October, its Cardmarket prices November 2025 to July 2026 where present at all, and a Pitch Black card from July 2026 had none.
- Pattern, stamp and edition variants are priced as their own printings. pokemontcg.io returns one card with a flat price list, so a Master Ball Exeggcute and the plain one are the same row; here each is an entry in printings[] with its own picture and its own Cardmarket and TCGplayer quotes, and Shadowless Base Set is priced apart from Unlimited.
- A 99.95% uptime SLA on Growth and Scale, and a public status page.
Side by side
Feature comparison
| Feature | Pokémon TCG API | TCGGraph |
|---|---|---|
| Available after 1 March 2027 | ||
| New sign-ups | Closed | Open |
| Games covered | Pokémon only | 9 games |
| Japanese sets and cards, priced | 453 sets, 30,332 cards | |
| French, German, Spanish and Italian printings | ||
| Price history | Current prices | Daily |
| Cardmarket low per language and condition | ||
| Pattern, stamp and edition printings priced apart | ||
| Graded prices | By grader and grade | |
| GraphQL | ||
| Webhooks | ||
| Published uptime SLA | 99.95% on Growth and Scale | |
| Price | Free, until it closes | From $29/mo |
When Scrydex is the better move
Staying on pokemontcg.io is not an option past 1 March 2027. If your app is Pokémon-only and you want to change as little code as possible, Scrydex is the shortest path: it is the successor the maintainers name, it keeps their ids, their q syntax and a very similar JSON shape, and it has population reports, which we do not. Consider TCGGraph when you need Cardmarket prices for one language and condition, the European printings, a second game, or GraphQL.
Migration
What the change looks like
Concepts map closely. Most migrations are a single afternoon of find-and-replace plus a test pass.
# pokemontcg.io: keys stop working on 1 March 2027
curl "https://api.pokemontcg.io/v2/cards/sv3pt5-199" \
-H "X-Api-Key: $POKEMONTCG_KEY"
curl "https://api.pokemontcg.io/v2/cards?q=name:charizard%20types:fire" \
-H "X-Api-Key: $POKEMONTCG_KEY"# TCGGraph: pkm_ + the same id, hyphens as underscores
curl "https://api.tcggraph.com/v1/cards/pkm_sv3pt5_199" \
-H "Authorization: Bearer $TCGGRAPH_KEY"
curl "https://api.tcggraph.com/v1/cards?game=pokemon&name=charizard&types=Fire" \
-H "Authorization: Bearer $TCGGRAPH_KEY"Signals
When it is worth switching
None of these are reasons on their own. Two or three together usually are.
- Your app calls api.pokemontcg.io. Its keys stop working on 1 March 2027, and new accounts can no longer register, so a new environment or a new teammate cannot get a key today.
- You show prices and need them read daily, with a history behind them, rather than a figure that was last updated weeks or months ago.
- You sell into Europe and need Cardmarket's price for one language and condition, not the cheapest copy in any language.
- Your app has grown past English Pokémon: the Japanese sets, the European printings, or a second game.
Migration
Moving off Pokémon TCG API, step by step
The honest version, including the parts that are not one-to-one.
Step 1
Convert the ids you have stored
Prefix pkm_ and turn every hyphen into an underscore: sv3pt5-199 becomes pkm_sv3pt5_199, bw11-RC1 becomes pkm_bw11_RC1. Set ids carry over unchanged as set.code. It is a string replace in a migration rather than a lookup table; GET /v1/cards/{id} confirms one card for 1 credit, and set=sv3pt5 pages a whole set at 2 credits per 100 cards.
Step 2
Translate the query syntax
The Pokémon TCG API uses a Lucene-style q parameter, so q=name:charizard types:fire becomes name=charizard&types=Fire, and hp:[300 TO *] becomes minHp=300. Filters combine with AND. A parameter we do not know, q included, is refused with a 400 that lists the valid ones, so a missed translation fails loudly instead of returning everything.
Step 3
Move game fields under their namespace
Fields that sit at the top level there — hp, types, attacks, weaknesses, regulationMark — live under gameData, in REST and GraphQL alike. Everything shared between games, like name, set, rarity and prices, stays at the top level. One find-and-replace usually covers it.
Step 4
Adopt the price array
Where you read tcgplayer.prices.holofoil.market, read the prices[] entry with source tcgplayer and finish foil; reverseHolofoil is finish reverse-holo, 1stEditionHolofoil is 1st-edition-foil. Cardmarket's trendPrice, avg1, avg7 and avg30 are trend, avg1, avg7 and avg30 on the entry with source cardmarket. The daily series is GET /v1/prices/{id}/history, 3 credits for up to five years.
Field mapping
What each field becomes
The part that takes the longest is discovering that Pokémon TCG API spells the same concept differently. Here it is, written down.
| Pokémon TCG API | TCGGraph | Notes |
|---|---|---|
| id | id | pkm_ + their id, hyphens as underscores: sv3pt5-199 is pkm_sv3pt5_199. |
| set.id | set.code | The same value. |
| number | collectorNumber | The same string; the filter reads 6, 006 and 006/165 alike. |
| set.releaseDate | set.releasedAt | An ISO date, 2023-09-22 rather than 2023/09/22. |
| hp (string) | gameData.hp (int) | Typed as an integer, so minHp and maxHp work. |
| types[], attacks[] | gameData.types[], gameData.attacks[] | Same values and shape, under the namespace. |
| tcgplayer.prices.holofoil | prices[] tcgplayer · foil | One entry per source and finish, Cardmarket next to it. |
| cardmarket.prices.trendPrice | prices[] cardmarket · trend | avg1, avg7 and avg30 keep their names. |
| — (not available) | languagePrices[] | Cardmarket's low per language, finish and condition. |
| legalities.standard | legalities.standard | Same keys; values in lower case (legal). |
| images.large | images.large | Unmetered; images.normal sits between small and large. |
FAQ
Common questions
Anything else, email hello@tcggraph.com. We will tell you if the answer is that you should stay where you are.