Skip to main content
You have an AI agent — Claude Code, Cursor, or anything that can run a Node.js script. This page gets that agent from zero to its first paid, useful result from Otto AI using nothing but a wallet with a little USDC on Base. There is no signup and no API key. Otto’s services speak x402, a pay-per-request standard: your agent requests an endpoint, receives 402 Payment Required, signs a tiny USDC payment locally, retries, and gets the data. Every command on this page was run live against the production catalog before it was published.

Or just hand it to your agent

Don’t want to follow steps yourself? Paste this into your agent (Claude Code, Cursor, or any capable agent). It reads Otto’s machine docs, sets up a fresh throwaway wallet, and does everything up to the first paid call — the only thing you do by hand is send the USDC.
Hand this to your agent
Prefer to drive it yourself, or want to see exactly what the agent will do? The rest of this page is that same flow, by hand.

What you need

  1. Node.js 20 or later. This guide was verified end-to-end on v22.
  2. A wallet with a few dollars of USDC on Base. Cheap intelligence reads cost $0.001 each, so even $1 goes a long way. Buy USDC on any exchange and withdraw it on the Base network (native USDC, contract 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913).
  3. That wallet’s private key, exported as an environment variable. It signs payment authorizations locally — it is never sent to Otto.
Use a fresh, dedicated wallet that holds only what you plan to spend — never your main wallet’s key. Any key you hand to agent tooling should be treated as disposable.
No ETH needed. x402 payments on Base are gasless USDC authorizations (EIP-3009) — the payment facilitator submits the on-chain transaction and pays the gas. Your wallet only needs USDC. Polygon and Solana USDC are also accepted; this guide pins Base as the simplest path.

Setup

Copy-paste, in a terminal:
Give the session your payer key (0x + 64 hex characters — never commit it anywhere):
Create otto.mjs:
otto.mjs

First paid call

That’s it. Real output from a live run of exactly this script (abridged):
What just happened:
  1. Your request hit the paywall and got a 402 describing the price ($0.001 USDC) and where to pay.
  2. The client signed a USDC transfer authorization with your key — locally.
  3. It retried the request with the signed payment attached.
  4. Otto’s facilitator settled it on Base and returned the data plus a settlement transaction hash you can check yourself on Basescan.
Endpoints take query parameters the way you’d expect. Swap the request line for a token snapshot (also $0.001, also verified live):

What else your wallet now buys

That one funded wallet is now a key to Otto’s whole x402 catalog — market and token intelligence, KOL sentiment, token security scans, yield discovery, onchain analytics, web and domain intelligence, real-world data (FX, weather), AI research, image and video generation, and trade-execution services. The live endpoint list with current prices is always at:
Using Claude Code or Cursor? Paste the setup above once, then tell your agent to fetch llm.txt and use otto.mjs as its template for calling any endpoint in the catalog. Not sure which endpoint fits a task? The x402 Open Router (POST /meta-intelligence, $0.001) recommends the right one.

Troubleshooting

The three failures new users actually hit — each reproduced live while writing this page: Two smaller gotchas: save the script as .mjs (plain .js without "type": "module" in package.json breaks the import statements), and if a request sits until the timeout, just re-run it — a payment signature is only valid for a short window, so a stalled attempt should be retried fresh, never resumed. Still stuck? Getting help lists the support channels.

Custody, and what’s coming

On this page, you hold the wallet: your key signs every payment locally, Otto never sees it, and every call is a discrete micro-payment you can audit on-chain. This bring-your-own-wallet rail is live today. Separately, Otto’s dApp accounts are agent-custodial today (an Otto-managed key signs); non-custodial Safe7579 accounts are in gated early access. A “fund one Safe once and Otto auto-pays your agent’s calls under a capped, revocable permission” rail is part of that same gated early access — it is not live, and this page will link the exact steps when it is. Until then, the path above is the way in. Details: Empire Access Layer.