Verifiable, not trust-me

How verification works

Your usage records live in our database — but a cryptographic commitment to them is anchored on Base, so you never have to take our word for what we recorded or billed.

What gets anchored

Each turn becomes a leaf committing its one-way content fingerprint (never the content) plus its billing fields — model, tokens, cost, economy lane. Leaves are built into a per-user Merkle subtree, then an hourly epoch tree, and the root is written to an append-only ledger contract on-chain, chained to the previous root.

Only hashes ever touch the chain. No prompts, no content, no PII.

What it proves
  • • The records we show you are the ones anchored on-chain.
  • • Your turns' fingerprints and billing can't be altered after anchoring.
  • • The ledger is append-only — no epoch can be rewritten or reordered.
  • • You can check all of this yourself, reading the root straight from Base.
What it does not prove
  • • That we recorded every turn — omission before anchoring is invisible to third parties. Your local corpus (ir data show) is the check for that.
  • • Content authenticity — fingerprints are computed on your machine; a lying client only corrupts its own records.
  • • Privacy — that's the separate TEE track. Anchoring proves “can't be rewritten”, not “we can't read it.”

Verify it yourself

One command
ir verify

It fetches your records' Merkle proofs, reads the roots directly from the anchor contract on base-sepolia (0x29Da07051225b2aB5EebAfeE642EfecA792d92aC), and checks each proof against the on-chain root — trusting nothing we serve. A mismatch means the data doesn't match what was anchored.

The proof format, leaf derivation, and contract address are all public, so you can reimplement the check in any language. Browse the anchored ledger on the transparency page.