Realtime/SL

List alerts

Service alerts, soonest-starting first, with an isActive flag.

GET /api/alerts

Every alert returned carries isActive, computed against at (default: now). An alert with no activePeriods is always active.

Pass at when exploring. The data is a capture from 2026-04-27T11:22:38Z, so filtering against the wall clock answers a question about today, not about the feed — see It's a snapshot.

informedEntities is what the alert applies to: any mix of agency, route, stop, trip and route type. A single alert commonly names several. Filtering by routeId or stopId matches if *any* selector matches.

Try it

Runs from your browser against the API in .

Query

GET
curl equivalent
 

Parameters

Query

ParameterTypeDefaultDescription
routeIdstring

Keeps alerts naming this route in any selector.

stopIdstring

Keeps alerts naming this stop. Alerts reference station ids (location_type 1), not the platform ids trip updates use — see Stations and platforms.

agencyIdstring

Keeps alerts naming this agency.

causeenum

Why. Defaults to UNKNOWN_CAUSE when the feed omits it.

UNKNOWN_CAUSEOTHER_CAUSETECHNICAL_PROBLEMSTRIKEDEMONSTRATIONACCIDENTHOLIDAYWEATHERMAINTENANCECONSTRUCTIONPOLICE_ACTIVITYMEDICAL_EMERGENCY

Genuinely populated here: 84 CONSTRUCTION, 52 OTHER_CAUSE, 21 MAINTENANCE, 19 TECHNICAL_PROBLEM, 1 MEDICAL_EMERGENCY. The remaining values match nothing.

effectenum

What it does to service. Defaults to UNKNOWN_EFFECT when the feed omits it.

NO_SERVICEREDUCED_SERVICESIGNIFICANT_DELAYSDETOURADDITIONAL_SERVICEMODIFIED_SERVICEOTHER_EFFECTUNKNOWN_EFFECTSTOP_MOVEDNO_EFFECTACCESSIBILITY_ISSUE

Only UNKNOWN_EFFECT matches, and it matches all 177 — the feed never sets this field, so what you are seeing is the spec default, not a claim that the effect is unknown.

severityenum

How bad. Has no spec default, so it is absent when unset.

UNKNOWN_SEVERITYINFOWARNINGSEVERE

Matches nothing in this capture. None of the 177 alerts carries a severity, and unlike cause/effect there is no default to fall back on, so the field is simply absent.

activeboolean

Keeps only alerts active (or inactive) at at. Accepts true/false, 1/0, yes/no.

Against the wall clock this returns roughly 40 of 177 — only the long-running alerts whose periods happen to still span today. That is a misleading subset, not a live view. Pair it with at=2026-04-27T11:22:38Z to ask what was actually active when the feed was generated, which is all 177.

attimestampnow

The instant to evaluate activePeriods against, as epoch seconds or ISO 8601. Sets isActive on every alert returned.

langstring

Language tag used to pick among an alert's translations. Matches an exact tag first (en-GB), then the base language (en), then an untagged translation, then whatever came first.

Inert in this capture. None of the 177 alerts tag their translations with a language, so every request falls through to the untagged translation regardless of what you pass.

limitinteger50

Page size, 1–1000. Values outside that range are a 400 rather than a silent clamp.

offsetinteger0

Rows to skip. Compare against meta.total to know when you have them all.

Response

Each item gains an isActive boolean that is not part of the stored alert.

GET /api/alerts?at=2026-04-27T11:22:38Z&limit=2
curl "$API_BASE/api/alerts?at=2026-04-27T11:22:38Z&limit=2"
200 · application/json
{
  "data": [
    {
      "id": "sl-service-alerts.pb:14050001655131049",
      "activePeriods": [
        {
          "start": {
            "epoch": 1704264355,
            "iso": "2024-01-03T06:45:55.000Z"
          },
          "end": {
            "epoch": 1798756200,
            "iso": "2026-12-31T22:30:00.000Z"
          }
        }
      ],
      "informedEntities": [
        {
          "routeId": "9011001081900000",
          "route": {
            "routeId": "9011001081900000",
            "agencyId": "505000000000000001",
            "shortName": "819",
            "type": 700
          },
          "stopId": "10741",
          "stop": {
            "stopId": "10741",
            "name": "Södergården",
            "latitude": 59.219074,
            "longitude": 18.209736,
            "locationType": 1
          }
        },
        {
          "routeId": "9011001082400000",
          "route": {
            "routeId": "9011001082400000",
            "agencyId": "505000000000000001",
            "shortName": "824",
            "type": 700
          },
          "stopId": "10741",
          "stop": {
            "stopId": "10741",
            "name": "Södergården",
            "latitude": 59.219074,
            "longitude": 18.209736,
            "locationType": 1
          }
        },
        {
          "routeId": "9011001082300000",
          "route": {
            "routeId": "9011001082300000",
            "agencyId": "505000000000000001",
            "shortName": "823",
            "type": 700
          },
          "stopId": "10741",
          "stop": {
            "stopId": "10741",
            "name": "Södergården",
            "latitude": 59.219074,
            "longitude": 18.209736,
            "locationType": 1
          }
        }
      ],
      "cause": "OTHER_CAUSE",
      "effect": "UNKNOWN_EFFECT",
      "headerText": {
        "text": "Indragna hållplatser",
        "translations": [
          {
            "text": "Indragna hållplatser"
          }
        ]
      },
      "descriptionText": {
        "text": "Buss linje 819, 823 och 824 stannar inte vid Södergården från och med 2023-12-09 på grund av kommande vägarbete.  Resenärer hänvisas till hållplats Kumla skola. Detta gäller i båda riktningar och beräknas pågå till och med 2026.",
        "translations": [
          {
            "text": "Buss linje 819, 823 och 824 stannar inte vid Södergården från och med 2023-12-09 på grund av kommande vägarbete.  Resenärer hänvisas till hållplats Kumla skola. Detta gäller i båda riktningar och beräknas pågå till och med 2026."
          }
        ]
      },
      "isActive": true
    },
    {
      "id": "sl-service-alerts.pb:14050001800799847",
      "activePeriods": [
        {
          "start": {
            "epoch": 1743746928,
            "iso": "2025-04-04T06:08:48.000Z"
          },
          "end": {
            "epoch": 1817157543,
            "iso": "2027-08-01T21:59:03.000Z"
          }
        }
      ],
      "informedEntities": [
        {
          "stopId": "9022050009805001",
          "stop": {
            "stopId": "9022050009805001",
            "name": "Himlabacken",
            "latitude": 59.376235,
            "longitude": 18.048877,
            "locationType": 0,
            "parentStation": "9805",
            "platformCode": "1"
          }
        },
        {
          "stopId": "9022050009805001",
          "stop": {
            "stopId": "9022050009805001",
            "name": "Himlabacken",
            "latitude": 59.376235,
            "longitude": 18.048877,
            "locationType": 0,
            "parentStation": "9805",
            "platformCode": "1"
          }
        }
      ],
      "cause": "CONSTRUCTION",
      "effect": "UNKNOWN_EFFECT",
      "headerText": {
        "text": "Hållplats Himlabacken flyttad",
        "translations": [
          {
            "text": "Hållplats Himlabacken flyttad"
          }
        ]
      },
      "descriptionText": {
        "text": "Hållplats Himlabacken är flyttad 90 meter Ulriksdal i färdriktningen för buss linje 503 mot (Ulriksdals begravnpl-) Ulriksdals st-Ö Bergshamra och 503 mot Ö Bergshamra-Ulriksdals stn-(Ulriksdals begravnpl) från och med 2025-04-01 pga vägarbete.\nDetta planeras pågå till och med 2027-08-01.",
        "translations": [
          {
            "text": "Hållplats Himlabacken är flyttad 90 meter Ulriksdal i färdriktningen för buss linje 503 mot (Ulriksdals begravnpl-) Ulriksdals st-Ö Bergshamra och 503 mot Ö Bergshamra-Ulriksdals stn-(Ulriksdals begravnpl) från och med 2025-04-01 pga vägarbete.\nDetta planeras pågå till och med 2027-08-01."
          }
        ]
      },
      "isActive": true
    }
  ],
  "meta": {
    "count": 2,
    "total": 177,
    "limit": 2,
    "offset": 0,
    "feedTimestamp": "2026-04-27T11:22:38.000Z",
    "loadedAt": "2026-08-07T12:01:42.748Z"
  }
}

Errors

400
{ "error": "request_failed", … }

An enum filter got an unknown value, `active` was not boolean-ish, or `at` parsed as neither epoch seconds nor ISO 8601.