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 — pokemontcg.io compared

pokemontcg.io is the community standard for Pokémon card data. TCGGraph adds eight more games, Cardmarket and TCGplayer prices on the same card, and an uptime SLA.

What Pokémon TCG API does well

  • Free, well documented and the default choice for Pokémon projects for years.
  • Complete English card pool with clean attack, weakness and resistance modelling.
  • Simple REST design that is easy to learn in an afternoon.
  • A large ecosystem of community libraries built on top of it.

Where TCGGraph differs

  • Coverage stops at Pokémon. TCGGraph carries the same Pokémon data plus Magic, One Piece, Yu-Gi-Oh!, Lorcana, Star Wars: Unlimited, Digimon, Grand Archive and Dragon Ball Super.
  • We carry the Japanese card pool as its own catalogue: 453 sets and 30,332 cards under language ja, each set with its own code and release date and each card with its own TCGplayer USD quote and, on 18,748 of them, the Cardmarket EUR guide for its Japanese product, where pokemontcg.io holds English only.
  • Prices come from Cardmarket and TCGplayer per printing and finish, with daily history rather than a single source snapshot.
  • 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; in TCGGraph 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.
  • We publish an uptime SLA on paid plans and a public status page.

Side by side

Feature comparison

FeaturePokémon TCG APITCGGraph
Games coveredPokémon only9 games
Japanese sets and cards, priced453 sets, 30,332 cards
Price historyCurrent pricesDaily, accumulating
European prices (Cardmarket)Pokémon only8 games
US prices (TCGplayer)Pokémon onlyAll 9 games
Pattern, stamp and edition printings priced apart
Price sourcesTCGplayer, Cardmarket4 sources
GraphQL
Webhooks
Published uptime SLA99.95% on paid
PriceFreeFrom $29/mo

When to use Pokémon TCG API instead

If you are building something Pokémon-only and free is the deciding factor, pokemontcg.io is a fine choice and has served the community well for a long time. Consider TCGGraph when you need a second game, the Japanese sets, deeper price history, or an availability guarantee you can point a customer at.

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
curl "https://api.pokemontcg.io/v2/cards?q=name:charizard" \
  -H "X-Api-Key: $POKEMONTCG_KEY"
TCGGraph
# TCGGraph
curl "https://api.tcggraph.com/v1/cards?game=pokemon&name=charizard" \
  -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.

  • Rate limits are shaping your product — you are batching, backing off or caching aggressively to stay inside them.
  • You need price history rather than today's number, for a portfolio, an alert or a repricing job.
  • Your app has grown past Pokémon and now needs a second game with the same shape of data.
  • You need somebody to answer when the data is wrong or the service is down.

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

    Translate the query syntax

    The Pokémon TCG API uses a Lucene-style q parameter, so q=types:fire hp:[300 TO *] becomes types=Fire&minHp=300. Ranges become min and max prefixes and every field name keeps its meaning, which makes this mostly mechanical.

  2. Step 2

    Move game fields under their namespace

    Fields that sit at the top level there — hp, types, attacks, weaknesses — 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.

  3. Step 3

    Adopt the price array

    Where you currently read a single tcgplayer price object, you get prices[], one quote per marketplace and finish (normal, foil, reverse-holo, 1st-edition, pokeball…). Take market from source tcgplayer to reproduce current behaviour, then add Cardmarket and the daily history when you want them.

  4. Step 4

    Stop pre-emptive caching

    A lot of Pokémon TCG API integrations cache hard to stay under the rate limit. Credits meter work rather than requests, cached 304 responses cost nothing and images are never metered, so the cache you built to survive rate limiting is often no longer earning its complexity.

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
ididDifferent format, same role. Ours is prefixed by game.
hp (string)gameData.hp (int)Typed as an integer, so numeric filters work.
types[]gameData.types[]Same values, moved under the namespace.
attacks[]gameData.attacks[]Same shape: name, cost, damage, text.
set.idset.codeSame identifier, renamed for consistency across games.
tcgplayer.pricesprices[]An array by source and finish: TCGplayer and Cardmarket.
legalities.standardlegalities.standardSame keys; values are lower case (legal, banned, not_legal).
images.largeimages.largeUnmetered on both.

FAQ

Common questions

Anything else, email hello@tcggraph.com. We will tell you if the answer is that you should stay where you are.