Know when an exchange fails —
before your fills do.
up24 polls the public REST endpoints and holds the WebSocket feeds of 15 crypto exchanges open around the clock, measuring latency, errors and stream integrity from outside the venue. Uptime nobody self-reports.
Built for desks that trade the failure modes
Not a status page reprinting what the exchange admits to. An independent measurement layer over every venue you route through.
90 days of independent uptime
Uptime is ok checks over total checks, per venue and per endpoint, counted by us. The strip above is the whole fleet's last 30 days, and 99.96% across the fleet so far (62 of 90 days measured).
Latency percentiles, not averages
p50 and p95 per endpoint over 24 hours or 7 days, from raw samples. Fleet median latency over 24 hours from Lauterbourg: 177ms. Slowdowns show up here long before anything goes down.
WebSocket stream integrity
A socket can be open and silent. up24 holds 30 streams open and measures delivery, sequence continuity and ping RTT separately — the failure a REST healthcheck cannot see.
The status API is free and public
The same JSON these pages render. No key, no signup, cached five seconds at the edge — the probe's own interval, so nothing is served staler than the measurement behind it.
ENDPOINTS
No key and nothing to sign up for. There is a per-address limit at the origin, it is generous, and cache hits do not count against it — the docs carry the number, enforced.
# every venue, every component, open incidents
curl https://api.up24.app/v1/status
# one venue in full, over the last 24 hours
curl https://api.up24.app/v1/exchanges/binance?range=24h
# incidents still open at one venue
curl https://api.up24.app/v1/incidents?venue=okx&status=open
# every venue's window, as CSV
curl https://api.up24.app/v1/reliability?format=csvSIGNED WEBHOOKS
Every alert up24 sends to your endpoint is signed, so a bot that pulls its quotes on an outage cannot be made to do it by somebody else.
// x-up24-signature: t=1770000000,v1=<hex>
const [t, v1] = header
.split(',')
.map((p) => p.split('=')[1]);
const expected = createHmac('sha256', secret)
.update(`${t}.${rawBody}`)
.digest('hex');
const ok =
Math.abs(Date.now() / 1000 - t) < 300 &&
timingSafeEqual(Buffer.from(expected),
Buffer.from(v1));HMAC-SHA256 over ${t}.${body}. The timestamp is inside the signed string, so a captured request cannot be replayed later. Delivery is at-least-once — deduplicate on eventId.
Free, open, no account.
The board, the 90-day history, every exchange page and the status API's JSON reads are free and need no account, for good. Prometheus metrics and CSV export are free during the pilot and may be paid later (see the pricing page). Nothing here asks for an address, a card or a login to read a measurement. 0 incidents open across the fleet as this page rendered.