tickerbot.io

Get a ticker's bars

GEThttps://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.

string[]required

Ticker symbol, or a comma-separated list (up to 50) for a bulk response keyed by symbol.

enumrequired

Bar 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.

1sOne-second bars. Bars only, active universe, back-filled on demand.
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.
5mFive-minute bars. Bars only.
15mFifteen-minute bars. Bars only.
30mThirty-minute bars. Bars only.
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).
1wOne week, resampled: state columns take the week’s last observation, bars aggregate, results keyed by the Monday.
string

Window 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).

string

Window 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).

string

Point-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.

boolean

Default 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 all

Sub-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 100

Most-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].

string

Return 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).

string

Continuation 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.

as_ofstring

Server time this response was assembled (ISO 8601).

tickerstring

The symbol you asked for.

intervalstring

The bar size served.

adjustedboolean

Whether the bars are split-adjusted — true unless you passed adjusted=false.

sessionstring

The session filter applied: all (default) or regular (09:30–16:00 ET, sub-hour intervals only).

_metaobject

On 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.

notestring

Present 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.

notesobject

Bulk (comma-list) requests only: the per-symbol disclosures, keyed by symbol, in place of note.

countnumber

Bars returned in single-symbol mode; the number of SYMBOLS in bulk mode.

coveragestring | object

covered 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 | object

Token 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 | object

OHLCV 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.

CodeMeaning
200Success — the response shape is documented under Returns above.
400Invalid 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.
401Missing or invalid API key.
503unavailable — 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.
  • 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: PTIV from PAPL's first day, PAPL through the day of the rename. _meta.identity names 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 1m bar is the minute that just finished, and a 5m/15m/30m bar 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 a Link header naming this path.
  • 1d/1h carry 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 at before/asof/now, a from/to window fills the window, and either one loads each finished 04:00–20:00 ET session it touches whole — page further back with next_cursor. That first response carries a note saying 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 tight before+limit window.
  • not_in_minute_tier is no longer emitted in coverage (see the changelog).

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"