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

Konami · 34,100 printings

Yu-Gi-Oh! card scanner API

The card is not the product. The rarity is.

34,100
Matchable printings
9
Languages
38 ms
Median match
$0
Charged for a miss

The problem

Why Yu-Gi-Oh! is hard to identify

Yu-Gi-Oh! inverts the usual problem. The same card, with the same name, the same artwork and the same eight-digit passcode, exists as Common, Rare, Super Rare, Ultra Rare, Secret Rare, Ultimate Rare, Ghost Rare, Starlight Rare and more, across hundreds of sets over twenty-five years. The passcode identifies the card. It says nothing about the product, and the product is what has a price.

The discriminating field is the set code in the bottom-right — LOB-005, or SDK-EN005 — which fixes both the set and the position within it, and from that the rarity follows. The foiling treatment on the name and the artwork then confirms it. First Edition versus Unlimited is a line of text under the artwork, and on early sets it is worth more than the card.

Duel Terminal parallels, Retro Pack reprints and the various tin promos all reuse art and passcodes freely, so this is a game where reading the small print in the corner is not an optimisation. It is the entire identification.

wss://api.tcggraph.com/v1/scanidle
    0
    Frames
    0
    Matched
    0
    Unbilled

    A replayed transcript of Yu-Gi-Oh! cards from the public demo catalog, including a frame that does not resolve and is not billed. Nothing is being inferred in your browser.

    What settles it

    The fields a match is decided on

    Read in the order a person grading Yu-Gi-Oh! would read them. The match returns all of them, so you never have to infer a printing from a card name.

    FieldWhy it decides the price
    Set codeThe bottom-right code fixes set and position, and from there the rarity.
    Rarity treatmentNine or more rarities of one card, from cents to thousands of dollars.
    Edition text1st Edition versus Unlimited, printed under the artwork.
    PasscodeIdentifies the card for rules purposes, and only the card.
    RegionEN, EU, DE, FR, IT, PT, JP and Asian-English print runs are distinct products.

    Where scanners fail

    Yu-Gi-Oh! traps that return the wrong printing

    Each of these is a case where the artwork is right and the answer is still wrong. A confident wrong match costs more than a refused one, which is why an unresolved frame is free.

    Passcode is not a product id

    Every printing of a card shares its passcode. Using it as the key returns a card that is right in every respect except the one that determines the price.

    Rarity lives in the foiling

    Secret, Ultimate and Ghost Rare differ in how the name and artwork are treated rather than in layout. Under flat light two of them can look the same, which is why the set code is read first and the treatment confirms rather than decides.

    Asian-English printings

    Visually near-identical to the English release and priced entirely differently. The region letters in the set code are the only reliable tell.

    Integrate it

    Scanning Yu-Gi-Oh! in about fifteen lines

    Pin the socket to one game and matching gets both faster and more certain, because there are fewer near-identical candidates to rule out.

    The card inside a match is the same object /v1/cards?game=yugioh returns, including the Yu-Gi-Oh!-specific fields. If you already read this API, a scanner is a new input to code you have written rather than a second integration.

    Scanning is metered separately from data, so pointing a camera at a stack all morning cannot spend the credits your repricer needs at midnight.

    Scan pricing

    $29/mo · 6,000 matched cards

    Or $0.012 per matched card with no plan at all. Down to $0.0025 at volume, and a frame we cannot place is never billed.

    Compare scan plans
    Live Yu-Gi-Oh! scanning
    const socket = new WebSocket("wss://api.tcggraph.com/v1/scan", [
      "tcggraph.v1",
      `bearer.${process.env.TCGGRAPH_KEY}`,
    ]);
    
    socket.onopen = () =>
      socket.send(
        JSON.stringify({
          type: "config",
          games: ["yugioh"],
          minConfidence: 0.92,
          prices: ["cardmarket", "tcgplayer"],
        }),
      );
    
    socket.onmessage = (event) => {
      const frame = JSON.parse(event.data);
    
      for (const match of frame.matches ?? []) {
        // The printing, not just the card: set, number, language, finish.
        intake.add(match.printing, match.card.prices);
      }
    
      // Unresolved frames arrive too, and cost nothing.
      for (const miss of frame.unresolved ?? []) showHint(miss.reason);
    };
    
    for await (const jpeg of camera.frames()) socket.send(jpeg);
    A match, with both price feeds
    {
      "requestId": "scan_01K5Z8P4XQJ7YB3M",
      "latencyMs": 41,
      "matches": [
        {
          "confidence": 0.9962,
          "billed": true,
          "box": {
            "x": 0.171,
            "y": 0.064,
            "w": 0.658,
            "h": 0.872
          },
          "printing": {
            "id": "ygo_89631139",
            "language": "en",
            "finish": "nonfoil",
            "edition": "unlimited",
            "collectorNumber": "CT13-EN008"
          },
          "card": {
            "id": "ygo_89631139",
            "game": "yugioh",
            "name": "Blue-Eyes White Dragon",
            "set": {
              "code": "CT13",
              "name": "2016 Mega-Tins"
            },
            "rarity": "Ultra Rare",
            "prices": [
              {
                "source": "tcgplayer",
                "region": "NA",
                "currency": "USD",
                "market": 0.13
              },
              {
                "source": "cardmarket",
                "region": "EU",
                "currency": "EUR",
                "market": 0.1,
                "trend": 0.1,
                "sellers": 144
              }
            ]
          },
          "alternatives": []
        }
      ],
      "scans": {
        "billed": 1,
        "remaining": 5842
      }
    }

    FAQ

    Scanning Yu-Gi-Oh!

    Start with Yu-Gi-Oh!, add the rest for nothing

    One key covers every game we carry, and scans are pooled across all of them. There is no per-game surcharge and no separate model to enable — a stack with Yu-Gi-Oh!, Pokémon and Magic mixed together resolves card by card without you sorting it first.

    Other games