Skip to content
Prepaid, no subscription trap. Top up a balance and we draw the monthly fee from it.
tcggraph

Ravensburger · 3,198 printings

Lorcana card scanner API

Enchanted variants hide behind ordinary card numbers.

3,198
Matchable printings
5
Languages
500 ms
Median match, live socket
$0
Charged for a miss

The problem

Why Lorcana is hard to identify

Lorcana is clean by the standards of this list, which makes the exceptions sharper. Nearly all of the secondary-market value sits in enchanted variants — full-art, foil-treatment versions of existing cards that carry a card number above the set's stated total. The base card and its enchanted version share a name and an ink colour and are separated by a number most tools truncate.

Below that, standard foil and non-foil printings of the same card diverge modestly, and the five-language release schedule — English, French, German, Italian and Japanese — means the same card exists in parallel markets at different prices. Because the set is small and consistently laid out, the collector number and total in the bottom corner are reliable, which makes this a game where a match should be near-certain or clearly refused.

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

    A replayed transcript of Lorcana 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 Lorcana 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
    Card number and totalA number above the set total marks an enchanted variant.
    FinishFoil and non-foil are separate products. Returned as the record's printings, each priced; not read from the photo.
    Ink colourConfirms the card against sets that reuse character names.
    LanguageFive printed languages, all matched; the localized printing links to its English card and carries that card's price.

    Where scanners fail

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

    Enchanted numbering

    Enchanted cards are numbered past the set total — 205/204 and up. Any tool that assumes the number cannot exceed the total drops the most valuable cards in the game onto their base printing.

    Character name reuse

    The same character appears across sets as different cards. The name is not unique, so the set and number carry the identification.

    Integrate it

    Scanning Lorcana 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=disney-lorcana returns, including the Lorcana-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 Lorcana scanning
    const { ticket } = await fetch("https://api.tcggraph.com/v1/scan/tickets", {
      method: "POST",
      headers: { authorization: `Bearer ${process.env.TCGGRAPH_KEY}` },
    }).then((r) => r.json());
    
    const socket = new WebSocket(`wss://api.tcggraph.com/v1/scan?ticket=${ticket}`);
    
    socket.onopen = () => {
      socket.send(
        JSON.stringify({
          type: "config",
          games: ["disney-lorcana"],
          minConfidence: 0.92,
        }),
      );
      // A JPEG straight off the camera, 1280 px across at quality 70.
      socket.send(camera.latestJpeg());
    };
    
    socket.onmessage = (event) => {
      const frame = JSON.parse(event.data);
    
      for (const match of frame.matches ?? []) {
        // printingResolved: set, number and language are settled. finishResolved:
        // the record has one finish. Either false is a choice for the operator.
        intake.add(match.card, match.printingResolved && match.finishResolved, match.alternatives);
      }
    
      // Unresolved frames arrive too, and cost nothing.
      for (const miss of frame.unresolved ?? []) showHint(miss.reason);
    
      // Every frame is answered. One in flight at a time: the next goes now.
      if (frame.type === "match" || frame.type === "unresolved" || frame.type === "error") {
        socket.send(camera.latestJpeg());
      }
    };
    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
          },
          "corners": [
            {
              "x": 0.183,
              "y": 0.064
            },
            {
              "x": 0.829,
              "y": 0.071
            },
            {
              "x": 0.817,
              "y": 0.936
            },
            {
              "x": 0.171,
              "y": 0.928
            }
          ],
          "distance": 21,
          "printingResolved": true,
          "finishResolved": false,
          "card": {
            "id": "lor_p1_3",
            "game": "disney-lorcana",
            "name": "Elsa - Snow Queen",
            "set": {
              "code": "P1",
              "name": "Promo Set 1"
            },
            "rarity": "Promo",
            "prices": [
              {
                "source": "cardmarket",
                "region": "EU",
                "currency": "EUR",
                "market": 5928.28,
                "trend": 5928.28,
                "avg7": 1000.17
              }
            ]
          },
          "alternatives": []
        }
      ],
      "scans": {
        "billed": 1,
        "remaining": 5842
      }
    }

    FAQ

    Scanning Lorcana

    Start with Lorcana, 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 Lorcana, Pokémon and Magic mixed together resolves card by card without you sorting it first.

    Other games