v1publicEndpoints: 9Auth: none (public)Format: JSON / RSS XML

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.

i
Schnellstart

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

GET/v1/status

Aggregierter 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

StatusBeschreibung
200Status-Snapshot
304Nicht 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": [...]
}
i
ETag-Caching

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`.

GET/v1/status/rss

RSS 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

StatusBeschreibung
200RSS 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>
i
Cache

`Cache-Control: max-age=300` — Reader pollen typisch alle 5-15 min, das passt.

Incidents & Maintenance

GET/v1/incidents

Incidents auflisten

Filterbare Liste aller Incidents inkl. Timeline, Postmortem-URLs.

Query-Parameter

NameInBeschreibung
sincequeryISO-Datum, nur Incidents mit started_at >= since
statusqueryinvestigating | identified | monitoring | resolved
limitquerydefault 50, max 200

Responses

StatusBeschreibung
200Incidents
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": [...]
    }
  ]
}
GET/v1/maintenance

Wartungen auflisten

Query-Parameter

NameInBeschreibung
upcomingquerytrue → nur Future-Windows
limitquerydefault 50, max 200

Responses

StatusBeschreibung
200Maintenance-Liste

Upstream-Provider

GET/v1/upstream

Upstream-Provider-Status

Hetzner, Cloudflare, Microsoft 365, Swisscom Trust Services — externe Abhängigkeiten und ihr aktueller Status.

Responses

StatusBeschreibung
200Provider-Liste
200 — example[
  { "id": "hetzner", "displayName": "Hetzner", "status": "ok", "activeIncidents": 0 },
  { "id": "cloudflare", "displayName": "Cloudflare", "status": "ok", "activeIncidents": 0 }
]

Subscribers

POST/v1/status/subscribe

Email 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

StatusBeschreibung
202DOI-Mail versendet
200Bereits aktiv abonniert (kein Re-Send)
429Rate-Limit überschritten
!
Rate-Limit

Max. 5 Requests/Minute/IP. Brute-Force-Schutz für DOI-Token-Erraten.

POST/v1/status/subscribe/confirm

Subscription bestätigen

Request-Body

application/json{ "token": "<aus Mail>" }

Responses

StatusBeschreibung
200Bestätigt
400Token ungültig oder abgelaufen
200 — example{ "status": "confirmed", "email": "..." }
POST/v1/status/unsubscribe

Subscription abbestellen

Request-Body

application/json{ "token": "<aus Mail>" }

Responses

StatusBeschreibung
200Abbestellt

OpenAPI-Spec

GET/v1/openapi.json

Vollständige OpenAPI 3.1-Spec

Maschinenlesbare Spec für Code-Generatoren (openapi-generator, Postman-Import etc.).

Responses

StatusBeschreibung
200OpenAPI 3.1 JSON
i
Webhook-Subscriptions

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.