The market dashboard API.

A dashboard is rows, widgets, and freshness. Here that’s three calls against one computed table: a row that already carries price and 421+ signals for any of 20,822+ tickers, series that arrive pre-aligned for the charts and sparklines, and a socket that pushes each recompute. Per-user watchlists are universes — one list drives the table, the widgets, and the alerts. No feed contract, no row store, no poller.

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

what you get

The capability, itemized.

The rowOne call returns everything a ticker card, table row or detail view could show: price plus all 421+ computed signals
The widgetsUp to 50 tickers × 25 columns on one aligned time grid per call — charts, sparklines, gauges, history tables
The freshnessA websocket pushes each subscribed ticker’s freshly-computed row on every refresh cycle — the same record, pushed
Per-user watchlistsModel each user’s list as a universe: the same list scopes their table, their widgets, and their alerts
The whole marketA screen tab is one scan: any SQL condition over every ticker, returned as full rows
History built inAll-time daily series on every plan, intraday tiers, and any row as of any past moment with ?asof=

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

The widgets, fed from one call.

Three tickers, three columns, one aligned grid — whatever a widget renders, this feeds it:

GET /v2/series?tickers=AAPL,MSFT,NVDA&columns=close,rsi_14,volume_today
    &interval=1d&from=2026-01-01

// → { "interval": "1d",
//     "tickers": ["AAPL", "MSFT", "NVDA"],
//     "columns": ["close", "rsi_14", "volume_today"],
//     "count": 477,
//     "series": {
//       "AAPL": [ { "t": "2026-01-02", "close": 271.01, "rsi_14": 43.79, … }, … ],
//       "MSFT": [ … ], "NVDA": [ … ] } }

The card behind it is GET /v2/tickers/{ticker}; the freshness is WS /v2/stream. Rows, widgets, freshness — three calls, and the recipe below wires them into a working dashboard.

Ready to wire it into something? Build a market dashboard below walks it end to end. Reference: GET /v2/series · GET /v2/tickers/{ticker} · streaming · universes.

build it

Build a market dashboard.

A dashboard is rows, widgets, and freshness — three calls against one computed table: a row that already contains every signal, series that arrive pre-aligned, and a socket that pushes each recompute.

1. The rowOne call returns everything a ticker card or table row could show: price plus all 421+ computed signals.

curl "https://api.tickerbot.io/v2/tickers/AAPL" \
  -H "Authorization: Bearer YOUR_KEY"
{
  "as_of": "2026-08-21T13:00:18Z",
  "ticker": "AAPL",
  "data": {
    "ticker": "AAPL",
    "name": "Apple Inc.",
    "price": 312.14,
    "day_change_pct": 0.0027,
    "rsi_14": 49.68,
    "above_sma_200": true,
    …
  }
}

2. The widgetsWhatever a widget renders — a chart, a sparkline, a gauge, a table of history — /v2/series feeds it: up to 50 tickers × 25 columns on one aligned time grid.

curl "https://api.tickerbot.io/v2/series?tickers=AAPL,MSFT,NVDA&columns=close,rsi_14,volume_today&interval=1d&from=2026-01-01" \
  -H "Authorization: Bearer YOUR_KEY"
{
  "interval": "1d",
  "tickers": ["AAPL", "MSFT", "NVDA"],
  "columns": ["close", "rsi_14", "volume_today"],
  "count": 477,
  "series": {
    "AAPL": [
      { "t": "2026-01-02", "close": 271.01, "rsi_14": 43.79, "volume_today": 37838054 },
      …
      { "t": "2026-08-20", "close": 311.22, "rsi_14": 48.86, "volume_today": 25926977 }
    ],
    "MSFT": [ … ], "NVDA": [ … ]
  }
}

3. The freshnessHold a websocket open and each subscribed ticker's freshly-computed row arrives on every refresh cycle — the same record as GET /v2/tickers/{ticker}, pushed.

import WebSocket from 'ws'
const KEY = process.env.TICKERBOT_API_KEY
const rows = new Map()   // ticker → latest computed row: the dashboard's state

const ws = new WebSocket('wss://api.tickerbot.io/v2/stream')
ws.on('open', () => ws.send(JSON.stringify({ type: 'auth', api_key: KEY })))
ws.on('message', (buf) => {
  const frame = JSON.parse(buf.toString())
  if (frame.type === 'authed') {           // wait for the ack — subscribing in 'open' races auth
    ws.send(JSON.stringify({ type: 'subscribe', tickers: ['AAPL', 'MSFT', 'NVDA'] }))
  }
  if (frame.type === 'update') {           // { ticker, as_of, data }
    rows.set(frame.ticker, frame.data)     // full computed row — re-render from here
  }
})

4. Per-user watchlistsModel each user's watchlist as a universe and every surface scopes to it: the same list drives their table, their widgets, and their alerts.

curl -X POST "https://api.tickerbot.io/v2/universes" \
  -H "Authorization: Bearer YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "id": "watchlist_u123", "name": "u123 watchlist", "tickers": ["AAPL","NVDA"] }'
{
  "id": "watchlist_u123",
  "name": "u123 watchlist",
  "tickers": ["AAPL", "NVDA"],
  "size": 2,
  …
}

The calls behind it

GET /v2/tickers/{ticker}The card/row: every computed signal for one ticker, one response
GET /v2/seriesThe widgets: aligned multi-ticker, multi-column history
WS /v2/streamThe freshness: full recomputed rows pushed per refresh cycle
POST /v2/universesPer-user watchlists: one list drives table, widgets, and alerts

questions

FAQ

Do I still need a market data feed and a database?

No — that’s the point. The feed, the store, the indicator math and the refresh loop already ran on our side; your app reads finished rows and aligned series over HTTPS and holds one websocket for freshness. The data comes with the API on every plan, history included.

Can each of my users have their own watchlist?

Yes — create a universe per user (or per list) and scope reads to it. The same universe works across the row, series, scan and webhook surfaces, so a user’s table, widgets and alerts all follow one list.

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 is this different from a market data API?

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.

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.