OHLCV bars
https://api.tickerbot.io/ v2/ tickers/ {ticker}/ bars/ {interval}OHLCV bars from 1-second through daily — the chart feed.
Query parameters
string[]requiredTicker symbol, or a comma-separated list (up to 50) for a bulk response keyed by symbol.
enumrequiredBar interval.
1s | One-second bars. Bars only, active universe, back-filled on demand. |
1m | One minute. The finest stored tier; carries the intraday column subset and ~1,100 of ~13,700 tickers. |
5m | Five-minute bars. Bars only. |
15m | Fifteen-minute bars. Bars only. |
30m | Thirty-minute bars. Bars only. |
1h | One hour. Stored tier, intraday column subset, full universe. |
1d | One day. The full-history, full-column tier — the only grain that carries daily-only columns (SMAs, RSI, fundamentals). |
integerdefault 100Most-recent N bars. Max 1000 — an over-cap value is clamped, not an error.
stringContinuation token from a prior response's next_cursor; sugar for before (sending both is a 400; a blank cursor= counts as absent), and the way to page inside a from/to window.
stringReturn the N bars ending strictly before this date/timestamp — back-paging. Mutually exclusive with cursor (they are the same control — a 400 when both are sent).
stringWindow start (inclusive): YYYY-MM-DD, ISO timestamp, or epoch-ms. Combines with to for an explicit window; page within it using cursor. Mutually exclusive with asof and before (400).
stringWindow end (inclusive): a bare YYYY-MM-DD means through the end of that day, same as series. Mutually exclusive with asof and before (400).
stringPoint-in-time: the most recent bar whose period had **closed** at or before that moment. A bare YYYY-MM-DD means that day's close. A full timestamp means the last FINISHED bar — at 10:00 ET on a Wednesday the day's close has not happened, so 1d returns Tuesday's bar. Returns one bar unless you also pass limit, which gives the last limit closed bars. Mutually exclusive with before/cursor (400). Unlimited depth.
Returns
as_ofstringServer time this response was assembled (ISO 8601).
tickerstringThe symbol you asked for.
intervalstringThe bar size served.
countnumberBars returned in single-symbol mode; the number of SYMBOLS in bulk mode.
coveragestringWhy the page looks the way it does: `covered` when bars were found, `no_data` when the vendor has none for the window, `not_in_minute_tier` when a sub-hour interval was asked of a symbol the minute store does not carry.
next_cursorstringOpaque token for the next page; `null` on the last page. Absent on bulk requests — page bulk symbol-by-symbol.
barsarrayOHLCV bars, chronological, in the compact array shape. Bulk requests key this by symbol instead.
Status codes
200400interval; no, malformed, or more than 50 symbols; invalid or contradictory range controls (asof with before-paging, before with cursor, from/to combined with either, from after to, or a malformed bound); a non-positive-integer limit; or an invalid cursor.401Notes
- Supports point-in-time (
asof) and back-paging (before/limit).1dand1hcover the full universe with full history; sub-hour intervals cover the active universe and back-fill on demand. Pass a comma-separated symbol list for a bulk response keyed by symbol. - Bars keeps its own route alongside
/v2/serieson purpose: sub-hour intervals, fetch-on-miss coverage, and the compact chart-ready shape live here. To get OHLCV *joined with* indicator or flag columns on one grid, read series withcolumns=close,rsi_14,…instead. - Available at all intervals. The
asofpoint-in-time param is unlimited-depth — see As-of queries. - Anonymously (the docs sandbox, no key) bars are scoped to the latest trading day: you get ONE bar whatever
limitsays, with anext_cursorto page back. A key lifts that — the same request then returns the fulllimit. 1d/1hcover the full universe with full history. Sub-hour (1m/5m/15m/30m) covers the active universe; a symbol outside it is fetched from the provider on first request and served in the same call (transparent, capped at ~31 days per fetch).1s(1-second) bars are served on demand: from our store when present, otherwise passed through from the provider and served in the same call. Second data is not bulk-backfilled — it accumulates as it is requested. Best paired with a tightbefore+limitwindow. When the vendor pass-through is unavailable, the response says so: anote(single-symbol) /notes[symbol](bulk) flags that the range came from the local store only and may be under-covered.coverageiscovered,no_data(universe-wide interval with nothing for the symbol), ornot_in_minute_tier— a gap is always explicit, never a silent empty array.- Paging is
before+limit, withcursor/next_cursoras sugar. Accepts epoch-ms orYYYY-MM-DD; bars come back oldest-first. - For an explicit historical window, pass
from/to(inclusive; same bound semantics as series) and page inside it withcursor.from/todoes not combine withasof(point-in-time) orbefore(tail-paging) — contradictory range controls are a 400, never a silent pick.
More examples
curl "https://api.tickerbot.io/v2/tickers/AAPL,MSFT/bars/5m?limit=2" \
-H "Authorization: Bearer YOUR_KEY"{
"as_of": "2026-08-11T22:47:23.948Z",
"interval": "5m",
"count": 2,
"bars": {
"AAPL": [ { "t": 1786487400000, "o": 304.975, "h": 304.984, "l": 304.955, "c": 304.975, "v": 890 },
{ "t": 1786487700000, "o": 304.975, "h": 304.975, "l": 304.975, "c": 304.975, "v": 2622 } ],
"MSFT": [ { "t": 1786487400000, "o": 501.9, "h": 501.9, "l": 501.846, "c": 501.846, "v": 617 },
{ "t": 1786487700000, "o": 501.845, "h": 501.845, "l": 501.82, "c": 501.82, "v": 826 } ]
},
"coverage": { "AAPL": "covered", "MSFT": "covered" }
}