Verify it yourself
Reserve API
Two public JSON endpoints feed every number on the site. They read the contracts and refresh at most once a minute.
/api/reserve
The reserve as the contracts record it: totals, every acquisition and every withdrawal.
GET /api/reserve
{
"source": "chain",
"chainId": 4663,
"block": 59537364,
"contracts": { "token": "0x…", "router": "0x…", "reserve": "0x…" },
"sets": 1, "bricks": 10001, "costUsd": 629.99, "kg": 11.68,
"reserveEth": 0.0411,
"acquisitions": [
{ "n": 1, "set": "10307", "costUsd": 629.99, "custody": "vaulted",
"withdrawalId": 1, "verified": true }
],
"withdrawals": [ { "id": 1, "eth": 0.26, "to": "0x…", "at": "2026-09-20T…" } ],
"nextTarget": { "number": "10307", "name": "Eiffel Tower" }
}verified is true when the metadata file still hashes to what the chain recorded, false when it doesn't, and null when there is no file yet.
/api/war-chest
Progress toward the next box.
| Field | Meaning |
|---|---|
reserveEth | ETH in the reserve contract. |
pendingEth | ETH waiting for a harvest, in the escrow or the router. |
unsweptEth | The creator share still on the curve or pool. |
fundedUsd | (reserveEth + reserve share of pending and unswept) at the ETH price. |
pct | fundedUsd over the next target's retail price, capped at 1. |
lifetimeEth | Every creator fee so far: harvested plus waiting. |
Freshness and errors
Both endpoints are cached for 60 seconds, then rebuilt from the chain on the next request. The ETH price comes from CoinGecko. If a read fails, the response says so in error or warning instead of passing old numbers off as new ones.