I told the x402 Foundation I'd build the fiat leg. It shipped the same day.
I told the x402 Foundation I'd build the fiat leg. It shipped the same day.
On July 14th the x402 Foundation launched under the Linux Foundation — Stripe, Adyen, Visa, Mastercard, Google, AWS, Cloudflare and Coinbase, standardizing how AI agents pay for things over HTTP 402. The trailing 30 days saw ~75 million x402 transactions averaging $0.32 each. That's not a whitepaper economy; that's agents buying API calls, today.
Almost all of it settles on-chain. Which is fine — unless you're an API builder whose operator just wants boring money: real euros, a real Stripe account, no wallet custody, no volatility. The spec itself agrees: v2 explicitly allows asset to be an ISO 4217 currency code, and there's an open draft (PR #2612, following issue #2126) for a fiat, credit-backed binding.
I run peage — a fiat pay-per-call rail for agents: prepaid wallets funded once by card, merchants collect with one HTTP call, every settlement returns a signed receipt anyone can verify. So I commented on that draft PR: here's a second production implementation of the shape you're standardizing, and once the binding stabilizes, we'll implement the wire format.
Then I looked at the mapping and realized there was nothing to wait for.
Live: an x402 facilitator on fiat rails
peage now speaks the x402 v2 wire format (v1 payloads accepted) as a facilitator — scheme exact on network peage:eur:
curl -s https://peage.intrane.fr/x402/supported
# {"kinds":[{"x402Version":2,"scheme":"exact","network":"peage:eur"}, …]}And the full header flow, on a real metered resource. A bare request gets a 402 carrying a PAYMENT-REQUIRED header with base64 v2 requirements:
curl -sD - https://peage.intrane.fr/demo/fortune -o /dev/null | grep -i payment-requiredRetry with a PAYMENT-SIGNATURE header naming a funded wallet, and one euro-cent settles — the response carries PAYMENT-RESPONSE with the receipt in transaction, exactly where the spec says a fiat binding should put its commitment identifier:
PSIG=$(printf '{"x402Version":2,"payload":{"wallet_token":"pw_…"}}' | base64 -w0)
curl -sD - https://peage.intrane.fr/demo/fortune -H "PAYMENT-SIGNATURE: $PSIG"The binding doc lives in the open: scheme-exact-peage.md. When #2612 merges a canonical fiat-credit binding, we rename to match — I'd rather align with the standard than fork it.
Three things a fiat binding should steal from a running ledger
Building this rail first and reading the spec second turned out to be the right order — a few things only show up when real cents move:
- Idempotent settlement must be normative. Upstream leaves /verify and /settle retry semantics unspecified (#452). On a money rail, a retried settle that double-bills is not an edge case, it's a certainty. In peage's binding, idempotency keys are part of the contract.
- Caps belong to the wallet, not the merchant. Agents hand their wallet token to strangers — that only works because the wallet holder sets a per-call cap and a per-merchant daily cap the merchant cannot exceed.
- A credit-backed intermediary should prove solvency continuously. peage recomputes its ledger invariant on every request, publicly: /v1/solvency — everything ever funded equals wallet float + escrow + merchant balances + fees. If you hold other people's balances, this is table stakes.
And the demand side: your agent gets a wallet in one config line
The same day-job continued: peage-mcp is an MCP server (one 120 KB static binary, no runtime) that gives any MCP-capable agent — Claude Code, Claude Desktop, anything — the wallet as seven native tools: mint, balance, top-up link for its human, paid requests, spending caps, receipt verification, and a solvency audit of the rail itself.
The whole rail is a ~110 KB binary written in machin, my machine-first language. The docs are written for agents first: peage.intrane.fr/llms.txt.
If you're building in the x402 ecosystem and want a fiat leg to test against — the facilitator is live, the demo endpoint costs one cent, and I answer email: javi@intrane.fr.