← tickerbot.io
View as markdown

Signal state

GEThttps://api.tickerbot.io/v2/signals/{signal}

The state of a signal is the set of tickers matching it right now, or with asof, as of any moment. One name, the whole market, one call.

stringrequired

A signal name. Booleans (e.g. golden_cross, above_sma_50) are detected automatically; every other type (numeric rsi_14, timestamp price_asof, date earnings_date, string asset_class) requires a condition.

string

Optional. Target moment as YYYY-MM-DD (that day's close) or an ISO timestamp (that intraday moment; daily-only signals then carry the previous session's close, never that day's) — the same read as it stood then, unlimited depth. Full contract under [As of a past date]().

enumdefault auto

Grain the past state is read at: 1m, 1h, 1d, or auto (default). auto blends: each signal comes from its freshest grain at or before the instant (minute, then hourly, then the last closed daily session), so nothing is refused for grain and no ticker is dropped; _meta.blended and _meta.intervals_present say what contributed. Pin a grain for the fastest response: one grain is read instead of three, and every ticker is captured on the same clock. A signal the pinned grain does not store is a 400 interval_unavailable naming the grains that carry it (rsi_14, fundamentals and valuation ratios are 1d-only). Only valid alongside asof: a live read with interval is a 400.

1mOne minute. The finest stored tier; carries the intraday column subset for the most liquid tickers only — _meta.sources on a blended as-of read reports how many at that instant.
1hOne hour. Stored tier, intraday column subset, full universe.
1dOne day. The full-history, full-column tier — the only grain that carries daily-only columns (SMAs, RSI, fundamentals).
autodefaultOn as-of reads: each signal at its freshest grain at or before the instant (minute, then hourly, then the last closed daily session), nothing refused for grain. Events with join=state blend hourly and daily on rows and use daily on group_by. Pin a grain instead for the fastest, single-grain read.
string

Required for every non-boolean signal; the shape follows the signal's type in the catalog. Single bound, <op><value>. **numeric**: >70, <=200, !=0 (operators >, >=, =, !=, <, <=). **timestamp**: an ISO instant, <YYYY-MM-DDTHH:MM:SSZ or >=YYYY-MM-DD (a bare date is midnight UTC). **date**: >=YYYY-MM-DD or =YYYY-MM-DD. **string**: =ETF or !=ETF (= and != only; quotes optional). A relative window ("older than 15 minutes") is a /v2/scan query: price_asof < now() - interval '15 minutes'. Sending a condition with a boolean or custom signal returns 400 (it does not apply).

string

Optional. Scope to a system or caller-owned universe slug.

integerdefault 50

Page size. Max 200.

string

Opaque cursor from the previous response.

enumdefault default

Row order: default (alphabetic for booleans, highest-value-first for numerics) or market_cap (desc NULLS LAST; adds market_cap to each row). Live only — with asof it is a 400 (the snapshot's order is fixed).

defaultdefaultThe endpoint’s own ordering — alphabetical for boolean matches, signal value descending for numerics.
market_capLargest companies first.
booleandefault false

Built-in booleans only: adds active_since and days_live per row — the first day of the current true streak, from daily state (the day after the last false day; if the boolean has never been false since it first computed, the first true day). Looks back five years, so a boolean true for longer reports the window edge as a lower bound. Live only — a 400 with asof.

as_ofstring

Server time this response was assembled (ISO 8601).

signalstring

The signal you asked for.

conditionstring

The bound you passed, echoed; null for boolean and custom signals.

universestring

The universe you scoped to, echoed; null when unscoped.

_metaobject

This endpoint's own keys, with asof: interval_scope and minute_only_columns_fell_back_to_daily; see the as-of read below. Shared keys: see the _meta reference.

countnumber

Rows in this page.

next_cursorstring

Opaque token for the next page; null on the last page. Pass it back as cursor.

resultsarray

Matching tickers with the signal value.

200
Success — the response shape is documented under Returns above.
400
Non-boolean signal called without condition, a condition whose shape does not match the signal's type, invalid cursor, or interval on a live read — interval selects the grain a PAST state is reconstructed at, so it is only valid alongside asof.
404
Signal name does not exist on the schema.
  • Numeric matches come back sorted by signal value descending; boolean matches alphabetically by ticker.
  • For the match set as of a past date, add ?asof= — see Ticker matches (as-of).
  • Custom signals: {signal} may be one of your custom signals — it resolves as a boolean signal (matches where its predicate is true; condition is ignored). See Create a custom signal.
  • For booleans, the response value is true/false. For numerics it's the signal value at the time of the request.
  • Pair with asof to ask "who matched as of a past date" — see Ticker matches (as-of). For a per-ticker time series of one signal, see Series.
  • Membership: live reads return currently-active tickers only. As-of reads use point-in-time listing instead (was the ticker listed and not yet delisted at that instant), so a since-delisted name can legitimately appear in a historical match set.
Tickers at a 52-week high (boolean)
curl "https://api.tickerbot.io/v2/signals/at_52w_high?limit=3" \
  -H "Authorization: Bearer YOUR_KEY"
Response
{
  "as_of": "2026-08-11T21:35:37.719Z",
  "signal": "at_52w_high",
  "condition": null,
  "universe": null,
  "count": 3,
  "next_cursor": "eyJhZnRlcl90aWNrZXIiOiJBQk5HIn0",
  "results": [
    { "ticker": "AAAP", "name": "Pacer Barings CLO Market Flex ETF",              "value": true },
    { "ticker": "ABCS", "name": "Alpha Blue Capital US Small-Mid Cap Dynamic ETF", "value": true },
    { "ticker": "ABNG", "name": "Leverage Shares 2x Long ABNB Daily ETF",          "value": true }
  ]
}