The AI agent API for the market.

An agent is only as good as what its tools return. A raw feed is a firehose that can’t fit in context; computed state does. Install one MCP server and the whole table — 20,822+ tickers × 421+ signals — becomes tool calls the model makes itself: who matches a condition, a ticker’s full row, its history, the news. Answers, not workloads, so the context window goes to the decision. Execution stays behind your own broker tool.

Free plan. Every ticker, every signal, real-time data, all-time history.

what you get

The capability, itemized.

Native tool callsThe MCP server exposes scan, tickers, series, news, universes and webhooks to Claude, ChatGPT, Cursor, or any MCP runtime — one config block
Computed answersA scan returns the tickers matching a condition — a list the model reasons over, not bars it has to compute RSI from
Whole-market questions"Which large caps went oversold while holding their 200-day?" is one tool call over every US equity
Memory of the pastThe same tools accept asof: the agent can ask what was true on any past day, with no look-ahead
Event-drivenSubscribe the conditions the agent cares about and wake it on the webhook — the market becomes the scheduler
Tool definitions, generatedCopy-paste tool schemas for Claude, OpenAI, Gemini and MCP, generated from the live API so they never drift

Every read runs in three tenses: live, as of any past moment (add ?asof=; no look-ahead, no survivorship bias), or on push — the same query as a webhook that fires when the answer changes. Under it sits the computed table: every US equity plus rates, FX and crypto, every signal precomputed and refreshed continuously, all-time history. Data included — there’s no feed to bring.

one call

One question, one tool call.

What the agent does with “which large caps are oversold but still above their 200-day?” — one call, computed answer back:

Agent → tickerbot_scan({ q: "rsi_14 < 30 AND above_sma_200 AND market_cap > 1e9" })

      ← { "as_of": "2026-08-23T15:18:49Z", "count": 3,
          "results": [ { "ticker": "LION", "name": "Lionsgate Studios Corp.", "price": 11.67, … },
                       { "ticker": "KRG",  "name": "Kite Realty Group Trust", "price": 26.15, … },
                       { "ticker": "DVA",  "name": "DaVita Inc.",            "price": 173.79, … } ] }

Agent: Three names match — here's the list, and what stands out…

Three rows, not three hundred bars. The model never computed an RSI; it asked a question and got the state. The same call is POST /v2/scan over HTTP for a headless agent loop.

Ready to wire it into something? Build an AI trading agent below walks it end to end. Reference: the MCP server · POST /v2/scan · scan subscriptions · the signals catalog.

build it

Build an AI trading agent.

An agent is only as good as what its tools return. Feed it computed state instead of raw data and the context goes to the decision: every ticker × every signal, queryable by the model itself.

1. Give the model the marketOne config block installs the MCP server in Claude, ChatGPT, Cursor, or any MCP runtime. Scans, tickers, series, news, and webhooks become tools the model calls itself.

{
  "mcpServers": {
    "tickerbot": {
      "command": "npx",
      "args": ["-y", "@tickerbot/mcp-server"],
      "env": { "TICKERBOT_API_KEY": "tb_live_…" }
    }
  }
}

2. Ask in EnglishThe agent compiles the question into tool calls on its own — one prompt, one scan, computed answers back.

You: which large caps went oversold this week while holding their 200-day?

Agent → tickerbot_scan({ q: "rsi_14 < 30 AND above_sma_200
                              AND market_cap > 1e10" })
      ← { count: 7, results: [ { ticker, price, rsi_14, … } × 7 ] }

Agent: Seven names match — here's the list, and what stands out…

3. Write the agent loopFor a headless agent: market state from Tickerbot, decisions from Claude, execution through your broker as a separate tool you control. The SDK's tool runner drives the loop — each cycle is one call.

import Anthropic from '@anthropic-ai/sdk'
import { betaZodTool } from '@anthropic-ai/sdk/helpers/beta/zod'
import { z } from 'zod'

const anthropic = new Anthropic()               // ANTHROPIC_API_KEY from env
const KEY = process.env.TICKERBOT_API_KEY

// Market state: the same scan as every other guide, as a tool
const scanMarket = betaZodTool({
  name: 'scan_market',
  description: 'Run a SQL WHERE clause over every ticker; returns matching rows.',
  inputSchema: z.object({
    q: z.string().describe('e.g. "rsi_14 < 30 AND market_cap > 1e10"'),
  }),
  run: async ({ q }) =>
    fetch('https://api.tickerbot.io/v2/scan', {
      method: 'POST',
      headers: { Authorization: `Bearer ${KEY}`, 'Content-Type': 'application/json' },
      body: JSON.stringify({ q }),
    }).then((r) => r.text()),
})

// Execution stays behind YOUR broker tool — market state is read-only
const placeOrder = betaZodTool({
  name: 'place_order',
  description: 'Buy or sell through the broker.',
  inputSchema: z.object({
    side: z.enum(['buy', 'sell']), ticker: z.string(), qty: z.number(),
  }),
  run: async ({ side, ticker, qty }) => {
    console.log('ORDER', side, ticker, qty)     // …or your broker's API — every action logged
    return 'accepted'
  },
})

async function cycle() {
  const final = await anthropic.beta.messages.toolRunner({
    model: 'claude-opus-5',
    max_tokens: 16000,
    system: 'You manage a small momentum book. Max 5 positions. Explain before ordering.',
    messages: [{ role: 'user', content: 'Review the market and act if warranted.' }],
    tools: [scanMarket, placeOrder],
  })
  for (const block of final.content) if (block.type === 'text') console.log(block.text)
}
setInterval(cycle, 5 * 60 * 1000)

That separation — execution behind your own broker tool, every action logged — is what makes an agent auditable.

4. Let the market interruptSubscribe the conditions the agent cares about and wake it on the webhook instead of polling — app.post('/wake', () => cycle()) — and the market becomes the scheduler.

curl -X POST "https://api.tickerbot.io/v2/scan/subscribe" \
  -H "Authorization: Bearer YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "q": "rsi_14 < 30 AND above_sma_200 AND market_cap > 1e10",
        "target_url": "https://your-agent.example.com/wake" }'
{
  "id": "wh_Clk9b8KHRLk",
  "q": "rsi_14 < 30 AND above_sma_200 AND market_cap > 1e10",
  "channel": "webhook",
  "target_url": "https://your-agent.example.com/wake",
  "signing_secret": "whsec_…",
  "status": "active",
  …
}

The calls behind it

MCP: @tickerbot/mcp-serverEvery endpoint as a native tool call: Claude, ChatGPT, Cursor, any runtime
GET /docs/mcpMCP server install + copy-paste tool definitions for Claude, OpenAI, Gemini, and MCP, auto-generated
POST /v2/scanThe agent’s workhorse: any question over the whole market, one call
POST /v2/scan/subscribeEvent-driven agents: wake on state change instead of polling

questions

FAQ

Which agent runtimes does it work with?

Anything that speaks MCP — Claude Desktop and Claude Code, ChatGPT, Cursor, and custom runtimes — via @tickerbot/mcp-server. For a headless agent, the same endpoints are plain HTTP with generated tool definitions for the Anthropic, OpenAI and Gemini SDKs on /docs/mcp.

Why does an agent need computed state instead of raw market data?

Context. Hand a model raw bars and it spends its window doing indicator math, badly and expensively, before it can reason; hand it rsi_14 < 30 as a column and the window goes to the decision. Computed state is also auditable: the condition the agent acted on is a string you can read, rerun as of that moment, and log.

Why does a trading system need computed state?

Because every action it takes — an alert, a screen result, an order — is a condition over derived values: RSI below 30, price above the 200-day average, volume three times normal. Raw data doesn’t contain those. Something has to compute and refresh them for every symbol, continuously, and keep the history so past answers are reproducible. That’s a data pipeline, not a feature — you either build and operate it, or query one that already runs.

What does it cover?

Every US-listed equity plus rates, FX and crypto, with the full schema computed for each ticker. History is all-time on every plan, delisted tickers included, so as-of reads return the market as it stood. Live signals recompute every minute during US market hours and 24/7 for crypto; fundamentals refresh daily.

How does Tickerbot pricing work?

The Free plan needs no card and carries the full data side: every ticker, every signal, real-time data, all-time history and as-of queries, at 10,000 calls a month and 60 a minute. Paid plans start at $29/mo, remove the monthly cap, and raise the rate limit; webhooks and streaming come with them. Data depth is never a tier lever: every plan sees the same table.

in the wild

900K+ calls served, and counting.

What people are saying.

“dude. whoah.”
President, ShopifyHarley Finkelstein
“Tickerbot is insane. It turns Claude into a quant.”
Quantitative Finance MScLounes Vennema
“Best value for hobbyists and advanced traders alike.”
AI Engineer, ImergeRon Reid

get started

Get a key. Run a scan.

Free plan. Every ticker, every signal, real-time data, all-time history.