How do I file a claim when I paid an x402 endpoint and got nothing back?
Keep the settlement transaction hash (or, if you only have the EIP-3009 authorization you signed, its from and nonce), then file a free public claim at POST https://kertivo.com/claim with the endpoint URL and that proof. Kertivo re-checks the payment on Base and, only if USDC actually moved, stores a public, hash-recheckable record. It never rewrites the seller's Index grade, holds no funds, and does not arbitrate.
Who this is for
- Agents that settled a Base USDC x402 payment and got no HTTP response, a non-2xx, or a useless body.
- Builders who need a public, recheckable receipt to send the seller (or an auditor) instead of a private screenshot.
- Sellers who want to answer a buyer with a signed reply on the same claim URL.
What a claim proves (and what it does not)
A claim proves an on-chain Base USDC payment tied to an endpoint URL. Delivery ("I got nothing" vs "I got a 200") is the buyer's report — it cannot be verified on-chain. Claims sit next to a Kertivo Index grade and never change it. Grades still come only from Kertivo's own paid Index tests.
Live desk (checked 2026-11-03): GET /claims listed 2 public claims. Browse by endpoint with GET /claims?endpoint=<url>.
How to file
POST https://kertivo.com/claim with JSON. Required field: endpoint (the x402 URL you paid). Add proof of payment:
| Field | When to use it |
|---|---|
txHash | You have the settlement hash from PAYMENT-RESPONSE (or your own broadcast) |
authorization | No hash yet: EIP-3009 {from, nonce, validBefore} as an object, or the same three fields flat at the top level (the response then lists inputAliases: ["from+nonce->authorization"]) |
expectedPayTo | Optional: the payTo from the 402. If money went elsewhere, status becomes payment_to_wrong_address (with a lookalike note when first/last 4 hex chars match) |
httpStatusAfterPay | Status after paying; null = no response |
contentDisputed | true if you got 2xx but the body was wrong (otherwise a reported 2xx is recorded as delivered) |
note | Optional, max 280 characters |
payerSignature | Optional: sign x402 claim <claimId> with the paying wallet (EOA personal_sign or ERC-1271) to mark the claim payer-verified |
The 200 response includes claimId, a public url, status, reasons, on-chain evidence, seller Index context (if any), a recheck sha256 of the evidence, and nextSteps. JSON claim pages also carry a signed attestation (see /.well-known/attestation).
Status values you may see
| Status | Meaning |
|---|---|
payment_proven_delivery_disputed | Payment settled; buyer reports no/bad delivery |
payment_proven_delivered | Payment settled; buyer reports HTTP 2xx (not disputed) |
payment_to_wrong_address | Settled, but not to the expectedPayTo you declared |
payment_to_unrecognized_address | Settled to an address that is not the seller's known Index payTo (skipped when the seller rotates per-request deposit addresses) |
payment_not_settled | No settled USDC payment found (for example an authorization nonce that was never used, or one the payer canceled). Returned with stored: false and not published: you were most likely not charged |
Resubmitting the same endpoint + tx returns the same claimId. A payer-verified claim rejects an unsigned change (409 claim_locked_payer_verified); re-sign from evidence.payment.from to update the buyer report.
Minimal curl shape
curl -sS -X POST https://kertivo.com/claim \
-H 'content-type: application/json' \
-d '{"endpoint":"https://example.com/x402-route","txHash":"0x…","httpStatusAfterPay":null,"note":"Settled; no HTTP response"}'
Real public examples
Dispute (money moved, no response): clm_2949137e3302fb35 — endpoint https://api.syraa.fun/trending-headline, status payment_proven_delivery_disputed, payer-verified, amount 0.005 USDC, settlement confirmed_onchain, seller not_indexed. Buyer note: transport abort, no body.
Delivery confirmation (positive control): clm_727ca50a6e9c67d8 — endpoint Kertivo Check, status payment_proven_delivered, payer-verified, amount 0.01 USDC, httpStatusAfterPay: 200. The seller side shows our own endpoint graded A in Kertivo Index #5, marked self: true with an explicit self-grade disclosure.
Seller reply (free)
POST /claim/<id>/response with {text, respondedAt, signature}. Only the seller can respond: known Index payTo, or the settled payment's recipient if the seller is not indexed. Message format: x402 claim response <id>\nrespondedAt: <ISO>\n<text> (EOA or ERC-1271). One latest response is kept; Kertivo records it and does not decide who is right.
Try it
- List: https://kertivo.com/claims (HTML in a browser; JSON with
Accept: application/jsonor?format=json). - Open one claim URL above and recheck the tx on Base via the
recheck.howTosteps. - After any paid call elsewhere, decode
PAYMENT-RESPONSEand keep.transaction— same habit as Guide #2 / /examples.
FAQ
Does filing cost USDC?
No. POST /claim, GET /claim/:id, GET /claims, and POST /claim/:id/response are free (security: [] in OpenAPI).
I never got a tx hash, only the authorization I signed. Can I still file?
Yes. Send from, nonce and validBefore (flat, or inside authorization). If the nonce is used and Kertivo finds its AuthorizationUsed event on Base, the transfer happened and the claim is stored like any other. If the nonce is unused or was canceled on-chain, the status is payment_not_settled and nothing is stored, because no money moved. USDC marks a used and a canceled nonce the same way, so a spent nonce whose AuthorizationUsed event can't be found is not stored as settled either: resubmit with the settlement txHash (or validBefore, so the right block range is searched).
Will a claim change the seller's A/B/F grade?
No. Claims never rewrite grades.
Can Kertivo refund me?
No. Evidence only: no custody, no arbitration. Next step is usually send the claim URL to the seller.
I got HTTP 200 but the body was garbage. What do I file?
Set httpStatusAfterPay to that status and contentDisputed: true, plus a short note.
The seller uses a new deposit address every request.
Recipient matching to a fixed Index payTo is not possible (payToRotates). The claim still records the settled payment; seller replies are verified against the payment recipient.
Limits
- Base mainnet native USDC evidence only (same rails as Check).
- Delivery and content quality are buyer-reported, not on-chain facts.
- Kertivo holds no funds and does not arbitrate disputes.
- A claim is not a court filing, chargeback, or Index grade.