Every card on the platform has a SKU — a short, machine-readable identifier that names it precisely. The SKU works the same way for One Piece, Pokémon, Magic, Yu-Gi-Oh, Digimon, Vanguard, Weiß Schwarz, Flesh and Blood, Lorcana, and every TCG the platform catalogues. One format. One parser. Every game.
This page is the canonical spec. It's the contract between the platform's database, its public API, every agent that reads or writes through us, every archivist preserving market history, and every partner who wants to interoperate.
Where this lives in code. The canonical implementation ispackages/sku/in the monorepo.parseSku(),buildSku(),normalizeSku(), and theGAMESregistry all live there and are imported by every app that handles SKUs. When the spec changes, this page changes in the same PR.
Try the identifier validator and builder: a browser-local companion with strict parsing, separate normalization suggestions, the bundled game registry and a public stateless API. Structure alone does not establish catalog existence, card identity, authenticity, or deck legality.
<game>-<set>-<number>-<lang>[-<variant>]op01, svobf, otj.001, t01, fa1.ja, en, zh, ko, fr, de. The implementation checks two-letter shape only, not membership in the ISO registry. Aliases such as jp can parse strictly but normalize to ja.rev (reverse holo), 1st (1st edition), alt-art, holo-foil.All segments lowercase. Hyphen-separated. Each segment must match [a-z0-9]+ (variant tokens individually). No spaces, no slashes, no underscores.
op-op01-001-ja ← One Piece, OP01 set, card 001, Japanese
op-op01-001-en ← Same card, English print
pkm-svobf-006-en ← Pokémon, Scarlet & Violet Obsidian Flames, card 006, English
pkm-svobf-006-en-rev ← Same card, reverse holo
mtg-otj-101-en ← Magic, Outlaws of Thunder Junction, card 101, English
mtg-otj-101-en-1st ← Same card, 1st edition / first print
ygo-mp23-014-en ← Yu-Gi-Oh, MP23 mega-pack, card 014, English
dmw-bt17-024-en ← Digimon, BT17, card 024, English
fab-wtr-001-en-cf ← Flesh and Blood, Welcome to Rathe, card 001, English, cold foilThe table is derived from packages/sku/src/games.ts. The parser rejects SKUs whose game code is not registered. Registry status is a bundled declaration, not a fresh catalog lookup: known means marked as having catalog rows; anticipated means registered but not so marked; internal is the test code. No status verifies a particular card.
| Code | Game | Publisher | Registry status |
|---|---|---|---|
op | One Piece TCG | Bandai | known |
pkm | Pokémon TCG | TPCi | known |
dbf | Dragon Ball Super Fusion World | Bandai | known |
mtg | Magic: The Gathering | Wizards | anticipated |
ygo | Yu-Gi-Oh! | Konami | anticipated |
dbs | Dragon Ball Super CCG | Bandai | anticipated |
wei | Weiß Schwarz | Bushiroad | anticipated |
vng | Cardfight!! Vanguard | Bushiroad | known |
dmw | Digimon Card Game | Bandai | known |
bsr | Battle Spirits Saga | Bandai | known |
lcg | Living Card Game | various | anticipated |
fab | Flesh and Blood | LSS | anticipated |
lgr | Disney Lorcana | Ravensburger | anticipated |
swu | Star Wars Unlimited | Fantasy Flight Games | anticipated |
sor | Sorcery: Contested Realm | Erik Olofsson | anticipated |
alt | Altered TCG | Equinox | anticipated |
rft | Riftbound | Riot Games | anticipated |
rsh | Yu-Gi-Oh! Rush Duel | Konami | anticipated |
pkp | Pokémon Pocket | TPCi | anticipated |
gen | Genshin Impact TCG | HoYoverse | anticipated |
gcg | GUNDAM CARD GAME | Bandai | anticipated |
una | UNION ARENA | Bandai | anticipated |
tst | Test | (internal) | internal |
The bundled language annotations live in GAMES[code].languages. Unlisted two-letter values remain syntactically accepted; the validator annotates them separately. This is not evidence about publisher releases. Strict canonical status means parsing succeeds and normalization leaves the input unchanged, not that its language appears in this list.
The platform shipped before this spec existed. Two legacy forms are in use in older data:
OP-OP01-001-JP → normalised to op-op01-001-ja. Old language codes (JP/CN/KR) are mapped to ISO 639-1 (ja/zh/ko).pkm-svobf-en-006 → normalised to pkm-svobf-006-en. The normalizer uses its fixed language-alias map; it does not validate against the whole ISO registry.Both legacy forms accept normalisation through normalizeSku(legacy); the result round-trips through parseSku() losslessly. Reading paths apply normalisation transparently; writing paths emit canonical form only.
The variant segment captures meaningful prints of the same underlying card. Each variant is one or more lowercase tokens hyphen-joined; the platform doesn't enforce a closed vocabulary, but these are the commonly-shipping tokens:
rev — reverse holographic foilholo — standard holographic foil1st — 1st edition print runulim — unlimited (post–1st edition)cf — cold foilrf — rainbow foilprom — promo / promotional releasealt-art — alternate art printfull-art — full-art printsigned — signed by the artistmisprint — known misprint (with known catalog entry)Variant tokens compose, for example pkm-svobf-006-en-rev-holo. Their presence is not proof of a printing. The implementation preserves token order; it does not sort variants or verify their meaning. Examples on this page illustrate syntax, not verified catalog entries.
One SKU per card means your wishlist, your portfolio, your trade history, and your alerts all use the same identifier. No re-typing, no cross-referencing two systems. The SKU on your receipt is the SKU on the listing is the SKU in your portfolio.
Every public API endpoint that returns a card carries its canonical SKU. A reading agent doesn't need to translate between formats; the platform emits one form. A writing agent's input is normalised on accept (so legacy forms work) and stored canonically.
The SKU is the platform's stable foreign key for any card. A snapshot from today can be cross-referenced with a snapshot from 2030 because SKUs don't change shape — the spec is versioned (this is v1) and any breaking change ships under a new prefix (/api/v2/) before v1 retires.
A platform that wants to interoperate with Cambridge TCG can adopt this spec and exchange SKUs directly. The spec is published here and the parser is inspectable in the monorepo. Implementation rights: repository LICENSEand applicable more-specific notices. The specification text's CC0 dedication does not create a separate code license.
A being whose cognition doesn't share our category of "card" can still index records by canonical-form string. The SKU is language-free in structure — the language hint is one segment, not embedded in identifier semantics. The math-mirror surface (see /methodology/universal-representation) uses SKU hashes for cryptographic identity; the SKU itself is the substrate that hashing is over.
v1 — 2026-05-12. Initial publication. Spec frozen. Future versions will be additive (new game codes, new variant tokens) until a breaking change is unavoidable; that change ships under v2 with v1 remaining honored for an announced deprecation window.