Two days ago we landed c9a70d2: Make x402-mesh rail-agnostic: add Stripe MPP, ACP, AP2 (+ L402, card).
It sounds like a small README change. It's actually a protocol shift.
x402-mesh started as a fix for a very specific dead end: an AI agent hits a 402 Payment Required, sees one price from one vendor, and has no way to compare. We turned that dead end into a market by adding two backward-compatible primitives to the 402 body:
- A peer menu: a signed list of competing offers in the same category
- Settlement: if the agent picks a competitor, that competitor pays the referrer a commission
Vanilla x402 clients ignore it. Mesh-aware agents get a market.
But that problem isn't x402-specific. It's every agent payment rail that shipped in the last year.
The door is the problem, on every rail
- Stripe MPP (Machine Payments Protocol, Stripe + Tempo, Mar 2026): metered per-call billing for APIs, stablecoin and fiat (cards, Klarna, Affirm) via Shared Payment Tokens
- ACP (Agentic Commerce Protocol, OpenAI + Stripe): agent checkout, live in ChatGPT Instant Checkout
- Google AP2 (Agent Payments Protocol, 60+ partners including PayPal, Mastercard, Amex, Adyen, Coinbase): the rail-agnostic authorization layer over cards, bank and stablecoin
Every one of them presented the agent with the same single-vendor door. So we made the mesh ride on all of them.
What changed in v0.1
The protocol core is untouched. Sections 2-7 of SPEC.md (the Ed25519 JWT referral token with iss, aud, exp, jti, cpct; discovery via /.well-known/x402-mesh.json; registry with public key mapping; identity composition; 5% default commission; 5-min TTL) are now explicitly rail-neutral.
A rail binding is just two functions:
- Where does the menu ride?
- And how does the commission split?
SPEC.md §8 now defines the official bindings:
| Rail | Menu carrier | Commission split | Proof |
|---|---|---|---|
| x402 (Coinbase) | mesh object in 402 body | atomic MeshSplitter.sol on Base | tx_hash |
| L402 (Lightning) | mesh object in 402 body | payout over Lightning | preimage |
| Stripe MPP | mesh in payment-required / session response | Stripe Connect application_fee on same charge | charge_id |
| ACP | mesh attached to product feed / checkout | Stripe Connect application_fee | charge_id |
| Google AP2 | alternatives[] during Cart / Intent Mandate exchange | commission terms inside signed Payment Mandate | mandate_id |
The referral_token itself is unchanged across rails. On x402/L402 it travels in the follow-up request. On MPP/ACP it travels in the Shared Payment Token metadata. On AP2 it is referenced by the Payment Mandate.
That has two big consequences:
1. No escrow for fiat vendors
On x402, the reference adapter is still the non-custodial MeshSplitter.sol: agent pays contract, contract atomically forwards vendor share + referrer commission. No float, no trust.
On MPP and ACP, vendors skip the contract entirely. The commission is a native Stripe Connect application_fee. The /settle endpoint becomes optional for moving money. It's still used for the cross-vendor redemption ledger, which is the foundation for the open agent-reputation primitive.
Crypto-native onboarding is still one field: a Base wallet address. No Stripe account, no KYC.
2. Card-network agent programs just work
Visa Trusted Agent Protocol and Mastercard Agent Pay aren't separate bindings. They settle underneath AP2 or ACP, which already carry the mesh fields.
A vendor can support several rails at once by listing them in payout_rails in the registry. The menu advertises each peer's accepted rails, so the agent settles on one both sides share.
The name is historical
The name is historical. The protocol was first specified on x402 and still ships its reference adapter there, but it is not limited to it.
That's now in the README verbatim. x402-mesh is not "the x402 referral thing" anymore. It's the commerce layer that composes with whatever identity standard wins (Catena ACK-ID with DIDs + VCs, WIMSE / RFC 8693 Token Exchange actor-chain, WorkOS auth.md, A2A / AGNTCY) and settles the money on whatever rail the agent brought.
The full wire details are in SPEC.md §8, and the reference middleware is still npm x402-mesh.
MIT as always. Copy it, fork it, run your own registry.



