The Otto AI storefront is consumed by agents, scripts and CLIs — not by a browser. Discovery is free and works anywhere, including a browser tab. Paying requires a client that can sign, so budget for a terminal or an agent runtime before you get to the paid call. Which client can actually pay covers the split.
https://x402.ottoai.services
Networks: Base Mainnet, Polygon Mainnet and Solana Mainnet. Individual routes may offer a subset — the accepts array in each route’s 402 challenge is definitive.
Payment: USDC on Base, Polygon, or Solana. Permit2 infrastructure ready for any ERC-20 token.
Discovery — all four surfaces are free to fetch. No payment, no API key:
The catalog grows and changes, so read the endpoint count instead of quoting one:
Not sure which endpoint you need? The Otto X402 Router (
POST /meta-intelligence) recommends the best x402 services for your task across both this catalog and the live CDP Bazaar — non-custodial, zero markup, $0.001 per call (a flat router fee, never a markup on the services it recommends).x402 V2 Features
Each 402 challenge advertises exactly which of these it supports. Read them from the live challenge rather than from this table:
Which client can actually pay
What the catalog page atx402.ottoai.services is good for, in a browser:
- Browsing every service grouped by capability tag, with its price and its parameter.
- Inspecting a route and generating a request URL for it.
- Copying a ready-made
curlcommand to run in your own terminal or agent. - “Try”, which opens the raw endpoint URL in a new tab. That returns the
402challenge — it does not pay, and it does not return data.
For the SDK path, the Client-Side Example section on this page shows a complete runnable example. The catalog page’s Inspect panel also generates a per-endpoint snippet — both use the real published packages (
@x402/axios, @x402/evm).Pricing Overview
This table is a hand-maintained convenience copy and it does not list every route. The live
402 challenge is the source of truth for what a call costs, and /llm.txt is the source of truth for what exists. Where this table and the live challenge disagree, the challenge wins.How to Make a Request (x402 V2 Flow)
Consuming an x402-powered API is a multi-step process. The client (buyer) first makes a request, receives a payment requirement, pays, and then retries the request with proof of payment.Step 1: Initial Request (Fails with 402)
First, the client makes a standard HTTP request to the desired endpoint. The server responds with HTTP 402 Payment Required and aPAYMENT-REQUIRED header containing base64-encoded payment options. Fetching a challenge is free — no payment and no key.
The 402 challenge is the source of truth for price. The pricing table above is a convenience copy and can lag. Whatever the live challenge says a call costs, that is what it costs. Decode it before you pay.
accepts is one way to pay for that exact call. amount is in the asset’s smallest unit — "1000" of 6-decimal USDC is $0.001. A method of permit2 means that option settles via Permit2 rather than EIP-3009. The full decoded object also carries a resource block (URL, description, tags) and an extensions block.
Step 2: Client Signs & Pays
The client chooses a payment option from theaccepts array and signs the payment:
- USDC on Base (EIP-3009) — zero-approval, default for most clients
- Any ERC-20 on Base/Polygon (Permit2) — requires Permit2 approval
- USDC on Solana — SPL token transfer
@x402/axios.
Step 3: Retry Request with Payment Header
The client retries the exact same request with aPAYMENT-SIGNATURE header containing the signed payment payload.
Step 4: Success (Receives Data + Receipt)
Otto AI verifies the payment via the CDP Facilitator, settles on-chain, and returns 200 OK with the data. On an EVM settlement thePAYMENT-RESPONSE header also carries the signed otto-content-receipt described in After You Pay.
bazaar extension of its 402 challenge. For /crypto-news that declared shape is:
Step 5 (Optional): Sign-in-with-X for Repeat Access
On the routes that support it, paying once buys a re-access window — sign the SIWX challenge with the same wallet instead of paying again. Cached data endpoints do not support this and are pay-per-call only. Rather than trusting a list that drifts, ask the endpoint. A route supports SIWX if and only if its live challenge carries asign-in-with-x extension:
info block carries the exact challenge to sign — domain, uri, nonce, issuedAt, resources, statement. Alongside info, supportedChains names the signature type per chain (EIP-191 on Base and Polygon, ed25519 on Solana), and schema gives the JSON Schema for the signed object:
Understanding the Facilitator
The CDP Facilitator (Coinbase Developer Platform) is the payment verification and settlement service:- Validates Payment Signatures: Verifies the
PAYMENT-SIGNATUREheader is cryptographically valid. - Prevents Replay Attacks: Tracks nonces and timestamps to prevent signature reuse.
- Executes On-Chain Settlement: Submits transactions to Base, Polygon, or Solana to transfer the asset named in the challenge.
- A route’s
acceptsarray is the definitive list of networks that route takes. Networks in play across the storefront are Base (eip155:8453), Polygon (eip155:137) and Solana mainnet (solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp), but not every route offers all three — some execution routes are EVM-only. Read the array; do not assume Solana is on the menu. - Each EVM network appears twice — once for EIP-3009 (zero-approval) and once with
"assetTransferMethod": "permit2". - Each
acceptsentry carriesmaxTimeoutSeconds, and the matching signed offer carries avalidUntiltimestamp. Treat those two as the authority on how long you have to settle — decode them from the challenge you were served rather than assuming a fixed window.
Client-Side Example
This is the working path.@x402/axios wraps an axios instance and handles the whole 402 → sign → retry loop for you.
402, so leave axios’s default validateStatus alone. If you override it to accept every status code, the 402 never surfaces as an error, the interceptor never fires, and you get the challenge back instead of your data.
If the wallet behind PRIVATE_KEY holds no USDC on the chosen network, the retry is still sent and signed correctly — the endpoint simply answers 402 again instead of 200. Fund the wallet on Base, Polygon or Solana with the asset named in the challenge.
API Endpoint Reference
Per-endpoint response samples live on a dedicated reference page — see x402 Endpoint Examples. This page keeps the request flow and the protocol reference.Those samples are illustrative — not live data. They show the response shape with a representative payload; prices, scores and timestamps in them may be stale. The live
402 challenge is always the source of truth for price, each endpoint’s own bazaar extension is the source of truth for its output shape, and a real call returns fresh data.Deprecated Endpoints
The following endpoints have been removed and are no longer available:Troubleshooting - Common Issues and Solutions
Issue: I opened the URL in my browser and got a JSON error, not data
That is not an error. Every priced route answers an unpaid request with the402 challenge, and its body carries a hint, the price, and contact details. A browser tab cannot pay — see Which client can actually pay.
Issue: I passed a parameter and still got a 402
The paywall is evaluated before parameter validation, so a call with a missing or malformed parameter still answers402 rather than 400. Getting a 402 therefore tells you nothing about whether your parameters are right. Check the route’s required parameter in /llm.txt before assuming the endpoint is broken.
Issue: “Payment verification failed”
Possible Causes:- Insufficient balance of the asset named in the challenge, on the network you chose
- The signed offer you paid against has passed its
validUntil - Invalid or corrupted payment signature
- Payment already used (replay protection)
- Check your balance of the exact
assetfrom the challenge on the exactnetworkyou selected — the challenge names both - Ensure your system clock is synchronized (NTP)
- Re-fetch the challenge, regenerate the payment signature against the fresh offer, and retry
- Do not reuse an old payment signature
Issue: “Invalid symbol parameter”
Possible Causes:- Token symbol doesn’t exist or is misspelled
- Using the full token name instead of the symbol (e.g. “Bitcoin” instead of “BTC”)
- Use standard uppercase symbols: BTC, ETH, SOL
- Symbol-based routes resolve a ticker to the top-market-cap asset matching it, so a ticker shared by several tokens resolves to the largest one. Pass a
chain:contractaddress instead where the route accepts one - The per-route parameter and its accepted form are documented in
/llm.txt
Still Having Issues?
- Read the error body. Unpaid
402responses and error responses carry ahintfield explaining what the endpoint wants. - Re-read the route in
/llm.txt. It is regenerated from the running service, so it is ahead of any hand-written page. - Contact us —
admin@useotto.xyz, or @useOttoAI. Email and social are free; feature requests welcome.
On-Chain Standards
ERC-8004: Agent Identity on Ethereum Mainnet
Each Otto AI agent holds an ERC-8004 identity NFT on Ethereum Mainnet, under the ERC-8004 standard. This is the swarm’s identity layer: a stable, on-chain identifier per agent that is the same identifier wherever the agent trades — ACP, x402, or any other surface. Registry contract:0x8004A169FB4a3325136EB29fA0ceB6D2e539a432 (Ethereum Mainnet)
You do not have to take our word for it.
ownerOf on the registry is a plain eth_call against any Ethereum RPC — a non-zero owner means the identity exists:
useotto.xyz/.well-known/erc8004/index.json.
ERC-8004 here is identity, and identity is what is on-chain today. This page does not claim a live buyer-facing on-chain rating surface, because there is not one. What you get after paying is described below.
After You Pay: Receipts and Refunds
Two things exist after a paid call, and both are reachable over plain HTTP. 1. Your receipt arrives in-band. Where a call settles on an EVM network, the paid response carries a signed EIP-712otto-content-receipt in its PAYMENT-RESPONSE header, binding the response content to that payment and request. It is handed to you in the same response as the data — there is no lookup step, no IPFS fetch, and no second transaction. Keep the header if you want the proof.
Two bounds worth knowing before you build on it:
- It is EVM-only. The v1 receipt is an EIP-712 object and needs an
eip155chain, so a call settled on Solana returns no content receipt. Pay on Base or Polygon if you need one. - It is best-effort, and deliberately so. Receipt generation never blocks your paid response: if signing cannot complete, you still get the data you paid for, without the header. Treat the receipt as present-when-it-can-be, not as a guarantee on every 200.
POST /feedback is a live x402 route, priced like any other:
- It covers Otto’s own recommended services and Full Auto (see Otto X402 Router). It does not cover third-party CDP Bazaar picks — there is no Otto receipt to verify against those.
- A refund claim needs a reason of at least 50 words.
- Refunds pay only to the original payer, and never more than that payer actually paid Otto.
- They are capped at $0.01 per transaction and 10 claims per wallet per day.
- Otto grades these claims itself. It is a service-quality guarantee from a counterparty, not an independent verdict, and an approved claim is reserved rather than paid out automatically.
ERC-8183: Agentic Commerce
ERC-8183 proposes an on-chain job primitive for AI agent commerce — escrowed ERC-20 payments, a job lifecycle, evaluator-based completion, and composable hooks. It is co-authored by members of the Virtuals Protocol team and designed to compose with ERC-8004. It carries Draft status on eips.ethereum.org, which the EIP site itself flags as not recommended for general use or implementation because it is subject to breaking changes. Nothing on this storefront depends on it: the x402 flow described above uses none of it, and no claim on this page rests on it. It is mentioned because ACP’s escrowed job lifecycle covers similar ground, and the two are easy to confuse.Additional Resources
Live, and always ahead of this page:- Machine-readable catalog: https://x402.ottoai.services/llm.txt
- OpenAPI document: https://x402.ottoai.services/openapi.json
- x402 discovery document: https://x402.ottoai.services/.well-known/x402
- ERC-8004 registration index: https://useotto.xyz/.well-known/erc8004/index.json
- x402 Protocol Specification: https://x402.gitbook.io/x402
- Coinbase x402 Documentation: https://docs.cdp.coinbase.com/x402/welcome
- ERC-8004 (Trustless Agents): https://eips.ethereum.org/EIPS/eip-8004
- ERC-8183 (Agentic Commerce, Draft): https://eips.ethereum.org/EIPS/eip-8183
admin@useotto.xyz · @useOttoAI