Card history row
Every state a card's gameplay face has been in, as observed by syncs: the face's fields flattened into the row. valid_to null = the current face, which equals the card record. A closed row is how the card played until valid_to; a printing released within a row's dates was printed with that row's values. Seeded with every card's face on 2026-09-09.
One row per state a card's gameplay face has been in, with the dates it was in force. Every card has exactly one open row, and it equals the card record.
Where it appears
registry.json → card_history[]history/cards.jsoninside cards/{codex_id}.json, without codex_id
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 this face belongs to. |
valid_from | date, YYYY-MM-DD | Start of the range this face was in force. What the date means depends on source. |
valid_to | date, YYYY-MM-DD or null | End of the range; null for the current face. |
source | "api", "card" or "manual" | Where the face came from: 'api' when the registry observed it in the official API; 'card' when it was recorded by hand from what is printed on the card (data/errata.json), the case of a card whose printed text differs from the text the API serves; 'manual' for the face of a card the registry recorded by hand because the API does not serve it (data/manual.json). |
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 at that time; null unless the card is double-faced. |
Example
{
"codex_id": "C000139",
"valid_from": "2023-06-22",
"valid_to": "2026-09-15",
"source": "card",
"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 damage from a fire spell or ability, it gains +1 power this turn, instead.",
"back": null
}Reference: registry API contract and published object definitions. Report a data or documentation issue.