Power cut? Call 105 — free, 24/7, for any electricity network in the UK.

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.

ParamTypeNotes
limitinteger, optional1–100, default 50
cursorstring, optionalfrom 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.

ParamTypeNotes
postcodestring, requireda 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.

StatusMeaning
400a request parameter is missing or malformed — detail says which
401missing, invalid, or revoked API key
403valid key, but the endpoint needs a premium one
404no such route
429rate 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.