CTCG-NAMES-v1says how to write down a card's name: which card it belongs to, in which language, how the name is known and where it came from. It sits beside the SKU standard: a SKU names one printing, and this standard names the card its printings share, in each language.
Version 1.0 is a draft and may change before it is frozen. No Cambridge endpoint returns these records yet; the shape and rules are published first so that people and agents can check them and build on them.
Where this lives in code. The reference implementation ispackages/sku/src/names.ts, exported from@cambridge-tcg/sku.cardName()builds and checks a record;cardNameText()andcardNameKey()give the text form and the match key;chooseCardName()andprintingName()pick the name to show;cardRushName(),tcgplayerName()andcardmarketName()are the vendor rules. The record's JSON Schema is /spec/v1/CardName.schema.json.
<game>-<set>-<number> the card keyThe card key is a CTCG-SKU-v1 canonical SKU without its language and variant segments. op-op01-001-ja, op-op01-001-en and op-op01-001-en-p1 all have the card key op-op01-001.
lang and scriptare the language and script its text is written in, never the printing's or the source row's. An English name read from a listing of a Japanese printing is an English name.op-op01-001-en-p1 is named by the English name of op-op01-001.sku. It then names that printing only.| Field | Required | Meaning |
|---|---|---|
spec_version | yes | Always ctcg.card-name/1. |
card_key | yes | <game>-<set>-<number>, with a registered game code. |
lang | yes | The language the text is written in, as a CTCG-SKU-v1 language code: lowercase ISO 639-1, such as ja or en. Legacy aliases such as jp are refused. |
script | no | The script the text is written in, as an ISO 15924 code such as Latn, for a romanisation. Absent means the language's usual script. |
text | yes | The name, in the text form below. |
key | yes | The match key below. For matching only; never displayed. |
status | yes | One of official, vendor, community, machine. |
source | yes | A source registry id, such as bandai-en, cardrush, tcgplayer or cardmarket. |
source_url | no | The https page the name was read from, with a DNS host and no credentials. Spaces and non-ASCII characters must already be percent-encoded; the URL is not repaired. |
observed_at | yes | When the source was read, in RFC 3339, on a real date and clock time. |
rule | yes | The extraction rule and its version, such as cardrush-title/names-1, or verbatim when the text was taken as printed. An official name's rule is always verbatim. |
illustrator | no | An illustrator credit taken from the source's markers. Never part of the name. |
sku | no | One printing's canonical SKU, for a name printed on that printing only. Its card key and language must be the record's. |
{
"spec_version": "ctcg.card-name/1",
"card_key": "op-op01-001",
"lang": "en",
"text": "Roronoa Zoro",
"key": "roronoazoro",
"status": "official",
"source": "bandai-en",
"observed_at": "2026-10-29T00:00:00Z",
"rule": "verbatim"
}An illustrative record, built for this page. No catalogue row or source was read for it.
officialvendorcommunitymachineShowing a name follows these rules:
source, then by text, in Unicode code point order.A record keeps a name in Unicode NFC, trimmed, with each run of whitespace collapsed to one space (U+0020). Whitespace means what ECMAScript's \smatches, which includes the ideographic space U+3000. Nothing else changes: official text keeps the publisher's punctuation (such as ・), letter case and character width.
To compare names, compute the key: Unicode NFKC, then remove all whitespace and the middle dots U+30FB (・), U+FF65 (・) and U+00B7 (·), then lowercase without regard to locale. Removing comes before lowercasing so that a Greek final sigma (ς) does not depend on spacing. Two texts name the same thing exactly when their keys are equal. Keys are for matching and are never displayed.
モンキー・D・ルフィ → モンキーdルフィ
モンキー・D・ルフィ → モンキーdルフィThe first is printed with a full-width D (U+FF24), the second with a half-width D. Their texts stay different; their keys are equal.
Shops and marketplaces write variant, rarity and condition markers into their titles. Each rule below removes them and returns the name, the illustrator credit if there is one, and the markers it removed; or it refuses, with a reason. A rule never guesses. A changed rule ships under a new version, so a record's rule says exactly how its text was made. Official names need no rule: their rule is verbatim and only the text form applies, and cardName() refuses an official record with any other rule.
cardrush-title/names-1〔condition〕* name (markers)? 【rarity】 {SET-NUM([RELEASE])?}英語版, 韓国語版, 中国語版, 簡体字版, 繁体字版 where they stand in ( ) or 【 】, as the CardRush collector does.not_a_card_title).(…) group, split it at /. When every token is a known marker or illust:<credit>, remove the group; the credit becomes illustrator. An unknown token is refused (unrecognised_marker), and so is a second credit (conflicting_illustrators).unexpected_bracket). A language marker or パラレル left in the name outside those brackets is refused (marker_in_name): the collector reads language markers, and the classifier パラレル, anywhere in a title. An empty name is refused (empty_name).Known markers: パラレル, 漫画絵, 和柄, 漫画背景, 漫画, マンガ, アルト, オルタネート, and the language markers above.
A language marker says which printing a listing is for, not which language its name is written in, so a record's lang comes from the text and the marker stays in markers. The names in the One Piece titles captured on 2026-10-28 are written in Japanese (lang: "ja"). None of those titles carried a language marker, so how CardRush writes the name on a listing marked 英語版 has not been seen.
tcgplayer-product/names-1 - 069/073 and parenthesised groups, one at a time. A group must be a card number such as (001), or a known variant marker: Parallel, Alternate Art, Box Topper, Manga. Any other group is refused (unrecognised_marker).The product names in the captured price guides are written in English, also on the Pokemon Japan line, whose rows are Japanese printings: Boss's Orders - 069/073 is one of them and gives an English name, lang: "en".
cardmarket-product/names-1Remove one trailing collector number, an upper-case set code and a number such as (OP01-001) or (P-001). Keep the rest verbatim. The rule knows no variant markers, so any bracket left in the rest, such as (Parallel) or (Pre-Release), is refused (unexpected_bracket), and so is an empty name. The product-list names in the collector's test fixtures are English, lang: "en".
| Source title | Name | Illustrator | Markers removed |
|---|---|---|---|
CardRush: 〔状態C〕お玉(illust:sowsow)【UC】{OP01-006} | お玉 | sowsow | 状態C |
CardRush: ロロノア・ゾロ(パラレル/漫画絵)【L/P】{OP01-001} | ロロノア・ゾロ | — | パラレル, 漫画絵 |
CardRush: 〔状態A-〕ナミ(パラレル/和柄/illust:S-KINOKO)【SP】{OP01-016[OP05]} | ナミ | S-KINOKO | 状態A-, パラレル, 和柄 |
CardRush: 〔PSA10鑑定済〕モンキー・D・ルフィ(パラレル/illust:Hachi Takashi)【R/P】{OP16-034} | モンキー・D・ルフィ | Hachi Takashi | PSA10鑑定済, パラレル |
TCGplayer: Roronoa Zoro (001) (Parallel) | Roronoa Zoro | — | Parallel |
TCGplayer: DON!! Card (Manga) (Alternate Art) | DON!! Card | — | Alternate Art, Manga |
TCGplayer: Boss's Orders - 069/073 | Boss's Orders | — | — |
Cardmarket: Roronoa Zoro (OP01-001) | Roronoa Zoro | — | — |
CardRush: ロロノア・ゾロ(パラレル/SP仕様)【L/P】{OP01-001} | Refused: unrecognised_marker (SP仕様) | ||
Cardmarket: Roronoa Zoro (Parallel) | Refused: unexpected_bracket (Roronoa Zoro (Parallel)) | ||
The titles are identifiers from the collectors' test fixtures. The results are computed by the reference implementation, not typed by hand.
docs/STANDARDS-LICENSE.md). A name taken from a source keeps that source's terms; this standard grants no right to collect, store or republish it.The reference implementation is packages/sku/src/names.ts in the monorepo. The JSON Schema checks structure only; the text form, the key's derivation and the agreement between sku and card_key are checked by cardName(). Implementation rights: Apache-2.0 per the repository LICENSE (licence text) and applicable more-specific notices. The specification text's CC0 dedication does not create a separate code license.
v1.0 — 2026-10-29. Draft. First publication, in answer to Yu's request that day: “We can set standard for the official translation too, for card names and format, just like SKU.” The card key, the record's fields, the statuses and their order, the text form, the match key and the three vendor rules were designed by the agents who drafted this version, not chosen by Yu. Any of them may change before v1 is frozen; a changed vendor rule gets a new rule version.