# GET /api/v1/uptime.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 /uptime.json`: live checks of the pages, the API and the MCP server, every five minutes. https://tickerinside.com/api/v1/uptime.json

## Response

Whether the site answers now, and how it has answered. Every five minutes the Worker requests a fund page, the API index and an MCP handshake through the public address, and reads the nightly report. This file gives each check's state, its share of passed checks over 24 hours, 7, 30 and 90 days, 90 days of daily figures, the incidents and the deployments. It is computed when asked and kept one minute at the edge.

- `schema` (integer): The version of this file's shape: 1.
- `generated_at` (string): When this answer was computed. The file is kept a minute at the edge.
- `method` (string): How the checks are made, in one paragraph.
- `deployed` (object): The version of the site serving now, or null before the first check saw it.
- `components` (array of object): One entry per check, with the fields of a component.
- `today` (object): Today's figures so far, per check, in the shape of an entry of days.
- `days` (array of object): Up to 90 days of daily figures, newest first: for each check, checks made, failed, no_data (slots with no check), up_pct and, except for the update, p50_ms and p95_ms. For the update, failed counts the checks that found it late.
- `incidents` (array of object): Open incidents first, then those closed in the last 90 days: id, component, kind (down or late), started, ended, minutes and cause. An incident opens after two failed checks in a row and closes after two good ones.
- `status` (string): The nightly report, as served at /api/v1/status.json.
- `docs` (string): Where this file is documented.
- `license` (string): The licence the data is published under.

A component:

- `id` (string): page, api, mcp or update.
- `name` (string): The check in words.
- `check` (string): The request made.
- `state` (string): up or down for page, api and mcp; on time or late for the update; no data when no check has run for 15 minutes; unknown when the record could not be read.
- `since` (string): When the current state began, within the last day, or null when it has held all day.
- `last_check` (string): When the last check ran, in UTC.
- `last_ms` (integer): How long its answer took, in milliseconds, measured from the Cloudflare location that ran the check.
- `uptime_pct` (object): The share of checks that passed over the last 24 hours, 7, 30 and 90 days. Slots with no check are left out.
- `no_data_pct_90d` (number): The share of five-minute slots with no check over the period on record, up to 90 days.
- `open_incident` (string): The id of the open incident on this check, or null.
- `ms_24h` (object): The median and 95th percentile answer time over the last 24 hours, in milliseconds.
- `server_version` (string): For the MCP server, the version its handshake announced.
- `last_build` (string): For the update, the built_at of the last build seen.
- `prices_through` (string): For the update, the price date of that build.
- `next_expected_by` (string): For the update, the deadline of the next nightly build: 02:00 UTC the morning after a weekday.

The checks run on Cloudflare, like the site. An outage of Cloudflare itself stops them too, so it shows as slots with no data, which are never counted as up.

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