Kairos Archive

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.

Browser · fetch one card
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);

Open Askelon Phoenix JSON →

Choose the right identifier

  • codex_id identifies a card across all its printings. Use it for decks, rules references and card-level features.
  • printing_id identifies 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.

Python · discover, download and verify
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


Reference: registry API contract and published object definitions. Report a data or documentation issue.