Get a series
https://api.tickerbot.io/ v2/ seriesOne call, up to 50 tickers × 25 columns, one shared time grid. ?tickers=AAPL,MSFT&columns=close,rsi_14 returns each ticker's series over the SAME timestamps — the join across the OHLCV bar store and the indicator/flag state tables that would otherwise take N history calls and a hand-rolled merge. Those two stores genuinely disagree (state has rows on non-trading days; intraday bars can lag behind state), so the endpoint owns the alignment policy: a missing cell is null, never a silently dropped row, and _meta reports per-column sources plus per-ticker coverage so a gap is always visible.
Column names resolve by source, invisibly at the call site: open/high/low/close/volume/vwap/trades (or o/h/l/c/v/vw/n) read licensed OHLCV bars; every column on the [schema page](/docs/schema) reads the state tables; your own [custom signals](/docs/endpoints/signals/using) compile per-row and behave exactly like built-ins. With no columns the default set matches [Ticker history](/docs/endpoints/tickers/history-series) — a bare /v2/series?ticker=AAPL IS ticker history in its canonical spelling.
Intervals: 1m / 1h / 1d are stored tiers. 1w is a real weekly resample — each state column samples the week's last observation, bars aggregate (open of first bar, max high, min low, close of last, summed volume), rows keyed by the week's Monday. 1q serves quarterly fundamentals (eps, eps_estimate, eps_surprise, eps_surprise_pct, revenue, gross_profit, free_cash_flow) on the fiscal grid — rows keyed by calendar quarter (2026-Q2) with each ticker's exact fiscal_period, and quarterly columns can't mix with daily ones in one request (the grids aren't joinable).
transitions_only=true filters rows down to the state-change edges of the boolean columns — computed by the same shared rule that fires webhooks, so the two can't disagree — with non-boolean columns riding along as context (the price at the flip). Numeric-threshold flips ("when did rsi_14 cross 70") are an [as-of replay](/docs/asof) question, not a transitions one.
For charting, [/v2/tickers/{t}/bars](/docs/endpoints/tickers/bars) keeps its own route on purpose: sub-hour intervals (1s–30m), fetch-on-miss coverage, and the compact array shape live there. Series is the analytical read; bars is the chart feed.
Query parameters
stringrequiredComma-separated symbols, up to 50 (POST accepts a JSON array). Required unless `ticker` (singular) is passed instead — and when both are passed, `ticker` wins, same precedence as `/v2/events`.
stringComma list of up to 25 columns (POST accepts an array): OHLCV names, schema columns, and your custom signals, freely mixed. Omitted → the ticker-history default set (price, day_change_pct, relative_volume, market_cap), intersected with what the interval carries. At `1q`, `columns` is required and quarterly-only.
stringdefault 1dGrid granularity. `1w` resamples the daily tier weekly (Monday-keyed); `1q` is the fiscal-quarter grid.
stringEarliest timestamp (inclusive), `YYYY-MM-DD` or ISO. Intraday requests default to a recent window (`1m`: 7 days, `1h`: 60 days) — the cursor keeps walking further back window-by-window, or pass `from` to widen it up front.
stringLatest timestamp (inclusive), `YYYY-MM-DD` or ISO.
integerdefault 252Grid steps per page (shared across tickers). Max 1000, and tickers × limit may not exceed 25,000 rows per page — over the cap is an explicit 400, never a silent clamp.
stringOpaque cursor from the previous response — every ticker pages backward in lockstep on the shared grid, no per-ticker gaps or duplicates.
booleanOnly rows where a boolean column changed state. Requires at least one boolean column (built-in flag or custom signal); each returned row carries `transitions: {column: "enter"|"exit"}`, and `_meta` lists the driving columns.
Status codes
200interval, tickers, columns, count, next_cursor, _meta (sources per column, coverage per ticker, plus non_trading_days_dropped / transitions_only / from_defaulted when applicable), and series — per-ticker arrays of flat rows, chronological ASC.400invalid_query), daily-only column at an intraday interval, quarterly/daily column mix, over the tickers × limit cap, or transitions_only without a boolean column.401Notes
- All-time on every plan — series history is never plan-gated.
ticker(singular) andtickersare both accepted; when both are present,tickerwins.- Caps: 50 tickers, 25 columns,
limit≤ 1000, tickers × limit ≤ 25,000 rows per page. Every cap violation is an explicit 400 — nothing is silently clamped. - On a mixed bars+state daily request, spine rows on non-trading days (weekends/holidays) are dropped and counted in
_meta.non_trading_days_dropped— they could never carry OHLCV and would read as gaps. - [Ticker history](/docs/endpoints/tickers/history-series) and [Signal history](/docs/endpoints/signals/history) return the same data for one ticker / one column in their original envelopes — kept stable for existing integrations. New integrations should read series.