# GET /api/v1/holders/{c}.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 /holders/{c}.json`: holders.json cut by the first character of the key, a to z, or 0 for any other character (7203.JP is in 0.json, AZN.GB in a.json). It is the source of the holders-only answers under /sec/, for a security with no stock file, such as a line listed abroad. Any other address under /holders/ answers 404, reason `not_a_shard`. https://tickerinside.com/api/v1/holders/a.json

## Response

The reverse index split by the first character of the key: a.json to z.json, and 0.json for a key that starts with any other character (7203.JP is in 0.json, AZN.GB in a.json). Each shard holds the part of holders.json for its keys, with their names and figures under facts. It also holds what holders.json does not: the SEC-layer funds that hold a key with no stock file, such as a line listed abroad, under holders_sec_nport, and the old keys of its first character under aliases. It is the source of the holders-only answers under /sec/. 0.json is the largest shard (3.0 MB). The same content is split again by the key's first digit, in /api/v1/holders/0/0.json to /api/v1/holders/0/9.json (7203.JP is in 0/7.json), for a client that wants a smaller file.

```json
{
  "as_of": "2026-10-16",
  "holdings_as_of": {"CNRG": "2026-10-15", "CWI": "2026-10-15", "…": "624 more"},
  "…": "1 more field",
  "facts": {"7203.JP": {"n": "Toyota Motor Corp"}},
  "holders": {"7203.JP": [["EWJV", 6.8909], ["RXI", 3.6642], "… 42 more"], "…": "6,125 more keys"},
  "holders_sec_nport": {"7203.JP": [["IQDG", 4.095], ["BBJP", 3.9873], "… 80 more"], "…": "7,926 more keys"},
  "sec_nport_as_of": {"IQDG": "2026-06-30", "BBJP": "2026-07-31", "…": "655 more"},
  "aliases": {"7203": ["7203.JP", "7203.SA"]},
  "…": "2 more fields"
}
```

- `as_of` (string): The price date.
- `holdings_as_of` (object): The date of each issuer-layer fund's holdings file, keyed by ticker, for every issuer-layer fund.
- `funds` (object): Ticker to fund name for the issuer-layer funds. The names of SEC-layer funds are in /api/v1/funds.json, under sec_funds.
- `facts` (object): For each key of this shard the data can describe: n, the name, and where known r1, r3, vol, mdd3, cap_b, pe and yield, in the units of a stock file. page is true when the stock has a page.
- `holders` (object of arrays of [ticker, weight]): The part of holders.json for the keys of this shard: each key to the issuer-layer funds that hold it, as [fund ticker, weight percent], heaviest first. Each row's date is in holdings_as_of.
- `holders_sec_nport` (object of arrays of [ticker, weight]): Each key of this shard that has no stock file, such as a line listed abroad, to the SEC-layer funds that hold it, as [fund ticker, weight percent], heaviest first. Each row's date is in sec_nport_as_of. A key with a stock file has its SEC-layer holders in that file.
- `sec_nport_as_of` (object): Each SEC-layer fund listed in holders_sec_nport, to the quarter end its filing describes.
- `aliases` (object): The old keys whose first character is this shard's, each with the keys it reads as now: 7203 reads as 7203.JP and 7203.SA. Unlike holders.json, it also lists a key that reads only as itself with its market (NESN as NESN.CH). Absent from a shard with no old key.
- `license` (string): The licence the data is published under.
- `attribution` (string): How to credit the data: a link to this file where the medium allows one, the name where it does not.

Ask for the key's first character in lower case, or 0 when it is not a letter. The files are a.json to z.json, 0.json, and 0/0.json to 0/9.json; any other address under /api/v1/holders/ answers 404, reason not_a_shard.

## 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`. |
| 404 | `not_a_shard` | Under `/holders/`: not a shard. The shards are `a.json` to `z.json`, and `0.json` for a key that starts with any other character; `0.json` is also split by the key's first digit into `0/0.json` to `0/9.json`. | `holders`: the shard of the key's first character. |
| 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`.
