Skip to content
Prepaid, no subscription trap. Top up a balance and we draw the monthly fee from it.
tcggraph

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.

The announcement in the pokemon-tcg-data repository

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

FeaturePokémon TCG APITCGGraph
Available after 1 March 2027
New sign-upsClosedOpen
Games coveredPokémon only9 games
Japanese sets and cards, priced453 sets, 30,332 cards
French, German, Spanish and Italian printings
Price historyCurrent pricesDaily
Cardmarket low per language and condition
Pattern, stamp and edition printings priced apart
Graded pricesBy grader and grade
GraphQL
Webhooks
Published uptime SLA99.95% on Growth and Scale
PriceFree, until it closesFrom $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.

Pokémon TCG API
# 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
# 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.

  1. 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.

  2. 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.

  3. 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.

  4. 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 APITCGGraphNotes
ididpkm_ + their id, hyphens as underscores: sv3pt5-199 is pkm_sv3pt5_199.
set.idset.codeThe same value.
numbercollectorNumberThe same string; the filter reads 6, 006 and 006/165 alike.
set.releaseDateset.releasedAtAn 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.holofoilprices[] tcgplayer · foilOne entry per source and finish, Cardmarket next to it.
cardmarket.prices.trendPriceprices[] cardmarket · trendavg1, avg7 and avg30 keep their names.
— (not available)languagePrices[]Cardmarket's low per language, finish and condition.
legalities.standardlegalities.standardSame keys; values in lower case (legal).
images.largeimages.largeUnmetered; 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.