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

Fantasy Flight Games · 4,920 printings

SW: Unlimited card scanner API

Hyperspace and showcase variants, plus leaders that are printed on both sides.

4,920
Matchable printings
6
Languages
38 ms
Median match
$0
Charged for a miss

The problem

Why SW: Unlimited is hard to identify

Star Wars: Unlimited was built with parallels from the first set. Hyperspace variants use alternate framing on cards that also exist in standard form, showcase treatments add a third, and foil runs of each add more. All of them share a card number with the base printing, so the number locates the card and the treatment prices it.

Leaders complicate the frame itself: they are double-sided, and which face is showing depends on how the card was placed under the camera. The match resolves a leader from either face and returns the printing rather than the side, so an intake operator does not have to care which way up a card landed.

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

    A replayed transcript of SW: Unlimited 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 SW: Unlimited 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 numberLocates the card within the set.
    Variant treatmentStandard, hyperspace and showcase share a number and differ in price.
    FoilingFoil runs of each variant are separate printings.
    Card faceLeaders are double-sided and may present either side.

    Where scanners fail

    SW: Unlimited 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.

    Hyperspace shares the number

    The variant is a framing change, not a renumbering, so the printed number cannot distinguish it from the standard printing.

    Double-sided leaders

    A leader photographed on its back face is unrecognisable to anything keyed on the front. It is a common intake error because the two faces look like two different cards.

    Integrate it

    Scanning SW: Unlimited 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=star-wars-unlimited returns, including the SW: Unlimited-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 SW: Unlimited 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: ["star-wars-unlimited"],
          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": "swu_sor_010",
            "language": "en",
            "finish": "nonfoil",
            "edition": "unlimited",
            "collectorNumber": "010"
          },
          "card": {
            "id": "swu_sor_010",
            "game": "star-wars-unlimited",
            "name": "Darth Vader — Dark Lord of the Sith",
            "set": {
              "code": "SOR",
              "name": "SOR"
            },
            "rarity": "Special",
            "prices": [
              {
                "source": "tcgplayer",
                "region": "NA",
                "currency": "USD",
                "market": 4.44
              },
              {
                "source": "cardmarket",
                "region": "EU",
                "currency": "EUR",
                "market": 3.35,
                "trend": 3.35,
                "sellers": 9
              }
            ]
          },
          "alternatives": []
        }
      ],
      "scans": {
        "billed": 1,
        "remaining": 5842
      }
    }

    FAQ

    Scanning SW: Unlimited

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

    Other games