Methodology
Every receipt on BitPredict is only worth what its settlement is worth. This page is the exact procedure — where the open and settle prices come from, the tie rule, the fallback path we disclose instead of hide, and the public hash chain that lets anyone check that settled history was never rewritten.
Horizons are 1h, 24h, 7d, and 30d; expiry is the open timestamp plus the horizon. At settle time we fetch the Binance 1-minute candle covering the exact expiry minute and settle on its close — not on whatever price happened to be cached when the settlement job ran. That candle is persisted to our database as evidence, and the receipt records the provenance: settle_price_source = candle_1m with the candle’s minute as settle_price_at.
If Binance can’t return that exact minute (outage, delisting — a neighboring candle doesn’t count), we don’t substitute a candle from the wrong minute. The call settles on the latest market snapshot at the settlement tick instead, and the receipt says so: settle_price_source = snapshot. The fallback is disclosed on the receipt and in the digest entries below, never dressed up as a candle.
Every completed UTC day gets one digest row. The day’s settled calls — ordered by settle time, then id — are serialized to canonical JSON and hashed (SHA-256) into an entriesHash. That hash is then chained: chainHash = sha256(previous chainHash + entriesHash), with the first day chaining from an empty string. Days with zero settles still get a row, so a missing day can’t be passed off as a quiet one. Editing or deleting any historical settle changes that day’s entries hash and breaks every chain hash after it.
Public verification endpoints
GET https://app.bitpredict.io/api/public/settlement-digest
GET https://app.bitpredict.io/api/public/settlement-digest/<YYYY-MM-DD>To verify a day yourself:
entries array it hashed.sha256(JSON.stringify(entries)) — it must equal entriesHash.sha256((prevChainHash ?? "") + entriesHash) — it must equal chainHash.The endpoint also recomputes both hashes from today’s live rows on every request and returns a consistent flag — a verification we could quietly skip wouldn’t be a verification. Both endpoints are unauthenticated and CORS-open. Only completed UTC days are digested; today is still in progress.
The newest links in the chain, read live from the same table the public API serves. Compare any row against /api/public/settlement-digest — they must match, or something is wrong and you caught it.
| UTC day | Settles | Chain hash |
|---|---|---|
| 2026-07-05 | 0 | d2d8d0fb54…5cf18948e1 |
| 2026-07-04 | 0 | 35de77e374…bf30908f9d |
| 2026-07-03 | 0 | d43f3366e6…b7a3eaadb3 |
| 2026-07-02 | 1 | fb5cc70d24…95cf109100 |
| 2026-07-01 | 0 | d4c83447d0…a3187ad749 |
| 2026-06-30 | 0 | 8bb1bc7cd9…f2191d2a64 |
| 2026-06-29 | 1 | c917f40997…c913466ae1 |
Every receipt names the price source that settled it and links back here. Building on the data instead? The crowd is also an API.