For technical readers
Verify it yourself.
No Beleg-hosted tool required — just SHA-256 and the OpenTimestamps client.
Why this page exists
Every verification tool we provide runs in your browser, but you still loaded it from our server. This page shows you how to verify a Beleg ledger using only open-source tools and public infrastructure.
Verifying the chain by hand
Entries are serialized as a JSON array in fixed order — [venture_id, seq, kind, title, body, occurred_at, recorded_at] — with null values as empty strings and recorded_at normalized to ISO 8601 with a Z suffix. That string is hashed with SHA-256 to produce the content seal. The chain seal is SHA-256(previous_chain_seal + content_seal).
A worked example for the first entry in a ledger, where the previous chain seal is the genesis value (64 zeros):
# 1. The canonical string. Note: seq is a number, not a string,
# and a null body becomes "" rather than null.
ENTRY='["8f14e45f-ceea-467a-9575-6dbbb1ee0d2c",1,"milestone","Grant received","","2026-07-14","2026-07-14T16:02:11.000Z"]'
# 2. Content seal
CONTENT=$(printf '%s' "$ENTRY" | sha256sum | cut -d' ' -f1)
# 78b7f533588166d93aa8527b29405129356693601d244f0e4d0e88f3b0a8e32f
# 3. Chain seal. prev_hash for entry #1 is the genesis value, 64 zeros.
PREV=$(printf '0%.0s' {1..64})
printf '%s' "$PREV$CONTENT" | sha256sum | cut -d' ' -f1
# cf5c7dc94f334207ca1d27a11e31d4715641f8b39d555e86e5e953a1d34fd139
# Compare those to content_hash and chain_hash on the entry.
# For entry #2, set PREV to entry #1's chain_hash and repeat.Verifying a Bitcoin anchor
Download the .ots proof from a proof page, then verify it with the OpenTimestamps CLI. This checks the timestamp against the public Bitcoin blockchain with no dependency on Beleg.
pip install opentimestamps-client
ots verify yourfile.otsGetting the raw data
Any public proof page's entry data is available as JSON at /api/public/[slug]/entries — the same record the proof page renders, in machine-readable form.