tickerbot-io Bars API

The Bars API from tickerbot-io — 1 operation(s) for bars.

Operations 1

GET /v2/bars/{ticker}/{interval} OHLCV bars from 1-second to monthly, in a compact array shape #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • 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.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/tickerbot-io:tickerbot-io-bars-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

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 Specification

tickerbot-io-bars-api-openapi.yml Raw ↑
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>`.'