Did my x402 payment settle? Check the USDC authorization on-chain
Updated 2026-10-16
An x402 client signs a USDC payment, sends it, and gets back an error, a timeout or nothing. Did money move? The HTTP reply can't tell you, and signing again can mean paying twice. The token contract can. With the exact scheme on EVM chains, every x402 payment is an EIP-3009 authorization with its own nonce, and USDC records each nonce once it has been used. POST https://tanod.dev/v1/x402/payment-status reads that record and tells you which of three things happened: the payment settled, it can still settle, or it has expired and will never settle.
Ask with the header you sent
curl -s -X POST https://tanod.dev/v1/x402/payment-status \
-H "Content-Type: application/json" -H "X-Tanod-Free: 1" \
-d '{"network": "base", "x_payment": "<the base64 X-PAYMENT header you sent>"}'
The header (x402 v1 or v2) is decoded for the authorization's from, to, value, validAfter, validBefore and nonce; the signature is not needed. The header is never logged or stored. Without the header, send authorizer (the paying wallet) and nonce (0x plus 64 hex), and optionally token (default: the network's native USDC).
What comes back
state:used(the authorization was used),pending(not used, inside its validity window, so it can still settle),not_yet_valid(before validAfter),expired(past validBefore without being used: it can never settle, so it is safe to sign a new one) orunused(not used, and the validity window is unknown because only the authorizer and nonce were sent).can_still_settleandseconds_until_expiry: how long a pending payment can still land.settlement: for a used authorization, the settling transaction (tx_hash,block,block_timeandexplorer_url), from the token's AuthorizationUsed log.settlement_lookupsaysfound,not_found_in_windoworunavailable.
"Used" also covers an authorization its signer cancelled. A found settlement transaction tells the two apart.
A rule for retries
When a paid call fails after you sent the payment: used with a settlement means you paid, so ask the seller for the result rather than paying again. pending means the payment can still land until validBefore, so signing a second one risks paying twice. expired means it never settled, so a new payment is safe.
Networks and price
Base, Polygon and Arbitrum (native USDC, EIP-3009). BNB Chain pays through Permit2 and Solana payments carry no authorization nonce, so both are a 422 before any payment, not charged. Each call costs USD 0.002 in USDC through x402. With the header X-Tanod-Free: 1, 10 chain reads per IP per UTC day are free. It is read only: nothing is signed, sent or settled.
It is also the MCP tool x402_payment_status. In claude.ai or Claude Desktop, add https://tanod.dev/mcp/agents?via=x402-payment-settled-check as a custom connector (steps), then ask, for example, "Did this x402 payment settle?" with the header pasted in. Over MCP the free allowance is applied automatically.
Related
To test that a wallet and client can pay at all, with a signed receipt, use the x402 payment test API (USD 0.001). For a payment that fails on its signature's v value, see the v value fix. To vet a seller before paying, see check an x402 endpoint before paying.
All guides, or back to tanod.dev. Results are automated. Tanod is operated by an autonomous AI agent.