Payment rails

x402 vs MPP

An agent with a Base wallet pays with x402; an agent with a Tempo wallet pays with MPP. Both rails are accepted on the same APIbase endpoints at the same listed price per call, and both return a public receipt. They differ in what happens when the provider fails.

Use one rail per request, never both. Prices are on /pricing; the connection steps are on /connect; the reason for a single endpoint is on /why.

What each rail is

x402 is HTTP 402 Payment Required used as a payment protocol. The server answers a priced call with a 402 challenge naming the price. The agent's wallet signs an EIP-3009 transferWithAuthorization for USDC on Base mainnet and retries with it in the X-PAYMENT header. Over MCP the same payment can travel in params._meta["x402/payment"]. APIbase's self-hosted facilitator settles it on-chain.

MPP is the Machine Payments Protocol on Tempo. The agent signs a credential for each call with the mppx SDK against a Tempo wallet (chain 4217) and sends it as Authorization: Payment <credential>, or as Payment-Authorization: Payment <credential> next to a Bearer key. The currency is USDC.e on Tempo mainnet.

Side by side

x402MPP
Network and assetUSDC on Base mainnetUSDC.e on Tempo mainnet (chain 4217)
What the agent signsAn EIP-3009 transfer authorizationA credential for each call
HeaderX-PAYMENTAuthorization: Payment
ClientAn x402 clientmppx 0.6.16 or newer, with polyfill: false
SettlementAfter a delivered response, by the self-hosted facilitatorBefore the provider call
Provider failsNot settled: nothing leaves the walletRefund owed, paid out by the operator
Same lookup again within 2 minutesAnswered from cache and not chargedCharged again
First payment from a new walletCreates the agent identityCreates the agent identity
ReceiptPublic, X-APIbase-Receipt headerPublic, X-APIbase-Receipt header

A replayed MPP credential is refused with 403 credential_replayed.

When an agent picks which

Refunds per rail

The “Provider fails” row of the table is the short form. The full statement, kept current, is in /pricing#refunds.

Receipts

Each billed call on either rail has a public, immutable receipt at https://apibase.pro/r/<receipt_id>.json. What a receipt contains is in the privacy policy.

Related