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.
- Regulated teams. The EU AI Act introduces logging and record-keeping duties: high-risk AI systems must be able to record events automatically over their lifetime (Article 12), and deployers must keep the logs the system generates for at least six months (Article 26). Most of those obligations apply from 2 August 2026 (source: artificialintelligenceact.eu, Article 12 and Article 26). Whether your agent is high-risk is your counsel's call. If it is, a log you can alter is a weak log.
- Customers who buy the output of an agent. A nightly research digest, an enrichment pipeline, a report for a client: the buyer wants to know it ran on time, produced the file and cost what you said. A proof they can check beats an invoice line.
- Anyone after an incident. When a run went wrong, the first question is "what actually happened and when", and the second is "is this record the original". A record fixed at run end, chained with every other run of the day, answers the second question for good.
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
- 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.
- Every UTC day, the leaves of all runs of all accounts form a Merkle tree. The top is the day root.
chain_hash = sha256(prev + ":" + date + ":" + root)links the day to the previous day. First day: 64 zeros.- 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.
- The day file is stamped with OpenTimestamps, which commits its hash in a Bitcoin block. The
.otsfile 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