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.
How to read a result
- Strict canonical structure: the strict parser accepts the input and the normalizer leaves it unchanged. Even
op-op01-001-jpparses strictly, but it receives a suggestion becausejpnormalizes toja. - 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-JPlacks a separate set and number. - The parser checks two lowercase letters for language, not ISO membership or publisher availability. An unlisted language such as
zzcan be syntactically accepted. The registry annotation is separate from validity. - Frozen legacy prefixes belong to their registered game. For example,
ST-ST01-001-JPresolves 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.
| Code | Game | Registry status | Listed languages |
|---|---|---|---|
| op | One Piece TCG | known | ja, en, zh, ko |
| pkm | Pokémon TCG | known | en, ja, zh, ko, fr, de, es, it, pt |
| dbf | Dragon Ball Super Fusion World | known | en, ja |
| mtg | Magic: The Gathering | anticipated | en, ja, zh, ko, fr, de, es, it, pt, ru |
| ygo | Yu-Gi-Oh! | anticipated | en, ja, zh, ko, fr, de, es, it |
| dbs | Dragon Ball Super CCG | anticipated | en, ja |
| wei | Weiß Schwarz | anticipated | ja, en |
| vng | Cardfight!! Vanguard | known | en, ja |
| dmw | Digimon Card Game | known | en, ja |
| bsr | Battle Spirits Saga | known | en, ja |
| lcg | Living Card Game | anticipated | en, ja |
| fab | Flesh and Blood | anticipated | en |
| lgr | Disney Lorcana | anticipated | en, fr, de |
| swu | Star Wars Unlimited | anticipated | en, fr, de, es, it |
| sor | Sorcery: Contested Realm | anticipated | en |
| alt | Altered TCG | anticipated | en, fr |
| rft | Riftbound | anticipated | en |
| rsh | Yu-Gi-Oh! Rush Duel | anticipated | ja, en |
| pkp | Pokémon Pocket | anticipated | en, ja, zh, ko, es, fr, de, it |
| gen | Genshin Impact TCG | anticipated | en, zh, ja, ko |
| gcg | GUNDAM CARD GAME | anticipated | ja, en, zh |
| una | UNION ARENA | anticipated | ja, en, zh |
| tst | Test | internal | en |
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.