Skip to content

New paid orders and subscriptions are retired. Existing records, settlement and refunds remain available through your account.

Standards / Identifier companion

A shape check, not a card check

Keep the identifier precise. Keep the claim small.

Check or build a Cambridge TCG SKU with the same @cambridge-tcg/sku package used by the platform. No account, image upload or catalog lookup. Your entries stay in page memory; the checker and builder do not submit them to the API.

<game>-<set>-<number>-<lang>[-<variant>]

A structurally valid identifier does not establish catalog existence, card identity, authenticity, or deck legality. See the SKU methodology for the specification.

Check an identifier

Checks run in your browser. This tool does not send or save your input. Whitespace is preserved, not trimmed. Up to 256 characters.

Build from known fields

Bring the identity; the builder only joins it. The package lowercases set, number, language and variant fields. It does not trim spaces or resolve language aliases; any further normalization appears separately below.

Publisher set code, e.g. op01. No spaces or hyphens.

Alphanumeric, e.g. 001. Leading zeroes are preserved.

Two letters, e.g. ja or en. Shape is checked, not ISO membership.

Hyphen-joined alphanumeric tokens, e.g. alt-art. Not proof of a printing.

How to read a result

  • Strict canonical structure: the strict parser accepts the input and the normalizer leaves it unchanged. Even op-op01-001-jp parses strictly, but it receives a suggestion because jp normalizes to ja.
  • Normalization suggested: the package recognizes a legacy shape. It can lowercase input, map its known language aliases, or recover a language/number swap such as pkm-svobf-en-006. Suggestions are never applied to your input automatically.
  • Invalid structure: neither path produced an accepted identifier. No missing game, set or number is guessed. For example, P-001-JP lacks a separate set and number.
  • The parser checks two lowercase letters for language, not ISO membership or publisher availability. An unlisted language such as zz can be syntactically accepted. The registry annotation is separate from validity.
  • Frozen legacy prefixes belong to their registered game. For example, ST-ST01-001-JP resolves to One Piece, not every game that prints an ST set. Supply a canonical game code when you know a different identity. If two fields already fit strict structure, the package does not guess that you intended them swapped.
  • Variant tokens are open-ended syntax, not evidence of a printing. The package preserves their order; it neither sorts nor verifies them.

The bundled game registry

Derived directly from GAMES. “Known” means this registry marks the game as having catalog rows; “anticipated” means registered but not so marked. These are bundled declarations, not fresh database checks and not judgments on whether a game exists. The internal test code is shown for transparency but excluded from builder choices.

Registered game codes, registry status and listed languages
CodeGameRegistry statusListed languages
opOne Piece TCGknownja, en, zh, ko
pkmPokémon TCGknownen, ja, zh, ko, fr, de, es, it, pt
dbfDragon Ball Super Fusion Worldknownen, ja
mtgMagic: The Gatheringanticipateden, ja, zh, ko, fr, de, es, it, pt, ru
ygoYu-Gi-Oh!anticipateden, ja, zh, ko, fr, de, es, it
dbsDragon Ball Super CCGanticipateden, ja
weiWeiß Schwarzanticipatedja, en
vngCardfight!! Vanguardknownen, ja
dmwDigimon Card Gameknownen, ja
bsrBattle Spirits Sagaknownen, ja
lcgLiving Card Gameanticipateden, ja
fabFlesh and Bloodanticipateden
lgrDisney Lorcanaanticipateden, fr, de
swuStar Wars Unlimitedanticipateden, fr, de, es, it
sorSorcery: Contested Realmanticipateden
altAltered TCGanticipateden, fr
rftRiftboundanticipateden
rshYu-Gi-Oh! Rush Duelanticipatedja, en
pkpPokémon Pocketanticipateden, ja, zh, ko, es, fr, de, it
genGenshin Impact TCGanticipateden, zh, ja, ko
gcgGUNDAM CARD GAMEanticipatedja, en, zh
unaUNION ARENAanticipatedja, en, zh
tstTestinternalen

The stateless API

For callers who choose to send an identifier: POST /api/v1/identifiers/validate. Public, no credentials required. The page tools above do not call it.

Content-Type: application/json

{"identifier":"OP-OP01-001-JP"}

Send exactly one object with one identifier string, up to 256 UTF-16 code units. The entire UTF-8 body is limited to 1,024 bytes, including streamed chunks. Additional fields and arrays are rejected. Ordinary JSON parsing applies; duplicate keys are not separately detected, so send the key only once.

HTTP 200 carries a syntax result, including invalid syntax. Malformed JSON or wrong shape returns 400; oversized input returns 413; other content types return 415. GET and other unsupported methods return 405 with a documentation link. OPTIONS supports non-credentialed public CORS.

Results use { data, _meta }. The status is strict_canonical, normalization_suggested, or invalid. strict_parse_valid describes the original input; parts, game and language describe the normalized candidate, when available. The original bounded identifier is returned, not replaced. See OpenAPI for the full response shape.

All endpoint responses are no-store. The handler performs no database or upstream calls and does not persist or log submitted identifiers; ordinary hosting access logs may still exist. Response rights are NOASSERTION, not a CC0 grant over submitted text.

Specification text retains its scoped CC0 dedication. Implementation rights: Apache-2.0 (licence text) per the repository LICENSE and applicable more-specific notices. The repository itself is currently private; source release is pending.

Reference: https://cambridgetcg.com/standards/validator