A dispute receipt is a small, open, self-verifying record of a single paid API call. It exists so that when an AI agent pays for something and does not get it, there is a record a third party can check, which is the piece agentic commerce is otherwise missing. This page defines the format. It is free to adopt, attribution appreciated.
Why
Payments settle in a second; disputes do not settle at all, because nothing records what was promised against what was delivered in a form anyone can audit after the fact. A receipt fixes that at the smallest useful unit: one call. It does not move money or reverse a payment. It makes the facts of a call portable and checkable, so reputation and resolution can be built on evidence rather than on trust.
What a receipt records
Six things, and a content hash over them:
- The promise: the advertised price and the output the listing said it returns.
- The order: the exact call made (endpoint, method, input).
- The payment: what was charged and the on-chain transaction that settled it.
- The delivery: the response, recorded as its shape (type names only), never the goods, plus a pointer to the untouched bytes archived at pay time.
- The truth (for accuracy receipts): the value from a primary source that cannot be a reseller.
- The verdict: delivered, short (underdelivered), accurate, off, or inconclusive, with the reason.
The receipt_id is a sha256 over those evidence fields. Change any one and the id no longer matches. The record is tamper-evident by construction.
The three-level verification
A receipt is arbitrable without trusting its publisher, at three independent levels:
- Integrity: recompute the hash of the evidence and confirm it equals the id. Detects any edit.
- Verdict: re-derive delivered/short/accurate from the stored evidence, offline, no network.
- Raw: pull the untouched bytes the seller returned (archived at pay time, matched by endpoint and transaction) and re-derive the response shape from scratch, proving the evidence itself is faithful.
Reference implementation: python3 receipts.py --verify <receipt_id> runs all three. A verdict reached by a two-call re-verify cannot be reproduced from one stored shape, so it is reported honestly as not-applicable at the offline level and confirmed at the raw level instead.
Opening and resolving a dispute
A dispute is opened by pointing at a receipt whose verdict is short or off. The receipt is the whole case file: promise, payment, delivery, and an independent verdict already in it. The seller may contest by submitting its own call, which is recorded as another receipt and graded the same way. Because every verdict re-derives from archived bytes, resolution is a reproducible fact, not an opinion. The consequence is reputational, recorded against the seller's public reliability, not a forced refund, because a third party's legitimate power here is evidence and reputation, not settlement.
The shape of a receipt
A real underdelivered receipt from this site, in full:
{
"checks": {
"integrity": true,
"raw": true,
"verdict": true
},
"delivery": {
"extra": [
"budget_allocated",
"operation_id",
"price",
"reconciliation_url"
],
"latency_ms": 3042,
"missing": [
"alive",
"bytes",
"content_type",
"final_url",
"generated_at",
"issue_codes",
"limitations",
"next_jobs",
"redirected",
"service",
"sources",
"status_code",
"summary",
"title"
],
"observed_schema": {
"budget_allocated": "number",
"job_id": "string",
"operation_id": "string",
"price": {
"amount": "number",
"currency": "string"
},
"reconciliation_url": "string",
"status": "string"
},
"raw_ref": {
"capture": "raw_2026-08-13.jsonl",
"line": 245,
"match": {
"tx": "0xfc5b87e6aff59a10cb6d09e2a73d96dc3961c49768a0d489b5adc66f41e4c43f",
"url": "https://agent.kihustle.tech/services/url-preflight/jobs"
}
}
},
"kind": "delivery",
"payment": {
"chain": "base",
"charged_usdc": "0.01",
"free": false,
"paid": true,
"settlement": "EIP-3009, submitted by a facilitator",
"tx": "0xfc5b87e6aff59a10cb6d09e2a73d96dc3961c49768a0d489b5adc66f41e4c43f"
},
"promise": {
"fields": [
"alive",
"bytes",
"content_type",
"final_url",
"generated_at",
"issue_codes",
"job_id",
"limitations",
"next_jobs",
"redirected",
"service",
"sources",
"status",
"status_code",
"summary",
"title"
],
"price_usdc": "0.01",
"source": "x402 Bazaar (CDP discovery)"
},
"receipt_id": "wab_01c3cc545cd9d991",
"seller": {
"host": "agent.kihustle.tech",
"url": "https://agent.kihustle.tech/services/url-preflight/jobs"
},
"ts": "2026-08-13",
"verdict": {
"decided_by": "two-call reconcile",
"method": "field-presence vs promised (conform.judge)",
"reverified": true,
"status": "short",
"why": "shortfall confirmed on two calls"
},
"verify": {
"cmd": "python3 receipts.py --verify wab_01c3cc545cd9d991",
"integrity": "sha256 over the evidence fields must equal receipt_id",
"raw": "re-derive observed_schema from delivery.raw_ref, then re-judge",
"verdict": "conform.judge(delivery.observed_schema, promise.fields).status == verdict.status"
},
"version": "1"
}