Teams
Incident-Management-Teams auflisten, lesen, anlegen, ändern und löschen, einschließlich der Team-Einstellungen für Eskalation und Engagement-Report.
Ein Team ist die oberste Besitz-Einheit in Incident Management: Eskalationsstufen, Schedules, Overrides und Incidents gehören jeweils zu genau einem Team. Diese Seite behandelt das Team selbst. Mitglieder stehen unter Team-Mitglieder, die Eskalationskette unter Eskalationsstufen.
Authentifizierung
Jeder Endpunkt braucht den Basis-IM-Zugriff: eine IM-berechtigte Rolle (admin, editor oder responder) oder einen organisationsweiten API-Token, und Incident Management muss für die Organisation aktiviert sein. Lesen darf jeder mit diesem Zugriff.
Schreiben braucht mehr:
- Anlegen braucht die Organisationsrolle
admin. - Ändern und Löschen brauchen die Team-Schreibhürde: Organisationsrolle
admin, oder Team-Admin (imRole: "admin") dieses Teams.
Ein API-Token läuft mit der Rolle des Users, der ihn erstellt hat. Nur ein Token, den ein Organisations-Admin erstellt hat, nimmt eine der beiden Schreibhürden.
Teams einer anderen Organisation antworten immer mit 404, nie mit 403.
Teams auflisten
GET /api/im/teams
Liefert jedes Team deiner Organisation, sortiert nach Name, mit Mitgliederzahl und einer kurzen Mitgliederliste.
Beispiel (cURL)
curl -X GET "$BASE_URL/api/im/teams" \
-H "Authorization: Bearer $TOKEN"Antwort (Response)
200 OK
[
{
"id": 3,
"name": "Platform Team",
"labelColor": "#4f46e5",
"analyticsEnabled": true,
"createdAt": "2026-06-02T08:00:00.000Z",
"memberCount": 2,
"members": [
{ "userId": "u_abc123", "name": "Ada Lovelace", "email": "ada@example.com", "src": null },
{ "userId": "u_def456", "name": "Bob Fixit", "email": "bob@example.com", "src": "https://uptimeify.io/avatars/u_def456.png" }
]
}
]members[].email ist nur für Organisations-Admins gefüllt (und für Tokens, die einer von ihnen erstellt hat). Alle anderen bekommen null, und ein Mitglied ohne Anzeigenamen hat dann einen leeren name. src ist die Avatar-URL des Mitglieds oder null.
Team lesen
GET /api/im/teams/:id
Liefert das Team, seine Einstellungen und seine Mitglieder samt Benachrichtigungsbereitschaft.
Beispiel (cURL)
curl -X GET "$BASE_URL/api/im/teams/3" \
-H "Authorization: Bearer $TOKEN"Antwort (Response)
200 OK
{
"id": 3,
"name": "Platform Team",
"labelColor": "#4f46e5",
"analyticsEnabled": true,
"organizationId": 1,
"createdAt": "2026-06-02T08:00:00.000Z",
"updatedAt": "2026-09-14T10:12:00.000Z",
"timezone": "Europe/Berlin",
"escalationRepeats": 1,
"escalationRepeatsAfterMinutes": 15,
"escalationRepeatsStopMode": "acknowledged",
"engagementReportEnabled": true,
"engagementReportDayOfWeek": 1,
"engagementReportTime": "09:00",
"members": [
{
"id": 17,
"userId": "u_abc123",
"imRole": "admin",
"user": {
"name": "Ada Lovelace",
"email": "ada@example.com",
"image": null,
"phone": "+4915112345678",
"activeChannels": ["email", "push", "sms"],
"phoneVerified": true,
"notificationRules": {
"high": { "hasPushRule": true, "hasSmsRule": true, "hasVoiceRule": false, "hasEmailRule": true },
"low": { "hasPushRule": true, "hasSmsRule": false, "hasVoiceRule": false, "hasEmailRule": true }
}
}
}
]
}members[].idist die Mitgliedschafts-ID, die Team-Mitglieder in seinen Pfaden verwendet, nicht die User-ID.user.emailfolgt derselben Regel wie in der Liste.user.phoneist die verifizierte Telefonnummer, vollständig für Organisations-Admins, sonst auf die letzten vier Ziffern gekürzt (***5678).user.activeChannelslistet die Benachrichtigungskanäle, die das Mitglied eingeschaltet hat.user.phoneVerifiedisttrue, wenn das Mitglied eine bestätigte Telefonnummer hat, SMS und Anruf es also erreichen.user.notificationRuleszeigt, welche Kanäle die eigene Regelkette des Mitglieds nutzt:highfürsev1/sev2,lowfürsev3/sev4, jeweils mithasPushRule,hasSmsRule,hasVoiceRuleundhasEmailRule. Es kommen nur diese Schalter zurück, nie Verzögerungen oder Nummern, deshalb sieht sie jede IM-Rolle; die Maskierung der Telefonnummer oben bleibt unverändert.
Team anlegen
POST /api/im/teams
Anfrage (Request Body)
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
name | string | Ja | Teamname, getrimmt, 1 bis 120 Zeichen. |
labelColor | string | Nein | Freie Farbmarkierung, z. B. #4f46e5. Leer wird zu null. |
analyticsEnabled | boolean | Nein | Nur true schaltet es ein. Standard false. |
timezone, escalationRepeats, escalationRepeatsAfterMinutes, escalationRepeatsStopMode, engagementReportEnabled, engagementReportDayOfWeek, engagementReportTime | Nein | Die Team-Einstellungen aus Team ändern, mit denselben Typen und Regeln. Sie werden zusammen mit dem Team gespeichert, es existiert also nie ohne sie. Weggelassene Felder erhalten ihre Standardwerte. |
Das Team entsteht immer in deiner eigenen Organisation. Wer es anlegt, wird nicht automatisch Mitglied.
Beispiel (cURL)
curl -X POST "$BASE_URL/api/im/teams" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{ "name": "Platform Team", "labelColor": "#4f46e5" }'Antwort (Response)
200 OK
{
"id": 3,
"name": "Platform Team",
"labelColor": "#4f46e5",
"analyticsEnabled": false,
"memberCount": 0
}Team ändern
PATCH /api/im/teams/:id
Jedes Feld ist optional. Nur die im Body vorhandenen Felder ändern sich.
Anfrage (Request Body)
| Feld | Typ | Beschreibung |
|---|---|---|
name | string | 1 bis 120 Zeichen nach dem Trimmen. |
labelColor | string | null | Farbmarkierung. null oder ein leerer String löscht sie. |
analyticsEnabled | boolean | Team-Analytics an oder aus. |
timezone | string | null | IANA-Zone, die Zeitzone des Standard-Schedules, den eine neue Stufe bekommt. null löscht sie (neue Stufen nehmen dann UTC). Bestehende Schedules behalten ihre eigene Zeitzone. |
escalationRepeats | integer | Wie oft die ganze Eskalationskette nach der letzten Stufe noch einmal läuft, 0 oder mehr. |
escalationRepeatsAfterMinutes | integer | null | Minuten vor jeder Wiederholung der Kette, 0 oder mehr. |
escalationRepeatsStopMode | string | acknowledged oder resolved: der Incident-Zustand, der die Wiederholungen stoppt. |
engagementReportEnabled | boolean | Wöchentlicher Engagement-Report an oder aus. |
engagementReportDayOfWeek | integer | null | ISO-Wochentag des Reports, 1 = Montag bis 7 = Sonntag. |
engagementReportTime | string | null | Uhrzeit des Reports, "HH:mm". |
Beispiel (cURL)
curl -X PATCH "$BASE_URL/api/im/teams/3" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{ "escalationRepeats": 1, "escalationRepeatsAfterMinutes": 15 }'Antwort (Response)
200 OK: die Felder des Teams nach der Änderung (ohne Mitglieder, ohne Zeitstempel).
{
"id": 3,
"name": "Platform Team",
"labelColor": "#4f46e5",
"analyticsEnabled": true,
"timezone": "Europe/Berlin",
"escalationRepeats": 1,
"escalationRepeatsAfterMinutes": 15,
"escalationRepeatsStopMode": "acknowledged",
"engagementReportEnabled": true,
"engagementReportDayOfWeek": 1,
"engagementReportTime": "09:00"
}Team löschen
DELETE /api/im/teams/:id
Löscht das Team samt Mitgliedschaften, Eskalationsstufen, Schedules, Overrides und Kanälen. Die Anfrage wird abgelehnt, solange etwas außerhalb des Teams noch darauf zeigt (siehe die beiden 409-Codes unten).
Beispiel (cURL)
curl -X DELETE "$BASE_URL/api/im/teams/3" \
-H "Authorization: Bearer $TOKEN"Antwort (Response)
200 OK
{ "success": true }Häufige Fehler
401 Unauthorized(unauthorized) wenn du nicht authentifiziert bist403 Forbidden(imAccessDenied) bei einem kunden-gescopten Token, oder wenn deine Session keine IM-berechtigte Rolle hat403 Forbidden(imNotEnabled) wenn Incident Management für die Organisation nicht aktiviert ist403 Forbidden(imTeamWriteDenied) beim Anlegen, wenn du kein Organisations-Admin bist, beim Ändern oder Löschen, wenn du weder Organisations-Admin noch Team-Admin bist404 Not Found(imTeamNotFound) wenn das Team nicht existiert oder zu einer anderen Organisation gehört400 Bad Request(invalidRequestBody) wenn:idkeine positive Ganzzahl ist,namefehlt, leer oder länger als 120 Zeichen ist,labelColorweder String nochnullist,analyticsEnabledkein Boolean ist, odertimezonekeine gültige IANA-Zone ist422 Unprocessable Entity(imInvalidNumber) wennescalationRepeatsoderescalationRepeatsAfterMinuteskeine Ganzzahl ab0ist422 Unprocessable Entity(imInvalidStopMode) wennescalationRepeatsStopModenichtacknowledgedoderresolvedist422 Unprocessable Entity(imInvalidRequestBody) wennengagementReportEnabledkein Boolean ist422 Unprocessable Entity(imInvalidDayOfWeek) wennengagementReportDayOfWeeknicht 1 bis 7 ist422 Unprocessable Entity(imInvalidTimeOfDay) wennengagementReportTimenicht"HH:mm"ist409 Conflict(imTeamChannelReferencesExist) beim Löschen, wenn ein Kanal des Teams der Fallback-Kanal der Organisation ist.data.fallbackChannelsnennt ihn; wähle zuerst einen anderen Fallback.409 Conflict(imTeamRoutingReferencesExist) beim Löschen, wenn eine Routing-Regel noch auf das Team zeigt.data.referenceslistet die Regeln; ändere oder lösche sie zuerst.409 Conflict(imTeamSourceReferencesExist) beim Löschen, wenn noch eine Alarmquelle zum Team gehört. Verschiebe sie zuerst in ein anderes Team oder lösche sie.409 Conflict(imTeamIncidentReferencesExist) beim Löschen, wenn noch Incidents zum Team gehören. Ein Team mit Incident-Historie kann nicht gelöscht werden.
Eskalationsstufen
Die Eskalationskette eines Teams lesen, bearbeiten und testen: geordnete Stufen, ihre Einstellungen für automatische Eskalation und Wiederholung, die Schedules unter jeder Stufe und ein Probelauf, wer alarmiert würde.
Schedule aktualisieren
Name, Zeitzone, Gültigkeitszeitraum, Wochenfenster, Rotationskadenz und Rotationsmitglieder eines Bereitschaftsplans ändern, in einem atomaren Aufruf.