tickerbot.io
View as markdown

Fintech app

Tickerbot is the stock market API designed for agents. A fintech app is a few queries on it: the row, the series, the socket, and a watchlist per user.

How it works

A dashboard is rows, widgets, and freshness: a row that already holds every signal, series that arrive aligned, and a socket that pushes each recompute.

1. The row

One call returns everything a ticker card or table row could show: every one of the 452+ signals.

curl "https://api.tickerbot.io/v2/tickers/AAPL" \
  -H "Authorization: Bearer YOUR_KEY"

2. The widgets

/v2/series feeds whatever a widget renders, from a chart to a sparkline to a table of history: up to 50 tickers × 25 signals 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"

3. The freshness

Hold 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 watchlists

Model 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"] }'
Show responseHide response
Response
{
  "id": "watchlist_u123",
  "name": "u123 watchlist",
  "tickers": ["AAPL", "NVDA"],
  "size": 2,
  …
}

The calls behind it

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