# GET /api/v1/history.json

One endpoint of the TickerInside API, with data through 2026-10-16. Contents of the reference, each section and endpoint as a file: https://tickerinside.com/api/sections/index.md. The whole reference as Markdown: https://tickerinside.com/api/index.md

`GET /history.json`: every fund with a holdings history, from its issuer's own files, with the dates of its oldest and newest files and the address of its history, under the history terms. https://tickerinside.com/api/v1/history.json

## Response

Every issuer-layer fund that has a history here, with the dates of its oldest and newest files in the archive, how many file dates it holds, how often the issuer publishes, and the address of its history file.

```json
{
  "as_of": "2026-10-16",
  "since": "2026-09-01",
  "count": 633,
  "funds": [{"t": "AAXJ", "first": "2026-09-02", "last": "2026-10-15", "file_dates": 31, "cadence": "daily", "traded_pp_from": "2026-09-29", "ended": null, "url": "https://tickerinside.com/api/v1/history/aaxj.json"}, "… 632 more"],
  "…": "3 more fields",
  "license": "TickerInside history terms",
  "terms": "https://tickerinside.com/legal/#history",
  "…": "1 more field"
}
```

- `as_of` (string): The newest file date any fund's history reaches. Here as_of is a holdings file date, not the price date.
- `since` (string): The oldest file date any fund's history starts from. It is not the day the archive began, which is since in status.json, under data.archive.
- `count` (integer): How many funds have a history file, the length of funds.
- `funds` (array of object): One entry per fund with a history, ended or not; its fields are described below.
- `holdings_at` (string or null): The address of a fund's holdings at a date, with {ticker} and {date} to fill, once it is served; null until then. Today any valid date answers 404 not_covered, with reason holdings_at_date_not_enabled and the address of the fund's changes file.
- `note` (string): How to read the files.
- `docs` (string): Where the files are documented.
- `license` (string): The terms the history is published under: TickerInside's history terms, not CC BY 4.0.
- `terms` (string): The terms in full, on the legal notice.
- `attribution` (string): How to credit it, a link to the file where the medium allows one and the name where it does not, then what the history terms allow.

A fund entry:

- `t` (string): The fund's ticker.
- `first` (string): The date of the oldest file of the fund in the archive.
- `last` (string): The date of the newest.
- `file_dates` (integer): How many file dates the archive holds for the fund.
- `cadence` (string or null): daily when the median gap between two files is at most four days, monthly when it is 25 to 35 days, irregular otherwise; null with a single file.
- `traded_pp_from` (string or null): The date of the first step whose two files both carry share counts, from which traded_pp is measured; null when there is none yet.
- `ended` (string or null): Last issuer file's date once no longer read, else null.
- `url` (string): The fund's history file.

Not under CC BY 4.0: the history terms apply (license, terms). Fetching this list or many funds' history files on a schedule to store them is not allowed.

## Errors and redirects

| Status | reason | Meaning | Next request |
|---|---|---|---|
| 200 |  | The file. | Read it. Every file carries its dates. |
| 204 |  | A browser's CORS preflight, an `OPTIONS` request, answered before any redirect: GET and HEAD from any origin, with the headers asked for, kept up to a day. | Nothing to do. |
| 301 |  | An upper case ticker, a share class written `BRK-B` or `BRK/B` (the file is `brk.b.json`), an address without `.json`, `/api/v1` alone, or punctuation copied from a sentence at its end. A key listed abroad with a hyphen, such as `SQM-B`, keeps it. A written comparison asked for in the other order leads to its file: `vym-vs-vig` to `vig-vs-vym.json`. A fund with no file under `/etf/` leads to its file under `/fund/`: `etf/voo.json` to `fund/voo.json`. `/stock/`, the name of the pages, leads to the stock files under `/sec/`: `stock/nvda.json` to `sec/nvda.json`. | Follow it (`curl -L`). `Location` gives the address. |
| 304 |  | Your `If-None-Match` matches the file's `ETag`. | Keep your copy. |
| 404 | `no_such_endpoint` | No endpoint at this address. | `covered`: `index.json`. |
| 503 |  | The file could not be served just then. The body's `error` is `unavailable`, with `Retry-After: 60`. | Retry after a minute. `uptime`: `uptime.json` says whether the site fails its own checks. |

Every 404 body is JSON. It holds `error`, always `not_covered`; `reason`, a code /contract/ lists; `ticker`, as asked for, or null when the address names no ticker; `message`; `docs`; and the follow-up address named above. Under /history/, it also holds `date` when a date was asked for. `before_history`, for a date before a fund's first file, is answered only once holdings at a date are served. A 400 body holds `error` (`bad_request`), `reason`, `message`, `docs`, and `parameter`, or `limit` and `asked`.
