From zero to your first paid fetch
Get an agent reading, extracting, and crawling the web — paid per fetch in USDC — in a few commands. No signup, no dashboard, no API key: just a wallet.
Prerequisites
- Node 20+ — for
@agentscout/cliand@agentscout/client. - Point at the API —
AGENTSCOUT_ENDPOINTdefaults tohttps://api.agentx402.ai; only set it to override. - Optional: spend caps —
AGENTSCOUT_MAX_SPEND_USD(per fetch) andAGENTSCOUT_MAX_SESSION_SPEND_USD(cumulative) refuse any op above them.
node --version # v20 or newer
export AGENTSCOUT_ENDPOINT=https://api.agentx402.ai # optional — this is already the default
export AGENTSCOUT_MAX_SPEND_USD=0.05 # optional — refuse any single fetch above this Read, extract, crawl
AgentScout is wallet-native — no signup, no API key. Leave AGENTSCOUT_PRIVATE_KEY unset and it mints and manages a local wallet for you on first use; export your own key instead and it uses that. (An opt-in account-key mode — an ak_… bearer funded out-of-band via AgentKV — covers managed wallets that can't sign; see the CLI docs for that path.)
-
Get a wallet.
No
wallet newcommand to run first — the CLI mints a local keypair on the first paid call and persists it (0600) under~/.agentscout/wallet.json.quoteis free and never spends, so it's a safe first command even before you're funded.npx @agentscout/cli quote https://example.com # → { "toll_price": 0, "total": 0, "would_pay": true, … } — free page, atomic USDC, no spend # A tolled page reads { "toll_price": 2000, "total": 2500, "would_pay": false } — # total adds the $0.0005 settle fee, and would_pay is true only when the page is free. # no AGENTSCOUT_PRIVATE_KEY set? Scout mints a local wallet on the first PAID call: # agentscout: created a new wallet 0x… (saved to ~/.agentscout/wallet.json). Fund it, then retry.Bring your own wallet instead?
export AGENTSCOUT_PRIVATE_KEY=0x…and Scout uses it — no local key is minted. -
Fund it.
Send USDC on Base to the printed address. Reads are $0.004, extracts $0.020, crawls $0.004 per page — quoted upfront as
max_pages× price (up to 500 pages), with any unused budget refunded as credits when the crawl completes. No onramp helper ships in the CLI — send USDC to the address directly (e.g.awal send).awal send 5 0x… # or send USDC to the printed address any other way -
Read, extract, crawl.
Same service from every surface — pick the one that fits your agent.
Long crawl?
crawlreturns ajobId— poll it withagentscout crawl status <jobId>, then pull a page withagentscout crawl artifact <jobId> <key>.agentscout read https://example.com # → clean markdown, $0.004 agentscout extract https://example.com --schema ./schema.json # → schema-valid JSON, $0.020 agentscout crawl https://example.com --max-pages 10 # → job manifest, 10 × $0.004import { AgentScout } from "@agentscout/client"; const scout = new AgentScout({ signer, endpoint, maxSpendUsd: 0.05 }); const { markdown } = await scout.read("https://example.com"); // clean markdown const { data } = await scout.extract(url, schema); // schema-valid JSON// Claude Code / Cursor / any MCP client — add to your config: { "mcpServers": { "agentscout": { "command": "npx", "args": ["-y", "@agentscout/cli", "mcp"], "env": { "AGENTSCOUT_PRIVATE_KEY": "0x…", "AGENTSCOUT_ENDPOINT": "https://api.agentx402.ai", "AGENTSCOUT_MAX_SPEND_USD": "0.05" } } } }
Before you ship
Pay on success
A read that fails or returns too little content settles nothing; an extraction that can't produce schema-valid JSON settles nothing. A crawl is the exception: it settles its whole max_pages budget at submit (a crawl can outrun the ~10-minute payment authorization), then refunds every unused page as credits when the job completes — only pages clearing the read predicate are billable, and any unused budget in max_pages is refunded as credits when the job completes.
Cap the spend
Set maxSpendUsd in the client (or AGENTSCOUT_MAX_SPEND_USD for the CLI and MCP) for a per-fetch ceiling, plus AGENTSCOUT_MAX_SESSION_SPEND_USD for a cumulative one — any op that would exceed either is refused before it's signed. Every paid verb is also flagged state-changing in the MCP server (never readOnlyHint), so MCP clients prompt before spending.
Name extract fields for what you want
In an extract schema, a field's name carries at least as much weight as its description. A field named domain returns github.com even when the page shows github.com/example-org and the description says "exactly as written" — the name promises a domain, so the model normalizes to one. Want the literal page text? Name the field for it (source_as_shown). Want the normalized form (price_usd, domain)? The name is doing that work for you.