The 402 response
A request to a multi-rail endpoint without payment headers returns:amount is in atomic units. USDC has 6 decimals everywhere, so 10000 means $0.01. payTo is an EOA on each rail (mandatory: the same EVM key holds balance on every EVM chain we support; the Solana key is separate).
How clients pick a rail
Clients should treat the Tempo MPP option and the Base / Solana x402 options as separate payment methods. A wallet that only understands x402 can useaccepts[]. A wallet that understands MPP can use the WWW-Authenticate challenge. Payment-aware wrappers such as AgentCash or Sponge can choose across both.
Order of selection (when no override is provided):
- Check which chains the wallet has balance on.
- Filter
accepts[]to options matching those chains. - Pick the first match (or the cheapest, if amounts differ across rails — they don’t on Remlo today).
paymentNetwork: 'solana' etc.) so the agent operator can force a chain regardless of balance.
Paying on Tempo (MPP protocol)
The Tempo rail uses MPP, signaled by theWWW-Authenticate: Payment header. To pay:
mppx/client handles the EIP-3009 transferWithAuthorization signature internally. The credential it returns is a base64-encoded signed authorization that Remlo verifies via mppx’s embedded facilitator (no external service in the loop).
Remlo also accepts Authorization: mpp ${credential} for older agent wrappers, but new clients should use the Payment auth scheme.
If the wallet provided isn’t a viem Account, mppx/client exposes lower-level helpers that take a sign function instead.
Paying on Base (x402 protocol, EVM scheme)
@x402/core handles the 402 retry loop. It reads accepts[], finds the Base option, signs an EIP-3009 transferWithAuthorization against the recipient, base64-encodes the v2 PaymentPayload, and retries with X-PAYMENT: <base64> set.
Paying on Solana (x402 protocol, SVM scheme)
Paying via AgentCash
Skip the protocol details entirely. AgentCash handles all three rails:agentcash.dev independently of Remlo; we use them because they implement the open protocols correctly.
Server side: what Remlo verifies
When the retry comes in, Remlo dispatches based on which header the agent supplied:State mutating endpoints
Two endpoints stay Tempo only:POST /api/mpp/payroll/execute($1.00). Writes to Tempo PayrollTreasury and PayrollBatcher.POST /api/mpp/bridge/offramp($0.25). Pulls from Tempo treasury, posts to Bridge.