← Back to blog
Product July 17, 2026 by Javier Arancibia

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-required

Retry 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.