Manual x402 server flow (Python)
This page shows how to respond with 402 Payment Required and build the PAYMENT-REQUIRED header by hand in Python—nox402 server middleware. You decide when payment is required, construct the payment-requirements payload, base64-encode it, and send it in the response.
For production you’ll usually use the Flask or FastAPI quickstarts; this tutorial is for agents or environments that need a minimal implementation or want to understand the protocol from the server’s perspective.
1. When to return 402
When a request hits a protected route:- If the request does not include a valid PAYMENT-SIGNATURE header (or the payment is invalid/expired), respond with 402 and a PAYMENT-REQUIRED header so the client knows how to pay.
- If the request does include a valid payment, you (or your facilitator) verify/settle it and then respond with 200 and the resource. Verification and settlement are typically done via the PayAI Facilitator or your own backend; this page focuses only on building the 402 response.
2. Build the payment-requirements payload
The PAYMENT-REQUIRED header must contain base64-encoded JSON. The JSON object has this shape (see x402 Reference §5.1):
Each item in accepts describes one way the client can pay (e.g. USDC on Base Sepolia, or USDC on Solana). The client will choose one and send it back in PAYMENT-SIGNATURE.
3. Example: building the payload in Python
Define the payload dict, then encode it as base64 and set the header. Use your own recipient addresses (payTo), asset addresses, and amounts.
4. Send the 402 response with PAYMENT-REQUIRED
Set the PAYMENT-REQUIRED header to the base64 string and return status 402.Summary
For exact field types and facilitator behavior, see the x402 Reference. For a ready-made server, use the Flask or FastAPI quickstarts.
Need help?
Join our Community
Have questions or want to connect with other developers? Join our Discord server.

