Get a ticker's bars
https://api.tickerbot.io/ v2/ tickers/ {ticker}/ bars/ {interval}Returns OHLCV bars from 1s to monthly for one ticker or a comma list of up to 50 in the path, such as a screen's matches.
Path parameters
string[]requiredTicker symbol, or a comma-separated list (up to 50) for a bulk response keyed by symbol.
enumrequiredBar interval. 2h/4h roll up hourly bars; 1w/1mo roll up daily bars into calendar weeks (Monday start) and months — the bar's t is the bucket start (UTC), and with asof the last bucket is the week/month to date.
1s | One-second bars. Bars only, active universe, back-filled on demand. |
1m | One 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. |
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). |
1w | One week, resampled: state columns take the week’s last observation, bars aggregate, results keyed by the Monday. |
Query parameters
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. On sub-daily intervals a bare date on from or to is the ET calendar day for stocks and ETFs (the whole 04:00-20:00 ET session) and the UTC day for crypto and FX. 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. A bare date on an intraday grid (1m, 1h, …) is accepted and means the last bar of that day: the ET calendar day for stocks and ETFs (through the 19:59 ET bar), the UTC day for crypto and FX. Returns one bar unless you also pass limit, which gives the last limit closed bars; follow next_cursor with the same parameters to keep paging back: the cursor and asof both bound the page, so no bar after the instant is ever served and every page stays on the company that held the symbol at the instant. Mutually exclusive with before (400). Unlimited depth. Response time: under 1.5 s cold, under 0.6 s warm.
booleanDefault true: prices are split-adjusted — restated after each later split, as the tape is, so a series is continuous across a split. false returns the price as it printed that day (a name that later did a 1:10 reverse split reads 21.4 adjusted and 2.14 on the tape), which is what a broker fill or a chart from that time shows. Volume scales the other way.
enumdefault allSub-hour intervals only. all (default) includes pre- and post-market bars. regular keeps bars whose start is in 09:30–16:00 ET (DST-aware). Why you might want it: the vendor buckets trades by SIP report time, and late-reported off-exchange (Form T) prints on thin names can land 20 min to hours late in a pre-market minute — a $1.70 print at 08:13 ET on a $3.85 stock. Daily high/low are untouched by those. limit counts after the filter; paging still works.
integerdefault 100Most-recent N bars. Max 1000 — an over-cap value is clamped, not an error. On a bulk (comma-list) request the cap is per symbol: each symbol returns its newest limit bars in the window, and a symbol with more carries its own cursor under next_cursor[symbol].
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).
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.
Returns
as_ofstringServer time this response was assembled (ISO 8601).
tickerstringThe symbol you asked for.
intervalstringThe bar size served.
adjustedbooleanWhether the bars are split-adjusted — true unless you passed adjusted=false.
sessionstringThe session filter applied: all (default) or regular (09:30–16:00 ET, sub-hour intervals only).
_metaobjectOn every read: history_revised_at, per symbol, the last time its stored history was rewritten. When a rename or an earlier holder affects the dates: identity, per symbol, whose bars these are, with traded_as listing the symbols a renamed company used. No keys of its own. Shared keys: see the _meta reference.
notestringPresent only when there is something to disclose about how the page was served: the first request for a symbol at a sub-hour interval loads and stores its bars, so that one call is slower than later ones and the note says so. Bulk responses carry notes[symbol] instead.
notesobjectBulk (comma-list) requests only: the per-symbol disclosures, keyed by symbol, in place of note.
countnumberBars returned in single-symbol mode; the number of SYMBOLS in bulk mode.
coveragestring | objectcovered when bars were found, no_data when nothing exists for the symbol in the window (before its first session, a market holiday, a thin name with no prints). A page that could not be completed is never a 200: it is a 503 unavailable with Retry-After.
next_cursorstring | objectToken for the next page; null on the last page. Bulk (comma-list) requests key it by symbol, like coverage: a symbol whose page was cut at limit carries its own token, a symbol served in full carries null. Continue a cut symbol with a single-symbol request passing its token as cursor (a bulk cursor is one bound applied to every symbol, so pass one only to symbols that share the same value).
barsarray | objectOHLCV bars, chronological, in the compact array shape: t (bar start, epoch ms), o h l c, v (volume), vw (volume-weighted average price) and n (trade count). A rolled-up bar (5m to 30m, 2h, 4h, 1w, 1mo) sums v and n and weights vw by volume. vw and n are null where the trades behind a bar were not recorded. Bulk requests key this by symbol instead.
Status codes
| Code | Meaning |
|---|---|
200 | Success — the response shape is documented under Returns above. |
400 | Invalid interval; 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. |
401 | Missing or invalid API key. |
503 | unavailable — the bars for a sub-hour or 1s read could not be loaded right now; the response carries Retry-After (seconds). Retry the same request. Never an empty or stale 200. |
Notes
- Daily bars are checked against that day's minute bars: a vendor daily high or low that no minute bar reached is replaced from the regular-session minute bars (open and close never change), the next trading day once the minute bars are final.
- By asset class: rates have one value per business day and no open, high, low or volume (those come back
null); pre-2024 spot-metal bars are a single daily fixing (open = high = low = close, no volume); FX has no consolidated traded size, so its volume is a tick count; crypto volume is genuine traded volume. - A company that changed its ticker reads as one continuous series under its current symbol, and its earlier symbol serves the same bars for the dates it traded under that name:
PTIVfromPAPL's first day,PAPLthrough the day of the rename._meta.identitynames the symbols and dates. - Sub-hour bars are current to the last closed minute through the extended session (04:00 to 20:00 ET), for every active stock and ETF: the newest
1mbar is the minute that just finished, and a5m/15m/30mbar still in progress is built from the minutes closed so far. - Minute and hourly bars for the current session are preliminary. Each morning the previous session's minute and hourly bars are replaced with the final version, so a session's bars can change once overnight and occasionally again up to three trading days later.
- Bars sits beside History on purpose: sub-hour intervals (loaded on first request) and the compact chart-ready shape live here. To get OHLCV joined with indicator or boolean signals on one grid, read history with
columns=close,rsi_14,…instead. - Path history:
GET /v2/bars/{ticker}/{interval}is the older spelling of this read. It keeps working, permanently, with the same response; its responses carry aLinkheader naming this path. 1d/1hcarry full history for every symbol. Sub-hour (1m/5m/15m/30m) is available for every active symbol at any past timestamp, extended session included: the first request for a symbol at a sub-hour interval takes a few seconds (~3–10s) while its bars are loaded and stored, and later calls are sub-second. A tail read (no window) fills up to 31 days ending atbefore/asof/now, afrom/towindow fills the window, and either one loads each finished 04:00–20:00 ET session it touches whole — page further back withnext_cursor. That first response carries anotesaying so.1s(1-second) bars are served on demand: from our store when it already covers the request through the latest session, otherwise loaded and served in the same call (the store is filled by earlier requests, so a full page of older stored bars is never mistaken for the latest ones). Second data accumulates as it is requested. Best paired with a tightbefore+limitwindow.not_in_minute_tieris no longer emitted incoverage(see the changelog).
More examples
Bulk: 5-minute bars for several symbols
curl "https://api.tickerbot.io/v2/tickers/NVDA,AMD/bars/5m?limit=2" \
-H "Authorization: Bearer YOUR_KEY"