---
title: "Statusseite abonnieren"
description: "Ö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

| Feld | Typ | Pflicht | Beschreibung |
|------|-----|---------|--------------|
| `channel` | string | nein | `email` (Standard), `webhook`, `slack` oder `teams` |
| `email` | string | bei `email` | Empfängeradresse |
| `targetUrl` | string | bei URL-Kanälen | `https`-URL ohne Zugangsdaten, öffentlich erreichbar. Slack: eine Incoming-Webhook-URL. Teams: eine Incoming-Webhook- oder Workflows-URL, die Adaptive Cards annimmt |
| `componentIds` | array | nein | Komponenten dieser Seite (numerische ID oder `publicId`), höchstens 100. Fehlt oder leer: die ganze Seite |
| `locale` | string | nein | `de...` 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)

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

```json
{ "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:

```json
{
  "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
