YGOPRODeck · Yu-Gi-Oh! only
YGOPRODeck API alternative — Yu-Gi-Oh! data compared
YGOPRODeck is the reference Yu-Gi-Oh! card API and it is free. TCGGraph matches its Yu-Gi-Oh! coverage and adds seven more games, GraphQL and legality webhooks behind one key.
What YGOPRODeck API does well
- Free and comprehensive, with the full Yu-Gi-Oh! card pool including OCG-only cards.
- Ban list data across TCG, OCG and Master Duel, kept current.
- Rich archetype metadata that is genuinely hard to reproduce.
- A large, active community and a deck builder people actually use.
Where TCGGraph differs
- Coverage stops at Yu-Gi-Oh!. TCGGraph keeps the same modelling and adds seven more games.
- Legality changes emit signed webhooks instead of requiring you to diff a poll.
- Prices are normalised across five marketplaces with daily history.
- GraphQL lets a deck view fetch cards across several games in one round trip.
Side by side
Feature comparison
| Feature | YGOPRODeck API | TCGGraph |
|---|---|---|
| Games covered | Yu-Gi-Oh! only | 8 games |
| TCG, OCG and Master Duel ban lists | ||
| Archetype metadata | ||
| Legality-change webhooks | ||
| Price history | Current prices | Daily, to 2019 |
| European prices (Cardmarket) | One EUR figure | Trend, averages, depth |
| GraphQL | ||
| Price | Free | From $19/mo |
When to use YGOPRODeck API instead
For a Yu-Gi-Oh!-only deck builder or ban list tracker, YGOPRODeck is free, complete and well maintained — use it. It is one of our upstream sources. TCGGraph makes sense once you need a second game or want webhooks instead of polling.
Migration
What the change looks like
Concepts map closely. Most migrations are a single afternoon of find-and-replace plus a test pass.
# YGOPRODeck
curl "https://db.ygoprodeck.com/api/v7/cardinfo.php?attribute=light&atk=gte3000"# TCGGraph
curl "https://api.tcggraph.com/v1/cards?game=yugioh&attribute=LIGHT&minAtk=3000" \
-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.
- You need OCG and TCG legality kept apart, with the right banlist per region rather than one merged list.
- You want price history for Yu-Gi-Oh! singles, which reprint constantly and move a great deal in price.
- You are adding another game and would rather not maintain a second, differently-shaped integration.
- You need an uptime commitment for something customer-facing.
Migration
Moving off YGOPRODeck API, step by step
The honest version, including the parts that are not one-to-one.
Step 1
Keep keying on the passcode
YGOPRODeck's id is the Konami passcode, and so is ours. That is the single biggest thing in your favour here: every deck list, collection row and price record you already store stays valid, because the identifier does not change.
Step 2
Split the merged legality
Where you currently read one banlist field, we return legality per region. Pass region=tcg or region=ocg and you get the right answer for your audience rather than a merged approximation that is wrong for both.
Step 3
Move monster stats under the namespace
atk, def, level, attribute and race move under gameData in REST and under the typed yugioh field in GraphQL. Link rating and pendulum scale become explicit fields rather than something you infer from the type string.
Step 4
Separate the card sets from the card
Instead of an array of set appearances hanging off the card, each printing is its own record linked to the card. That is what makes per-printing pricing possible, which for a game with forty reprints of a staple is the difference between a useful price and a meaningless average.
Field mapping
What each field becomes
The part that takes the longest is discovering that YGOPRODeck API spells the same concept differently. Here it is, written down.
| YGOPRODeck API | TCGGraph | Notes |
|---|---|---|
| id | gameData.passcode | The same eight-digit Konami passcode. |
| atk / def | gameData.atk / gameData.def | Integers. def is null on Link monsters. |
| level | gameData.level | Holds rank for Xyz monsters; check monsterType. |
| race | gameData.monsterType | Renamed — race meant monster type, which confused people. |
| linkval | gameData.linkRating | Arrows are a separate array of compass directions. |
| banlist_info | legalities.tcg / legalities.ocg | Kept separate by region rather than merged. |
| card_sets[] | printings[] | Each printing is its own record with its own price. |
| card_prices | prices[] | Daily series per source, not a single snapshot. |
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