# GET /api/v1/ownership-index.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.json`: the ETF Ownership Index: each stock's figure and top three funds' share, market and sector lines. CSV too.

## Response

The ETF Ownership Index (ti-ownership-index/1). For each stock with a figure in the ownership ledger: the share of its shares outstanding held by the covered US ETFs, at least, the funds counted, and top3_share_pct, the share of those funds' holdings held by the three funds holding the most. Then the market line, over one line per company, with the cap-weighted share of the companies' market value the ETFs hold, the mean, the median and the quartiles, and the same line by sector. Its CSV twin, /api/v1/ownership-index.csv, has the same rows. The methodology, with a worked example, is at /etf-ownership/methodology/.

```json
{
  "…": "1 more field",
  "as_of": "2026-10-16",
  "method": "ti-ownership-index/1",
  "…": "6 more fields",
  "count": 3345,
  "columns": ["ticker", "company", "sector", "basis", "pct_lower_bound", "funds_counted", "top3_share_pct", "holdings_newest", "shares_outstanding_as_of"],
  "stocks": [["EU", "enCore Energy Corp.", null, "company", 33.47, 19, null, "2026-10-16", "2026-08-10"], ["URG", "Ur Energy Inc", null, "company", 32.89, 16, null, "2026-10-16", "2026-07-31"], "… 3,343 more"],
  "market": {"companies": 3241, "cap_weighted_pct": 7.88, "mean_pct": 8.68, "median_pct": 7.92, "p25_pct": 3.7, "p75_pct": 12.8, "companies_without_cap": 129, "cap_b": 83221.2},
  "…": "9 more fields",
  "cite_as": "TickerInside, ETF Ownership Index (ti-ownership-index/1) of 2026-10-16: at least 7.88% of the combined market value of 3,241 US-listed companies held by the covered US ETFs, https://tickerinside.com/api/v1/ownership-index.json, CC BY 4.0",
  "…": "4 more fields"
}
```

- `name` (string): The index's name.
- `as_of` (string or null): The date of the ownership ledger the index reads: its newest holdings date.
- `method` (string): The method of the index, ti-ownership-index/1, in /api/v1/methods.json.
- `ledger_method` (string): The method of the figures it reads, ti-ownership/1.
- `method_url` (string): Where both methods are written down, with their test vectors.
- `methodology` (string): The methodology page: formulas, sources, dates, limits and a worked example.
- `holdings_dates` (object or null): The oldest and newest holdings dates counted across the stocks.
- `shares_outstanding_dates` (object or null): The oldest and newest dates of the SEC's counts of shares outstanding used.
- `caps_as_of` (string or null): The price date of the market caps that weight the lines; they enter no stock's figure.
- `count` (integer): How many stocks have a figure, the rows of stocks.
- `columns` (array of string): The names of the places of each row of stocks.
- `stocks` (array of [ticker, company, sector, basis, pct_lower_bound, funds_counted, top3_share_pct, holdings_newest, shares_outstanding_as_of]): One row per stock with a figure, most held first, as columns names them.
- `market` (object or null): The line over every company: described below.
- `sectors` (array of object): The line of each sector with at least 5 companies, by name: the same fields and sector.
- `class_basis_left_out` (integer): How many figures of one class alone are in stocks and left out of the lines.
- `concentration_min_funds` (integer): The fewest funds counted for a top3_share_pct.
- `concentration_not_published` (object): How many stocks have a null top3_share_pct, by reason (refusals of ti-ownership-index/1 in methods.json).
- `held_back` (object or null): Set when tonight's ledger was held back by its checks: the index then reads the last ledger that passed.
- `failed` (boolean): True when the index could not be computed tonight: no rows and no lines, the history as it was.
- `history` (string): The daily history, with the changes over 5 and 20 market days (history terms).
- `csv` (string): The rows of stocks as CSV, the same columns.
- `note` (string): How to read the file.
- `cite_as` (string or null): A citation line: the index, its date, the market line 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): CC BY 4.0.
- `attribution` (string): Credit TickerInside with a link to this file, or to the page that shows the figure, wherever the medium allows a link, and by name where it does not. How you mark the link is up to you.

The market line, and each line of sectors:

- `companies` (integer): Companies in the line, one per company on a company basis.
- `cap_weighted_pct` (number or null): Sum of each company's figure times its market cap over the sum of their caps, rounded down: the share of their combined market value held by the covered US ETFs, at least.
- `mean_pct` (number or null): The mean of the companies' figures, rounded down.
- `median_pct` (number or null): The median company's figure.
- `p25_pct` (number or null): The first quartile, by nearest rank.
- `p75_pct` (number or null): The third quartile, by nearest rank.
- `companies_without_cap` (integer): Companies without a market cap, in the mean and quartiles and left out of cap_weighted_pct.
- `cap_b` (number or null): The companies' combined market cap, in billions of dollars.

A lower bound, like the ledger it reads: funds outside the coverage, and covered funds whose count could not be used, are not in it. Market caps weight the lines and enter no stock's figure. Under CC BY 4.0.

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