A new way to build an AI trading agent.

Tickerbot is the stock market, in SQL. An AI trading agent is a model with the table as its tools: computed answers that fit in context.

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

the recipe

An AI trading agent in four steps.

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-server · POST /v2/scan · POST /v2/scan/subscribe

questions

FAQ

What is Tickerbot?

The market as one computed table: 20,864+ tickers × 421+ signals, precomputed, refreshed continuously, and queried in SQL. Every read runs live, as of any past moment, or as a push. The main endpoints are /v2/tickers for one symbol’s full row, /v2/signals for every ticker matching a named signal, and /v2/scan for the whole market matching a SQL WHERE clause.

What does it cover?

Every US-listed equity plus rates, FX and crypto, with the full schema of 421+ signals computed for each ticker. The data refreshes continuously, and all-time history sits behind every column.

How is this different from other market data APIs?

A data API sells inputs (bars, ticks, statements) and leaves the derived values your product actually acts on for you to compute, refresh, and store, per symbol, continuously. Tickerbot sells the finished state: conditions like above_sma_200 are already columns, past answers are already reproducible, and the pipeline between raw data and product is the part you skip.

What makes Tickerbot useful to AI agents?

Computed state: hand a model raw data and its context window fills with math to do; hand it computed answers and the context goes to decisions. A scan returns the tickers matching your condition: a list, not a workload. Every call here is also a native tool call: install the MCP server and Claude, ChatGPT, Cursor, or any MCP runtime queries the market directly.

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.

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.

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.