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"{
"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"{
"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" }'{
"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"{
"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"{
"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.