Kanäle
Paging-Kanäle im Incident Management (Webhook, Slack, E-Mail) auflisten, anlegen, ändern und löschen, inklusive der Nur-Schreiben-Behandlung von Webhook-URLs und Headern.
GET /api/im/channels · POST /api/im/channels · GET /api/im/channels/:id · PATCH /api/im/channels/:id · DELETE /api/im/channels/:id
Ein Kanal ist ein gemeinsames Paging-Ziel deiner Organisation: ein generischer Webhook, ein eingehender Slack-Webhook oder eine E-Mail-Adresse. Ein Kanal gilt entweder organisationsweit (teamId: null) oder gehört zu einem Team. Ein Kanal kann in den Organisationseinstellungen als Fallback-Kanal der Organisation gesetzt werden, als letzte Instanz, wenn einer Eskalation die Stufen ausgehen.
Authentifizierung
Erfordert den Basiszugriff auf Incident Management, den jeder Endpunkt dieser API braucht (eine IM-berechtigte Rolle admin, editor oder responder, oder ein organisationsweites API-Token; Incident Management muss für die Organisation aktiviert sein). Lesen darf jede IM-berechtigte Rolle. Einen organisationsweiten Kanal zu schreiben erfordert die Rolle admin. Einen Team-Kanal zu schreiben erfordert die Rolle admin oder eine Team-Admin-Mitgliedschaft in diesem Team. Ein organisationsweites API-Token läuft mit der Rolle der Person, die es erstellt hat; ein Token, das ein Organisations-Admin erstellt hat, darf also jeden Kanal schreiben. Eine Team-Admin-Mitgliedschaft gilt für ein Token nie.
Kanaltypen und config
type | Pflichtfelder in config | Optionale Felder in config |
|---|---|---|
webhook | webhookUrl | headers (Objekt aus Header-Name und Wert) |
slack | webhookUrl | headers |
email | email |
webhookUrlmuss einehttp- oderhttps-URL mit öffentlichem Hostnamen sein. Private, Loopback- und reservierte IP-Adressen,localhost,*.local,*.internal,home.arpaund Hostnamen ohne Punkt werden abgelehnt.headersdarf denHost-Header nicht setzen.configdarf als JSON höchstens 8 KB groß sein. Weitere Schlüssel werden so gespeichert, wie du sie schickst.
webhookUrl und Header-Werte sind nur schreibbar. Sie werden verschlüsselt gespeichert und nie zurückgegeben. Jede Antwort ersetzt sie: webhookUrl ist null, und hasWebhookUrl sagt, ob eine URL gespeichert ist; headers behält die Header-Namen mit null als Wert, und hasHeaders sagt, ob überhaupt ein Header gespeichert ist.
Kanäle auflisten
GET /api/im/channels
Liefert alle Kanäle deiner Organisation (organisationsweite und Team-Kanäle), nach Name sortiert, mit aufgelöstem Teamnamen.
Beispiel (cURL)
curl -X GET "$BASE_URL/api/im/channels" \
-H "Authorization: Bearer $TOKEN" \
-H "Accept: application/json"Antwort (Response)
200 OK
[
{
"id": 9,
"organizationId": 1,
"teamId": 3,
"teamName": "Platform Team",
"type": "webhook",
"name": "Ops webhook",
"config": {
"webhookUrl": null,
"headers": { "X-Api-Key": null },
"hasWebhookUrl": true,
"hasHeaders": true
},
"isActive": true,
"createdAt": "2026-09-20T10:00:00.000Z",
"updatedAt": "2026-09-20T10:00:00.000Z"
},
{
"id": 10,
"organizationId": 1,
"teamId": null,
"teamName": null,
"type": "email",
"name": "NOC mailbox",
"config": { "email": "noc@example.com" },
"isActive": true,
"createdAt": "2026-09-20T10:05:00.000Z",
"updatedAt": "2026-09-20T10:05:00.000Z"
}
]Kanal abrufen
GET /api/im/channels/:id
Liefert einen Kanal (ohne teamName) plus einen references-Block, der dir sagt, ob er der Fallback-Kanal der Organisation ist. Ein Fallback-Kanal kann weder gelöscht noch deaktiviert werden.
{
"id": 10,
"organizationId": 1,
"teamId": null,
"type": "email",
"name": "NOC mailbox",
"config": { "email": "noc@example.com" },
"isActive": true,
"createdAt": "2026-09-20T10:05:00.000Z",
"updatedAt": "2026-09-20T10:05:00.000Z",
"references": {
"isOrgFallback": true,
"fallbackOrganizationIds": [1]
}
}Kanal anlegen
POST /api/im/channels
Request Body
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
type | string | Ja | webhook, slack oder email. |
name | string | Ja | Anzeigename, getrimmt, maximal 120 Zeichen. |
config | object | Ja | Siehe Kanaltypen und config. |
teamId | integer | null | Nein | Team deiner Organisation, oder null/weggelassen für einen organisationsweiten Kanal. |
isActive | boolean | Nein | Standard true. Jeder andere Wert als true legt einen inaktiven Kanal an. |
Beispiel (cURL)
curl -X POST "$BASE_URL/api/im/channels" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"type": "webhook",
"name": "Ops webhook",
"teamId": 3,
"config": {
"webhookUrl": "https://hooks.example.com/im/7f3a",
"headers": { "X-Api-Key": "k_live_51b2" }
}
}'Antwort (Response)
200 OK: der angelegte Kanal, mit geschwärzten Geheimnissen wie oben beschrieben. Die Antwort gibt die URL und die Header-Werte, die du gerade geschickt hast, nie zurück.
Kanal ändern
PATCH /api/im/channels/:id
Nimmt nur name, type, config, isActive und teamId an; jeder andere Schlüssel oder ein leerer Body ergibt 400. Du brauchst Schreibrechte auf den aktuellen Geltungsbereich des Kanals und, wenn du teamId änderst, auch auf den neuen (einen Kanal organisationsweit zu machen erfordert die Rolle admin).
config wird mit der gespeicherten Konfiguration zusammengeführt, du musst also nie Geheimnisse erneut senden, die du nicht zurücklesen kannst:
- Lass
webhookUrlweg oder schicknulloder"", um die gespeicherte URL zu behalten. Schick eine neue URL, um sie zu ersetzen. - Wenn du
headersschickst, ersetzt das die gespeicherte Menge an Header-Namen. Ein Header mit dem Wertnulloder""behält seinen gespeicherten Wert; ein Header, den du weglässt, wird entfernt. - Wenn du
typeänderst, wird die zusammengeführte Konfiguration gegen den neuen Typ geprüft; einemail-Kanal, den du aufwebhookumstellst, braucht also einewebhookUrl. - Den Fallback-Kanal der Organisation zu deaktivieren (
isActive: false) wird mit409abgelehnt.
curl -X PATCH "$BASE_URL/api/im/channels/9" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{ "name": "Ops webhook (primary)", "config": { "headers": { "X-Api-Key": null } } }'200 OK: der aktualisierte Kanal, Geheimnisse geschwärzt.
Kanal löschen
DELETE /api/im/channels/:id
Wird mit 409 abgelehnt, solange der Kanal der Fallback-Kanal der Organisation ist; setz fallbackChannelId in den Organisationseinstellungen vorher auf einen anderen Kanal (oder auf null).
curl -X DELETE "$BASE_URL/api/im/channels/9" \
-H "Authorization: Bearer $TOKEN"200 OK
{ "success": true }Häufige Fehler
401 Unauthorizedwenn du nicht authentifiziert bist403 Forbidden(imAccessDenied) bei Verwendung eines kunden-gescopten Tokens, oder wenn deine Session keine IM-berechtigte Rolle hat403 Forbidden(imNotEnabled) wenn Incident Management für die Organisation nicht aktiviert ist403 Forbidden(imChannelWriteDenied) wenn du den Geltungsbereich des Kanals (oder das Ziel einer Verschiebung) nicht schreiben darfst400 Bad Request(invalidRequestBody) wenn:idkeine positive Ganzzahl ist,type,nameoderconfigfehlt oder ungültig ist,webhookUrloderemaildie Prüfung nicht besteht,configgrößer als 8 KB ist,teamIdkein Team deiner Organisation ist,isActivekein Boolean ist (beim Ändern), oder der Body beim Ändern leer ist oder nicht unterstützte Schlüssel enthält400 Bad Request(webhookHostHeaderForbidden) wennconfig.headersdenHost-Header setzt404 Not Found(imChannelNotFound) wenn der Kanal nicht existiert oder zu einer anderen Organisation gehört409 Conflict(imChannelReferencesExist) beim Löschen des Fallback-Kanals der Organisation.data.fallbackOrganizationIdsnennt die verweisende Organisation409 Conflict(imChannelIsOrgFallback) beim Deaktivieren des Fallback-Kanals der Organisation
Incidents gesammelt ändern
Wendet eine Aktion (bestätigen, lösen, Schweregrad, zuweisen) auf bis zu 200 Incident-Management-Incidents gleichzeitig an, mit Ergebnis je Incident.
Incident erstellen
Erstellt einen Incident-Management-Incident für ein Team von Hand; die Eskalation startet kurz nach dem Anlegen, mit demselben Paging-Verhalten wie bei einem Incident aus einem Alert.