Your cart is empty
Browse CatalogYour sell cart is empty
Add cards from the buylist to get started
Different trading card games have fundamentally different ontologies for what the same card across languages means. Cambridge TCG names the policy per game, in code, so partners, agents, and future operators can see the strategy without inferring it from data.
Most aggregators silently merge cross-language printings, silently split them, or silently invent equivalences. We declare the policy each game gets — and where the policy admits no upstream anchor, we say so.
Where this lives in code. The canonical table isORACLE_POLICYinpackages/sku/src/oracle.ts. The machine-readable feed is/api/v1/oracle-policies. The pure-compute resolver isresolveOracle(sku, anchors)in the same package. The cross-language query surface is/api/v1/cards/[sku]/cross-language(planned).
Every registered game falls into one of four patterns. The pattern determines how the platform derives the oracle id — Cambridge TCG's canonical, language-stripped identifier for a card across its cross-language siblings.
The publisher uses the same set code and card number across language tracks. OTJ-001 in English is the same printing as OTJ-001 in Japanese — only the printed text differs. The oracle is <game>-<set>-<number>[-<variant>]; the language tail is dropped.
Pattern A games: MTG, One Piece, Lorcana, Star Wars Unlimited, Digimon, Battle Spirits Saga, Dragon Ball Fusion World, and the rest of the Bandai and Bushiroad families.
The publisher mints a global stable identifier. Konami's 8-digit passcode for Yu-Gi-Oh!: every printing of Blue-Eyes White Dragon — across 30+ sets, 8 languages, two regions (TCG vs OCG) — carries passcode 89631139. The SKU set, number, and language are all derivative; the passcode is primary. The oracle is <game>-<passcode>[-<variant>].
Pattern B games: Yu-Gi-Oh!, Rush Duel.
Different language tracks have different set codes and different reprint composition. Pokémon's JP track (s4, sv1, sm12a) and EN track (swsh4, sv01, sma) are roughly equivalent in spirit but not in identity. The publisher does not assert equivalence; no upstream source provides it. The oracle is null — a substrate-honest gap.
For diverged-pattern games, cross-language sibling discovery requires the pkm_equivalence table — operator-curated, partner- submittable, image-hash-seedable. Until an equivalence is curated, JP and EN printings are accounted as different cards. This is the upstream truth, not our deficiency.
Pattern C games: Pokémon TCG, Pokémon Pocket.
The game ships in one language only; cross-language siblings do not exist by construction. The oracle is the stripped form (same as Pattern A) but the kind is named distinctly to communicate intent — Pattern D will never gain a language sibling unless the publisher opens a new track.
Pattern D games: Flesh and Blood, Sorcery: Contested Realm, Riftbound.
The variant tail of the SKU — foil, alt-art, 1st, etched — is preserved on the oracle. Foil-EN and foil-JA share an oracle (they are language siblings of the same variant). Foil-EN and non-foil-EN do not share an oracle (they are variant siblings of the same language). Substrate-honest: variant is a structural dimension orthogonal to language.
Every registered game and its policy. The full table is also queryable machine-readably at /api/v1/oracle-policies.
| Game | Publisher | Languages | Pattern | Rationale |
|---|---|---|---|---|
op — One Piece TCG | Bandai | ja, en, zh, ko | Pattern A — stripped | JP-first, EN-parallel; same set codes across language tracks. |
pkm — Pokémon TCG | TPCi | en, ja, zh, ko, fr, de, es, it, pt | Pattern C — diverged | JP-track (s4, sv1, sm12a) and EN-track (swsh4, sv01, sma) have different set codes and partial reprint overlap; no upstream equivalence anchor. Requires manual equivalence curation (pkm_equivalence table). |
mtg — Magic: The Gathering | Wizards | en, ja, zh, ko, fr, de, es, it, pt, ru | Pattern A — stripped | Same numbering across 10 languages; (game,set,number) is the anchor. |
ygo — Yu-Gi-Oh! | Konami | en, ja, zh, ko, fr, de, es, it | Pattern B — passcode | Konami passcode (8-digit) is the global cross-language anchor; SKU set/lang are derivative. |
dbs — Dragon Ball Super CCG | Bandai | en, ja | Pattern A — stripped | Bandai legacy: same set codes across JP/EN. |
dbf — Dragon Ball Super Fusion World | Bandai | en, ja | Pattern A — stripped | Bandai pattern: same set codes across JP/EN. |
wei — Weiß Schwarz | Bushiroad | ja, en | Pattern A — stripped | Bushiroad pattern: JP-primary, EN-parallel where shipped. |
vng — Cardfight!! Vanguard | Bushiroad | en, ja | Pattern A — stripped | Bushiroad pattern: same set codes across JP/EN. |
dmw — Digimon Card Game | Bandai | en, ja | Pattern A — stripped | Bandai pattern: JP-first, EN-parallel, same set codes. |
bsr — Battle Spirits Saga | Bandai | en, ja | Pattern A — stripped | Bandai pattern: same set codes across JP/EN. |
lcg — Living Card Game | various | en, ja | Pattern A — stripped | LCG umbrella covers multiple games; per-product adapter still needed for cross-product oracles. |
fab — Flesh and Blood | LSS | en | Pattern D — single-language | Flesh and Blood ships in English only; cross-language siblings do not exist. |
lgr — Disney Lorcana | Ravensburger | en, fr, de | Pattern A — stripped | Simultaneous global release in EN/FR/DE; matched numbering. |
swu — Star Wars Unlimited(anticipated) | Fantasy Flight Games | en, fr, de, es, it | Pattern A — stripped | Simultaneous EN/FR/DE/ES/IT release; matched numbering. |
sor — Sorcery: Contested Realm(anticipated) | Erik Olofsson | en | Pattern D — single-language | Sorcery: Contested Realm ships in English only. |
alt — Altered TCG(anticipated) | Equinox | en, fr | Pattern A — stripped | Simultaneous EN/FR release; matched numbering. |
rft — Riftbound(anticipated) | Riot Games | en | Pattern D — single-language | Riftbound (Riot, 2025+) launches English-only; revise on confirmation. |
rsh — Yu-Gi-Oh! Rush Duel(anticipated) | Konami | ja, en | Pattern B — passcode | Rush Duel uses the YGO passcode system; same anchor model. |
pkp — Pokémon Pocket(anticipated) | TPCi | en, ja, zh, ko, es, fr, de, it | Pattern C — diverged | Mobile-derived catalog; per-region differences expected; status confirmed on first ingest. |
gen — Genshin Impact TCG(anticipated) | HoYoverse | en, zh, ja, ko | Pattern A — stripped | Publisher TBD; default to stripped pending first ingest confirmation. |
tst — Test | (internal) | en | Pattern D — single-language | Internal test game; English-only by convention. |
apps/storefront/src/lib/cards/name.ts (kingdom-075), which honours Accept-Language and the user's preferences.card_set_cards (K2 schema migration) so federation by upstream id remains a first-class operation./api/v1/oracle/[oracle_id]/prices endpoint, downstream of the schema migration.A platform that silently merges a JP Pokémon printing with an EN one is either lying or guessing. A platform that silently splits a German MTG printing from its English sibling is either lying or missing the feature. We publish the policy so a partner reading our data knows which we do, and why, and can build against the contract.
Where the policy is diverged — Pokémon — the gap is named and the path to closure is named. Where the policy is passcode — Yu-Gi-Oh! — the anchor is named and the normalizer's job is named. Where the policy is stripped — MTG, OP, Lorcana, SWU, the Bandai family — the operation is mechanical and the cross-language siblings are queryable.
Substrate honesty applied to identity itself.