Live on Base mainnet

See a token before the indexers do

Pools read straight off Base seconds after they exist, each with the launched token's address — then ask whether it's a trap in the next call. Your agent pays a fraction of a cent in USDC per request. No accounts. No API keys.

reading the chain… From $0.001 a call Open source · MIT agenttoll.base.eth

What is this

A data vending machine for software

Software can't sign up for accounts or hold credit cards. So here, nothing is gated behind a signup form — the price is quoted in the HTTP response and paid by the agent itself, machine to machine.

Seconds, not minutes

Everything else reads an indexer. /api/base/fresh reads Base's own pool-creation log, so a token shows up about a block after it's born — we've caught one 2 seconds old.

🕵️

Then: is it a trap?

A simulated buy and sell, taxes, owner powers, holder concentration, and who deployed it — a token shipped from a six-transaction wallet holding dust is the shape most rugs share.

📒

Were we right?

Every day a CI job buys one scout call and commits the result to public git, with the Base transaction that paid for it. /api/base/scorecard compares selected historical verdicts with available current observations, and reports missing data.

Try it

No wallet needed to look

The 402 response is the product: a price quote any agent can read and pay programmatically. Run this and you'll see one.

Live demo · GET /api/base/fresh pools born on Base in the last 10 minutes

The quote needs nothing at all. Paying is optional and needs a browser wallet holding a cent of USDC on Base — the same signature your agent would make, just done by hand.

# free — status, catalog, and a sample of every shape
curl https://agenttoll.app/api/health
curl https://agenttoll.app/api/catalog
curl https://agenttoll.app/api/demo

# a paid endpoint, unpaid: you get the quote
curl -i https://agenttoll.app/api/base/fresh
HTTP/1.1 402 Payment Required
PAYMENT-REQUIRED: <base64>
  price   $0.004 USDC
  network eip155:8453 (Base)
  + the request and response schema,
    so no second fetch is needed
// In the cloned repository: npm install && npm run build
import { createPaymentClient }
  from "./dist/payment-policy.js";

const client = createPaymentClient("base", undefined,
  { totalBudgetUsdc: "0" });

console.log(await client.getPaymentQuote(
  "/api/base/fresh"));
// Validates price, network, asset and recipient.
// No wallet and no payment. Use the MCP setup below
// when you want to enable bounded paid calls.

Catalog

Twenty-one endpoints, priced per call

Base onchain data first — gas, any token by contract address, wallet portfolios, address analytics, DEX pools and a spam-filtered new-token radar — plus market and Turkish-lira feeds.

EndpointWhat you getPrice
GET /api/base/safety/:addressToken safety checks: honeypot simulation, taxes, owner privileges, holder concentration, liquidity risk, deployer history$0.003
GET /api/base/scoutRadar + safety in one call: today's new pools, each with a verdict already attached$0.008
GET /api/base/freshPools read straight off Base seconds after they exist, before indexers see them$0.004
GET /api/base/radar/historyA past day's snapshot, exactly as committed to public git the day it was taken$0.002
GET /api/base/scorecardThe radar's track record: verdicts then vs prices now, per cohort$0.005
GET /api/base/portfolio/:addressObserved Base holdings valued in USD, largest first, with coverage limits$0.003
GET /api/base/radarNew-token radar: fresh Base pools that already have real liquidity$0.003
GET /api/base/trendingTrending DEX pools on Base: price, volume, liquidity$0.002
GET /api/base/token/:addressOnchain USD price for any Base token by contract address$0.001
GET /api/base/name/:nameOrAddressBasename both ways: name → address + records, or address → primary name$0.001
GET /api/base/address/:addressBase address snapshot: basename, ETH balance, tx count, contract or EOA$0.001
GET /api/gasBase network gas price and latest block$0.001
GET /api/briefOne-call market brief: BTC/ETH/SOL, Base gas, sentiment$0.005
GET /api/price/:symbolSpot price (USD) + 24h change for any asset$0.001
GET /api/trendingTokens trending across the market right now$0.002
GET /api/feargreedCrypto Fear & Greed index with yesterday comparison$0.001
GET /api/try/premiumTurkish lira premium: implied vs official USD/TRY$0.002
GET /api/try/spreadTurkish exchange spread: BTCTurk and Paribu TRY quotes vs the global price$0.002
GET /api/watch/address/:addressNew activity for a Base address since your cursor$0.002
GET /api/watch/radarOnly the pools that appeared since your cursor$0.003
GET /api/watch/price/:symbolPrice alert check against your reference and threshold$0.001
GET /api/catalogMachine-readable catalog of everything for salefree
GET /api/demoSample response shapes for every paid endpointfree
GET /api/statsQualifying small USDC transfers, with known operator activity reported separatelyfree
GET /api/healthService statusfree
GET /api/readyPayment provider and Base RPC readinessfree

Selected responses are cached; lifetimes vary by source. Handler failures before settlement are not billed. If a signed request times out or its response is lost, inspect the receipt and wallet before retrying: settlement may already have happened.

Watch endpoints

Ask only for what changed

A snapshot is useful once. Agents that run on a schedule want the diff. Address and radar watches return a cursor; send it back as ?since=. Drain address pages while hasMore is true and deduplicate transaction hashes. Radar coverage is partial; the price watch checks a threshold and has no cursor.

# inspect the quote — no wallet or payment
curl -i "https://agenttoll.app/api/watch/radar"
HTTP/1.1 402 Payment Required

# after payment via the bounded client or MCP tool,
# pass the returned cursor unchanged to the next call:
# /api/watch/radar?since=<returned-cursor>
# Each paid poll costs $0.003, including an empty result.
# Results cover the current ranked listing, not every pool.

How it works

One request, one micropayment, one response

1

Request

Your agent calls an endpoint. The server replies 402 Payment Required with a machine-readable price quote.

2

Pay inline

The agent signs a USDC authorization for the quoted amount — no gas on the client, no account, no API key.

3

Get the data

The request retries with the payment header. Settlement lands on Base and the data comes back in the same round trip.

MCP

Plug it straight into Claude

AgentToll ships an MCP server. Add it to Claude Desktop or Claude Code and use 21 data tools plus two free quote and budget tools. Start without a wallet; add a dedicated wallet and a finite session budget when you want to pay.

{
  "mcpServers": {
    "agenttoll": {
      "command": "npx",
      "args": ["-y", "agenttoll-mcp@0.14.0"]
    }
  }
}
🧰

23 tools, start with a free quote

Use agenttoll-mcp@0.14.0 or newer. If you installed 0.13.0 or earlier, update your MCP configuration and restart it to receive the free tools and payment budget controls.

get_price, get_base_gas, get_trending, get_base_token_price, get_base_address_info, get_fear_greed, get_base_trending_pools, get_market_brief, get_new_token_radar, get_try_premium, get_try_spread, get_base_portfolio, check_token_safety, get_fresh_pools, scout_new_tokens, get_radar_scorecard, get_radar_history, resolve_basename, watch_base_address, watch_new_tokens, watch_price_alert, get_payment_quote and get_payment_budget.

To enable payments, set AGENT_PRIVATE_KEY and AGENTTOLL_BUDGET_USDC. The budget applies to one running MCP instance; a restart does not cancel previously signed authorizations.

agenttoll-mcp on npm →

Transparency

Numbers we can't fake, data we can't leak

⛓️

Transfers read from the chain

/api/stats counts the actual USDC transfers to our address on Base, and excludes known operator wallets from the external count. Transfers can include tests and unsolicited payments; they do not establish API sales or unique customers.

🔒

No account setup

No accounts, no API keys, no sessions. Even the watch endpoints keep the cursor on your side, not ours.

🧾

Data errors before settlement aren't billed

Settlement starts after the data handler succeeds. A connection loss or timeout after signing can leave the payment outcome unknown; check your receipt and wallet before retrying.

🔁

Several sources per endpoint

Prices fall through CoinGecko → Binance → Coinbase, Base tokens through GeckoTerminal → DexScreener, and RPC calls across three providers. The response names the source that answered.

📖

Open source, MIT

The whole tollbooth is on GitHub. Fork it and run your own — the payment rail is the interesting part, and it's yours too.