A SKU is a machine-readable card identifier. The shared grammar supports registered games and recognized legacy forms. Valid syntax does not prove that a card, printing or source-price mapping exists.
This page describes the identifier grammar. Existing storage and API readers still include legacy identifiers; each boundary must state which forms it accepts and returns.
Where this lives in code. The canonical implementation ispackages/sku/in the monorepo.parseSku(),buildSku(),normalizeSku(), and theGAMESregistry live there.skuIdentity()keeps the supplied identifier alongside its normalized syntax candidate.
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. Adoption is explicit at each read or write boundary; this utility does not rewrite stored identifiers.
The variantsegment 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.
Search and card composition preserve the stored sku and add an identity object with raw_sku, a normalizedcanonical_sku and scope: syntax_only. Other endpoints may still use legacy forms. Normalization alone is never sufficient to join a price to a physical printing.
Preserve raw identifiers, source references and the version of the normalization rules with each snapshot. The grammar is v1. Future breaking changes need an explicit migration; this package does not rewrite historical keys or promise that every stored alias is unique.
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.