Paying with x402 (USDC)
x402 is an open HTTP payment standard (the 402 Payment Required status, finally used). Settlement infrastructure exists from Coinbase (the CDP facilitator settles Base for this service) and client tooling from Stripe (purl, below). x402 is one of the two wires underneath Agentic Finance - the other is Paying with MPP, answered on the same 402.
The flow
- Client calls a paid endpoint.
- Server replies
402with a machine-readable quote: price, asset (USDC), network (eip155:8453= Base mainnet), and the pay-to address. - Client signs a USDC
transferWithAuthorizationfrom its own wallet (no gas needed - the facilitator sponsors it) and retries with the payment header. - Facilitator verifies + settles on-chain; the server serves the result. End-to-end this is seconds.
The payer needs only USDC on Base, Solana, Polygon, Arbitrum, Monad, Celo, Avalanche, Sei, Optimism, Stellar, or Algorand - no ETH, no account, no API key. (Sellers can also settle USDG on Robinhood Chain when the operator enables it.)
JavaScript (x402 v2 SDKs)
import { wrapFetchWithPayment } from "@x402/fetch";
import { x402Client } from "@x402/core/client";
import { registerExactEvmScheme } from "@x402/evm/exact/client";
import { privateKeyToAccount } from "viem/accounts";
const client = new x402Client();
registerExactEvmScheme(client, { signer: privateKeyToAccount(process.env.AGENT_KEY) });
const payFetch = wrapFetchWithPayment(fetch, client);
const res = await payFetch("https://agent402.tools/api/extract", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ url: "https://example.com/article" }),
});
console.log(await res.json());
Paying over MPP instead (dual-stack)
Every paid endpoint also speaks MPP (Machine Payments Protocol - the
IETF-track Payment HTTP auth scheme from tempoxyz/mpp),
and now offers TWO MPP methods: evm (below, same URL, same price, same
on-chain USDC settlement as x402, just a different HTTP dialect) and tempo
(native settlement via Tempo's own relay, TIP-1034/
TIP-20, no x402 facilitator, a genuinely different mechanism; use
tempo.charge from mppx/client the same way evm.charge is used below).
MPP responses add a signed Payment-Receipt header either way. With the
reference mppx client:
import { Fetch, evm } from "mppx/client";
import { privateKeyToAccount } from "viem/accounts";
const payFetch = Fetch.from({
methods: [evm.charge({
account: privateKeyToAccount(KEY),
currencies: [evm.assets.base.USDC],
maxAmount: "1.00",
})],
});
const res = await payFetch("https://agent402.tools/api/uuid"); // 402 -> sign -> paid retry -> 200
console.log(res.headers.get("payment-receipt")); // signed MPP receipt
The buyer's client picks the dialect: mppx prefers the native MPP challenge and
pays via Authorization: Payment; x402 clients keep using PAYMENT-SIGNATURE.
An MPP evm-method buyer and an x402 buyer settle the identical EIP-3009
authorization; an MPP tempo-method buyer settles via Tempo's own relay
instead - different mechanism, same price.
The same 402 sells report products and takes card credits
The outcome-priced report routes (POST /v1/research, /v1/dossier, /v1/ticker-pack, /v1/fund, /v1/filing-report, /v1/domain-audit, /v1/recall-report, /v1/insider-report, /v1/token-brief, /v1/token-risk, /v1/linkedin-article; $0.60 to $2.00, and $0.05 for the /v1/ipo-report digest) answer the identical 402, so any client that pays a $0.001 tool pays a $0.85 dossier the same way. People without a wallet buy the same reports by card at /reports for $2 to $5, where the price includes payment processing. Buyers with a card and no wallet can load prepaid credits at /credits and send Authorization: Bearer a402_… instead of a payment header; the credits gate holds the list price and debits only on a final 200. Details on Reports, Monitors and Credits.
Command line: Stripe's purl
Stripe's open-source purl ("curl for paid endpoints") works against Agent402 out of the box - our CI proves it on demand with a real settled payment:
purl wallet add --name me --type evm -k 0xYOUR_KEY -p yourpass --set-active=true
purl --dry-run "https://agent402.tools/api/dns?name=example.com&type=A" # see the quote
purl "https://agent402.tools/api/dns?name=example.com&type=A" # pay + get result
Spend controls
Client-side caps belong on the buyer:
- purl:
PURL_MAX_AMOUNT(atomic units; 1000 = $0.001 USDC). - agent402-mcp:
AGENT402_MAX_PER_CALL(refuse any single call above this USD price) andAGENT402_BUDGET(hard session cap) - both enforced before a payment is signed, so a confused model cannot drain the wallet.
Verifying you weren't cheated
Every settled call is an on-chain USDC transfer to agent402.base.eth (a Base name resolving to the public revenue wallet) - auditable by anyone at Basescan. The service also publishes served-call counters at /api/stats; the chain, not the counter, is the source of truth.