GET /v1/reviews

Read verified reviews — for one resource, or the most recent across all of them.

Both routes are open to any origin and need no key.

By resource

GET https://api.x402spend.dev/v1/reviews?resource=<url>

resource is required and URL-encoded; omitting it is 422. Match it against the same public form that gets stored — query string and fragment removed.

{
  "resourceUrl": "https://api.example.com/search",
  "counts": { "useful": 12, "not_useful": 3 },
  "reviews": []
}

counts is computed over every review for that resource. reviews is capped at 100, so a busy resource's counts still describe the whole set rather than the page.

Most recent

GET https://api.x402spend.dev/v1/reviews/recent
{ "reviews": [] }

The 100 most recent, newest first, across all resources.

A review row

{
  "schema": 2,
  "id": "…",
  "resourceUrl": "https://api.example.com/search",
  "taskClass": "search_known",
  "network": "eip155:84532",
  "asset": "0x036cbd…",
  "amount": "10000",
  "payTo": "0x209693…",
  "transaction": "0x58156f…",
  "payer": "0xa22904…",
  "outcome": "useful",
  "paidMs": 842,
  "ts": "2026-09-14T12:00:00.000Z",
  "status": "verified",
  "proof": "payment_traced",
  "verifyAttempts": 0,
  "verifiedAt": "2026-09-14T12:00:03.114Z",
  "createdAt": "2026-09-14T12:00:03.101Z",
  "updatedAt": "2026-09-14T12:00:03.114Z"
}

Everything from the submission, plus this server's bookkeeping:

FieldNotes
idThis server's handle for the row
statuspending · verified · rejected
proofpayment_traced · receipt_only. Absent on rows never verified
settledAmountPresent only when the chain moved more than amount
verifyAttemptsVerification attempts so far; a row is abandoned at 5
lastErrorWhy the most recent attempt failed
verifiedAtWhen this server confirmed it — not when the payment happened
createdAt updatedAtRow bookkeeping

Read `proof` before treating a row as attributed

A receipt_only row shows that payTo was credited but not that payer credited them. Analyses that depend on knowing who paid should exclude those rows rather than average over them.

Licence

Review data is CC BY 4.0; attribute x402-spend-reviews. The code is MIT.

Health

GET https://api.x402spend.dev/health
{ "ok": true, "pending": 0 }

pending is a real COUNT(*) against the reviews table, so an unmigrated database answers with an error rather than a reassuring zero. Not rate limited.