# GET /api/v1/status.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 /status.json`: the nightly report, when the build ran and the date of each layer of the data. https://tickerinside.com/api/v1/status.json

## Response

What the last build did: when it ran, the date of each layer of the data, and the funds still served from an older file. It also gives the pages it dated as modified, and the versions of the API and of the MCP server. The build writes it with the data, so it is exactly as current as the files it describes.

- `schema` (integer): The version of this file's shape: 1. Fields are added and never removed or retyped.
- `built_at` (string): When the build that wrote this file started, in UTC. The nightly build starts at 22:00 UTC each weekday and is due by 02:00 UTC. The site can also be rebuilt during the day, from the data already fetched.
- `run` (object): What the nightly steps reported, when their reports are in the build. run.fetch_holdings, the holdings fetch, publishes only counts, tickers, issuers, dates and a kind of failure. run.fund_figures, the capture of what the issuers state about their funds, which is kept and not served, publishes four totals and nothing else.
- `data` (object): The date of each layer of the data: prices, the issuers' files and the SEC filings, and of the ownership ledger computed from them.
- `pages` (object): How many pages the site publishes, and which of them this build dated as modified in the sitemaps.
- `versions` (object): The API version, and the version of the MCP server as an npm package and at its URL.
- `live` (string): The live checks of the site, made every five minutes: the file documented next.
- `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.

run.fetch_holdings, when the fetch left its report:

- `funds_attempted` (integer): How many issuer files the fetch tried to read.
- `funds_updated` (integer): How many of them were read and accepted, so the fund now carries the file read that night, whether or not its date moved. A Vanguard file is dated at the month end and keeps its date for weeks.
- `funds_newer_file` (integer): How many of those carry a file dated later than the one held before.
- `kept_previous` (array of object): The funds still served from an earlier file, because the new one was refused or missing, or because the issuer no longer lists the fund. Each gives ticker, issuer, since (the first night the fetch found the fund served this way) and holdings_as_of (the date of the file served). The two dates differ: a fund kept since last night can be served from a month end file.
- `failed` (array of object): The funds with a file here whose two attempts both failed that night: ticker, issuer and reason_class. reason_class is http_error (the file could not be downloaded), refused (by the site), empty_file (no holdings came back), rejected_by_gate (its weights did not add up to a whole fund, or its date was too old), parse_error (it could not be read) or other. Each is still served from its earlier file, so it is also in kept_previous.
- `failed_without_file` (integer): How many other funds failed that night that have no file here, such as fixed income funds, whose issuer files the fetch tries and does not serve: a fixed income fund is read from its SEC filing. They are counted rather than listed, and with funds_updated and failed they add up to funds_attempted.

run.fund_figures, when the capture of the issuers' fund figures left its report:

- `run_date` (string): The UTC day the capture ran.
- `funds` (integer): How many funds it captured.
- `deadline_hit` (boolean): True when it ran out of time before every answer was in.
- `warnings` (integer): How many warnings it raised, 0 on a normal night. What they say is not published.

The data object:

- `prices` (object): through, the last close in the price data, which every return and risk figure uses; securities_priced, how many funds and stocks have a weekly series.
- `issuer_files` (object): funds, how many funds are read from their issuers' files; newest and oldest file dates; by_date, how many funds carry each of the eight most recent dates.
- `sec_nport` (object): funds, how many other US stock ETFs are served from SEC filings; dataset, the SEC quarterly data set the layer was last read from (a fund with a newer filing on EDGAR is served from that filing); report_dates, the oldest and newest quarter end the filings describe.
- `universe` (object): The coverage measured against the US-listed ETFs, the block of index.json coverage.universe.
- `archive` (object): What the archive of issuer files holds: funds; snapshots, one per fund and file date; first and last, the oldest and newest file dates; and since, the day the archive began, which is not the oldest file date. What changed in each fund from one file to the next is served under /api/v1/history/, under the history terms.
- `ownership` (object or null): The ETF ownership ledger: method; stocks, how many stocks have a figure; as_of, the newest holdings date it counted; held_back. held_back is true on a night whose ledger failed its checks, when the figures served are those of the last ledger that passed. Null when the build had no ledger.

The pages object:

- `published` (integer): How many pages the site publishes.
- `redated` (integer): How many of them this build dated as modified. Most nights it is a small number: a page is dated only when a reader would notice the change.
- `redated_paths` (array of string): The first 50 of those pages, sorted.

The versions object:

- `api` (string): The API version, which is also the path prefix: v1.
- `mcp_package` (object): The npm package tickerinside-mcp: name, version and its page.
- `mcp_remote` (object): The remote MCP server: its URL and the version it announces.

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