{"codes":[{"code":"AUTHORIZATION_ALREADY_USED","fault":"payer","fix":"Generate a fresh nonce and re-sign.","means":"That nonce has already been settled, here or on chain.","retryable":false},{"code":"AUTHORIZATION_EXPIRED","fault":"payer","fix":"Re-sign with a later validBefore.","means":"validBefore has already passed.","retryable":false},{"code":"AUTHORIZATION_NOT_YET_VALID","fault":"payer","fix":"Wait until validAfter, or re-sign with validAfter in the past.","means":"validAfter is in the future.","retryable":true},{"code":"CHAIN_READ_FAILED","fault":"chain","fix":"Retry shortly; the authorization is untouched.","means":"We could not read the chain to complete the check. This is not a statement about your payment.","retryable":true},{"code":"INSUFFICIENT_AMOUNT","fault":"payer","fix":"Re-sign for at least maxAmountRequired.","means":"The authorization is for less than the resource costs.","retryable":false},{"code":"INSUFFICIENT_FUNDS","fault":"payer","fix":"Fund the signing wallet, then retry the same authorization.","means":"The signer's USDC balance is below the authorized value.","retryable":true},{"code":"INVALID_PAYMENT","fault":"payer","fix":"Re-check the payment against the 402 requirements.","means":"The upstream verifier rejected the payment without naming a condition.","retryable":false},{"code":"MALFORMED_AMOUNT","fault":"payer","fix":"Send both as base-unit integers, not decimals.","means":"The authorized value or the required amount could not be read as an integer.","retryable":false},{"code":"MALFORMED_PAYLOAD","fault":"payer","fix":"Send paymentPayload.payload.authorization and .signature.","means":"The envelope carried neither an authorization nor a signature.","retryable":false},{"code":"MISSING_AUTHORIZATION","fault":"payer","fix":"Include the EIP-712 authorization you signed.","means":"A signature was present with no authorization object.","retryable":false},{"code":"MISSING_SIGNATURE","fault":"payer","fix":"Sign the authorization and include the signature.","means":"An authorization was present with no signature.","retryable":false},{"code":"SIGNATURE_MISMATCH","fault":"payer","fix":"Sign with the key that owns authorization.from.","means":"The recovered signer is not the address in authorization.from.","retryable":false},{"code":"SIGNATURE_UNRECOVERABLE","fault":"payer","fix":"Check the EIP-712 domain (name, version, chainId, verifyingContract) matches the asset.","means":"No signer address could be recovered from the signature.","retryable":false},{"code":"SVM_VERIFY_UNREACHABLE","fault":"facilitator","fix":"Retry shortly; nothing was settled.","means":"The SVM verification path was unreachable.","retryable":true},{"code":"UNSUPPORTED_ASSET","fault":"payer","fix":"Set asset to the USDC contract on Base.","means":"Only USDC on Base is settled here.","retryable":false},{"code":"UNSUPPORTED_NETWORK","fault":"payer","fix":"Use base (eip155:8453) or a supported SVM network; GET /supported lists them.","means":"That network is not settled here.","retryable":false},{"code":"UNSUPPORTED_SCHEME","fault":"payer","fix":"Set scheme to exact.","means":"Only the exact scheme is settled here.","retryable":false},{"code":"WRONG_PAYEE","fault":"payer","fix":"Re-sign with authorization.to set to the payTo from the 402.","means":"The authorization pays an address other than the one the resource named.","retryable":false}],"count":18,"facilitator":"https://x402-agent-pay.com/facilitator","faults":{"chain":"A chain read failed on our side; the payment is untouched.","facilitator":"Our problem; nothing was settled.","payer":"Something about the payment must change."},"how":"Every rejection from /verify and /settle names one of these codes in invalidReason or errorReason, and repeats it as reasonCode with the fields below. Verification is free and spends no gas, so this is the cheapest way to find out why a payment will fail."}
