ADD ONE LINE. SETTLE ON STELLAR TOO.
You already take money on your own key. Your endpoint answers 402 and gets paid on Base or Solana, and nothing about that has to change. x402 v2 lets one route advertise several ways to pay — one entry in accepts[] per chain, each with its own network and payTo. Add a Stellar entry and buyers on Stellar can reach you too.
Your 402 challenge, before and after
HTTP/1.1 402 Payment Required
{
"x402Version": 2,
"accepts": [
{
"scheme": "exact",
"network": "eip155:8453",
"payTo": "0xYourBaseAddress",
"price": "$0.01"
}
]
}HTTP/1.1 402 Payment Required
{
"x402Version": 2,
"accepts": [
{
"scheme": "exact",
"network": "eip155:8453",
"payTo": "0xYourBaseAddress",
"price": "$0.01"
},
{
"scheme": "exact",
"network": "stellar:pubnet",
"payTo": "GYOUR...STELLARADDRESS",
"price": "$0.01"
}
]
}One endpoint, one entry per chain. The buyer’s client picks whichever it can pay with. Your existing Base or Solana revenue is untouched— the first entry is byte-for-byte the one you have now, buyers already paying you keep paying you the same way, and you are not migrating anything.
What that looks like in code
Two added lines register the Stellar scheme, and one added entry advertises it. Shown with @x402/express; the shape is the same for Hono, Next.js and any other x402 v2 server middleware.
import { paymentMiddleware, x402ResourceServer } from "@x402/express";
import { ExactEvmScheme } from "@x402/evm/exact/server";
import { ExactStellarScheme } from "@x402/stellar/exact/server"; // +
import { HTTPFacilitatorClient } from "@x402/core/server";
const resourceServer = new x402ResourceServer(
new HTTPFacilitatorClient({ url: "https://x402.org/facilitator" }),
)
.register("eip155:8453", new ExactEvmScheme())
.register("stellar:pubnet", new ExactStellarScheme()); // +
app.use(
paymentMiddleware(
{
"POST /v1/summarize": {
accepts: [
{ scheme: "exact", price: "$0.01",
network: "eip155:8453", payTo: "0xYourBaseAddress" },
{ scheme: "exact", price: "$0.01", // +
network: "stellar:pubnet", payTo: "GYOUR...ADDRESS" }, // +
],
},
},
resourceServer,
),
);No Stellar account yet?
That is not a blocker and it is not a migration. A Stellar address is just a keypair; the only friction is the account reserve and a USDC trustline. We sponsor both — tell us on the form below that you need one and we open it for you. The address is yours, the money goes straight into it, and moving that USDC back to Base afterwards is a bridge you run when you feel like it, from your own wallet.
What we ask you for
Service name
How it appears in the catalog and to buying agents.
API base URL
The server you already run. We route to it; we never host it.
The routes to charge, and their prices
Per call, in USD. Charge some routes and leave the rest free if you like.
A payout address per chain
At least one. This is where buyers' money lands — on your key, not ours.
What stays yours
Your server stays yours. Your key stays yours. Payments land directly on your address — nothing custodial on our side. We handle discovery, routing, the paywall snippet and the dashboard.
What happens next
- 1We check your endpoint answers a well-formed 402 challenge, that the price matches, and that the payTo address is the one you registered.
- 2One minimal paid call runs against your service as a real buyer. The money lands in your wallet, not ours.
- 3You are listed in the MPP Router catalog, at /services and in llms.txt, with you as the operator.
- 4The same integration makes you visible across the x402 surface — x402scan, the Bazaar and MPPScan.