# GET /v2/tickers/{ticker}/bars/{interval}

**OHLCV bars**

OHLCV bars from 1-second through daily — the chart feed.

## Query / path parameters

| Name | In | Type | Required | Description |
|------|----|----|----------|-------------|
| `ticker` | path | string[] | yes | Ticker symbol, or a comma-separated list (up to 50) for a bulk response keyed by symbol. Example: `NVDA`. |
| `interval` | path | string | yes | Bar interval. Enum: `1s`, `1m`, `5m`, `15m`, `30m`, `1h`, `1d`. Example: `1d`. |
| `limit` | query | integer | no | Most-recent N bars. Max 1000 — an over-cap value is clamped, not an error. Default: `100`. Example: `5`. |
| `cursor` | query | string | no | 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. |
| `before` | query | string | no | 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). Example: `2026-05-14`. |
| `from` | query | string | no | 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). Example: `2026-07-03`. |
| `to` | query | string | no | 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). Example: `2026-05-14`. |
| `asof` | query | string | no | 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. Returns one bar unless you also pass `limit`, which gives the last `limit` closed bars. Mutually exclusive with `before`/`cursor` (400). Unlimited depth. Example: `2026-05-14`. |

## Returns

- `as_of` (string) — Server time this response was assembled (ISO 8601).
- `ticker` (string) — The symbol you asked for.
- `interval` (string) — The bar size served.
- `count` (number) — Bars returned in single-symbol mode; the number of SYMBOLS in bulk mode.
- `coverage` (string) — Why 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_cursor` (string) — Opaque token for the next page; `null` on the last page. Absent on bulk requests — page bulk symbol-by-symbol.
- `bars` (array) — OHLCV bars, chronological, in the compact array shape. Bulk requests key this by symbol instead.

## Status codes

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

## Sample response

```json
{
  "as_of": "2026-08-11T22:47:57.964Z",
  "ticker": "NVDA",
  "interval": "1d",
  "count": 5,
  "coverage": "covered",
  "next_cursor": "1785902400000",
  "bars": [
    { "t": 1785902400000, "o": 216.86, "h": 222.22,   "l": 216.4,   "c": 219.22,  "v": 158187404 },
    { "t": 1785988800000, "o": 221.53, "h": 223.63,   "l": 217,     "c": 218.99,  "v": 113940644 },
    { "t": 1786075200000, "o": 221.54, "h": 224.76,   "l": 220.66,  "c": 223.96,  "v": 105669440 },
    { "t": 1786334400000, "o": 223.4,  "h": 224.1379, "l": 216.77,  "c": 217.55,  "v": 115846596 },
    { "t": 1786420800000, "o": 222.17, "h": 222.201,  "l": 216.442, "c": 217.457, "v": 82019024 }
  ]
}
```

## More examples

### Bulk: 5-minute bars for several symbols

Request:

```shell
curl "https://api.tickerbot.io/v2/tickers/AAPL,MSFT/bars/5m?limit=2" \
  -H "Authorization: Bearer YOUR_KEY"
```

Response (`200`):

```json
{
  "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" }
}
```

## Notes

- Supports point-in-time (`asof`) and back-paging (`before`/`limit`). `1d` and `1h` cover 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/series`](/docs/endpoints/series/get) on 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 with `columns=close,rsi_14,…` instead.
- Available at all intervals. The `asof` point-in-time param is unlimited-depth — see [As-of queries](/docs/asof).
- Anonymously (the docs sandbox, no key) bars are scoped to the latest trading day: you get ONE bar whatever `limit` says, with a `next_cursor` to page back. A key lifts that — the same request then returns the full `limit`.
- `1d`/`1h` cover 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 tight `before`+`limit` window. When the vendor pass-through is unavailable, the response says so: a `note` (single-symbol) / `notes[symbol]` (bulk) flags that the range came from the local store only and may be under-covered.
- `coverage` is `covered`, `no_data` (universe-wide interval with nothing for the symbol), or `not_in_minute_tier` — a gap is always explicit, never a silent empty array.
- Paging is `before` + `limit`, with `cursor`/`next_cursor` as sugar. Accepts epoch-ms or `YYYY-MM-DD`; bars come back oldest-first.
- For an explicit historical window, pass `from`/`to` (inclusive; same bound semantics as [series](/docs/endpoints/series/get)) and page inside it with `cursor`. `from`/`to` does not combine with `asof` (point-in-time) or `before` (tail-paging) — contradictory range controls are a 400, never a silent pick.

---

Interactive sandbox + parameter editor: https://tickerbot.io/docs/endpoints/tickers/bars
