---
title: "Schedule-Vorschau"
description: "Die Schichten und Abdeckungslücken berechnen, die die gespeicherte Rotation eines Schedules in den nächsten vier Wochen ergibt, ohne etwas zu schreiben."
---

`POST /api/im/schedules/:id/preview`

Rechnet die **gespeicherte** Konfiguration des Schedules (Kadenz, Rotationsgruppen, Wochenfenster, Gültigkeitszeitraum) mit derselben Schichtberechnung durch, die der Alarmierungs-Worker verwendet, für die nächsten vier Wochen ab jetzt, und liefert die Schichten und die Lücken, in denen niemand Bereitschaft hat. Es wird nichts gespeichert.

Standardmäßig fließen die gespeicherten Overrides des Schedules ein. Mit `overrides` probierst du stattdessen andere Override-Fenster aus. Team-Overrides und `all_teams`-Overrides, die an anderen Schedules angelegt wurden, sind nicht Teil der Vorschau.

## Authentifizierung

Basis-IM-Zugriff: eine IM-berechtigte Rolle (`admin`, `editor` oder `responder`) oder ein organisationsweiter API-Token, und Incident Management für die Organisation aktiviert. Eine Team-Rolle ist nicht nötig.

## Anfrage (Request Body)

Der Body ist optional.

| Feld | Typ | Erforderlich | Beschreibung |
|-------|------|----------|-------------|
| `overrides` | array | Nein | Bis zu 500 Override-Fenster, die für diese Vorschau die gespeicherten Overrides ersetzen. Jeweils: `{ userId, startsAt, endsAt, type?, coveredByUserIds? }`, `type` `online` (Standard) oder `offline`, `coveredByUserIds` nur bei `offline`. `[]` zeigt die Vorschau ganz ohne Overrides. |

## Beispiel (cURL)

```bash
curl -X POST "$BASE_URL/api/im/schedules/7/preview" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{}'
```

## Antwort (Response)

`200 OK`

```json
{
  "from": "2026-10-09T12:00:00.000Z",
  "to": "2026-11-06T12:00:00.000Z",
  "timezone": "Europe/Berlin",
  "shifts": [
    {
      "userId": "u_abc123",
      "layerIndex": 0,
      "startsAt": "2026-10-09T12:00:00.000Z",
      "endsAt": "2026-10-12T07:00:00.000Z",
      "isOverride": false
    },
    {
      "userId": "u_def456",
      "layerIndex": 0,
      "startsAt": "2026-10-12T07:00:00.000Z",
      "endsAt": "2026-10-19T07:00:00.000Z",
      "isOverride": false
    }
  ],
  "gaps": [
    { "from": "2026-11-02T07:00:00.000Z", "to": "2026-11-06T12:00:00.000Z" }
  ]
}
```

- `layerIndex` nummeriert die gleichzeitigen Bereitschaftsplätze (`0` bis `roundRobinSize - 1`); Override-Schichten liegen auf höheren Indizes. `isOverride` ist `true` für eine Schicht, die aus einem Override stammt.
- `gaps` listet jeden Abschnitt des Fensters, in dem keine Schicht jemanden abdeckt. Ein Schedule ohne Rotationsgruppen hat eine Lücke über das ganze Fenster.

## Häufige Fehler

- `401 Unauthorized` (`unauthorized`) wenn du nicht authentifiziert bist
- `403 Forbidden` (`imAccessDenied`) bei einem kunden-gescopten Token, oder wenn deine Session keine IM-berechtigte Rolle hat
- `403 Forbidden` (`imNotEnabled`) wenn Incident Management für die Organisation nicht aktiviert ist
- `404 Not Found` (`imScheduleNotFound`) wenn `:id` nicht existiert oder zu einer anderen Organisation gehört
- `400 Bad Request` (`invalidRequestBody`) wenn `:id` keine positive Ganzzahl ist, `overrides` kein Array ist oder mehr als 500 Einträge hat, ein Eintrag keine `userId` oder kein gültiges `startsAt` vor `endsAt` hat, oder sich die gespeicherte Konfiguration nicht in Schichten umrechnen lässt (die Meldung nennt den Grund)
