← Docs · Collection

Stats dataset

Spirit Cards publishes machine-readable statistics generated from live on-chain reads. The data is served as static, server-rendered resources that work without JavaScript or a wallet, so an agent can fetch and cite concrete numbers instead of scraping. Reference contract:0x0997DB0BEa2c1278063ebBEc0d1cdbecE7B6F021.

1. Endpoints

/statsHuman and agent readable HTML view (server-rendered, no JavaScript).
/stats/current.jsonA single object — the latest live snapshot.
/stats/history.jsonlJSON Lines — one snapshot per line, append-only, chronological.

The HTML page at /stats is the human view (it also carries a schema.org/Dataset JSON-LD block); the two JSON resources are the machine contract described below.

2. /stats/current.json

A single JSON object: the most recent snapshot, a direct read of the contract. Example (values illustrative):

{
  "domain": "spiritcards.fun/stats/1",
  "updatedAt": "2026-09-16T21:08:56.181Z",
  "chainId": 4663,
  "contract": "0x0997DB0BEa2c1278063ebBEc0d1cdbecE7B6F021",
  "site": "https://spiritcards.fun",
  "totalMinted": 1,
  "maxSupply": 8888,
  "currentPriceEth": "0.00037",
  "baseBits": 20,
  "mineCooldownSeconds": 45,
  "mergeFeeEth": "0.00002",
  "burned": 0,
  "forged": 0,
  "paused": false
}
FieldTypeUnits / meaning
domainstringsnapshot schema id: spiritcards.fun/stats/1
updatedAtstringISO-8601 UTC, time of the on-chain reads
chainIdinteger4663
contractstring0x address used for the reads
sitestringcanonical site URL
totalMintedintegercards minted
maxSupplyintegerfinal supply cap (8,888)
currentPriceEthstringcurrent mint price in ETH; "0" means free
baseBitsintegerbits (base difficulty)
mineCooldownSecondsintegerseconds between mints per wallet
mergeFeeEthstringmerge fee in ETH
burnedintegercards burned by merging
forgedintegercards forged by merging
pausedbooleanmint pause flag

Units in one line: ETH is the native gas token with 18 decimals, so the underlying on-chain prices are uint256 values in wei (1 ETH = 1e18); the snapshot exposes them already scaled as decimal strings in currentPriceEth and mergeFeeEth ("0" means free). baseBits is a leading-zero-bit difficulty.

3. /stats/history.jsonl

A JSON Lines file: one compact JSON object per line, no surrounding array, no commas between lines. Each line is a lightweight snapshot (a subset of current.json, with ts instead of updatedAt), appended oldest first:

{"ts":"2026-09-16T17:00:00.000Z","totalMinted":1,"currentPriceEth":"0.00037","baseBits":20}
{"ts":"2026-09-16T19:00:00.000Z","totalMinted":1,"currentPriceEth":"0.00037","baseBits":20}
{"ts":"2026-09-16T21:08:56.181Z","totalMinted":1,"currentPriceEth":"0.00037","baseBits":20}
FieldTypeUnits / meaning
tsstringISO-8601 UTC timestamp of the snapshot
totalMintedintegercards minted
currentPriceEthstringdecimal ETH price
baseBitsintegerbits (base difficulty)
  • Append-only and chronological (oldest first); the last line is the most recent recorded state.
  • Parse line by line (streaming); ignore blank lines. Do not assume a key exists in every line — the shape is a stable subset and may grow additively.
  • The line count equals the number of recorded changes, not the number of mints (see the cadence note below).

4. Methodology

  • Source. Every value is read directly from the deployed contract on Robinhood Chain over RPC via viem (eth_call). There is no indexer and no database behind the numbers.
  • Reads. Core views (totalMinted, maxSupply, currentPrice, baseBits, mineCooldown, mergeFee, paused), plus burned() and forged() for the burn and merge counters; the chain id comes from the build env.
  • Cache and freshness. current.json is generated with a short cache (about 60 seconds; s-maxage=60, stale-while-revalidate=300) and always carries updatedAt, the timestamp of the reads. Treat updatedAt as authoritative and do not cache the file in a consumer for longer than that.
  • History. history.jsonl is served from a repo-seeded file and appended by a small ops cron that polls current.json and writes a new line only when the values change (with a one-hour dedup window while the chain is quiet).
  • Determinism. Rarity and difficulty are recomputed from on-chain state; the exact math is documented on /docs/verification.

5. How to cite

Quote the URL, the dataset id and the updatedAt timestamp so the number is reproducible:

Spirit Cards stats — chainId 4663, contract 0x0997DB0BEa2c1278063ebBEc0d1cdbecE7B6F021,
dataset spiritcards.fun/stats/1, https://spiritcards.fun/stats/current.json, updatedAt <ISO-8601 UTC>.
  • For difficulty, quote baseBits and currentRequiredBits in bits.
  • For price, quote currentPriceEth and say it is in ETH (the 18-decimal native gas token).
  • For supply, quote totalMinted / maxSupply and burned / forged.

6. Cadence and versioning

  • current.json: refreshed continuously with a cache of about 60 seconds.
  • history.jsonl: one new line per change (a mint, a price change, pause/unpause), appended by the ops cron with a one-hour dedup window.
  • Versioning. The schema is versioned by domain (spiritcards.fun/stats/1); new keys are added in a backward-compatible way and a breaking change bumps the suffix. Optional expansions (for example a flat CSV mirror and richer rarity coverage) are planned and would be added additively.

Related: Agent access · Verification · Live stats · Docs index · GitBook

Spirit CardsBuilt on Robinhood Chain · Collect · Evolve · Stake · Battle// A more elemental tomorrow