Entwickler
Die öffentliche ÖffiGo-API
Alles, was das Messnetz live erzeugt, gibt es auch als offene JSON-API — dieselbe, die die App und dieStatus-Seite benutzen. Kein Key, keine Anmeldung; bitte fair verwenden (Limits unten).
https://api.oeffigo.app| Endpoint | Beschreibung |
|---|---|
GET /v1/health | Kurzer Gesundheitscheck der API |
GET /v1/status | Status aller Systemkomponenten (Basis der Status-Seite) |
GET /v1/predictions | Live-Verspätungsprognosen aus dem Messnetz |
GET /v1/announcements | Aktive Service-Meldungen |
Spielregeln
- CORS ist offen (
Access-Control-Allow-Origin: *) — Aufrufe direkt aus dem Browser sind okay. - Rate-Limit: 120 Anfragen pro Minute und IP. Darüber kommt
429mitRetry-After: 30. - Erfolgreiche Antworten tragen
Cache-Control: public, max-age=10. /v1/predictionsliefert einenETagpro Messzyklus (~35 s). MitIf-None-Matchpollen → körperloses304, solange sich nichts geändert hat. Empfohlen für akkuschonende Clients.- Breaking Changes kommen nur als neuer Pfad (
/v2). Neue Felder können auf/v1jederzeit dazukommen — unbekannte Felder bitte ignorieren.
GET /v1/health
Antwortet 200, wenn der letzte Messdurchlauf frisch ist, sonst 503.
{
"ok": true,
"vehiclesLive": 1312,
"lastCycleAt": "2026-07-03T10:15:30.000Z"
}GET /v1/status
Komponenten-Status (Messung, Datenquelle, Wiener Linien, Verkehrslage, Datenbank, API) mit deutschsprachigen Klartext-Details —overall ist operational, degradedoder down. Genau das rendert die Status-Seite.
{
"generatedAt": "2026-07-03T10:15:35.000Z",
"overall": "operational",
"components": [
{
"id": "ingestion",
"name": "Messung (Fahrzeug-Beobachtung)",
"status": "operational",
"detail": "Letzter Messdurchlauf vor 28 s, 1.312 Fahrzeuge."
}
]
}GET /v1/predictions
Live-Verspätungsprognosen aus dem In-Memory-Snapshot des Messnetzes. Ein Lookup-Modus pro Anfrage:
| Parameter | Bedeutung |
|---|---|
lat + lon | Prognosen rund um eine Koordinate. Optional radius in Metern (Default 2000, max. 25000) und limit (Default 50, max. 200). |
line | Exaktes Linien-Label, Groß-/Kleinschreibung egal. Kombinierbar mit lat/lon. |
jid | Direkte Journey-ID → genau eine Prognose oder 404. |
jids | Kommagetrennte Journey-IDs (max. 40) für ein ganzes Abfahrts-Board. |
curl 'https://api.oeffigo.app/v1/predictions?lat=47.0707&lon=15.4395&radius=3000&limit=20'{
"generatedAt": "2026-07-03T10:15:35.000Z",
"count": 1,
"predictions": [
{
"jid": "1|12345|0|80|03072026",
"line": "U1",
"product": "U-Bahn",
"direction": "Leopoldau",
"lat": 48.2084,
"lon": 16.3725,
"delayMin": 1.2,
"feedDelayMin": 1,
"confidence": "high",
"progress": 0.642,
"updatedAt": "2026-07-03T10:15:30.000Z",
"distanceM": 116
}
]
}delayMin ist unsere eigene Prognose in Minuten,feedDelayMin die offizielle Anzeige (oder null, wenn es keine gibt), confidence die Modell-Sicherheit. Prognosen verfallen ~3 Minuten nach dem letzten Refresh.
GET /v1/announcements
Aktive Service-Meldungen (z. B. Wartungsfenster), maximal 20, neueste zuerst.
{
"generatedAt": "2026-07-03T10:15:35.000Z",
"announcements": [
{
"id": 42,
"severity": "warning",
"title": "S-Bahn Einschränkung",
"body": "Auf der Stammstrecke kommt es derzeit zu Verzögerungen.",
"url": null,
"startsAt": "2026-07-03T09:00:00.000Z",
"endsAt": null
}
]
}Fragen?
Die API ist jung und wächst mit dem Messnetz. Wenn du etwas damit baust oder dir ein Feld fehlt: schreib uns.