# GET /v2/tickers/{ticker}/history

**Ticker as-of date**

Time-travel to any historical date and pull the whole wide row as it stood then, including the boolean flag values, technical indicators, and the most-recent fundamentals known on that date. Useful for "what did we know" reconstructions and replaying screens across history.

## Plan access

- **Plan access.** Included on every plan.
- **Rate limit.** Hobby 600/min · Pro 6,000/min · Scale 60,000/min.
- **History.** Replayable on every plan.

## Query / path parameters

| Name | In | Type | Required | Description |
|------|----|----|----------|-------------|
| `ticker` | path | string | yes | Ticker symbol. Example: `AAPL`. |
| `asof` | query | string | yes | Target date as `YYYY-MM-DD` or full ISO timestamp `YYYY-MM-DDTHH:MM:SSZ`. A time component is truncated to the calendar day (`_meta.resolution: "daily"`). The response returns the most-recent daily snapshot on or before this date, with **no lookback limit** — it walks back as far as needed and 404s only if the ticker has no state at all on/before the date. (This differs from `/v2/scan?asof=` and `/v2/signals/{signal}?asof=`, which cap carry-forward at 14 days and return empty rather than 404.) Example: `2026-03-01`. |

## Status codes

- **200** — Wide row at the requested date under `data`. `_meta.frozen_fields` lists fields that are not historized (sector, industry, etc.; JOIN to /tickers/{t} for current values).
- **400** — `bad_request` — `asof` missing or not `YYYY-MM-DD` / `YYYY-MM-DDTHH:MM:SSZ`.
- **401** — Missing or invalid API key.
- **404** — `not_found` — the ticker has no historical state at or before the requested date.

## Sample response

```json
{
  "as_of": "2026-03-01",
  "ticker": "AAPL",
  "_meta": {
    "resolution": "daily",
    "frozen_fields": ["name", "sector", "industry", "asset_type", "exchange"]
  },
  "data": {
    "ticker": "AAPL",
    "date": "2026-02-27",
    "price": 271.43,
    "day_change_pct": 0.0092,
    "volume_today": 38104000,
    "rsi_14": 64.7,
    "above_sma_50": true,
    "pe_ratio": 31.2,
    "eps": 9.04,
    "...": "(full daily row)"
  }
}
```

## Examples

### AAPL as of 2026-03-01

Request:

```shell
curl "https://api.tickerbot.io/v2/tickers/AAPL/history?asof=2026-03-01" \
  -H "Authorization: Bearer YOUR_KEY"
```

Response (`200`):

```json
{
  "as_of": "2026-03-01",
  "ticker": "AAPL",
  "_meta": {
    "resolution": "daily",
    "frozen_fields": ["name", "sector", "industry", "asset_type", "exchange"]
  },
  "data": {
    "ticker": "AAPL",
    "date": "2026-02-27",
    "price": 271.43,
    "day_change_pct": 0.0092,
    "volume_today": 38104000,
    "rsi_14": 64.7,
    "above_sma_50": true,
    "pe_ratio": 31.2,
    "eps": 9.04,
    "...": "(full daily row)"
  }
}
```

## Notes

- Replayable history on every plan. A missing or malformed `asof` returns `400 bad_request`; a date with no state on/before it returns `404 not_found`. A future date is not rejected — it simply returns the most-recent row available.
- The returned `data.date` may be earlier than the requested `asof` (weekend/holiday/gap) — it is the latest daily state on or before that date. See the example: `asof=2026-03-01` (a Sunday) returns the `2026-02-27` row.
- `frozen_fields` are not historized; they're snapshots of the *current* value. The other fields are correct as of the requested date.

---

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