Pay per call with stablecoins over x402, MPP or Nanopayments.
By default you pay with prepaid credits. You can also pay per call with stablecoins over three rails, with no account:
- x402 pays in USDC on Base, at
www.orthogonal.com/pay. - MPP (Machine Payments Protocol) pays in USDC.e on Tempo, at
www.orthogonal.com/mpp. - Nanopayments pays in USDC through Circle Gateway, at
www.orthogonal.com/np.
All three work the same way: your request gets a 402 Payment Required, your client signs a payment and retries, and the payment is settled before the call runs.
x402
Endpoints live at https://www.orthogonal.com/pay/{api}/{path}.
CLI
Pay from the terminal with purl, a curl-compatible client that speaks x402. You need:
- A wallet funded with USDC on Base. Inspect the endpoint’s accepted network and token before funding your wallet.
# Install
brew install stripe/purl/purl
# Create a wallet, then fund it with USDC on Base
purl wallet add
purl balance
# Pay with USDC on Base and call the endpoint
purl -X POST \
-H "Content-Type: application/json" \
-d '{"url_to_scrape": "https://example.com"}' \
'https://www.orthogonal.com/pay/olostep/v1/scrapes'
Code
Set PRIVATE_KEY to an EVM wallet holding USDC on Base. The client handles the 402 for you.
import { wrapFetchWithPayment } from "x402-fetch";
import { privateKeyToAccount } from "viem/accounts";
const account = privateKeyToAccount(process.env.PRIVATE_KEY);
const fetchWithPayment = wrapFetchWithPayment(fetch, account);
const res = await fetchWithPayment("https://www.orthogonal.com/pay/olostep/v1/scrapes", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ url_to_scrape: "https://example.com" }),
});
console.log(await res.json());
Install with npm install x402-fetch viem or pip install x402 eth-account requests.
MPP
Endpoints live at https://www.orthogonal.com/mpp/{api}/{path}.
CLI
Pay from the terminal with mppx:
# Create a Tempo account (stored in your keychain)
npx mppx account create --network mainnet
# Fund with USDC.e on Tempo, then call the endpoint
npx mppx --network mainnet -X POST -J '{"url_to_scrape": "https://example.com"}' \
'https://www.orthogonal.com/mpp/olostep/v1/scrapes'
Code
import { privateKeyToAccount } from "viem/accounts";
import { Mppx, tempo } from "mppx/client";
Mppx.create({
methods: [tempo({ account: privateKeyToAccount(process.env.PRIVATE_KEY) })],
});
// fetch now settles 402 payments on Tempo
const res = await fetch("https://www.orthogonal.com/mpp/olostep/v1/scrapes", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ url_to_scrape: "https://example.com" }),
});
console.log(await res.json());
Install with npm install mppx viem.
Nanopayments
Endpoints live at https://www.orthogonal.com/np/{api}/{path}. Nanopayments is x402 settled in batches by Circle Gateway: you deposit USDC into a Gateway balance once, and each call is paid from it without gas.
Code
import { GatewayClient } from "@circle-fin/x402-batching/client";
const gateway = new GatewayClient({
chain: "base",
privateKey: process.env.PRIVATE_KEY,
});
// Move USDC into your Gateway balance, once
await gateway.deposit("1");
// Pay for and call the endpoint
const { data } = await gateway.pay("https://www.orthogonal.com/np/olostep/v1/scrapes", {
method: "POST",
body: { url_to_scrape: "https://example.com" },
});
console.log(data);
Install with npm install @circle-fin/x402-batching viem.
Payable tools in the catalog work with these rails. Use the integrate tool (MCP or /v1/integrate) to get a ready-to-paste snippet for any endpoint.