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
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
}| Field | Type | Units / meaning |
|---|---|---|
| domain | string | snapshot schema id: spiritcards.fun/stats/1 |
| updatedAt | string | ISO-8601 UTC, time of the on-chain reads |
| chainId | integer | 4663 |
| contract | string | 0x address used for the reads |
| site | string | canonical site URL |
| totalMinted | integer | cards minted |
| maxSupply | integer | final supply cap (8,888) |
| currentPriceEth | string | current mint price in ETH; "0" means free |
| baseBits | integer | bits (base difficulty) |
| mineCooldownSeconds | integer | seconds between mints per wallet |
| mergeFeeEth | string | merge fee in ETH |
| burned | integer | cards burned by merging |
| forged | integer | cards forged by merging |
| paused | boolean | mint 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}| Field | Type | Units / meaning |
|---|---|---|
| ts | string | ISO-8601 UTC timestamp of the snapshot |
| totalMinted | integer | cards minted |
| currentPriceEth | string | decimal ETH price |
| baseBits | integer | bits (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