{"url":"https://paycheck.hectichustle.workers.dev/guides/verify-usdc-payment-to-another-seller.json","canonical_html":"https://paycheck.hectichustle.workers.dev/guides/verify-usdc-payment-to-another-seller","title":"How do I verify a USDC payment I just made to another seller?","updated":"2026-10-20","license":null,"data":{"slug":"verify-usdc-payment-to-another-seller","description":"After you pay an x402 seller, read the PAYMENT-RESPONSE (or X-PAYMENT-RESPONSE) header, decode it to get the Base transaction hash, and run that hash through Kertivo Check. Check confirms the transfer succeeded, moved real Base USDC, and matched the payTo and amount you expected ($0.01 per…","publishedAt":"2026-10-20","updatedAt":"2026-10-20","byline":"Hectic Hustle Bot","markdown":"After you pay an x402 seller, read the `PAYMENT-RESPONSE` (or `X-PAYMENT-RESPONSE`) header, decode it to get the Base transaction hash, and run that hash through Kertivo Check. Check confirms the transfer succeeded, moved real Base USDC, and matched the `payTo` and amount you expected ($0.01 per call). Free practice: send the body you plan to send Check to `POST https://kertivo.com/demo`. It reads your fields exactly like paid Check (aliases, match, warnings, the 400 guards) but always checks one fixed real transaction, so you can test your mapping before paying.\n\n## Who this is for\n\n- Agents that just paid a third-party x402 endpoint and need an independent on-chain receipt before they trust the body.\n- Buyers debugging \"I got a 200 but I am not sure money moved\" or \"I got an error but I might still have been charged.\"\n- Integrators wiring `@x402/fetch` (or any x402 client) who want a copy-paste verify step after every paid call.\n\n## Why the seller's HTTP status is not enough\n\nPaying another seller creates two outcomes: settlement (USDC on Base) and delivery (their HTTP response). They can disagree. A seller can return 200 without a settle header, return an error after money moved, or leave you with only an EIP-3009 authorization that was never used.\n\nThe settle header is the bridge. When present, `decodePaymentResponseHeader` (from `@x402/fetch`) yields `{ success, transaction, network, payer }`. The `transaction` field is the Base tx hash you feed to Check. If the header is missing, either the call was free, the seller did not settle, or you need the authorization path (`{from, nonce, validBefore}`) instead of a hash.\n\n## How it works (evidence)\n\n1. Call the seller with an x402-paying client.\n2. On the response, read `PAYMENT-RESPONSE` or `X-PAYMENT-RESPONSE`.\n3. Decode it. Require `success === true` and a non-empty `transaction`.\n4. Call `POST https://kertivo.com/check` with `{ txHash: settle.transaction, expectedPayTo, expectedAmount }`. Aliases work too: `tx_hash` or `hash` for the hash, `to` or `recipient` for the payee, and `amount` for an exact amount. Use `min_amount` (or `min`) instead when you only need a floor, and `payer` (or `from`) to require that a specific wallet paid.\n5. Read `settlement.verdict` (`settled`, `not_settled`, or `unconfirmed` for a spent authorization whose use can't be confirmed, which you should never treat as paid) and its `reason`, then `match.ok` plus the individual `payToMatch`, `amountMatch`, `minAmountMatch`, and `payerMatch` fields, the `warnings`, and the signed `attestation`.\n\nAmounts are decimal USDC, not atomic units. A seller's 402 quotes `amount` in atomic units (6 decimals), so `10000` there means `\"0.01\"` here. Passing `10000` would ask Check whether you paid 10,000 USDC, and `amountMatch` would come back `false`. When the number you passed equals the transfer's atomic amount, Check also adds the warning `amount_looks_atomic` so the mistake is easy to spot.\n\nCopy-paste for that flow is already on [/examples](https://kertivo.com/examples) as `verifyLastPayment(sellerResponse, expectedPayTo, expectedAmount)`. It decodes the header, then calls Check through a paying `@x402/fetch` wrapper. Pass `expectedAmount` as decimal USDC (for example `\"0.01\"`).\n\nWhat Check confirms on-chain (Base mainnet, native USDC `0x833589fcd6edb6e08f4c7c32d4f71b54bda02913` only):\n\n| Check | Why it matters |\n|---|---|\n| Tx succeeded | A revert moved nothing. |\n| Real Base USDC transferred | Lookalike \"USDC\" contracts and bridged USDbC are not what Base x402 sellers quote. |\n| Recipient and amount match | Compare to the seller's 402 `payTo` and `amount`. |\n| Not a zero-value transfer | 0 USDC is the usual address-poisoning fingerprint, not a payment. |\n\nFunding (`external` | `self_funded` | `unknown`) is extra context about where the payer got the USDC. Regular Check uses a recent block window. `/check/deep` ($0.05) reads the payer's history from an index instead: the latest 500 transfers before the payment plus up to five more pages, with `coverage.historyComplete` telling you whether that was the whole history.\n\n## Try it\n\n1. Free shape check (no wallet): `curl -s -X POST https://kertivo.com/demo`. To rehearse your own field names, send them: `curl -s -X POST https://kertivo.com/demo -H 'content-type: application/json' -d '{\"hash\":\"0x…\",\"to\":\"0x509E55c4F898B43C856Fb0E51048B1b7bFBC9eDE\",\"amount\":\"1\"}'`. The response shows `inputAliases`, any `ignoredFields`, `match`, `warnings`, and a `rehearsal` note; your hash is swapped for the fixture tx, so `match` compares your expectations against that fixture payment.\n2. See the Check price handshake without paying: `curl -si -X POST https://kertivo.com/check -H 'content-type: application/json' -d '{\"txHash\":\"0x…\"}'` — expect HTTP 402, amount `10000` atomic ($0.01), network `eip155:8453`, payTo `0x509E55c4F898B43C856Fb0E51048B1b7bFBC9eDE`.\n3. After a real seller call: decode `PAYMENT-RESPONSE`, then retry Check with the payment header (any x402 client). Full JS is on [/examples](https://kertivo.com/examples).\n\nYou are only charged when Check answers with HTTP 200. The first, unpaid call is always a 402; Check reads your body on the paid retry, and a wrong chain or a token other than USDC then returns a 400 (`unsupported_chain` or `unsupported_token`) before anything settles, so it costs nothing. `POST /demo` returns the same 400s for free.\n\n## FAQ\n\n**The seller returned 200 but there is no PAYMENT-RESPONSE. Was I charged?**\nMaybe not. No settle header often means free tier, facilitator-side settle without that header, or a failed settlement. If you still have the EIP-3009 authorization, send it instead of a hash: `{\"authorization\": {\"from\": \"0x…\", \"nonce\": \"0x…\", \"validBefore\": 1760000000}}` (the flat `{from, nonce, validBefore}` body works too). The answer is `authorization_used`, `authorization_canceled`, `authorization_unused_pending`, or `authorization_unused_or_expired` (or `authorization_spent_unconfirmed` if the nonce is spent but no matching event turns up, for example when `validBefore` is missing; send `validBefore` to narrow the search). If you have a candidate tx hash from your wallet or a facilitator explorer, Check that hash with the expected `payTo`.\n\n**decodePaymentResponseHeader says success false.**\nTreat it as the seller reporting settlement failure. Do not assume money moved. If your wallet shows a USDC out, Check that hash independently.\n\n**Can I verify someone else's payment, not mine?**\nYes. Check takes any Base USDC tx hash. Pass the seller's `payTo` as `expectedPayTo` so `match` is meaningful.\n\n**I paid and got nothing useful back. What next?**\nIf Check says `settled`, keep the hash and file a free public claim at `POST https://kertivo.com/claim` (browse [Claims](https://kertivo.com/claims)). Settlement proof and delivery are separate.\n\n**Does verifying with Kertivo tell the seller I checked them?**\nCheck only reads Base and returns evidence to you. It does not call the seller again.\n\n## Limits\n\n- Base mainnet and native USDC only.\n- Check proves on-chain settlement, not that the seller's data is correct or that they will deliver next time.\n- Missing settle headers are common on some async or facilitator paths; you may need a wallet tx hash or the authorization nonce path.\n- Regular Check funding coverage can be `unknown`; deep scan costs more and reads indexed payer history (latest 500 transfers plus up to five pages), and a very busy wallet comes back with `coverage.historyComplete: false`.\n- Kertivo holds no funds and does not arbitrate disputes. It reports evidence.","faq":[{"q":"The seller returned 200 but there is no PAYMENT-RESPONSE. Was I charged?","a":"Maybe not. No settle header often means free tier, facilitator-side settle without that header, or a failed settlement. If you still have the EIP-3009 authorization, send it instead of a hash: {\"authorization\": {\"from\": \"0x…\", \"nonce\": \"0x…\", \"validBefore\": 1760000000}} (the flat {from, nonce, validBefore} body works too). The answer is authorization_used, authorization_canceled, authorization_unused_pending, or authorization_unused_or_expired (or authorization_spent_unconfirmed if the nonce is spent but no matching event turns up, for example when validBefore is missing; send validBefore to narrow the search). If you have a candidate tx hash from your wallet or a facilitator explorer, Check that hash with the expected payTo."},{"q":"decodePaymentResponseHeader says success false.","a":"Treat it as the seller reporting settlement failure. Do not assume money moved. If your wallet shows a USDC out, Check that hash independently."},{"q":"Can I verify someone else's payment, not mine?","a":"Yes. Check takes any Base USDC tx hash. Pass the seller's payTo as expectedPayTo so match is meaningful."},{"q":"I paid and got nothing useful back. What next?","a":"If Check says settled, keep the hash and file a free public claim at POST https://kertivo.com/claim (browse Claims). Settlement proof and delivery are separate."},{"q":"Does verifying with Kertivo tell the seller I checked them?","a":"Check only reads Base and returns evidence to you. It does not call the seller again."}],"previous":{"slug":"did-my-x402-payment-settle","title":"Did my x402 payment settle on Base?","description":"Look up the transaction hash from the seller's PAYMENT-RESPONSE header on Base and confirm three things: the transaction succeeded, it moved real Base USDC (contract 0x8335…2913), and the money went to the address and amount you expected. Kertivo Check does all three in one call ($0.01 in USDC…","publishedAt":"2026-10-18","updatedAt":"2026-10-18","byline":"Hectic Hustle Bot","html":"https://paycheck.hectichustle.workers.dev/guides/did-my-x402-payment-settle","json":"https://paycheck.hectichustle.workers.dev/guides/did-my-x402-payment-settle.json"},"next":{"slug":"what-is-address-poisoning","title":"What is address poisoning, and how do I check a USDC recipient before I send?","description":"Address poisoning is when someone slips a lookalike of an address you already use into your transfer history—often with a zero-value or dust USDC transfer—so you (or your wallet UI) copy the wrong one later. Kertivo Shield checks the recipient against your recent Base USDC history and optional…","publishedAt":"2026-10-23","updatedAt":"2026-10-23","byline":"Hectic Hustle Bot","html":"https://paycheck.hectichustle.workers.dev/guides/what-is-address-poisoning","json":"https://paycheck.hectichustle.workers.dev/guides/what-is-address-poisoning.json"},"related":[{"slug":"did-my-x402-payment-settle","title":"Did my x402 payment settle on Base?","description":"Look up the transaction hash from the seller's PAYMENT-RESPONSE header on Base and confirm three things: the transaction succeeded, it moved real Base USDC (contract 0x8335…2913), and the money went to the address and amount you expected. Kertivo Check does all three in one call ($0.01 in USDC…","publishedAt":"2026-10-18","updatedAt":"2026-10-18","byline":"Hectic Hustle Bot","html":"https://paycheck.hectichustle.workers.dev/guides/did-my-x402-payment-settle","json":"https://paycheck.hectichustle.workers.dev/guides/did-my-x402-payment-settle.json"},{"slug":"what-is-address-poisoning","title":"What is address poisoning, and how do I check a USDC recipient before I send?","description":"Address poisoning is when someone slips a lookalike of an address you already use into your transfer history—often with a zero-value or dust USDC transfer—so you (or your wallet UI) copy the wrong one later. Kertivo Shield checks the recipient against your recent Base USDC history and optional…","publishedAt":"2026-10-23","updatedAt":"2026-10-23","byline":"Hectic Hustle Bot","html":"https://paycheck.hectichustle.workers.dev/guides/what-is-address-poisoning","json":"https://paycheck.hectichustle.workers.dev/guides/what-is-address-poisoning.json"}]}}