RunVouch / Verifiable agent runs

Prove what your AI agent did. To anyone, without trusting us.

A tamper-evident record for every run of an unattended agent: what ran, when, with which evidence, at what cost. Hashed the moment the run ends, chained in a public daily file, anchored in Bitcoin. An auditor verifies it with a 60-line script and the open-source OpenTimestamps client. Included on every plan, Free too.

Get a free keyRead the mechanism

Who needs this, and why now

An agent that runs while nobody watches produces two things: a result, and a claim that it produced the result. Until now the claim lived in a log file that the same team could edit. Three groups are starting to ask for more than that.

Finance and compliance teams, internal audit, and engineers who have to hand something to those teams: this page is for you. RunVouch does not make anyone compliant. It gives you a record an auditor can verify themselves.

How it works, in five lines

  1. When a run ends, RunVouch builds one JSON object with the facts of the run and stores its sha256, the leaf. Written once, in the same transaction that ends the run.
  2. Every UTC day, the leaves of all runs of all accounts form a Merkle tree. The top is the day root.
  3. chain_hash = sha256(prev + ":" + date + ":" + root) links the day to the previous day. First day: 64 zeros.
  4. The day file (date, root, prev, chain hash, list of run_id and leaf) is public at api.runvouch.com/proof/. No login. Run ids are random; the file does not reveal who ran what.
  5. The day file is stamped with OpenTimestamps, which commits its hash in a Bitcoin block. The .ots file sits next to the day file.
rv proof RUN_ID            # the proof JSON: record, leaf, Merkle path, root, chain hash, ots status
rv proof RUN_ID --verify   # recomputes everything against the public day file; exit 0 or 1

What is in the record, and what is not

The record has these keys and nothing else: run_id, agent, account_id, started, ended, status, cost, tokens, tool_calls, output_bytes, evidence, evidence_ok, source, exit, tool_events_hash. Evidence is a map of check names to true or false: the file changed, the URL returned 200, the assertion held. tool_events_hash covers the ordered tool events of the run: tool name, the input hash the client sent, ok flag, timestamp.

Not in it: prompts, model output, tool inputs, file contents, log lines. RunVouch never receives those, so it cannot hash them. That is a limit and a feature at once: the proof shows that a run with these numbers and these evidence verdicts ended at this time and was not edited afterwards. It does not show what the agent wrote. If you need the content itself under seal, hash the output file on your side and pass that hash as an evidence check; it then becomes part of the record.

The record is built from what your client reported. If the client lies about cost, the proof preserves the lie faithfully. What the chain rules out is editing afterwards, by you or by us. The full list of limits is on docs/proof.

Verify without trusting RunVouch

Two open tools, neither of them ours to run:

curl -H "X-API-Key: rv_..." https://api.runvouch.com/v1/runs/RUN_ID/proof > proof.json
curl https://api.runvouch.com/proof/days/2026-08-25.json > day.json
python3 verify_proof.py proof.json day.json
PASS leaf hash matches the record
PASS merkle path leads to the root
PASS day file lists this run with this leaf
PASS day file root recomputed from its leaves
PASS chain hash of the day
VERIFIED

verify_proof.py is Python 3, standard library only, about 60 lines you can read in full before you run it. Change one byte of the record and the first line reads FAIL with exit code 1. For the Bitcoin anchor:

pip install opentimestamps-client
curl -O https://api.runvouch.com/proof/days/2026-08-25.ots
ots verify 2026-08-25.ots -f day.json

With a local Bitcoin node this checks the block header itself; without one it tells you which block to look up in any explorer. A day whose ots_status still reads pending is sealed but not yet in a block; usually a matter of hours.

Pricing

Proofs are on every plan, including Free. They are part of how runs are stored, not an add-on. The plans differ in the number of agents, history and alert channels: pricing. On Free the full run record is purged after 7 days, on Solo and Team after 90; the leaf hash stays in the public day file, so a proof you saved keeps verifying after that.

Questions an auditor will ask

Does RunVouch make my agent compliant with the EU AI Act?

No, and nobody can promise that with a tool. The Act introduces logging and record-keeping duties for providers and deployers of high-risk AI systems. RunVouch gives you one piece of that: a record per run that cannot be altered afterwards without it showing, and that an auditor can verify with a script rather than with your word. Whether your system is high-risk, and what else you must keep, is a question for your legal counsel.

What exactly is in the record?

run_id, agent, account_id, started, ended, status, cost, tokens, tool_calls, output_bytes, evidence (name to true/false), evidence_ok, source, exit (when reported) and tool_events_hash, a hash over the ordered tool events (tool name, input hash, ok flag, timestamp). Nothing else. Prompts, model output, tool inputs and file contents never reach RunVouch, so they are not in it.

Can RunVouch change a record after the fact?

Not without it showing. The leaf hash of the run is written in the same database transaction that ends the run, the leaves of the day are published in a public day file with a Merkle root, the root is chained to the previous day, and the day file is stamped in Bitcoin with OpenTimestamps. Changing one leaf changes the root that every other customer can see and that the Bitcoin attestation no longer matches.

Do I need to trust RunVouch to verify a proof?

No. templates/verify_proof.py is a standalone Python 3 script, standard library only, that recomputes the leaf, the Merkle path, the day root and the chain hash. The Bitcoin anchor is checked with the open-source OpenTimestamps client: ots verify DATE.json.ots -f DATE.json. Neither step calls RunVouch code.

Which plans include proofs?

All of them, including Free. Proofs are part of how runs are stored, not a feature we switch on. On Free the full run record is purged after 7 days, on Solo and Team after 90 days; the leaf hash stays in the public day file, so a proof you saved keeps verifying.

When is a proof final?

A day is sealed a few minutes after UTC midnight and anchored in Bitcoin some hours later. For a run that ended today, the proof endpoint returns sealed: false and a live root; until the seal it is our word, not a proof. ots_status tells you whether the Bitcoin block is in yet.

What does the proof not prove?

It does not show what the agent wrote. It shows that a run with these numbers and these evidence booleans ended at this time and was not edited afterwards. If your client reports wrong numbers, the proof preserves them faithfully. A run that never called run end (killed, stalled) has no leaf. OpenTimestamps proves existence before a block, not after.


Start with one agent

Wrap the job, let it run once, fetch the proof, hand it to whoever asked. Free for 3 agents, no card.

pip install runvouch
rv agent nightly-report --cadence 24h --evidence
rv run nightly-report --evidence-file out/report.html -- claude -p "build tonight's report"
rv proof RUN_ID --verify

Get a free keyThe mechanism, byte for byteField note with a real proof