Resources
API & verification endpoints
The public ledger is inspectable over plain HTTP. For any tenant you can read the current head hash, verify the chain from any sequence number, and fetch the nightly anchor — the same endpoints the human verify pages are built on.
Request an endpoint, get verifiable JSON.
Head hash
/api/ledger/{tenant}/head returns the current head of the chain.
Verify
/api/ledger/{tenant}/verify?from=0 recomputes and checks the chain from a sequence.
Anchor
/api/ledger/{tenant}/anchor.json returns the nightly published checkpoint.
Public, unauthenticated, and meant to be used against us
These endpoints take no API key. That is the point: a verification endpoint you need our permission to call would not prove much. Anyone holding a tenant slug — a journalist, a regulator, a homeowner, a rival campaign — can read the chain and check it.
The {tenant} path segment accepts a tenant slug, a public embed slug, or a tenant UUID. Every response reports the hash algorithm it was produced under as algo, currently sha256-canonical-json-v1, so a client can refuse to verify against an algorithm it does not implement.
Verify recomputes; it does not just assert
The verify endpoint streams newline-delimited JSON: a meta line describing the tenant and range, then one line per event, then a summary. Each event line carries chain_ok and hash_ok. The first reports whether the event’s prior_hash matches the actual previous event; the second reports whether re-hashing the event’s canonical encoding reproduces its stored event_hash.
Treat this endpoint as defense in depth rather than as the root of trust. The stronger check is the one you run yourself: pull the events, recompute the SHA-256 chain in your own code, and compare the head you derive against the head we publish. If those disagree, we are wrong and you can prove it.
Worked examples
Every call below is public and unauthenticated. demo-transparency is a live demonstration tenant — swap in your own slug to read your own chain.
Current head of the chain
curl -sL https://openbooks.fyi/api/ledger/demo-transparency/head{
"ok": true,
"tenant": {
"slug": "demo-transparency",
"name": "Demo Transparency Committee",
"entity_type": "campaign"
},
"head": {
"seq": 10,
"head_hash": "5563f82ea7d075fb…3de45391",
"event_count": 11
},
"algo": "sha256-canonical-json-v1"
}Verify the chain from genesis
curl -sL "https://openbooks.fyi/api/ledger/demo-transparency/verify?from=0"{"type":"meta","from":0,"to":10,"algo":"sha256-canonical-json-v1"}
{"type":"event","seq":0,"event_type":"tenant.genesis",
"prior_hash":"0000000000000000…00000000",
"chain_ok":true,"hash_ok":true}
{"type":"event","seq":1,"chain_ok":true,"hash_ok":true}
…Latest published anchor
curl -sL https://openbooks.fyi/api/ledger/demo-transparency/anchor.json{
"ok": true,
"anchor": {
"head_seq": 10,
"head_hash": "5563f82ea7d075fb…3de45391",
"event_count": 11,
"anchor_at": "…",
"ots_status": "…"
},
"algo": "sha256-canonical-json-v1"
}