Appearance
Incidents Beta
Public, rate-limited per IP
No auth required. Held to the shared public budget (600 requests/min per IP, 429 over). Submitting crowd reports is metered more tightly per IP and device to curb abuse. See rate limits.
The outage feed for a target: what providers have officially acknowledged, what our probes detected, and what other users are reporting right now.
- Base path:
https://ws.latency.app/v1/incidents - Auth: none (public)
List incidents
bash
# Everything currently active
curl "https://ws.latency.app/v1/incidents"| Parameter | Meaning |
|---|---|
target | Optional domain to filter to. Omit for the full active feed. |
Single-target: use /details
GET /v1/incidents?target= still works, but for one host prefer the normalized details endpoint below. It returns a single incident object (not a one-element array) with the provider status page alongside.
One target (details)
bash
curl "https://ws.latency.app/v1/incidents/details?target=cloudflare.com"Returns everything about a single host's status in one call: the reconciled incident, the provider's own status page, its 30-day history, how stale that observation is, and a recent probe measurement.
json
{
"target": "cloudflare.com",
"incident": {
"domain": "cloudflare.com",
"name": "Cloudflare",
"verdict": { "label": "Operational", "tone": "operational" },
"reportCount": 0,
"reporterCount": 0,
"events": []
},
"statusPage": { "status": { "state": "operational", "summary": "All systems operational." } },
"statusHistory": [ { "day": "2026-08-01", "state": "operational" } ],
"staleness": { "stale": false, "note": "updated 40s ago" },
"probe": { "avgUs": 41200, "samples": 20 }
}| Field | Meaning |
|---|---|
incident | The reconciled verdict, crowd counts, and provider status-page events. |
incident.events | The provider's status-page events for this host: ongoing first, then recently resolved. (Formerly pageIncidents.) |
statusPage | The provider's own status page, when the host is a tracked provider. |
statusHistory | Per-day page status over the last 30 days, oldest first. |
staleness | How old the newest provider observation is. |
probe | Recent average measurement (µs) of our endpoint probe, with the sample count. |
Confirmation levels
Not every report is equal. An incident carries a status that says how sure we are:
| Status | Meaning |
|---|---|
unconfirmed | Some user reports, but below the threshold to call it real. |
active | Enough independent reports to treat it as a genuine incident. |
confirmed | Corroborated by the provider's own status page or our probes. The strongest signal. |
The confirmed tier is what keeps the feed honest: a handful of reports won't turn a service red, and a provider quietly acknowledging an outage will surface even with zero user reports.
Reporting an outage
Anyone can contribute a report. Reports feed the crowd signal above.
bash
curl -X POST "https://ws.latency.app/v1/reports" \
-H 'content-type: application/json' \
-d '{ "domain": "example.com", "type": "website", "message": "timing out" }'| Field | Meaning |
|---|---|
domain | The affected domain. Required. |
type | Reason slug, e.g. website, login, app, service, other, or a slug from /reports/recommend. |
message | Optional free-text detail (most useful with type: "other"). |
To fetch the current suggested reasons for a target (used by our app's report sheet):
bash
curl "https://ws.latency.app/v1/reports/recommend?query=example.com"Crowd vs. official
The crowdVerdict you see in inspect reflects user reports only; it's deliberately kept separate from the provider's official status so a page-confirmed outage with no reports never reads as "the crowd confirmed it," and vice versa.