Remlo’s paid endpoints don’t use API keys. They use HTTP 402 Payment Required with two protocols:Documentation Index
Fetch the complete documentation index at: https://docs.remlo.xyz/llms.txt
Use this file to discover all available pages before exploring further.
mpp (Tempo) and x402 (Base, Solana). An agent reads the 402 challenge, picks a chain, signs a payment proof, and retries the same URL with the proof in a header.
Two protocols, three chains
| Protocol | Chain | Header on retry |
|---|---|---|
mpp | Tempo Moderato (chainId 4217 mainnet, 42431 testnet) | Authorization: mpp <credential> |
x402 | Base mainnet (eip155:8453) | X-PAYMENT: <base64 payload> |
x402 | Solana mainnet (solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp) | X-PAYMENT: <base64 payload> |
What 402 looks like
A request without payment headers returns:WWW-Authenticate: mpp ... header is the Tempo challenge. The JSON body’s accepts array lists the x402 options (Base, Solana). An agent picks one based on which wallet has balance, signs the proof, and retries.
Tempo: mpp protocol
If the agent’s wallet has Tempo USDC.e and they want to pay on Tempo:- Read the
WWW-Authenticate: mppheader. NotechainId,currency,recipient,amount. - Construct an mpp credential. The simplest form uses the
mppx/clientSDK or AgentCash, which signs an EIP-3009transferWithAuthorizationagainst the recipient and returns a base64 credential string. - Retry the original URL with
Authorization: mpp <credential>. - The server verifies via mppx’s embedded facilitator, runs the handler, and returns 200 with a
Payment-Receiptresponse header.
Base or Solana: x402 protocol
If the agent’s wallet has USDC on Base or USDC on Solana and they want to pay on either:- Read the JSON body’s
acceptsarray. Pick the entry whosenetworkmatches the wallet’s chain. - Construct the x402 v2 payload:
scheme: copy from the picked entry (exact).network: copy from the picked entry.- For Base: sign an EIP-3009
transferWithAuthorizationfrom the agent’s wallet topayToforamountofasset. - For Solana: sign an SPL token transfer from the agent’s wallet to the recipient’s USDC token account for
amount.
- Wrap the signed proof in
{ x402Version: 2, accepted: <picked>, payload: <signed> }. - Base64 encode the JSON. Set as
X-PAYMENTheader. Retry the URL. - Server verifies via the CDP facilitator. On success, runs the handler and returns 200.
@x402/core + @x402/evm + @x402/svm packages handle the signing and encoding. AgentCash wraps them all.
Settlement
Verification runs synchronously, before the handler. Settlement (broadcasting the signed proof on-chain to actually move the USDC) runs after the handler returns, fire and forget. Handler latency is not extended by the on-chain confirmation step. If settlement fails after the handler returned, the error is logged server-side but the response that already went out stands. The signed proof is recorded in the facilitator’s queue and can be re-broadcast or claimed later. From the agent’s perspective, payment is irreversible the moment they sent the signed proof.State mutating endpoints
Two endpoints intentionally accept Tempo only:POST /api/mpp/payroll/execute($1.00). Writes to Tempo PayrollTreasury + PayrollBatcher.POST /api/mpp/bridge/offramp($0.25). Pulls from Tempo treasury and posts to Bridge.
What the server checks
Formpp (Tempo): the credential signature recovers to the agent’s claimed wallet, the EIP-3009 authorization is unused, the amount and recipient match the challenge, and the chainId is 4217 (mainnet) or 42431 (testnet) as configured.
For x402 (Base / Solana): the X-PAYMENT header is base64 valid JSON matching the v2 schema, accepted.network is one of our supported rails, and the CDP facilitator’s verifyPayment returns isValid: true. Verification details (signature recovery, asset address match, amount match) live inside the facilitator and the protocol scheme implementation.
If verification fails, the server returns 402 again with an error string explaining why.
Why no API keys
Remlo doesn’t issue API keys for paid endpoints because the protocol already provides a stronger primitive: every request carries a fresh, signed proof of payment. An agent’s wallet is its identity. There’s nothing to leak that wouldn’t also be a key to drain the agent’s wallet. For endpoints that need an authenticated principal (compliance reports for a specific employer, payroll execution against a specific treasury), Remlo layers a Privy JWT on top of the payment proof. The payment is the toll; the JWT is the identity. Both are required.Two-factor: payment + principal
For any endpoint that mutates employer state or discloses scoped data, Remlo requires both a payment proof AND a principal proof. The matrix:| Endpoint shape | Payment proof | Principal proof |
|---|---|---|
Public reads (yield-rates, memo/decode) | Yes | Not required |
Employer-scoped reads (treasury/optimize, payroll/status, escrow/status) | Yes | Privy JWT (employer owner) or Tier 1 / Tier 2 agent proof |
Employer-scoped writes (payroll/execute, agent/pay, bridge/offramp, agent/session/treasury rebalance, escrow/post) | Yes | Privy JWT (employer owner) or Tier 1 / Tier 2 agent proof + caps |
Employee-scoped reads (payslips/[runId]/[employeeId]) | Yes | Privy JWT (employee owner) or the run’s employer (Privy / agent) |
agent/pay and drain any employer’s treasury. Payment is service revenue, not authorization.
There are two flavors of agent principal proof. See agent-registration for the full setup.
Tier 1 — HMAC
The employer issues asigning_secret from their dashboard. The agent computes:
Tier 2 — ERC-8004 + ECDSA
The agent registered an ERC-8004 Identity token on Tempo. The EOA that owns the token signs a canonical Remlo message:IdentityRegistry.ownerOf on registration), recovers the signer from the signature, and rejects on mismatch.
Tier 2 — Solana pubkey + Ed25519
For Solana-native agents. Same canonical Tier 2 message, but no on-chain mint and noownerOf lookup — the Solana pubkey IS the identity:
solana_pubkey from the authorization row and runs Ed25519 verify against it. Possession of the private key is the only auth check.
Tier 2 (either flavor) means an agent has one identity across every Remlo employer who authorizes them, and reputation accrues to the on-chain agentId or pubkey across every system that reads ERC-8004 (Tempo) or SAS (Solana) — not just Remlo.