Status-API · v1
Public-API für Status-Daten der SYSINFRA-Dienste. Aggregiert Probe-Daten von mehreren Vantage-Points (FSN/NBG/CH) plus Editorial-Inhalte. JSON-Snapshots, RSS-Feed, Email- und Webhook-Subscriptions.
Der einzige Endpoint, den die meisten Konsumer brauchen, ist GET /v1/status — er enthält alles für ein Status-Dashboard inkl. Service-Groups, 90-Tage-Bars, aktive Incidents und Wartungen.
Status & Snapshots
/v1/statusAggregierter Status-Snapshot
Liefert den vollständigen Status-Snapshot: Service-Groups mit aktuellem Status, 90-Tage-Bars, aktive Incidents, bevorstehende Wartungen und Upstream-Provider-Health.
Responses
| Status | Beschreibung |
|---|---|
200 | Status-Snapshot |
304 | Nicht modifiziert (ETag matched) |
200 — example{
"version": "v1",
"generatedAt": "2026-04-27T18:00:00.000Z",
"stale": false,
"overallStatus": "ok",
"uptime90dPct": 99.92,
"activeIncidents": 0,
"scheduledMaintenanceCount": 1,
"incidents": [],
"maintenanceWindows": [...],
"serviceGroups": [...],
"upstreamProviders": [...]
}Response trägt `ETag: W/"r-<hash>"` auf einem stable revision-hash (ohne `generatedAt`). Konsumer können `If-None-Match` schicken und sparen Bandbreite. `Cache-Control: max-age=30, stale-while-revalidate=120`.
/v1/status/rssRSS 2.0 Feed
Letzte 30 Incidents (alle Stati) plus 30 Maintenance-Windows als RSS 2.0-Feed. Sortiert nach Editorial-Update-Time. Für Status-Aggregator-Tools, Slack/Mattermost-Bots und Power-User-RSS-Reader.
Responses
| Status | Beschreibung |
|---|---|
200 | RSS 2.0 XML |
200 — example<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title>SYSINFRA Status</title>
<link>https://status.sysinfra.ch</link>
<item>...</item>
</channel>
</rss>`Cache-Control: max-age=300` — Reader pollen typisch alle 5-15 min, das passt.
Incidents & Maintenance
/v1/incidentsIncidents auflisten
Filterbare Liste aller Incidents inkl. Timeline, Postmortem-URLs.
Query-Parameter
| Name | In | Beschreibung |
|---|---|---|
since | query | ISO-Datum, nur Incidents mit started_at >= since |
status | query | investigating | identified | monitoring | resolved |
limit | query | default 50, max 200 |
Responses
| Status | Beschreibung |
|---|---|
200 | Incidents |
200 — example{
"items": [
{
"id": "uuid",
"slug": "portal-degraded-2026-04-26",
"title": "Portal-Degradation",
"severity": "minor",
"status": "resolved",
"affectedServices": ["public-web"],
"customerImpact": "Login-Verzögerungen",
"startedAt": "2026-04-26T10:00:00Z",
"resolvedAt": "2026-04-26T10:42:00Z",
"timeline": [...]
}
]
}/v1/maintenanceWartungen auflisten
Query-Parameter
| Name | In | Beschreibung |
|---|---|---|
upcoming | query | true → nur Future-Windows |
limit | query | default 50, max 200 |
Responses
| Status | Beschreibung |
|---|---|
200 | Maintenance-Liste |
Upstream-Provider
/v1/upstreamUpstream-Provider-Status
Hetzner, Cloudflare, Microsoft 365, Swisscom Trust Services — externe Abhängigkeiten und ihr aktueller Status.
Responses
| Status | Beschreibung |
|---|---|
200 | Provider-Liste |
200 — example[
{ "id": "hetzner", "displayName": "Hetzner", "status": "ok", "activeIncidents": 0 },
{ "id": "cloudflare", "displayName": "Cloudflare", "status": "ok", "activeIncidents": 0 }
]Subscribers
/v1/status/subscribeEmail abonnieren (DOI)
Email-Subscription mit Double-Opt-In. Versendet eine Bestätigungs-Mail; Abonnement wird erst nach Confirm aktiv.
Request-Body
application/json{ "email": "[email protected]", "scope": "all" }
Responses
| Status | Beschreibung |
|---|---|
202 | DOI-Mail versendet |
200 | Bereits aktiv abonniert (kein Re-Send) |
429 | Rate-Limit überschritten |
Max. 5 Requests/Minute/IP. Brute-Force-Schutz für DOI-Token-Erraten.
/v1/status/subscribe/confirmSubscription bestätigen
Request-Body
application/json{ "token": "<aus Mail>" }Responses
| Status | Beschreibung |
|---|---|
200 | Bestätigt |
400 | Token ungültig oder abgelaufen |
200 — example{ "status": "confirmed", "email": "..." }/v1/status/unsubscribeSubscription abbestellen
Request-Body
application/json{ "token": "<aus Mail>" }Responses
| Status | Beschreibung |
|---|---|
200 | Abbestellt |
OpenAPI-Spec
/v1/openapi.jsonVollständige OpenAPI 3.1-Spec
Maschinenlesbare Spec für Code-Generatoren (openapi-generator, Postman-Import etc.).
Responses
| Status | Beschreibung |
|---|---|
200 | OpenAPI 3.1 JSON |
Webhook-Empfänger werden im internen CMS angelegt (cms.dev.sysinfra.ch/admin/collections/webhook-subscribers), nicht via Public-API. Der Empfänger bekommt beim Anlegen ein einmaliges HMAC-Secret, mit dem die X-SYSINFRA-Signature-Header der ausgehenden POSTs verifiziert werden.