Build with the archive
Stable card identifiers, every printing and a traceable history. Public JSON, ready for your project.
Kairos serves a static data API: JSON files generated from a registry release. No API key or account is required. Use GET to read a record, or download the full dataset and search it locally. There is no server-side search endpoint.
Look up a card
This browser example follows the current v3 release. Browsers send their own User-Agent automatically; cross-origin GET and HEAD requests are supported.
const response = await fetch(
"https://api.kairosarchive.net/v3/cards/C000139.json"
);
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const card = await response.json();
console.log(card.name, card.rules_text, card.printings);Choose the right identifier
codex_ididentifies a card across all its printings. Use it for decks, rules references and card-level features.printing_ididentifies a specific set, product and finish. Use it for collections and exact printing references.
Both are permanent. Names and slugs can change, so neither is a safe foreign key. Understand cards and printings.
Download a verified snapshot
For many cards, fetch registry.json once rather than crawling per-card files. Discover the newest compatible tag, fetch its immutable root, and compare the SHA-256 of the downloaded bytes with the release entry before parsing.
import hashlib
import json
import urllib.request
BASE = "https://api.kairosarchive.net"
HEADERS = {"User-Agent": "my-card-tool/1.0 ([email protected])"}
def fetch(url):
request = urllib.request.Request(url, headers=HEADERS)
with urllib.request.urlopen(request) as response:
return response.read()
versions = json.loads(fetch(f"{BASE}/versions.json"))
tag = versions["latest"]["v3"]
release = next(r for r in versions["releases"] if r["tag"] == tag)
root = versions["base_url"].rstrip("/") + "/" + tag
payload = fetch(f"{root}/registry.json")
if hashlib.sha256(payload).hexdigest() != release["sha256"]:
raise ValueError("Registry checksum mismatch")
registry = json.loads(payload)
print(tag, registry["header"]["cards"], "cards")Replace the example User-Agent with your project name and contact. Automated requests without any User-Agent are refused. Keep a cached copy of successful downloads; failures should not replace your last good data.
What to read next
- Endpoints and releases: URL patterns, aliases, indexes and caching.
- History and errata: interpret dates and all four printing statuses.
- Images: sizes, permanent addresses and missing art.
- Usage and attribution: publisher content and archive data.
Reference: registry API contract and published object definitions. Report a data or documentation issue.