Reference
Verify a payment
Checks a signed payment against the requirements without changing chain state. Call it before doing expensive work, then settle once the work succeeds.
POST
/verifyRequest
Send the decoded PAYMENT-SIGNATURE header from the client as paymentPayload together with the paymentRequirements your server advertised in its 402. Only x402 version 2 is accepted.
request
http
POST https://facilitator.arcusnetwork.co/verify
Content-Type: application/json
{
"x402Version": 2,
"paymentPayload": {
"x402Version": 2,
"accepted": { /* the requirement the client chose */ },
"payload": {
"authorization": {
"from": "0xPayer", "to": "0xMerchant",
"value": "10000",
"validAfter": "0", "validBefore": "1760000000",
"nonce": "0x…"
},
"signature": "0x…"
}
},
"paymentRequirements": {
"scheme": "exact",
"network": "eip155:5042",
"amount": "10000",
"asset": "0x3600000000000000000000000000000000000000",
"payTo": "0xMerchant",
"maxTimeoutSeconds": 60,
"extra": { "name": "USDC", "version": "2" }
}
}| Field | Meaning |
|---|---|
| x402Version | Must be 2. |
| paymentPayload | The client’s signed payload: the requirement it accepted plus the EIP-3009 authorization and signature. |
| paymentRequirements | Scheme exact, an Arc network, the amount in 6-decimal USDC units, the USDC asset, payTo, maxTimeoutSeconds and the EIP-712 domain in extra. |
What is checked
Verification runs entirely against the requirements and a read-only RPC call:
- the signature recovers to the authorization's
fromaddress valueequals the required amount andtoequalspayTo- the current time is inside
validAfterandvalidBefore - the payer's USDC balance covers the amount
- the network is Arc mainnet or Arc testnet
A valid verify does not reserve funds. The payer could spend the balance before you settle, so keep the window between verify and settle short.
Response
200 OK
json
{ "isValid": true, "payer": "0xPayer" }200 OK (invalid payment)
json
{
"isValid": false,
"invalidReason": "invalid_exact_evm_payload_authorization_value_mismatch",
"invalidMessage": "authorization value does not match requirements amount"
}Malformed bodies return 400, rate-limited callers return 429 and RPC failures return 500, each with isValid: false and an invalidReason. The full list is on the Errors and limits page.