tickerbot-io Bars API
The Bars API from tickerbot-io — 1 operation(s) for bars.
The Bars API from tickerbot-io — 1 operation(s) for bars.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/tickerbot-io:tickerbot-io-bars-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Tickerbot Bars API
version: 2.69.6
summary: The stock market API designed for agents.
description: 'Tickerbot is the stock market API designed for agents. We serve real-time and historical market data as one queryable table. You and your agents can ask it anything, without building anything custom. Every ticker is a row. Every data point is a column. 23,000+ tickers, covering US stocks and ETFs, FX, crypto, rates and metals. 452+ columns, covering raw data, calculations and conditions: price, volume, price action, technicals, fundamentals, events, profile, analyst ratings and news. Refreshed every minute, historized back to 2003. The table is the API: /v2/tickers/ returns one ticker''s whole row, /v2/signals/ returns every ticker that matches one column, /v2/scan returns every ticker that matches a SQL WHERE clause. Every read runs live or as of any date. The power is in the columns: every ticker gets the same columns, query any of them, in any combination. Ask any question: anything you want to know about the market is a query over the table. Build any trading tool: anything you want to build is a few queries in sequence. Get a free API key, or paste our setup prompt and your agent connects over MCP. Free plan: 10,000 calls a month, no card required.
All responses carry a top-level `as_of` ISO timestamp indicating data vintage. List and history responses use opaque cursor pagination — treat `next_cursor` as a black-box token and pass it back via `?cursor=` on the next request.'
contact:
name: Tickerbot Support
url: https://tickerbot.io/support
email: support@tickerbot.io
license:
name: Proprietary
url: https://tickerbot.io/terms
servers:
- url: https://api.tickerbot.io
description: Production
security:
- apiBearer: []
tags:
- name: Bars
paths:
/v2/bars/{ticker}/{interval}:
get:
tags:
- Bars
summary: OHLCV bars from 1-second to monthly, in a compact array shape
operationId: get_bars
description: 'OHLCV bars from 1-second through monthly. The prices underneath the table. 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, and open and close are never changed. The newest session is checked the next trading day, once the vendor''s minute bars are final. That keeps a bad vendor print from stretching a day''s range. Notes:
- Bars are the historical stock data: daily bars run back to each ticker''s first day of coverage (2003 for the oldest equities; see Tickers for depth by class), delisted names keep their bars, and intraday bars run from 1-second up. History is not only price: `?asof=` on any state read rewinds a whole row, and Series pulls any columns over time on one grid. - Supports point-in-time (`asof`) and back-paging (`before`/`limit`). Every interval covers every active symbol; the first sub-hour request for a symbol takes a few seconds while its bars are loaded. Pass a comma-separated symbol list for a bulk response keyed by symbol. - 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. - Prices are **split-adjusted** at every interval, and re-adjusted retroactively when a later split lands: a bar from before a 1-for-10 reverse split shows the tape price times 10, so a stock that closed at $2.14 that day reads $21.40 once the split is in. To match a fill from your broker, pass `adjusted=false` for the price as it printed that day; `/v2/events?kind=split` lists the splits behind the difference. - Sub-hour bars (`1s` through `30m`) include pre-market and after-hours prints, bucketed by the SIP report time rather than the execution time. On thin names an off-exchange trade can be reported an hour or more after it executed, so a pre-market bar can carry a wick far from where the market was in that minute. `1d` high/low counts regular-session trades only, per SIP rules, so the daily bar never shows those wicks. Compute intraday statistics such as MAE/MFE from regular-session bars: pass `session=regular` (09:30 to 16:00 ET). - Bars is its own family on purpose, alongside Series: sub-hour intervals, fetch-on-miss coverage, and the compact chart-ready shape live here. To get OHLCV *joined with* indicator or boolean signals on one grid, read series with `columns=close,rsi_14,…` instead. - Available at all intervals. The `asof` point-in-time param is unlimited-depth — see As-of queries. - `2h`/`4h` are rollups of the hourly store and `1w`/`1mo` of the daily store (calendar buckets, `t` = bucket start), so they carry the same universe and depth as `1h` and `1d`. Added in v2.32.0 — until then only the dashboard chart could draw them. - `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. - `coverage` is `covered` or `no_data` (nothing exists for the symbol in the window).'
parameters:
- name: ticker
in: path
required: true
description: Ticker symbol, or a comma-separated list (up to 50) for a bulk response keyed by symbol.
schema:
type: array
example: NVDA
items:
type: string
- name: interval
in: path
required: true
description: 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.
schema:
type: string
enum:
- 1s
- 1m
- 5m
- 15m
- 30m
- 1h
- 2h
- 4h
- 1d
- 1w
- 1mo
example: 1d
- name: from
in: query
required: false
description: '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).'
schema:
type: string
example: '2026-09-21'
- name: to
in: query
required: false
description: 'Window end (inclusive): a bare `YYYY-MM-DD` means through the end of that day, same as series. Mutually exclusive with `asof` and `before` (400).'
schema:
type: string
example: '2026-08-02'
- name: asof
in: query
required: false
description: '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 UTC day. 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.5 s warm.'
schema:
type: string
example: '2026-08-02'
- name: adjusted
in: query
required: false
description: '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. Un-adjusted on read from the splits table; the store is untouched.'
schema:
type: boolean
example: false
- name: session
in: query
required: false
description: '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.'
schema:
type: string
enum:
- all
- regular
default: all
example: regular
- name: limit
in: query
required: false
description: '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]`.'
schema:
type: integer
default: 100
example: 5
- name: before
in: query
required: false
description: 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).
schema:
type: string
example: '2026-08-02'
- name: cursor
in: query
required: false
description: 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.
schema:
type: string
responses:
'200':
description: Success.
content:
application/json:
schema:
type: object
properties:
as_of:
type:
- string
- 'null'
description: Server time this response was assembled (ISO 8601).
ticker:
type:
- string
- 'null'
description: The symbol you asked for.
interval:
type:
- string
- 'null'
description: The bar size served.
adjusted:
type:
- boolean
- 'null'
description: Whether the bars are split-adjusted — `true` unless you passed `adjusted=false`.
session:
type:
- string
- 'null'
description: 'The session filter applied: `all` (default) or `regular` (09:30–16:00 ET, sub-hour intervals only).'
_meta:
type:
- object
- 'null'
description: 'On every read: `history_revised_at`, per symbol, the last time its stored history was rewritten. No keys of its own. Shared keys: see [the `_meta` reference](/docs/asof#meta).'
note:
description: '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.'
notes:
description: 'Bulk (comma-list) requests only: the per-symbol disclosures, keyed by symbol, in place of `note`.'
count:
type:
- number
- 'null'
description: Bars returned in single-symbol mode; the number of SYMBOLS in bulk mode.
coverage:
anyOf:
- type: string
- type: object
- type: 'null'
description: '`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_cursor:
anyOf:
- type: string
- type: object
- type: 'null'
description: '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).'
bars:
anyOf:
- type: array
- type: object
- type: 'null'
description: OHLCV bars, chronological, in the compact array shape. Bulk requests key this by symbol instead.
'400':
description: 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':
description: Missing or invalid API key.
'402':
description: No active plan on the account (rare — new signups land on the Free plan automatically).
'429':
description: Rate limit exceeded for your plan.
'503':
description: '`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.'
components:
securitySchemes:
apiBearer:
type: http
scheme: bearer
bearerFormat: API key (tb_live_… or tb_test_…)
description: 'API keys are minted in the dashboard. Send as `Authorization: Bearer <key>`.'