Card
One record per card as a game piece; reprints share one record.
A card is the game piece: its rules, cost and stats. Reprints share one record. Gameplay data lives here and applies to every printing of the card.
Where it appears
registry.json → cards[]cards/{codex_id}.json, which adds printings, name_history and card_historyindex/cards.json, a subset of the fields
Fields
Every field is present on every record; a value that does not apply is null, never missing. Types are from the release's schema; the schema itself is the contract.
| Field | Type | Meaning |
|---|---|---|
codex_id | codex ID, C plus six digits | The card's permanent ID. |
name | string | The current name. Earlier names are in name_history. |
type | string or null | Observed values: Artifact, Aura, Avatar, Magic, Minion, Site. |
category | string or null | Coarser grouping: Spell (Minion, Magic, Artifact, Aura), Site, Avatar, Token. |
rarity | string or null | The rarity printed on the card. Observed values: Ordinary, Exceptional, Elite, Unique; null on Avatars and some tokens. |
slot | string or null | The rarity slot the card is distributed in. Agrees with rarity except for Avatars (no printed rarity) and tokens. |
subtypes | array of string | In upstream's order, e.g. ["Beast", "Spirit"]. |
elements | array of string | In upstream's order. ["None"] means colourless (Artifacts, Avatars, most Sites). |
keywords | array of string | Ability keywords the card carries (Airborne, Genesis, Spellcaster, ...), as upstream tags them. |
umbrellas | array of string | Cross-subtype groupings rules text refers to (Evil, Knight, Royalty). |
cost | integer or null | Mana cost. null for Sites and Avatars, and for X costs. |
attack | integer or null | Printed attack; null when the card has none. |
defense | integer or null | Printed defense; null when the card has none. |
power | integer or null | Derived: Sorcery's power - equal to attack when attack equals defense, otherwise floor((attack + defense) / 2); null when either is null. Published so every consumer computes the same number. |
life | integer or null | Only Avatars have a life value. |
thr_air | integer, 0 or more | Air threshold: the number of Air the card needs in play to be cast. 0 when none. |
thr_earth | integer, 0 or more | Earth threshold. 0 when none. |
thr_fire | integer, 0 or more | Fire threshold. 0 when none. |
thr_water | integer, 0 or more | Water threshold. 0 when none. |
rules_text | string | Current text the card plays by, applying to every printing. Canonicalised: \n line endings, no trailing whitespace, one line per ability. Changes are recorded in rules_history. |
back | face object: the gameplay fields of a card (see Card) or null | The back face of a double-faced card; null for every other card. The card's own fields are its front. |
errata | boolean | Registry-owned: true once any gameplay field of the card (type, elements, cost, attack, defense, life, thresholds, rules_text, back) has changed since it was printed. Seeded from the old upstream UPDATED: marker; set whenever a sync observes such a change (see card_history); corrected only through data/overrides.json. Rarity, slot, subtypes, keywords and umbrellas are classification, so a change to them is not errata. |
set_codes | array of set code: three digits, or three letters for the registry's own | Derived, sorted: the sets this card appears in. For products and finishes, follow printing_ids. |
printing_ids | array of printing ID, P plus six digits | Derived, sorted, and it only ever grows. |
default_printing_id | printing ID, P plus six digits or null | Derived: the representative printing, by a fixed rule so every consumer picks the same one - not retired, showing the card's current face (printed_as_current) over older values, Booster over other products, Standard over other finishes, most recently released, lowest id. A reprint that changed the card's stats therefore becomes the default even when it is a promo; otherwise a promo never outranks a Booster printing. A registry maintainer can pin a different printing through data/overrides.json, with a reason. null only for a card with no printings. |
api_url | string | Derived: this card's JSON object on api.kairosarchive.net, under the moving major alias (/v3/ always redirects to the newest verified v3.x release), so the address leads to the current record from any copy. |
kairos_url | string | Derived: this card's page on kairosarchive.net. |
image_urls | object: small, normal, large, original or null | Derived: the image of the card's default_printing_id (its front face), null while that printing has no image. |
image_status | "missing", "lowres" or "ok" | Derived: the default printing's image_status. |
origin | "api" or "manual" | — |
manual | object: source, recorded, confirmed_at, withdrawn or null | — |
notes | array of object: text, source, recorded | What the registry knows about this card that the official API does not say, oldest first. Empty for most records. |
Example
Card · from release v3.4.0
{
"codex_id": "C000139",
"name": "Askelon Phoenix",
"type": "Minion",
"category": "Spell",
"rarity": "Elite",
"slot": "Elite",
"subtypes": [
"Beast"
],
"elements": [
"Fire"
],
"keywords": [
"Airborne"
],
"umbrellas": [],
"cost": 5,
"attack": 4,
"defense": 4,
"power": 4,
"life": null,
"thr_air": 0,
"thr_earth": 0,
"thr_fire": 2,
"thr_water": 0,
"rules_text": "Airborne\nIf Askelon Phoenix would take fire damage, it gains +1 power this turn instead.",
"back": null,
"errata": true,
"set_codes": [
"001",
"002"
],
"printing_ids": [
"P000569",
"P000570",
"P000571",
"P000572"
],
"default_printing_id": "P000571",
"api_url": "https://api.kairosarchive.net/v3/cards/C000139.json",
"kairos_url": "https://kairosarchive.net/cards/C000139",
"image_urls": {
"small": "https://api.kairosarchive.net/images/P000571.806b0ecb6963.small.webp",
"normal": "https://api.kairosarchive.net/images/P000571.806b0ecb6963.normal.webp",
"large": "https://api.kairosarchive.net/images/P000571.806b0ecb6963.large.webp",
"original": "https://api.kairosarchive.net/images/P000571.806b0ecb6963.original.png"
},
"image_status": "lowres",
"origin": "api",
"manual": null,
"notes": []
}Reference: registry API contract and published object definitions. Report a data or documentation issue.