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.
| Field | Why it decides the price |
|---|---|
| Card number | Locates the card within the set. |
| Variant treatment | Standard, hyperspace and showcase share a number and differ in price. |
| Foiling | Foil runs of each variant are separate printings. |
| Card face | Leaders 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 plansconst 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);{
"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.