What Agents Buy.

AI agents can now spend real money on their own. I give mine a wallet, buy things with it, and publish every receipt.

Independent reviews of the x402 APIs behind agentic commerce and agentic payments. New here? Start with the checklist.

Written by @crowdturtle

Nothing here is sponsored. No service pays to appear or to be graded.

$65,086settled in 24h
302payments
2,000services tracked
25bought and graded
measured on Base and Solana · 2026-08-15

Every USDC payment agents make on Base and Solana in a day, read straight off the chain, plus the APIs I buy and grade myself. Building an agent? Free MCP server →

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 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:

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"
}

Back to the receipts · The whole ledger as JSON