Getting started

Concepts

The pieces the API is built out of. Read this once before reaching for the endpoint reference; the names will land harder when you see them in context.

Tickers and the universe

The unit and the population.

A ticker is one tradeable instrument: an equity (AAPL) or a cryptocurrency (BTC). The coverage at v1 is roughly 12,000 US-listed equities plus the top 100 cryptocurrencies by market cap.

The universe is “every ticker we track.” In our docs, “universe” is conceptual. It contrasts universe-shaped queries (which return a set of matching tickers, via /scan or webhooks) against ticker-scoped queries (which return data for a known ticker, via /tickers or /signals). It is not a parameter you pass — there are no named index lists in v1. Filter by sector, market cap, or any other column via the WHERE clause.

Signals, fields, and flags

One schema, three names depending on context.

A signal is anything we compute about a ticker. Looked at as a current value, it's a field on the /v1/tickers/{ticker} response. Looked at across time, it's a signal history on /v1/signals/{ticker}/{signal}. When the signal is boolean, we call it a flag — same column, just emphasizing the true/false shape.

Numeric and boolean signals differ in one practical way: history shape.

  • Numerics (price, market_cap, RSI, …) return bars: {time, value} at the signal's native cadence, optionally resampled.
  • Continuous flags (above_sma_50, in_uptrend, …) return windows: {start, end} for each interval the flag was true. The latest window's end is null if the flag is currently true.
  • Edge-triggered flags (breakout, gap_up_3pct, …) return trigger timestamps only. The flag remains true for the rest of that session, but the trigger moment is what's recorded.

The schema page labels every column with its type, cadence, and (for flags) firing flavor.

The four primitives

Every endpoint is one of these four things.

  • /v1/tickers/{ticker} — “tell me everything about this ticker right now.”
  • /v1/signals/{ticker}/{signal} — “tell me the history of this one signal on this one ticker.”
  • /v1/scan — “tell me which tickers match this condition right now.”
  • /v1/webhooks — “tell me when any ticker starts matching this condition.”

Most clients use a mix. A trading bot might poll /v1/tickers/AAPL for one specific name, subscribe to a webhook to catch opportunities elsewhere, and run an ad-hoc /v1/scan before market open to evaluate the day's setups. A backtesting tool might never touch webhooks and instead pull /v1/signals/... for every symbol it cares about.

The query language

One language for every WHERE clause: a SQL WHERE clause.

Wherever the API needs “a combination of conditions,” it accepts a SQL WHERE clause. Identifiers are flag names from the schema (which evaluate as booleans) or column names (which compare with =, >, IN, BETWEEN, …). Numeric literals are fully specified — 1500000000, not 1.5B (this is an API).

Same string in every place that takes a query: the q parameter on /v1/scan and the q field on POST /v1/webhooks. See the SQL reference for what we don't accept; see the schema for which columns are queryable.

Refresh cadence

Per-signal, not global.

Signals don't all refresh on the same schedule. The schema page labels each one with its cadence, but the rough story is:

  • Live (1 min during market hours) — most price-, volume-, and indicator-based signals. For US equities this means 4 AM–8 PM ET on weekdays (covers pre-market and after-hours).
  • Live (1 min, 24/7) — crypto. Markets don't close.
  • Daily, post-close — fundamentals like market_cap, the daily cross flags (golden_cross_today), 52-week extremes on a stable basis.
  • Quarterly — financial statements (pe_ratio, eps) update when issuers file.

Every API response includes an as_of timestamp. That's the last time the data was recomputed for that ticker; treat older timestamps as stale.

State-change deduplication

Why you never receive 500 webhook events for one breakout.

For webhooks, the API tracks the last-known match state per (webhook, ticker) and only delivers an event when a ticker transitions from not-matching to matching. If a flag flickers true → false → true inside a minute, you get one event. If a ticker stays in the match set for three days, you get one event when it first matched and nothing for those three days. To re-fire for that ticker, it has to leave the match set first.

Polling endpoints (/scan, /tickers, /signals) always return current state with no deduplication; deduplication is a webhook concept.

Equities vs. crypto

Same shape, different tables underneath.

Equity and crypto tickers go through the same endpoints with the same response shapes. The differences:

  • Crypto tickers don't have session_open, session_high, session_low in the traditional sense — markets never close. We use the rolling 24-hour window instead.
  • Crypto tickers don't have most fundamentals (pe_ratio, eps, dividend_yield). They have market_cap.
  • Crypto tickers don't have corporate-event flags (earnings_this_week, etc.). These return as false for crypto.
  • Crypto refresh cadence is 1 minute, 24/7. Equity refresh is 1 minute during 4 AM–8 PM ET, weekdays only.