x402 PAYMENT PROTOCOL - AI AGENT QUICK REFERENCE ================================================ When you receive HTTP 402, follow these steps: 1. PARSE THE 402 RESPONSE Extract: accepts[0].{scheme, network, asset, amount, payTo, maxTimeoutSeconds, extra} 2. SIGN EIP-3009 TRANSFER AUTHORIZATION Domain: {name: extra.name, version: extra.version, chainId: , verifyingContract: asset} Types: TransferWithAuthorization(from, to, value, validAfter, validBefore, nonce) Message: {from: YOUR_WALLET, to: payTo, value: amount, validAfter: 0, validBefore: now+120, nonce: random32bytes} 3. BUILD X-PAYMENT HEADER (base64 JSON) { "x402Version": 2, "scheme": "exact", "network": "", "payload": { "x402Version": 2, "payload": {"authorization": , "signature": }, "accepted": {, "extra": {, "assetTransferMethod": "eip3009"}} } } 4. RESEND REQUEST WITH HEADER X-PAYMENT: 5. SAVE JWT FROM RESPONSE Header: X-Payment-Response: {"token": "", "transactionId": ""} 6. USE JWT FOR SUBSEQUENT REQUESTS Authorization: Bearer NETWORKS -------- Testnet: eip155:84532 (Base Sepolia), USDC: 0x036CbD53842c5426634e7929541eC2318f3dCF7e Mainnet: eip155:8453 (Base), USDC: 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 MINIMAL NODE.JS EXAMPLE ----------------------- import {ethers} from "ethers"; const wallet = new ethers.Wallet(PRIVATE_KEY); // After getting 402 with accepts[0] as `req`: const nonce = ethers.hexlify(ethers.randomBytes(32)); const validBefore = Math.floor(Date.now()/1000) + 120; const sig = await wallet.signTypedData( {name: req.extra.name, version: req.extra.version, chainId: 84532, verifyingContract: req.asset}, {TransferWithAuthorization: [ {name:"from",type:"address"},{name:"to",type:"address"},{name:"value",type:"uint256"}, {name:"validAfter",type:"uint256"},{name:"validBefore",type:"uint256"},{name:"nonce",type:"bytes32"} ]}, {from: wallet.address, to: req.payTo, value: req.amount, validAfter: 0, validBefore, nonce} ); const header = btoa(JSON.stringify({x402Version:2, scheme:"exact", network:req.network, payload:{ x402Version:2, payload:{authorization:{from:wallet.address,to:req.payTo,value:req.amount,validAfter:"0", validBefore:String(validBefore),nonce},signature:sig}, accepted:{...req,extra:{...req.extra,assetTransferMethod:"eip3009"}}}})); const resp = await fetch(URL, {headers:{"X-PAYMENT":header}}); const jwt = JSON.parse(resp.headers.get("X-Payment-Response")).token; ERROR CODES ----------- 402 = Need payment (parse accepts array) 401 = JWT expired (pay again) 400 = Bad X-PAYMENT header format 403 = Insufficient USDC or invalid signature