Uptimeify Docs

Statusseite abonnieren

Öffentlicher Endpunkt hinter dem Abo-Formular: E-Mail, Webhook, Slack oder Microsoft Teams, für die ganze Seite oder einzelne Komponenten. Double-Opt-in für jeden Kanal.

POST /api/status-pages/public/:slug/subscribe

Ohne Anmeldung. An diesen Endpunkt schickt das Abo-Formular einer öffentlichen Statusseite. Jedes Abo beginnt als pending und wird erst aktiv, wenn der Bestätigungslink geöffnet und bestätigt wurde: per Mail bei email, als erste Nachricht an das Ziel bei webhook, slack und teams. Jede Nachricht enthält einen Abmeldelink.

Die Seite muss veröffentlicht und öffentlich sein, Abos müssen eingeschaltet sein, und ihre Organisation braucht das Statusseiten-Modul und darf nicht gesperrt sein. Sonst antwortet der Endpunkt genauso mit { "ok": true } und speichert nichts.

Request-Body

FeldTypPflichtBeschreibung
channelstringneinemail (Standard), webhook, slack oder teams
emailstringbei emailEmpfängeradresse
targetUrlstringbei URL-Kanälenhttps-URL ohne Zugangsdaten, öffentlich erreichbar. Slack: eine Incoming-Webhook-URL. Teams: eine Incoming-Webhook- oder Workflows-URL, die Adaptive Cards annimmt
componentIdsarrayneinKomponenten dieser Seite (numerische ID oder publicId), höchstens 100. Fehlt oder leer: die ganze Seite
localestringneinde... für deutsche, da... für dänische Nachrichten, sonst Englisch

Ein URL-Abo wird verschlüsselt gespeichert. Sein Ziel wird nie vollständig ausgegeben, die Abonnentenliste zeigt nur den Ursprung.

Beispiel (cURL)

curl -X POST "https://uptimeify.io/api/status-pages/public/acme/subscribe" \
  -H "Content-Type: application/json" \
  -d '{"channel":"webhook","targetUrl":"https://example.com/hooks/status","componentIds":[12]}'

Antwort

200 OK

{ "ok": true }

Bei email kommt immer diese Antwort, auch für eine unbekannte Seite, eine schon bestätigte oder eine gedrosselte Adresse. So verrät der Endpunkt nicht, ob es eine Adresse oder Seite gibt.

Webhook-Payload

Jede Nachricht an ein webhook-Ziel ist ein POST mit Content-Type: application/json in dieser festen Form:

{
  "event": "incident_open",
  "page": { "slug": "acme", "name": "Acme Status", "url": "https://uptimeify.io/status/acme" },
  "incident": {
    "title": "Zahlungen gestört",
    "body": "Wir prüfen das.",
    "severity": "major",
    "monitorName": null,
    "occurredAt": "2026-10-27T10:00:00.000Z"
  },
  "components": [{ "id": 12, "name": "Zahlungen" }],
  "url": "https://uptimeify.io/status/acme",
  "unsubscribeUrl": "https://uptimeify.io/status/<seite>/unsubscribe?token=<token>"
}

event ist eines von subscription_confirmation, incident_open, incident_update, incident_resolved, maintenance_scheduled, maintenance_completed, im_override_set, im_override_cleared. Bei Wartungen und Statushinweisen trägt incident den Hinweis. components nennt die betroffenen Komponenten der Seite; eine leere Liste heißt: die ganze Seite. Die Bestätigungsnachricht hat incident: null und zusätzlich confirmUrl. Slack bekommt denselben Inhalt als Block Kit, Teams als Adaptive Card.

Zustellung: ein Versuch je Ereignis, 10 Sekunden Timeout, Weiterleitungen nur zu öffentlichen Adressen, der Antwortkörper wird nicht gelesen. Nach 5 fehlgeschlagenen Zustellungen in Folge wird das Abo abgeschaltet (status: disabled in der Abonnentenliste); der Abonnent kann sich neu anmelden.

Häufige Fehler

  • 400 Bad Request (invalidRequestBody), wenn email oder targetUrl für den gewählten Kanal fehlt
  • 400 Bad Request (subscriptionTargetUrlInvalid), wenn targetUrl keine https-URL ist oder Zugangsdaten enthält
  • 400 Bad Request (subscriptionTargetUrlRejected), wenn targetUrl auf eine Loopback-, private, Link-Local- oder sonst nicht öffentliche Adresse zeigt
  • 404 Not Found (statusPageComponentNotFound), wenn ein Eintrag in componentIds keine Komponente dieser Seite ist
  • 409 Conflict (statusPageLimitReached), wenn die Seite schon 50 Webhook-, Slack- und Teams-Abos hat
  • 429 Too Many Requests bei zu vielen Anmeldungen von einer IP oder, bei URL-Kanälen, auf einer Seite

Auf dieser Seite