Skip to main content
Every receipt QED Proof issues is appended to a Merkle tree log, in the style of RFC 6962 (the Certificate Transparency log format). This is what makes a receipt checkable independent of QED Proof’s own database: instead of trusting an API response, you verify that a receipt is included in a tree whose root is public.

Leaves

Each receipt becomes one leaf:
Interior nodes are SHA-256( 0x01 || left || right ). The 0x00 / 0x01 prefixes on leaves and interior nodes follow RFC 6962, and stop a leaf hash from ever being reinterpreted as an interior node hash (or vice versa). The log is append-only by construction — QED Proof’s storage refuses updates and deletes against receipts, leaves, and roots.

The proof object

A receipt’s proof carries what you need to check inclusion:
To check inclusion, recompute leaf_hash from the receipt’s own body and signature, then run the RFC 6962 audit-path verification using leaf_index, tree_size, and the hashes in inclusion. It must produce exactly root_hash. anchor may be absent — that happens at trust level 1, or at trust level 2 before an anchor has landed yet for this part of the tree. An absent anchor is a limitation of the proof, not an invalid receipt. See anchoring for what it adds, and check a receipt for running this verification yourself.

Read the log yourself

The log is free and public: no account, no API key, and any website may call it from a browser. Reads are rate-limited per IP address.
The tree head is signed under its own domain (POAW-TREE-HEAD-V0), so it can never be mistaken for a receipt. Keep the heads you fetch: a later head that isn’t consistent with an earlier one is proof the log was rewritten. To check a receipt against a head you hold, run check.py --head <file-or-url>. The full endpoint list is in the API reference, and qedproof.site/log shows the same data.