← tickerbot.io
View as markdown
Concepts

Signals (columns)

The column axis of the table: 439+ signals on every ticker row, from raw price to RSI to insider activity. Each is referenceable by bare name across the entire API.

What a signal is

Raw data, what's calculated from it, and the conditions on top, in the same row.

A signal is a value our pipeline derives from market data and keeps current across the 23,212+ tickers in the universe, NULL on rows it doesn't apply to. Signals come in three layers. Raw data: the record itself (price, volume_today, statement lines as reported). Calculated: values computed from it (sma_200, rsi_14, relative_volume). Conditions: booleans on top, each with a published condition over other signals shown on its reference page, so what "true" means is not a black box (above_sma_200, golden_cross, insider_cluster_buy). You don't compute anything: the indicator math, the windowing, and the refresh already ran by the time you query.

One name works everywhere: the same identifier is the field on a ticker response, the identifier in a scan WHERE clause, the series on a history pull, and the condition on a webhook. If you know a signal's name, you know how to use it everywhere it's carried.

Three tenses

Signal state is the noun; there are three ways to read it.

Live: the current row, recomputed on each signal's own cadence, up to every minute. As-of: the row as of any past date, via ?asof= on the same reads. Subscribe: the future tense. Subscribe to a condition and get pushed when it becomes true. Every signal speaks the live and subscribe tenses; most are historized for as-of too. Each reference page states exactly which reads carry it.

The catalog

Every live signal, grouped by how far it is derived from the raw tape.

The full list, 439+ signals with type, cadence, and coverage, each name linking to its reference page, is at Signal catalog.

One name, five reads

Every read below uses the same name, above_sma_200. Swap YOUR_KEY for a key from /dashboard/keys. Responses are real captures, trimmed; add ?asof= to the state reads for any past date, or subscribe the signal or the scan as a webhook subscription.

Every signal for one ticker /v2/tickers/{ticker}

curl "https://api.tickerbot.io/v2/tickers/AAPL" \
  -H "Authorization: Bearer YOUR_KEY"
Response (sampled 2026-09-08, trimmed)
{
 "as_of": "2026-09-02T13:38:16.648Z",
 "ticker": "AAPL",
 "data": {
  "ticker": "AAPL",
  "name": "Apple Inc.",
  "price": 324.341,
  "change_1d_pct": -0.24,
  "volume_today": 2591319,
  "relative_volume": 0.076,
  "rsi_14": 60.111,
  "sma_200": 283.3255,
  "above_sma_200": true,
  "market_cap": 4624165933000,
  "pe_ratio": 35.87,
  "earnings_date": "2026-10-29T00:00:00.000Z",
  "analyst_consensus_rating": "buy",
  "news_volume": 0.727
 }
}

Every ticker matching this signal /v2/signals/{signal}

curl "https://api.tickerbot.io/v2/signals/above_sma_200" \
  -H "Authorization: Bearer YOUR_KEY"
Response (sampled 2026-09-18, trimmed)
{
 "as_of": "2026-09-18T14:36:43.384Z",
 "signal": "above_sma_200",
 "condition": null,
 "universe": null,
 "count": 2,
 "results": [
  {
   "ticker": "A",
   "name": "Agilent Technologies Inc.",
   "value": true
  },
  {
   "ticker": "AAA",
   "name": "Alternative Access First Priority CLO Bond ETF",
   "value": true
  }
 ]
}

The whole market, filtered on it /v2/scan

curl -X POST "https://api.tickerbot.io/v2/scan" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_KEY" \
  -d '{ "q": "above_sma_200" }'
Response (sampled 2026-09-18, trimmed)
{
 "as_of": "2026-09-18T14:36:43.890Z",
 "query": {
  "q": "above_sma_200",
  "limit": 2,
  "order": "change_1d_pct",
  "dir": "desc",
  "fields": [],
  "full": false,
  "universe": null,
  "asset_class": null
 },
 "count": 2,
 "results": [
  {
   "ticker": "IMCC",
   "name": "IM Cannabis Corp. Common Shares",
   "asset_class": "stocks",
   "asset_type": "CS",
   "price": 7.245,
   "change_1d_pct": 316.37931034482756,
   "gap_pct": 86.2069,
   "relative_volume": 9.9118,
   "market_cap": 984391
  },
  {
   "ticker": "PBMWW",
   "name": "Psyence Biomedical Ltd. Warrant",
   "asset_class": "stocks",
   "asset_type": "WARRANT",
   "price": 0.0332,
   "change_1d_pct": 46.837682441397604,
   "gap_pct": 38.4343,
   "relative_volume": 0.0088,
   "market_cap": null
  }
 ]
}

Its history /v2/series

curl "https://api.tickerbot.io/v2/series?tickers=AAPL,MSFT&columns=close,above_sma_200" \
  -H "Authorization: Bearer YOUR_KEY"
Response (sampled 2026-09-18, trimmed)
{
 "as_of": "2026-09-18T14:37:16.512Z",
 "interval": "1d",
 "tickers": [
  "AAPL",
  "MSFT"
 ],
 "columns": [
  "close",
  "above_sma_200"
 ],
 "count": 6,
 "series": {
  "AAPL": [
   {
    "t": "2026-09-15",
    "close": 331.34,
    "above_sma_200": true
   },
   {
    "t": "2026-09-16",
    "close": 332.41,
    "above_sma_200": true
   },
   {
    "t": "2026-09-17",
    "close": 337.002,
    "above_sma_200": true
   }
  ],
  "MSFT": [
   {
    "t": "2026-09-15",
    "close": 497.12,
    "above_sma_200": true
   },
   {
    "t": "2026-09-16",
    "close": 490.3,
    "above_sma_200": true
   },
   {
    "t": "2026-09-17",
    "close": 497.75,
    "above_sma_200": true
   }
  ]
 }
}

Its firings /v2/events

curl -G "https://api.tickerbot.io/v2/events" \
  -d "kind=signal" -d "signal=above_sma_200" -d "transition=enter" -d "from=2026-02-24" \
  -H "Authorization: Bearer YOUR_KEY"
Response (sampled 2026-09-18, trimmed)
{
 "as_of": "2026-09-18T14:37:16.686Z",
 "query": {
  "kind": "signal",
  "tickers": null,
  "universe": null,
  "since": "2026-02-10T00:00:00.000Z",
  "until": null,
  "limit": 2,
  "signal": "above_sma_200",
  "transition": "enter"
 },
 "count": 2,
 "results": [
  {
   "ticker": "WEEK",
   "ts": "2026-09-18T14:36:14.292Z",
   "kind": "signal",
   "payload": {
    "signal": "above_sma_200",
    "transition": "enter",
    "price": 100.04,
    "definition_version": 6
   }
  },
  {
   "ticker": "TAOX",
   "ts": "2026-09-18T14:36:14.292Z",
   "kind": "signal",
   "payload": {
    "signal": "above_sma_200",
    "transition": "enter",
    "price": 4.534,
    "definition_version": 6
   }
  }
 ]
}

Author your own

The catalog is the built-in vocabulary, not the ceiling: custom signals let you save any WHERE clause or SQL expression over these signals as a named signal, then scan it and subscribe to it anywhere a built-in works.