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.

FieldMeaning
reserveEthETH in the reserve contract.
pendingEthETH waiting for a harvest, in the escrow or the router.
unsweptEthThe creator share still on the curve or pool.
fundedUsd(reserveEth + reserve share of pending and unswept) at the ETH price.
pctfundedUsd over the next target's retail price, capped at 1.
lifetimeEthEvery 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.