Skip to content
Crypto-only, prepaid. Top up a balance and we draw from it monthly — nothing is ever charged automatically.
tcggraph

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

FeatureYGOPRODeck APITCGGraph
Games coveredYu-Gi-Oh! only8 games
TCG, OCG and Master Duel ban lists
Archetype metadata
Legality-change webhooks
Price historyCurrent pricesDaily, to 2019
European prices (Cardmarket)One EUR figureTrend, averages, depth
GraphQL
PriceFreeFrom $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 API
# YGOPRODeck
curl "https://db.ygoprodeck.com/api/v7/cardinfo.php?attribute=light&atk=gte3000"
TCGGraph
# 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.

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

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

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

  4. 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 APITCGGraphNotes
idgameData.passcodeThe same eight-digit Konami passcode.
atk / defgameData.atk / gameData.defIntegers. def is null on Link monsters.
levelgameData.levelHolds rank for Xyz monsters; check monsterType.
racegameData.monsterTypeRenamed — race meant monster type, which confused people.
linkvalgameData.linkRatingArrows are a separate array of compass directions.
banlist_infolegalities.tcg / legalities.ocgKept separate by region rather than merged.
card_sets[]printings[]Each printing is its own record with its own price.
card_pricesprices[]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.