# GET /api/v1/ownership-index/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 /ownership-index/history.json`: the index by close, 5 and 20 day changes (history terms).

## Response

One row per market close of the market line and of each sector line: the levels of the night the close was first published, and the change of ETF ownership ending on the close over 1, 5 and 20 market days, weighted by market cap. Then each stock's changes ending on the latest close, in percentage points of its shares outstanding, from the net shares the funds read daily bought and sold, as the ETF flows publish them. Its CSV twin, /api/v1/ownership-index/history.csv, has the rows of every line.

```json
{
  "…": "4 more fields",
  "first_close": "2026-09-29",
  "last_close": "2026-10-12",
  "…": "1 more field",
  "series_columns": ["date", "as_of", "companies", "cap_weighted_pct", "mean_pct", "median_pct", "p25_pct", "p75_pct", "companies_without_cap", "cap_b", "change_1d_pp", "change_1d_cap_pct", "change_5d_pp", "change_5d_cap_pct", "change_20d_pp", "change_20d_cap_pct", "rebuilt"],
  "market": [["2026-10-09", null, null, null, null, null, null, null, null, null, 0.0061, 90.7, 0.0124, 85.5, null, 0.0, true], ["2026-10-12", "2026-10-13", 3503, 11.41, 10.64, 9.88, 3.68, 16.54, 252, 84647.2, 0.0067, 88.8, 0.0233, 83.5, null, 0.0, false]],
  "…": "1 more field",
  "stocks_columns": ["ticker", "change_1d_pp", "change_5d_pp", "change_20d_pp", "null_1d", "null_5d", "null_20d"],
  "stocks": [["A", 0.0121, 0.0328, null, null, null, null], ["AA", 0.0079, 0.0225, null, null, null, null], "… 3,343 more"],
  "…": "11 more fields"
}
```

- `name` (string): The history's name.
- `method` (string): The method of the index, ti-ownership-index/1.
- `flows_method` (string): The method of the flows the changes are read from, ti-flows/1.
- `methodology` (string): The methodology page.
- `first_close` (string or null): The first close of the history.
- `last_close` (string or null): The close of the changes in stocks: the flows' latest close.
- `windows` (object): For 1d, 5d and 20d: from, the close the change starts after, to, the close it ends on, and covered, whether every close between is a complete close of the flows.
- `series_columns` (array of string): The names of the places of each row of market and sectors.
- `market` (array of [date, as_of, levels, changes, rebuilt], as series_columns): The market line, one row per close, oldest first.
- `sectors` (object of the same rows, by sector): Each sector's line, one row per close, by sector.
- `stocks_columns` (array of string): The names of the places of each row of stocks.
- `stocks` (array of [ticker, change_1d_pp, change_5d_pp, change_20d_pp, null_1d, null_5d, null_20d]): Each stock's changes over 1, 5 and 20 market days ending on last_close, in percentage points of its shares outstanding, and the reason each null one is null; a null reason with a null change means the window is not covered.
- `not_measured` (object): For each window, how many stocks have no change, by reason.
- `null_reasons` (object): Each reason a change is null, in words.
- `index` (string): The index file.
- `csv` (string): market and sectors as CSV rows, with the line's name in line.
- `note` (string): How to read the file.
- `cite_as` (string or null): A citation line: the closes and this file's address.
- `cite_html` (string): The credit as HTML: a link to this file, then its address.
- `docs` (string): Where the file is documented.
- `license` (string): The history terms, not CC BY 4.0.
- `terms` (string): The terms in full, on the legal notice.
- `attribution` (string): How to credit it, then what the history terms allow.

A row is written the first night its close is published and never rewritten. The rows before the first night are rebuilt from the flows of that night: their changes only. Not under CC BY 4.0: the history terms apply.

## 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`.
