Verify a DomainDrift bundle
Paste any DomainDrift signed bundle, or a single signed receipt, below. The verification math (Ed25519) runs in your browser; the only network request is for DomainDrift's published public keys. If the keys cannot be fetched, results are reported as signature-only.
Accepts
Signed bundle, full
Compact Merkle rollup
A single signed receipt
Ed25519, checked against the published keys
no file chosen
or paste below
Paste a signed bundle, drop in a file, or load a live sample. The JSON is validated as you type.
- Each observation carries a
receipt_jsonThe signed commitment: the hash of what was observed, asignature, and thepublic_keythat produced it. The receipt itself holds no data - that is why the observed bytes are archived next to it. and, alongside it,signed_outputsThe exact data that was hashed and signed, archived beside the receipt so the commitment can be re-checked against the observed bytes themselves. - the receipt commits, the archived bytes let you re-check the commitment. - This page calls
DRM3Provenance.verifySignature(receipt)from the open-sourcedrm3-provenanceWASM SDK loaded with this page. That proves attribution (DomainDrift produced this receipt) and integrity (it has not been altered). - Where
signed_outputsis present, the page also canonicalizes it, computeshashValue(), and confirms it equalsreceipt.output_hash- the data-binding checkIt ties the signature to the observed data itself, not just to a hash someone states. Signature validity and data binding are reported as separate checks.. Observations recorded before DomainDrift began archiving the signed payload show binding n/a - their signatures are still valid; the optional check simply cannot be run on them. - The page also fetches DomainDrift's published key registry at /.well-known/domaindrift-keys.json and grades every signing key's lifecycleCurrent keys verify. Rotated keys verify only for receipts inside their validity window (marked "key since rotated"). Compromised, revoked, or unregistered keys FAIL even when the signature math passes.. If the registry is unreachable the result is reported as signature-only.
- Want to verify with your own tools? The SDK is on npm:
@drm3/sdk. Runnpm i @drm3/sdk, then@drm3/sdk/receiptschecks the signature and the hash and@drm3/sdk/keysgrades the key registry, the same checks this page runs.
A signature proves who produced a record and that it is unaltered: added trust, not a claim of correctness. It does not by itself prove the record was not backdated against DomainDrift's own keys. To close that, every 15 minutes the window's signed receipts are Merkle-rolled and the root is anchored to Base automatically by a dedicated attestation key, an authority that is not DomainDrift, live on Base mainnet. Once a window's root is on-chain, the block's own timestamp is the independent proof-of-time, the chain's, not ours. Per-receipt verification is live going forward: each covered receipt has a stored Merkle inclusion proof, so you can check a single receipt against its window's on-chain root entirely in your browser, hashing the short proof path up and comparing, with no need to fetch the window's other receipts. Each 15-minute window's root commits every signed receipt in that window. Everything before the 15-minute lane began is covered too: 9,129 window roots were committed to Base in a single transaction on 2026-07-29, and a receipt from one of those windows proves itself in two hops - into its window's root, and that root into the commitment. The commitment's block timestamp is when it was written, never a claim about when the reading was taken. You can also resolve any window's on-chain root and its block timestamp here directly.
Enter a 15-minute window (YYYY-MM-DDThh:mm) or a receipt id to resolve its on-chain root from Base.