Documentation

The status API

Every number on this site, as JSON. 15 exchanges, probed from up24's own hosts every 5 seconds. Public, free, and no key — there is nothing to sign up for and nothing to apply for.

OpenAPI 3.1 · https://api.up24.app/openapi.json · generated from build a13f65a4faaa8505df851319ecfb78a6a4e3dbff

Before you start

No authentication

No key, no header, no account. Everything here is public because the whole point of an independent status board is that anyone can check its arithmetic. Attribution and a link back is the only thing asked for.

Caching

Responses carry cache-control: public, max-age=5, s-maxage=5, stale-while-revalidate=30 and are served from Cloudflare. Five seconds is the probe's own interval, so nothing is published staler than the measurement behind it — and polling faster than that returns the same bytes. A closed incident is history and is cached five minutes; a badge is cached one.

Rate limit

Rate limit: 600 origin requests per 60s per address. Responses served from the edge cache never reach the origin and are not counted. Over the limit is 429 with retry-after.

Counted at the origin, so a cache hit costs you nothing — a poller on a five-second loop mostly talks to Cloudflare and is never counted. Over it you get 429 with retry-after in seconds. That header is the only backoff you need to implement, and the quickstart writes it out.

Errors

Every failure at every status is {"error": "…"}. A 4xx says what was wrong with the request; a 5xx is always the opaque string internal error, because the alternative is publishing stack shapes to strangers. A 404 on an incident slug means no such incident has ever existed, not that it is temporarily missing.

Retention

Retention: raw samples and stream health are kept 7 days and expire by dropping whole day partitions. The minute and daily rollups never expire, and neither do incidents — so uptime, latency percentiles and every incident permalink are permanent, and only the per-check and per-window evidence behind a window older than that is gone. An error breakdown on an old stream incident says so rather than reading as clean. A window older than that keeps its uptime, its percentiles and its incidents, and loses only the per-check evidence underneath.

How every number here is produced

Each venue is probed on the same schedule from every region: three public REST endpoints each, one request every 5 seconds, plus a WebSocket connection held open and read continuously. Nothing on this site is reported by an exchange.

Uptime is ok checks over total checks, REST only, and a response counts as ok only if it was both delivered and correct. Latency is percentiles over successful responses only and never combines across regions — an API 30 ms from France and 176 ms from Singapore is not a 103 ms API. Availability does combine, by quorum, because one region losing an exchange is a route or a geo-block. measuredDays travels with every window: a percentage over eight days is not a quarter.

The full methodology — uptime, latency, streams and retention, each with the reason it is measured that way.

The rules an incident is graded by

Every number the incident engine judges by is published and read live from /v1/thresholds. A board that grades incidents by numbers nobody can see is asking to be trusted rather than checked. Every change to one of them is dated in the changelog, with its commit and what it moved.

Every rule with the reason it is that number, and the per-feed stall thresholds.