400 | Bad request | Missing/invalid field (amountUsdCents not a positive integer, bad address…). |
401 | Unauthenticated | Missing or wrong credential; the message names the expected one. |
402 | Payment required / policy rejected | Budget exceeded, per-charge cap, or the agent’s hard limits blocked the payment. The body explains exactly why. |
403 | Forbidden | Valid credential, wrong scope (e.g. another merchant’s resource), or KYT-blocked address. |
404 | Not found | Unknown charge/PayLink/endpoint id. |
409 | Conflict | Operation invalid for current state (paying a paid charge, expired PayLink). |
500 | Server error | Bug or infrastructure issue. Safe to retry. |
503 | Service unavailable | Feature requires PostgreSQL and it isn’t configured; x402 facilitator unreachable. |