# GET /api/v1/methods.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 /methods.json`: the methods ti-ownership/1 (ETF ownership), ti-ownership-index/1 and ti-overlap/1, with formulas, rules and test vectors. https://tickerinside.com/api/v1/methods.json

## Response

Each method a published figure names in its method field, with its version, formula, rules and test vectors: inputs with the output the method gives, to check an implementation against. It holds ti-ownership/1, the ETF ownership ledger, ti-ownership-index/1 and ti-overlap/1.

```json
{
  "…": "1 more field",
  "methods": [{"id": "ti-ownership/1", "…": "5 more fields", "formula": "pct_lower_bound = floor(100 * shares_held / shares_outstanding, 2 decimals)", "…": "5 more fields", "vectors": [{"name": "two issuer files and one SEC filing", "input": {"ticker": "AAA", "shares_outstanding": {"as_of": "2026-08-01", "classes": [{"class": null, "tickers": ["AAA"], "shares": 1000000}]}, "independent": {"AAA": {"class": 1000000, "company": 1000000}}, "funds": [{"fund": "F1", "layer": "issuer_files", "as_of": "2026-09-24", "shares": {"AAA": 30000}}, {"fund": "F2", "layer": "issuer_files", "as_of": "2026-09-23", "shares": {"AAA": 20000}}, {"fund": "S1", "layer": "sec_nport", "as_of": "2026-06-30", "shares": {"AAA": 5555}}]}, "output": {"pct_lower_bound": 5.55, "basis": "company", "shares_held": 55555, "shares_outstanding": 1000000, "funds_counted": {"issuer_files": 2, "sec_nport": 1}, "not_counted": {}}}, "… 17 more"]}],
  "…": "3 more fields"
}
```

- `note` (string): How methods are named and versioned.
- `methods` (array of object): One entry per method; its fields are described below.
- `docs` (string): Where this file is documented.
- `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.

A method:

- `id` (string): The name and version a published figure gives in its method field.
- `name` (string): The method in words.
- `version` (integer): The version number. Fields are added; a change to what the method computes from inputs it already accepted is a new id, and a rule for an input it did not accept before is listed under changes.
- `since` (string): The first day figures were published under this version.
- `changes` (array of object): The rules added to this version for an input it did not accept before, each with since, the first day it was published, rule, its code under not_counted, and what, the change in words. Every earlier test vector keeps its output.
- `measures` (string): What the figure is, in one sentence.
- `formula` (string): The figure as a formula.
- `definitions` (object): What each term of the formula is.
- `rules` (array of string): The rules of the method, in words.
- `not_counted` (object): Each reason an input is left out, as a code and in words.
- `refusals` (object): Each reason no figure is given, as a code and in words.
- `vector_format` (string): The shape of a test vector's input and output.
- `vectors` (array of object): Inputs with the output the method gives for them, to check an implementation against.

A change to what a method computes from inputs it already accepted is a new version, never an edit of the one published. A rule for an input it did not accept before is added to the version with its own test vector, and changes gives the day it was first published.

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