API
Programmatic access to the same live incident data behind the map — cursor
pagination, ISO 8601 timestamps, and errors as
RFC 9457 problem+json. Base
URL: https://api.outages.uk.
Get an API key
Free while the API is in early access. One active key per email address -- registering again revokes whatever was issued before and replaces it, since there's no recovery for a lost key: only its hash is ever stored.
Authentication
Send your key as a bearer token on every request: Authorization: Bearer
<key>. Keys are rate-limited to 10 requests/minute; a request over
that limit gets a 429 problem+json response.
How much data you get
Standard keys see a rolling 12-hour window: an incident older than that (by when
it started, regardless of whether it's still ongoing) drops out of
/v1/incidents and /v1/postcode-check entirely. A
restored incident stays visible for 60 minutes after resolution — long enough to
see that something was just fixed — then it drops out too.
Full lifecycle history beyond that window is a premium feature
(GET /v1/history), not available to standard keys yet. Get in touch
if continuous history is something you need.
Coverage depends on what each operator publishes, not just what they know about internally — for example Electricity North West's public dataset only includes incidents affecting 5 or more customers, so a handful of genuinely live, smaller incidents on their own website won't appear here. We surface every incident each operator's feed gives us; we can't add what isn't published there.
Endpoints
GET /v1/incidents
Current incidents across every operator, cursor-paginated, plus a freshness envelope showing which operators were stale as of that request.
| Param | Type | Notes |
|---|---|---|
limit | integer, optional | 1–100, default 50 |
cursor | string, optional | from a previous response's nextCursor |
curl -H "Authorization: Bearer <key>" \ "https://api.outages.uk/v1/incidents?limit=50"
Response (trimmed to one incident):
{
"generatedAt": "2026-09-08T12:00:00.000Z",
"operators": [
{ "operator": "ukpn", "name": "UK Power Networks", "stale": false,
"lastSuccessAt": "2026-09-08T11:58:12.000Z", "lastAttemptAt": "2026-09-08T11:58:12.000Z" }
],
"data": [
{
"id": "ukpn:INCD-105479-V",
"operator": { "id": "ukpn", "name": "UK Power Networks",
"attribution": "Contains data from UK Power Networks, licensed under CC BY 4.0" },
"status": "active",
"cause": "unplanned",
"location": {
"postcodeUnits": ["N1 9GU"], "postcodeSectors": ["N1 9"],
"point": { "lon": -0.1, "lat": 51.5 },
"pointMeaning": "affected-area-centroid", "areaName": "Islington Zone"
},
"customersAffected": 42,
"estimatedRestoration": {
"claim": { "kind": "point", "at": "2026-09-08T14:00:00.000Z" },
"displayText": "08 Sept 14:00 - 15:00"
},
"fetchedAt": "2026-09-08T11:58:12.000Z"
}
],
"nextCursor": "ukpn:INCD-105480-V"
}
GET /v1/postcode-check
Whether a postcode or bare sector is currently affected.
| Param | Type | Notes |
|---|---|---|
postcode | string, required | a full unit (N1 9GU) or a sector (N1 9) |
curl -H "Authorization: Bearer <key>" \ "https://api.outages.uk/v1/postcode-check?postcode=N1%209GU"
GET /v1/status
Per-operator freshness on its own, uncached — the source of truth the other two endpoints' envelopes refer to.
curl -H "Authorization: Bearer <key>" \ "https://api.outages.uk/v1/status"
GET /v1/history Premium
Same shape and parameters as GET /v1/incidents, but without the
12-hour window. Requires a premium key; a standard key gets
403 Forbidden.
Errors
Every error is application/problem+json: type, title, status, detail.
| Status | Meaning |
|---|---|
400 | a request parameter is missing or malformed — detail says which |
401 | missing, invalid, or revoked API key |
403 | valid key, but the endpoint needs a premium one |
404 | no such route |
429 | rate limit exceeded — per-key on /v1 routes, per-address on POST /v1/keys |
Data rights
Most operators publish under CC BY 4.0 — attribute the originating operator
wherever you display their data (each incident carries an
operator.attribution string; null means that operator's
licence isn't cleared for redistribution yet, and its incidents should not be
shown to your own users).
Full machine-readable contract: openapi.yaml.