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:
| Field | Notes |
|---|---|
id | This server's handle for the row |
status | pending · verified · rejected |
proof | payment_traced · receipt_only. Absent on rows never verified |
settledAmount | Present only when the chain moved more than amount |
verifyAttempts | Verification attempts so far; a row is abandoned at 5 |
lastError | Why the most recent attempt failed |
verifiedAt | When this server confirmed it — not when the payment happened |
createdAt updatedAt | Row 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.