Receipts and verification
The receipt schema
A receipt is one signed record of something an agent did. Version 4 is what new actions use. The published task receipt file is still served at /schemas/task_receipt.v1.json. Historical hashes are never rewritten. An older receipt keeps verifying with the rule it was signed under.
What the record includes
Identity is who signed it: the agent, its version, and a verified owner. Rules are whether it was allowed and who approved it. Activity is the stream of these receipts. A Bond is money behind a receipt if something goes wrong. Backed by money the owner keeps in their own wallet. Agentics reads that balance on-chain before it allows pay-later. A company is one owner with many agents, looking at the same receipts.
| Field | Meaning |
|---|---|
| action_type | What the agent did. A tool call, a policy decision, an approval, a payment, an outcome, and the rest of the set. |
| agent_id, agent_version_id | Which agent, and which version of it. |
| owner_user_id | The verified owner accountable for the action. |
| policy_id, policy_version, decision, reason | The rule, and whether it was allowed, denied, or needs you. |
| approver_user_id, approval_channel | Who decided, and where: console, phone, text, email, or API. |
| amount_usd, currency, cost_usd, business_impact_usd | The amount, the cost, and what the outcome was worth. Dollars in the table are Example when the story is the $500 credit. |
| inputs_digest, outputs_digest | SHA-256 of the redacted input and output. The raw text is not part of the hash. |
| prev_hash, hash_version | The previous receipt in this company’s chain, and which canonical rule this row used. Version 4 is current. Null, 2, and 3 stay as they were. |
| provenance | Verified by Agentics, self-reported, or imported from an older table. |
| occurred_at, recorded_at | When the agent did it, and when Agentics stored it. Times on the site are shown in PT. |
| run_id, parent_event_id, root_event_id | Where this step sits in the run, including agent-to-agent calls. |
| idempotency_key | The same key twice stores one receipt. |
| legacy_ref | A pointer to an older row this receipt was imported from. The original hash stays. |
The leaf is canonical JSON with sorted keys. event_id and the anchor batch stay outside the leaf, same as the older receipt id and batch id. event_hash and receipt_hash are the same bytes so the existing anchor can fold the row.
Published task receipt
Loading /schemas/task_receipt.v1.json
| Field | Type | Required |
|---|---|---|
| receipt_id | string | Required |
| agent_handle | string | Required |
| platform | enum | Required |
| started_at | string | Required |
| ended_at | string | Required |
| status | enum | Required |
How to write one
Use the workflow. The agent does not take the action first. It asks, waits when a person is required, takes the action in your own system, then records what happened. That sequence is Put one action under control.
A caller can also send a self-reported event to POST /v1/activity with an API key. Those rows are marked self-reported. They are not verified by Agentics, and a caller cannot mark a row verified through that endpoint.
How to check one
Paste the hash on Check a receipt, or call the checker. It recomputes the leaf, the chain, the batch, and the anchor. verified is true only when those match.
curl -s "https://agentics.you/api/proof/verify?hash=HASH"const res = await fetch("https://agentics.you/api/proof/verify?hash=" + hash);
const body = await res.json();
console.log(body.verified);import json, urllib.request
body = json.load(urllib.request.urlopen("https://agentics.you/api/proof/verify?hash=" + hash))
print(body["verified"])