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 covers the English TCG card pool and adds eight more games, per-printing prices, 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 GOAT, 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 uses one schema across eight more games.
- Legality changes emit signed webhooks instead of requiring you to diff a poll.
- Every printing carries its own Cardmarket and TCGplayer prices per finish, 1st Edition included, 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 | 9 games |
| TCG and OCG ban lists | ||
| GOAT ban list | ||
| Lookup by passcode | ||
| Archetype metadata | ||
| Legality-change webhooks | ||
| Price history | Current prices | Daily, accumulating |
| European prices (Cardmarket) | One EUR figure | Trend, averages, depth |
| GraphQL | ||
| Price | Free | From $29/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. TCGGraph makes sense once you need a second game, per-printing prices, or webhooks instead of polling. It does not carry the passcode, so a YDK-driven tool is better served there.
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 want Cardmarket and TCGplayer prices per printing and per finish, 1st Edition included, rather than one price per card.
- 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
Re-key from the passcode to the printing
YGOPRODeck's id is the Konami passcode. The passcode is not carried here: a record is one printing, keyed by its set code (ygo_macr_en036, collectorNumber MACR-EN036). Resolve each passcode in your data to a name once, with YGOPRODeck, then look the printings up by name. This is the real cost of the migration, so budget for it.
Step 2
Read the banlist from gameData
banlist_info.ban_tcg and ban_ocg become gameData.banlist.tcg and gameData.banlist.ocg, with lower-case values (forbidden, limited, semi_limited, unlimited) and unlimited written out rather than left absent. Filter on either with banlist.tcg=forbidden. The GOAT list is not carried.
Step 3
Move monster stats under gameData
atk, def, level, attribute and race move under gameData, in REST and GraphQL alike. linkval becomes linkRating, linkmarkers becomes linkMarkers, scale becomes pendulumScale, and the archetype string becomes the archetypes array.
Step 4
Turn card_sets into records
Instead of an array of set appearances hanging off the card, each printing is its own record, with its own set, rarity, image and prices. That is what makes per-printing pricing possible, which for a game with dozens of 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 | — (not carried) | The passcode; resolve it to a name once. |
| card_sets[].set_code | collectorNumber | One record per set appearance, e.g. MACR-EN036. |
| atk / def | gameData.atk / gameData.def | Integers. def is null on Link monsters. |
| level | gameData.level | Holds rank for Xyz monsters; check frameType. |
| race | gameData.race | Same values: Warrior, Dragon, Quick-Play… |
| linkval | gameData.linkRating | Arrows are gameData.linkMarkers[]. |
| banlist_info | gameData.banlist.tcg / .ocg | Also in legalities. No GOAT list. |
| card_prices | prices[] | Per source and finish, with a daily history endpoint. |
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