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 offers the same Pokémon coverage plus seven more games, normalised prices from five marketplaces and a stricter uptime commitment.
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 and Grand Archive.
- We serve Japanese printings linked to their English counterparts through a shared card identity.
- Prices come from five marketplaces with daily history rather than a single source snapshot.
- We publish an uptime SLA on paid plans and a public status page.
Side by side
Feature comparison
| Feature | Pokémon TCG API | TCGGraph |
|---|---|---|
| Games covered | Pokémon only | 8 games |
| Japanese printings linked to English | ||
| Price history | Current prices | Daily, to 2019 |
| European prices (Cardmarket) | Pokémon only | All 8 games |
| Price sources | TCGplayer, Cardmarket | 5 sources |
| GraphQL | ||
| Webhooks | ||
| Published uptime SLA | 99.95% on paid | |
| Price | Free | From $19/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. It is one of our upstream sources. Consider TCGGraph when you need a second game, Japanese-to-English card linking, 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.
# pokemontcg.io
curl "https://api.pokemontcg.io/v2/cards?q=name:charizard" \
-H "X-Api-Key: $POKEMONTCG_KEY"# 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.
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.
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 under the typed pokemon field in GraphQL. Everything shared between games, like name, set, rarity and prices, stays at the top level. One find-and-replace usually covers it.
Step 3
Adopt the price series
Where you currently read a single tcgplayer price object, you get a series per marketplace and condition. Take the market value from your preferred source to reproduce current behaviour, then add history when you want it.
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 API | TCGGraph | Notes |
|---|---|---|
| id | id | Different 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.id | set.code | Same identifier, renamed for consistency across games. |
| tcgplayer.prices | prices[] | An array across five sources rather than one object. |
| legalities.standard | legalities.standard | Same keys and values. |
| images.large | images.large | Unmetered 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.
More comparisons