Skip to main content
Welcome to the technical documentation for the Otto AI Agent Swarm on x402 V2. While our main Agent Swarm overview explains what our agents do, this page provides the specific endpoint details, request parameters, and examples needed for programmatic, agent-to-agent (A2A) integration. All endpoints are accessible via the x402 V2 protocol, allowing any developer or AI agent to pay for and consume our services in real-time.
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.
Base URL: 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:
Related rails: MPP and Otto X expose overlapping subsets and rail-specific routes. See Access Paths & Coverage for current counts and capability coverage.
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

There is no browser-based payment path on this storefront. x402.ottoai.services ships no wallet connection and no in-page signing. Opening an endpoint URL in a browser tab returns the 402 challenge as JSON — the price and the payment options — and nothing else. That is the correct and expected behaviour, not an error.Paying requires a client that can sign an EIP-712 / EIP-3009 (or Permit2) authorization and replay the request with a PAYMENT-SIGNATURE header. Use an x402 client library or your own signer, as shown under Client-Side Example.
What the catalog page at x402.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 curl command to run in your own terminal or agent.
  • “Try”, which opens the raw endpoint URL in a new tab. That returns the 402 challenge — 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).
So the workflow is: discover in the browser, pay from an agent, a script or a terminal.

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 a PAYMENT-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.
Decode the header and read the payment options:
Each entry in 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 the accepts array and signs the payment:
  1. USDC on Base (EIP-3009) — zero-approval, default for most clients
  2. Any ERC-20 on Base/Polygon (Permit2) — requires Permit2 approval
  3. USDC on Solana — SPL token transfer
This is typically handled by an x402-compatible client library like @x402/axios.

Step 3: Retry Request with Payment Header

The client retries the exact same request with a PAYMENT-SIGNATURE header containing the signed payment payload.
You cannot hand-write that header — the value is a signed payload built from the challenge in Step 1. In practice a client library constructs it for you; see Client-Side Example.

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 the PAYMENT-RESPONSE header also carries the signed otto-content-receipt described in After You Pay.
Each endpoint publishes its own output shape inside the bazaar extension of its 402 challenge. For /crypto-news that declared shape is:
Read any endpoint’s declared shape straight from its live challenge rather than trusting a sample:

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 a sign-in-with-x extension:
Swap in any route to check it. Where the extension is present, its 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:
  1. Validates Payment Signatures: Verifies the PAYMENT-SIGNATURE header is cryptographically valid.
  2. Prevents Replay Attacks: Tracks nonces and timestamps to prevent signature reuse.
  3. Executes On-Chain Settlement: Submits transactions to Base, Polygon, or Solana to transfer the asset named in the challenge.
What the live challenge tells you:
  • A route’s accepts array 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 accepts entry carries maxTimeoutSeconds, and the matching signed offer carries a validUntil timestamp. 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.
The wrapper works by intercepting the rejected 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 the 402 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 answers 402 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)
Solutions:
  • Check your balance of the exact asset from the challenge on the exact network you 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”)
Solutions:
  • 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:contract address instead where the route accepts one
  • The per-route parameter and its accepted form are documented in /llm.txt

Still Having Issues?

  1. Read the error body. Unpaid 402 responses and error responses carry a hint field explaining what the endpoint wants.
  2. Re-read the route in /llm.txt. It is regenerated from the running service, so it is ahead of any hand-written page.
  3. Contact usadmin@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:
The machine-readable index of all four registrations, with their registration files, is published at 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-712 otto-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 eip155 chain, 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.
You can confirm a route advertises the extension before paying:
2. Refunds run through a paid endpoint, not a web form. POST /feedback is a live x402 route, priced like any other:
It is a bounded money-back guarantee, and the bounds are the point:
  • 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: Specifications: Powered by Otto AI. Questions: admin@useotto.xyz · @useOttoAI