Paying with a Tempo wallet
Machine payments let an agent pay per call and keep working without a human. This page covers the wallet side, which the MPP docs assume you already have.
You probably do not need this
Most people should stop here. MPP exists for one case: an autonomous agent that must pay mid-task with nobody watching. If a person is in the loop, every row above the last one is faster and cheaper.
| What you want | Use | Cost |
|---|---|---|
| Just to see the data | Keyless trial: search_funds, get_fund | Free, 10 calls/day, no signup |
| To build on the free tools | Free API key | Free, 100 calls/month |
| Signals (GP profiles and matching on Pro) | Pro subscription | €29/mo, card |
| An agent paying per call, unattended | This page | €0.10 per signals call |
1. What the challenge asks for
Call a paid tool with no credential and you receive a challenge that decodes to:
method: tempo intent: charge chainId: 4217 (Tempo mainnet) currency: 0x20C000000000000000000000b9537d11c60E8b50 (USDC / USDC.e) amount: 115375 (example: 6 decimals = $0.115375) expires: 5 minutes
The amount is an example. It is the EUR price converted to USDC at the ECB daily reference rate plus a 1.5% buffer, so it moves a little every day. Current EUR prices are in the tools reference.
The token, because this has already confused someone
The currency address above is USDC (USDC.e) on Tempo mainnet. It is not pathUSD. pathUSD lives at 0x20c0000000000000000000000000000000000000 and is a different thing entirely: the quote token for Tempo's native exchange and the fallback gas token. If you compared against the pathUSD address in Tempo's own docs, that is why it did not match.
TIP-20 tokens use 6 decimals, so 115375 is $0.115375, not 115,375 of anything.
2. A wallet on Tempo mainnet
Any EVM wallet works. Add the network manually:
Network name: Tempo RPC URL: https://rpc.tempo.xyz Chain ID: 4217 Explorer: https://explore.tempo.xyz
Two things that look broken and are not:
- Your native balance shows a nonsense number. Tempo has no native gas token, so wallets display a placeholder.
- Gas is paid in stablecoins. Fees come out of a TIP-20 balance rather than a separate gas asset, and cost well under a cent.
Add USDC as a custom token using the address above, or your balance will not appear at all.
3. Funding it
This is the step we cannot yet document honestly.
What we know: you need USDC on Tempo mainnet, chain 4217, at the token address above. The Tempo CLI exposes tempo wallet fund, and the MPP docs cover the CLI well.
What we will not guess at:
- the practical onramp routes into Tempo mainnet USDC from EUR or a card
- the minimum top-up. Our first tester estimated $5 to $20 and that was his main hesitation. We will fund a wallet ourselves and publish the real number here.
If you get there before we do, tell us what it cost and your route goes on this page.
On MPP Credits
Asked for, and the honest answer is no. The mppx version this server runs has no credits concept at all: its intents are charge, session and subscription, and nothing in its surface mentions credits. tempo wallet fund --credits is a wallet-side onramp rather than something a server advertises. If credits become part of the protocol we will support them and say so here, because card-payable credits would remove most of this page.
4. Paying a challenge
With a funded wallet, an MPP-aware client handles the round trip: it calls, receives the challenge, signs, retries with the credential, and gets the data plus a receipt. Two details specific to this endpoint:
- MCP clients get the challenge on a 200, not a 402. The JSON-RPC error carries code
-32042with the challenge inerror.data.challenges. Plain HTTP callers get a real 402 withWWW-Authenticateinstead. That is mppx's convention, not ours. - Return the credential in
params._meta. MCP clients cannot set an HTTP header on a tool call, so the server bridges it.
Challenges expire after five minutes. Request a fresh one rather than reusing.
5. Timeouts and retries
Retrying never costs twice
The same call returns the same challenge, never a new one. Once that challenge is paid, the same call returns the stored result free. A timeout followed by a retry cannot produce two payments.
The boundary is derived from the payer, the tool and the canonical arguments, so you do not have to set anything. Argument order does not matter: keys are sorted before comparison. To choose the boundary yourself:
{ "params": { "_meta": { "vc.fundmomentum/idempotency-key": "your-id" } } }An agent does not need this page to find that out: every challenge carries the same guarantee in error.data.idempotency, with guaranteed, meta_key, meta_key_optional and a note.
Set your timeout generously for match_startup. It takes three to ten seconds because it reasons over the whole database. That is normal, not a hang. The retry guard exists as a safety net, not as a substitute for a sensible timeout.
6. If something goes wrong
| What you see | What it means |
|---|---|
-32042 | Normal. Challenge attached in error.data.challenges, nothing charged. |
-32043 | Your credential did not verify. You may have paid. Send us the transaction hash and we will credit it by hand. |
-32000, error_reason: "not_found", with checked_before_payment: true | The slug does not exist, or that fund has no published signals. You were not charged, and the message names the closest real slugs. |
-32602, error_reason: "invalid_args", with checked_before_payment: true | An unknown, missing or malformed parameter. Checked before any challenge, so you were not charged. The message names what it expected. |
A -32043 is the one to report immediately. It means money may have moved without data coming back, and we would rather hear about it than have you absorb it.
What we would rather you did
Tell us where you stopped. A failed run explains more than a successful one, and this page exists because someone did exactly that.