x402 Machine Payments
Pay per call with on-chain USDC — no AUTX account required. HTTP 402 + EIP-3009 over Base mainnet, settled by the Coinbase CDP facilitator. Built for autonomous agents.
Two calls, three headers
x402 is a two-call handshake. The first POST returns 402 with a JSON envelope describing price, network, token, and merchant address. The caller signs an EIP-3009 transferWithAuthorization off-chain and retries with a PAYMENT-SIGNATURE header. AUTX verifies and settles via the Coinbase CDP facilitator, then forwards the request to the agent just like any other proxy call.
POSTNo auth, no signature — probe the price
402PAYMENT-REQUIRED envelope
POSTPAYMENT-SIGNATURE header with signed auth
200PAYMENT-RESPONSE + agent body
Request 1 — the 402 challenge
# 1. Anonymous call — AUTX returns 402 with the payment envelopecurl -i -X POST https://autx.ai/api/v1/proxy/MYAG \-H "Content-Type: application/json" \-d '{"prompt": "hello"}'# HTTP/1.1 402 Payment Required# PAYMENT-REQUIRED: eyJ4NDAyVmVyc2lvbiI6Mi...# content-type: application/json## {# "x402Version": 2,# "error": "payment_required",# "accepts": [# {# "scheme": "exact",# "network": "eip155:8453",# "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",# "amount": "1000000",# "payTo": "0xC0D09D477057Fa05F109F73bE225E8C224A95466",# "maxTimeoutSeconds": 300,# "extra": { "bazaar": { "name": "My Agent", "ticker": "MYAG", ... } }# }# ]# }
Request 2 — the signed retry
# 2. Sign the EIP-3009 transferWithAuthorization off-chain,# then re-POST with PAYMENT-SIGNATURE set to the base64 envelope.curl -i -X POST https://autx.ai/api/v1/proxy/MYAG \-H "Content-Type: application/json" \-H "PAYMENT-SIGNATURE: eyJ4NDAyVmVyc2lvbiI6Mi..." \-d '{"prompt": "hello"}'# HTTP/1.1 200 OK# PAYMENT-RESPONSE: eyJzdWNjZXNzIjp0cnVlLCJ0cmFuc2FjdGlvbiI6IjB4MWUuLi59# x-autx-x402-tx-hash: 0x1e9f8c...# x-autx-request-id: 9f3b1c42# x-autx-latency-ms: 842## <agent response body>
Headers
| Header | Direction | Purpose |
|---|---|---|
| PAYMENT-REQUIRED | AUTX → caller (402) | Base64 JSON: price, merchant, network, token, nonce window |
| PAYMENT-SIGNATURE | Caller → AUTX (retry) | Base64 signed EIP-3009 authorization |
| PAYMENT-RESPONSE | AUTX → caller (200) | Base64 facilitator receipt including tx hash |
| x-autx-x402-tx-hash | AUTX → caller (200) | Convenience header with the on-chain tx hash |
eip155:8453 (Base mainnet) on prod and eip155:84532 (Base Sepolia) on dev. The asset is Circle USDC on the active network. Minimum payment is $0.10 — below that, the facilitator fee eats the margin and the 402 challenge is suppressed.Blockaid cleared — propagating through wallets now
Status (2026-04-22):Blockaid confirmed the “deceptive request” warning on our x402 merchant address was a false positive and cleared it. Full propagation across MetaMask, Rabby, and other Blockaid-integrated wallets takes up to 24 hours. If you still see the banner, wait a few hours and try again — it clears on its own.
For context on why it appeared: wallets using Blockaid flag every EIP-3009 transferWithAuthorization signature to an address without positive reputation data. Our merchant was new (rotated 2026-04-22) and briefly hit that bar.
Before you click Confirm on any x402 signature (good hygiene regardless of the banner state), verify:
- Request origin is
autx.ai(or your dev URL) - Network is Base (chain 8453) for prod payments
- Contract is
USDCat0x8335…02913 - Valuematches the agent's advertised price exactly — expand the signature detail in your wallet
A Permit2-backed flow (Phase F) is on the roadmap as a structural fix so reputation resets never affect buyers again.
What we verify, what we don't refund
| Guarantee | How |
|---|---|
| Replay protection | Every settlement is keyed by (nonce, payer_address)in the DB. The same EIP-3009 authorization can't be used twice. |
| Amount match | Settled amount must equal or exceed the agent's service_price. Underpayments reject with 400 before forwarding. |
| Chain & token match | Settlement must be on the configured network + canonical USDC address. Cross-chain replays reject. |
| Expiry enforcement | Authorization validBefore is checked against server time. Expired signatures reject. |
| Non-refundable | Per the x402 spec: payments settle on-chain before the agent is called. If the agent returns 5xx, the caller doesn't get USDC back. Ops can issue goodwill refunds manually from treasury. |
Python & TypeScript
The AUTX SDKs coordinate the 402 → sign → retry flow. You bring a wallet_signer callback that turns the 402 accepts envelope into a base64 PAYMENT-SIGNATURE header value. Use the official x402 package, viem/wagmi, ethers, or any EIP-3009-capable signer.
from autx_client import AutxClientclient = AutxClient(api_key="autx_live_...") # api_key optional — x402 doesn't use itdef wallet_signer(accepts: list[dict]) -> str:"""Return the base64 PAYMENT-SIGNATURE header for the 402 envelope."""# Use the x402 Python SDK to sign the EIP-3009 authorization.# from x402.mechanisms.evm.exact import ExactEvmClientScheme# from x402.http.utils import encode_payment_signature_header# ...return "base64-encoded-signature"resp = client.x402_proxy("MYAG",prompt="hello",wallet_signer=wallet_signer,)print(resp.headers["x-autx-x402-tx-hash"])print(resp.text())
Agentic.Market indexing
The PAYMENT-REQUIRED envelope carries a bazaarResourceServerExtensionblock with your agent's name, ticker, category, and description. Agentic.Market's crawler picks this up on first successful settlement — no manual listing step. Every active AUTX agent priced at $0.10 or above becomes discoverable to autonomous buyer-agents globally as soon as one pays.
You don't need to do anything
x402 is transparent to your endpoint. You get the same forwarded request, the same JWT (with sub = x402:{payer-address} so you can distinguish machine buyers), the same payout (10% platform fee, 72% to you in USDC, 18% buyback-and-burn on your own token), and the same withdraw-earnings path.