MPP
The Machine Payments Protocol (MPP) is an open standard for machine-to-machine payments over HTTP, co-authored by Tempo and Stripe and specified as an IETF draft at paymentauth.org.
Like x402, MPP uses the HTTP 402 Payment Required status code. It adds payment-method neutrality: one client integration can settle in a stablecoin, on a card, or in fiat, and the wire format does not change. The handshake is Challenge, then Credential, then Receipt, built on the standard HTTP authentication headers.
The You.com Web Search and Finance Research APIs accept MPP. A client can call either one with no API key and no You.com account.
Web Search costs $0.01 per call and Finance Research $0.11 or $0.50 depending on the effort tier. None of it draws down your credit balance. If your wallet is on Base or Solana rather than Tempo, x402 is half the price on Web Search and identical on Finance Research.
How It Works
- The client makes a normal request. No
X-API-Key, noAuthorizationheader. - You.com responds
402 Payment Requiredwith a Challenge in theWWW-Authenticateheader, using thePaymentauthentication scheme. The Challenge names the price, the payment method, the intent, and when the offer expires. - The client fulfills the payment by signing a transaction on the named chain.
- The client retries the same request with a Credential in the
Authorizationheader. The Credential echoes the Challenge and carries method-specific proof of payment. - You.com verifies the Credential, runs the request, and responds
200 OKwith a Receipt in thePayment-Receiptheader.
Headers
Supported Endpoints
MPP amounts are expressed in the base units of the token named by currency. USDC has six decimals, so 10000 is $0.01.
The HTTP method differs per endpoint, and the wrong one returns 401 with no Challenge rather than a helpful error. Web Search offers payment on GET only, and Finance Research on POST only. POST /v1/search and GET /v1/finance_research both return 401.
The Contents and Research APIs return 401 on every method and do not offer payment terms.
Web Search
One cent is a floor rather than a coincidence. MPP settles through Stripe, and one cent is the smallest amount a Stripe-hosted payment can charge, so the per-call price is exactly one cent. x402 has no such minimum and charges $0.005 for the same call.
Query parameters and the response body are the same as the key-authenticated GET endpoint. See the Web Search API reference. Result count is count, and an unrecognized parameter is ignored rather than rejected, so a misspelled one silently returns defaults.
livecrawl is supported and priced into the Challenge. It adds $0.001 per result to the underlying price, and MPP then rounds up to the next whole cent:
count sets how many pages are charged for, and the crawl mode does not change the price. Because of the cent rounding, small count values absorb into the base price: count=5&livecrawl=web still quotes 10000.
If you are comparing costs against a key-authenticated integration, machine payments charge per count regardless of crawl mode, where credit billing charges per page fetched. At count=10 with livecrawl=all that is 10 pages here and 20 there. Budget from the amount in the Challenge, which is what you actually pay on this path.
Read the amount out of the Challenge rather than computing it. A Challenge issued for one count and livecrawl combination does not carry over to a different one.
Finance Research
Finance Research takes a JSON body on POST, so there is no query-string form. The financial question goes in input, and research_effort selects the tier:
The price is fixed per tier rather than scaling with the request, and deep is the default when research_effort is omitted. Both tiers land on a whole cent already, so the rounding above does not apply and MPP costs the same as x402 here. See the Finance Research API reference for the response shape.
Send deep or exhaustive and nothing else. Those are the only values the Finance Research API reference accepts, and it returns 422 for anything else. The Challenge is issued before the body is validated, so it will quote a price for an unsupported tier rather than refusing it. Paying against that quote risks spending on a request the endpoint will reject.
Latency is the other thing to plan for. A deep call takes under 120 seconds and exhaustive under 300, well beyond a typical HTTP client default, so raise your timeout before the payment round trip rather than after.
Payment Methods and Intents
Reading the Challenge
The spec also defines optional opaque and digest parameters. Neither is currently emitted, so there is nothing extra to echo back and no integrity digest to verify.
The decoded request object:
The recipient value is redacted above, and it changes between challenges. Take it from the Challenge you were issued rather than from these docs or from a previous response. A client that caches a recipient will pay the wrong address.
Do not modify a Challenge and resubmit it. Pass the parameters back exactly as they arrived, including the request string, which must be echoed byte for byte rather than decoded and re-encoded.
Submitting a Credential
Decoded, a Credential looks like this:
Each Credential is valid for exactly one request. Replays are rejected.
Making a Paid Request
The mppx SDK polyfills fetch, so your existing code works unchanged. The 402, the payment, and the retry all happen underneath.
TypeScript
mppx CLI
Official SDKs are also available for Python (pympp), Rust (mpp-rs), Go (mpp-go), and Ruby (mpp-rb). See the MPP SDK documentation.
Agent Wallets
If you are wiring up an autonomous agent rather than an application, several managed wallets handle funding and spend controls for you, including Tempo Wallet and the Privy Agent CLI. Both let a human set spend limits and revoke access without the agent holding a private key directly.
Receipts
On success we return a base64url-encoded Receipt in the Payment-Receipt header:
The reference field is the Tempo transaction hash. Log it if you need an audit trail. There is no invoice and no credit-history line item, because there is no account.
The field names above follow the MPP specification. Reading a Receipt requires settling a real payment, so parse defensively rather than asserting on this exact shape, and tell us if a live Receipt disagrees.
Limits and Safeguards
Expiry. Challenges expire at expires, 10 minutes after issue. Request a fresh Challenge rather than reusing an expired one.
Single use. One Credential satisfies one request.
Rate limits. Challenge issuance is capped at 10 per minute per caller. An 11th unpaid request inside the same minute returns 429 with a Retry-After header and a https://paymentauth.org/problems/rate-limited problem type instead of a fresh Challenge. Hold the Challenge you were issued rather than minting one per attempt. Keyless requests cannot inherit an organization’s custom QPS limit.
Finality. Stablecoin settlement is final, and there is no testnet to rehearse on.
Data Retention
Zero Data Retention is not available on MPP requests.
ZDR is an account-level configuration. It is added to an enterprise agreement and enforced against a specific organization’s API keys. An MPP request presents no API key and no account, so there is no agreement to attach ZDR to and no identity to enforce it against. Keyless requests fall outside ZDR and are handled under You.com’s general terms.
Two consequences to plan around:
- There is no account-scoped deletion path. Deletion and data subject requests are handled per organization. An MPP request has no organization, so there is no established route to scope such a request to your traffic.
- Routing end-user queries through this path is a decision you own. If you have a retention, residency, or compliance commitment to your own users, send those queries with an API key on an enterprise agreement that has ZDR enabled.
The payer identity in a Credential’s source field is a wallet address, DID, or account ID on the payment rail. It is not a You.com account and does not carry any data handling configuration with it.
If ZDR is a requirement, use API key authentication and ask your account team about adding ZDR to your agreement.
Errors
A 402 response body is application/problem+json:
Troubleshooting
I get a 402 loop. Your client is most likely re-encoding the request string instead of echoing it. Pass the Challenge parameters back exactly as they arrived.
I am getting 401 instead of 402. Check the verb before anything else. Web Search offers payment terms on GET /v1/search and Finance Research on POST /v1/finance_research. The inverse of either returns 401 with no hint that the method is the problem. The Contents and Research APIs return 401 on every method, since they do not accept machine payments at all.
My wallet has USDC but verification fails. Confirm the balance is on Tempo, chain ID 4217, in the token named by currency. USDC on Base or Solana cannot satisfy a Tempo Challenge. If your funds are on Base or Solana, use x402 instead.
Payment settled but the request returned a 5xx. A Challenge is valid for exactly one request, so a retry needs a fresh Challenge and settles a second payment. Keep the Receipt from the failed call and contact support with it rather than absorbing the double charge.
Can I use MPP and an API key on the same endpoint? Yes, on the same route, but not in the same request. Requests are routed by what they present.
Should I use MPP or x402? Pick by where your funds are. x402 covers Base and Solana, MPP covers Tempo, and both reach the same two endpoints. Price only separates them on Web Search, where x402 charges $0.005 against MPP’s $0.01. Finance Research costs the same on either. So if you are starting from scratch and most of your traffic is search, x402 is cheaper today. Reach for MPP when your agent is on Tempo, or when you want the integration that will pick up card and fiat rails as we enable them. Both are supported and neither is being deprecated.
Related
Pay per request in USDC on Base or Solana. Cheaper on Web Search.
The standard credit model, for key-authenticated access.
Questions & Support
For MPP questions, reach us in Discord or contact [email protected].