Binden Sie die produktive API zur Übermittlung von Dienstplänen per API-Schlüssel an, der an Ihr kostenpflichtiges Abonnement gebunden ist. Mandantenweite Standardzeiten speichern Sie mit PATCH /v1/schedule-defaults; Wochen-Schichtwünsche pro Mitarbeiter lesen/ersetzen Sie mit GET/PUT /v1/staff/{staffId}/weekly-shift-wish. Die Abrechnung folgt Ihrem Plan und Vertrag (keine nutzungsabhängige API-Gebühr pro Aufruf). Diese Seite beschreibt Berechtigungen, Validierungsregeln und Fehlercodes — nutzen Sie die Seitenleiste, um Felder zu finden.
Diese Seite beschreibt die Produkt-REST-API fuer externe Integrationen (API Gateway {stage}/v1/*, Authentifizierung mit x-api-key).
Abschluss-Webhooks fuer Planungsergebnisse sind ausgehende HTTPS-Benachrichtigungen in der API-Verwaltung (kein REST-CRUD). Siehe Completion webhooks auf dieser Seite.
Interne Browser-Routen (z. B. Zahlungs-Callbacks oder Analytics) ersetzen diese Produkt-API nicht. Externe Systeme nutzen /v1/* und Completion-Webhooks.
Diese HTTP-API ist Teil des kostenpflichtigen Produkts: Der Zugriff setzt eine aktive kommerzielle Vereinbarung voraus; Schlüssel werden nach dem Onboarding für Ihre Organisation ausgestellt.
Die Abrechnung basiert auf Abonnement und Vertrag. Bei kostenpflichtigen Plänen richten sich die Gebühren typischerweise nach registrierten Mitarbeiterplätzen pro Monat (siehe Preisseite).
Playground-/Free-Tier-Limits gelten nicht für kostenpflichtige API-Schlüssel. Effektive Grenzen (Spanne, Mitarbeiterzahl, 15-Minuten-Raster) ergeben sich aus Ihren kostenpflichtigen Berechtigungen. Siehe Limits und Standardwerte auf dieser Seite.
Anfragen müssen einen gültigen API-Schlüssel enthalten, der im Rahmen Ihres kostenpflichtigen Abonnements ausgestellt wurde. Erstellung, Rotation und Widerruf erfolgen im Konto nach der Anmeldung.
Senden Sie den Schlüssel im Header x-api-key. Schlüssel sind an Ihre Organisation für Mandantenauflösung und vertragliche Zugriffsgrenzen gebunden.
Schlüssel verwalten: API-Verwaltung
Übermitteln Sie eine Planbedingung als JSON. Dies ist die kostenpflichtige Integrationsschnittstelle; die genaue Basis-URL wird pro Umgebung nach Freischaltung Ihres API-Zugangs mitgeteilt.
Verwenden Sie die Basis-URL, die bei der Freischaltung Ihres API-Zugangs mitgeteilt wurde oder von Ihrem Betriebsteam bereitgestellt wird.
Ersetzen Sie BASE_URL durch die API-Basis-URL (Pfadpräfix), die Ihnen bei der Freischaltung mitgeteilt wurde.
Senden Sie Ihren API-Schlüssel im Header **x-api-key**. Ihre Organisation (Mandant) wird aus dem Schlüssel ermittelt — Sie übergeben keine separate Mandanten-ID in der Abfragezeichenkette.
Kostenpflichtige Funktionen (Notfallschicht, Arbeitsdetails, einige Planungs-Standardwerte) erfordern ein aktives kostenpflichtiges Abonnement. Wenn die Abrechnung nicht konfiguriert ist, kann **503** zurückkommen (z. B. Code **STRIPE_NOT_CONFIGURED**). Unternehmensprofil, Audit-Logs und Benutzer-(Konto-)Verwaltung erfolgen in der Web-App und sind nicht Teil der öffentlichen API.
Windows PowerShell: Ein abschließender `\` ist **kein** Zeilenfortsetzungszeichen. Schreiben Sie eine Zeile, oder setzen Sie am Zeilenende ein Backtick (`) für die Fortsetzung.
curl -sS -D - \ -H "x-api-key: YOUR_API_KEY" \ "BASE_URL/v1/schedule-results?limit=10" curl -sS -D - \ -H "x-api-key: YOUR_API_KEY" \ "BASE_URL/v1/staff"
Gleiche Basis-URL und x-api-key wie bei POST /v1/schedule. Optionale Abfrageparameter: limit (1–100, Standard 50), cursor (undurchsichtiges Token aus dem Feld nextCursor der vorherigen Antwort).
Listet SCHEDULE_RESULT-Elternzeilen: conditionId, status, candidateCount, createdAt/updatedAt usw. DynamoDB-Elternzeilen-Paginierung.
Verlaufssuche für Planungsergebnisse (wie Browser-Verlauf). Optional from / to (ISO 8601, Standard Dienstbeginn bis jetzt), keyword, eventName (kommagetrennt INSERT,MODIFY,REMOVE), limit, cursor. Führt aktuelle und Archivdaten automatisch zusammen; nur items / nextCursor.
Holt eine SCHEDULE_RESULT-Elternzeile per conditionId (JSON-Attribute; PK/SK weggelassen).
Aufgelöste Optimierungsausgabe: status, candidates, confirmedAssignments falls vorhanden. Bei status completed und noch nicht bestätigt kann rank-1 bei diesem GET automatisch bestätigt werden (Nebenwirkung). Manuelle Bestätigung über POST …/confirm-assignments.
Review-Payload für manuelle Bestätigung (Kandidaten, requiredByCellKey, allowedCellKeys der Mitarbeitenden usw.).
Kontext für Notfall-Schicht (Kalendertage, Personal, Slots). Kostenpflichtiges Abo erforderlich; null wenn Bedingung fehlt.
Listet SCHEDULE_CONDITION-Elternzeilen (conditionId, Daten, optional publicApiCancelledAt).
Bedingungs-Elternzeile plus reqDays und staffSnapshots (ohne PK/SK).
Mandanten-Planungsstandardzeile (SCHEDULE_DEFAULTS) oder null, wenn noch nicht gespeichert.
SCHEDULE_ACTUAL-Zeile für Ist-Schichten oder null, wenn keine vorhanden.
Wochen-Wunschzeile des Mitarbeitenden oder null, wenn keine vorhanden.
Listet aktive Mitarbeitende des Mandanten (sortiert nach Anzeigename).
Holt einen Mitarbeitenden per staffId inkl. Arbeitsdetails (laborLawCompliance, laborFlsaExempt, persönliche Obergrenzen, laborConstraintMask). Soft-Delete → 404.
| Methode | Pfad | Beschreibung |
|---|---|---|
| GET | {baseUrl}/v1/schedule-results | Listet SCHEDULE_RESULT-Elternzeilen: conditionId, status, candidateCount, createdAt/updatedAt usw. DynamoDB-Elternzeilen-Paginierung. |
| GET | {baseUrl}/v1/schedule-results/history | Verlaufssuche für Planungsergebnisse (wie Browser-Verlauf). Optional from / to (ISO 8601, Standard Dienstbeginn bis jetzt), keyword, eventName (kommagetrennt INSERT,MODIFY,REMOVE), limit, cursor. Führt aktuelle und Archivdaten automatisch zusammen; nur items / nextCursor. |
| GET | {baseUrl}/v1/schedule-results/{conditionId} | Holt eine SCHEDULE_RESULT-Elternzeile per conditionId (JSON-Attribute; PK/SK weggelassen). |
| GET | {baseUrl}/v1/schedule-results/{conditionId}/resolution | Aufgelöste Optimierungsausgabe: status, candidates, confirmedAssignments falls vorhanden. Bei status completed und noch nicht bestätigt kann rank-1 bei diesem GET automatisch bestätigt werden (Nebenwirkung). Manuelle Bestätigung über POST …/confirm-assignments. |
| GET | {baseUrl}/v1/schedule-results/{conditionId}/review | Review-Payload für manuelle Bestätigung (Kandidaten, requiredByCellKey, allowedCellKeys der Mitarbeitenden usw.). |
| GET | {baseUrl}/v1/schedule-results/{conditionId}/emergency-shift-context | Kontext für Notfall-Schicht (Kalendertage, Personal, Slots). Kostenpflichtiges Abo erforderlich; null wenn Bedingung fehlt. |
| GET | {baseUrl}/v1/schedule-conditions | Listet SCHEDULE_CONDITION-Elternzeilen (conditionId, Daten, optional publicApiCancelledAt). |
| GET | {baseUrl}/v1/schedule-conditions/{conditionId} | Bedingungs-Elternzeile plus reqDays und staffSnapshots (ohne PK/SK). |
| GET | {baseUrl}/v1/schedule-defaults | Mandanten-Planungsstandardzeile (SCHEDULE_DEFAULTS) oder null, wenn noch nicht gespeichert. |
| GET | {baseUrl}/v1/schedule-actual/{conditionId} | SCHEDULE_ACTUAL-Zeile für Ist-Schichten oder null, wenn keine vorhanden. |
| GET | {baseUrl}/v1/staff/{staffId}/weekly-shift-wish | Wochen-Wunschzeile des Mitarbeitenden oder null, wenn keine vorhanden. |
| GET | {baseUrl}/v1/staff | Listet aktive Mitarbeitende des Mandanten (sortiert nach Anzeigename). |
| GET | {baseUrl}/v1/staff/{staffId} | Holt einen Mitarbeitenden per staffId inkl. Arbeitsdetails (laborLawCompliance, laborFlsaExempt, persönliche Obergrenzen, laborConstraintMask). Soft-Delete → 404. |
Gleicher API-Schlüssel mit JSON-Body. PATCH /v1/schedule-defaults speichert mandantenweite Standardwerte (requirementsByCellKey, Planungshorizont usw.); kostenpflichtige Felder folgen Ihrem Abonnement. PUT /v1/staff/{staffId}/weekly-shift-wish ersetzt das komplette Wochen-Wunschraster (siehe Validierungshinweis). POST /v1/staff liefert 409 STAFF_LIMIT, wenn die Liste das Mandantenlimit überschreiten würde. Benutzer-(Konto-)Verwaltung, Unternehmensprofil und Audit-Logs erfolgen in der Web-App und sind nicht Teil der öffentlichen API.
POST /v1/staff: nur JSON { "displayName": "..." }. PATCH /v1/staff/{staffId}: displayName, laborLawCompliance, laborFlsaExempt, personalMaxWeeklyMinutes / personalMaxMonthlyMinutes / personalMaxThreeMonthMinutes (Ganzzahl oder null), laborConstraintMask (Objekt oder null bei laborLawCompliance true) — Arbeitsfelder kostenpflichtig. POST /v1/schedule-results/{conditionId}/emergency-shift: absentStaffIds, absentDatesYmd und/oder absentSlots (kostenpflichtig, Quellplan abgeschlossen). POST …/confirm-assignments: assignments-Array und optionales relaxAvailability. PATCH /v1/schedule-defaults: PUBLIC_API_SCHEDULE_REQUEST_BODY.md §12. PUT /v1/staff/{staffId}/weekly-shift-wish: scheduleStartDate, scheduleEndDate, timeRangeStart, timeRangeEnd, wishByCellKey.
Speichert Planungs-Standardwerte des Mandanten (JSON-Body wie saveSchema in schedule-defaults-actions). Kostenpflichtige Felder folgen Ihrem Abonnement.
Legt einen Mitarbeitenden an (displayName). Antwort 201 mit staff-JSON.
Klont abgeschlossenen Quellplan mit Abwesenheiten; antwortet 201 mit conditionId. Kostenpflichtiges Abo erforderlich.
Validiert und speichert manuell bearbeitete Zuweisungen (200 mit { ok: true }).
Aktualisiert displayName und Arbeitsdetails (laborLawCompliance, laborFlsaExempt, persönliche Obergrenzen, laborConstraintMask).
Soft-Delete eines Mitarbeitenden (setzt deletedAt).
Markiert die Bedingung als storniert (publicApiCancelledAt); löscht keine Kindzeilen.
Speichert Ist-Zuweisungen JSON { "assignments": [ ... ] } (gegen das Bedingungsraster validiert).
Ersetzt Wochen-Wünsche: volles Raster (1–7 Tage), wishByCellKey pro Zelle (NONE|LOW|HIGH); Granularität aus Mandanten-Standardwerten.
| Methode | Pfad | Beschreibung |
|---|---|---|
| PATCH | {baseUrl}/v1/schedule-defaults | Speichert Planungs-Standardwerte des Mandanten (JSON-Body wie saveSchema in schedule-defaults-actions). Kostenpflichtige Felder folgen Ihrem Abonnement. |
| POST | {baseUrl}/v1/staff | Legt einen Mitarbeitenden an (displayName). Antwort 201 mit staff-JSON. |
| POST | {baseUrl}/v1/schedule-results/{conditionId}/emergency-shift | Klont abgeschlossenen Quellplan mit Abwesenheiten; antwortet 201 mit conditionId. Kostenpflichtiges Abo erforderlich. |
| POST | {baseUrl}/v1/schedule-results/{conditionId}/confirm-assignments | Validiert und speichert manuell bearbeitete Zuweisungen (200 mit { ok: true }). |
| PATCH | {baseUrl}/v1/staff/{staffId} | Aktualisiert displayName und Arbeitsdetails (laborLawCompliance, laborFlsaExempt, persönliche Obergrenzen, laborConstraintMask). |
| DELETE | {baseUrl}/v1/staff/{staffId} | Soft-Delete eines Mitarbeitenden (setzt deletedAt). |
| DELETE | {baseUrl}/v1/schedule-conditions/{conditionId} | Markiert die Bedingung als storniert (publicApiCancelledAt); löscht keine Kindzeilen. |
| PUT | {baseUrl}/v1/schedule-actual/{conditionId} | Speichert Ist-Zuweisungen JSON { "assignments": [ ... ] } (gegen das Bedingungsraster validiert). |
| PUT | {baseUrl}/v1/staff/{staffId}/weekly-shift-wish | Ersetzt Wochen-Wünsche: volles Raster (1–7 Tage), wishByCellKey pro Zelle (NONE|LOW|HIGH); Granularität aus Mandanten-Standardwerten. |
When a schedule result reaches a terminal status, we POST a signed JSON notification to your HTTPS URL. The body does not include the full result; fetch details with GET /v1/schedule-results/{conditionId}.
Playground results are not delivered. If the webhook is disabled or no URL is saved, nothing is sent.
Event type and when it is sent.
schedule.result.terminal
Schedule result status becomes completed, no_solution, failed, error, or canceled
| type | When |
|---|---|
| schedule.result.terminal | Schedule result status becomes completed, no_solution, failed, error, or canceled |
status is terminal only. customerId is omitted from the body.
{
"type": "schedule.result.terminal",
"conditionId": "019ee481-e855-7000-abd8-977cbfd64ffc",
"status": "completed",
"occurredAt": "2026-07-16T13:00:54.694Z",
"links": {
"result": "{baseUrl}/v1/schedule-results/019ee481-e855-7000-abd8-977cbfd64ffc"
}
}Content-Type
application/json
User-Agent
AutoScheduler-Webhook/1.0
X-AutoScheduler-Timestamp
Unix seconds as a string
X-AutoScheduler-Signature
v1=<hex> (see verification below)
| Header | Description |
|---|---|
| Content-Type | application/json |
| User-Agent | AutoScheduler-Webhook/1.0 |
| X-AutoScheduler-Timestamp | Unix seconds as a string |
| X-AutoScheduler-Signature | v1=<hex> (see verification below) |
Compute a digest from the raw body (before JSON parse) and the Timestamp, then compare to Signature. Reject requests when |now − timestamp| exceeds 300 seconds (5 minutes) unless you intentionally allow wider clock skew.
HMAC-SHA256(signingSecret, `${timestamp}.${rawBody}`) → hex; header value is v1=<hex>On 5xx or timeout we retry automatically. Persistent failures go to a dead-letter queue. Browser push notifications use a separate path.
Register & enable: API management
x-api-key
API-Schlüssel für Ihr kostenpflichtiges Abonnement (identifiziert Mandant und Planlimits).
Content-Type
application/json
| Header | Beschreibung |
|---|---|
| x-api-key | API-Schlüssel für Ihr kostenpflichtiges Abonnement (identifiziert Mandant und Planlimits). |
| Content-Type | application/json |
Einige Antwort-Header (z. B. Request-IDs) sind Trace-Metadaten, nicht Ihr API-Schlüssel. Behandeln Sie JSON-**Antworttexte** vertraulich, wenn sie Firmen- oder Nutzerdaten enthalten.
Typische Validierungsgrenzen für Ihren Vertrag (15-Minuten-Raster, Planungsspanne, registrierte Mitarbeiterzahl und verwandte Obergrenzen).
Abrechnungsmodell
Stripe-Abonnement; Produktgebühren skalieren typischerweise mit den registrierten Mitarbeiter-Plätzen gemäß Preisseite (keine Gebühr pro API-Aufruf).
maxScheduleDays
Bis zu 14 Kalendertage pro Übermittlung für die Standard-Zwei-Wochen-Detailplanung (längere Spannen nur bei vertraglicher Freigabe).
maxStaffPerSchedule
Bis zu 500 staff-Zeilen pro POST /v1/schedule (PUBLIC_SCHEDULE_MAX_STAFF; Inline-staffId im Body).
maxRosterStaff
Bis zu 30 aktive Mitarbeitende über POST /v1/staff (STAFF_ROSTER_MAX_PAID); 409 STAFF_LIMIT bei Überschreitung.
allowedGranularities
[60, 15] — 15-Minuten-Slots sind kostenpflichtig; 60 Minuten werden ebenfalls unterstützt.
maxPayloadBytes
524288 (512 KiB) UTF-8, sofern kein höheres Limit gewährt wurde.
strictUnknownRootKeys
true — unbekannte Keys auf Root-Ebene oder in staff werden abgelehnt
| Einstellung | Kostenpflichtige API (typisch) |
|---|---|
| Abrechnungsmodell | Stripe-Abonnement; Produktgebühren skalieren typischerweise mit den registrierten Mitarbeiter-Plätzen gemäß Preisseite (keine Gebühr pro API-Aufruf). |
| maxScheduleDays | Bis zu 14 Kalendertage pro Übermittlung für die Standard-Zwei-Wochen-Detailplanung (längere Spannen nur bei vertraglicher Freigabe). |
| maxStaffPerSchedule | Bis zu 500 staff-Zeilen pro POST /v1/schedule (PUBLIC_SCHEDULE_MAX_STAFF; Inline-staffId im Body). |
| maxRosterStaff | Bis zu 30 aktive Mitarbeitende über POST /v1/staff (STAFF_ROSTER_MAX_PAID); 409 STAFF_LIMIT bei Überschreitung. |
| allowedGranularities | [60, 15] — 15-Minuten-Slots sind kostenpflichtig; 60 Minuten werden ebenfalls unterstützt. |
| maxPayloadBytes | 524288 (512 KiB) UTF-8, sofern kein höheres Limit gewährt wurde. |
| strictUnknownRootKeys | true — unbekannte Keys auf Root-Ebene oder in staff werden abgelehnt |
Der erforderliche Personalbedarf pro Zelle bleibt eine ganze Zahl von 0 bis 15. Bei Überschreitung von Ratenlimits kann eine Fehlerantwort zurückkommen.
Ist der Strict-Modus aktiv, werden nur die folgenden Keys auf oberster Ebene akzeptiert. Jeder andere Key liefert UNKNOWN_FIELD.
Der Payload folgt dem kostenpflichtigen öffentlichen Modell: Kalendertage, Zeitzone, Slot-Raster (60 oder 15 Minuten), Bedarf pro Zelle und Mitarbeiterverfügbarkeit. Arbeitsrechts-Hoheit, kostenpflichtige Optimierungs-Flags und arbeitsrechtliche Felder auf Mitarbeiterebene gehören nicht zum JSON — der Server schreibt Standardwerte in die übergeordnete SCHEDULE_CONDITION-Zeile (siehe „Arbeitsrecht und kostenpflichtige Flags“). DynamoDB-Keys und interne Entitätstypen dürfen nicht im Body stehen.
timeZone
IANA-Zeitzone zur Interpretation von Daten und Slots.
scheduleStartDate / scheduleEndDate
Kalenderbereich inklusiv; Start ≤ Ende.
timeRangeStart / timeRangeEnd
Wanduhr-Zeitraum, der die Slot-Spalte definiert; muss mindestens einen Slot ergeben.
slotGranularityMinutes
Kostenpflichtige API: 60 (stündlich) oder 15 (Viertelstunden). Muss in allowedGranularities enthalten sein.
requirementsByCell
Keys = cellKey im berechneten Raster; Werte = ganze Zahl 0–15.
staff
Nicht leer; maximale Größe siehe Limits; pro Eintrag: staffId, displayName, optional availableCells.
| Feld | Typ | Erforderlich | Hinweise |
|---|---|---|---|
| timeZone | string | Ja | IANA-Zeitzone zur Interpretation von Daten und Slots. |
| scheduleStartDate / scheduleEndDate | string (YYYY-MM-DD) | Ja | Kalenderbereich inklusiv; Start ≤ Ende. |
| timeRangeStart / timeRangeEnd | string (HH:mm) | Ja | Wanduhr-Zeitraum, der die Slot-Spalte definiert; muss mindestens einen Slot ergeben. |
| slotGranularityMinutes | 60 | 15 | Ja | Kostenpflichtige API: 60 (stündlich) oder 15 (Viertelstunden). Muss in allowedGranularities enthalten sein. |
| requirementsByCell | object | Ja | Keys = cellKey im berechneten Raster; Werte = ganze Zahl 0–15. |
| staff | array | Ja | Nicht leer; maximale Größe siehe Limits; pro Eintrag: staffId, displayName, optional availableCells. |
Die folgenden Abschnitte entsprechen dem Validator in `app/lib/public-schedule-api/validate.ts` und den Bereinigungen in `sanitize.ts`, mit den Standardwerten aus `PUBLIC_SCHEDULE_SUBMIT_DEFAULTS`, sofern keine Optionen gesetzt sind. JSON-Zahlen bitte als echte Zahlen senden (nicht als Strings). Nach der Validierung ergänzt `build-schedule-transact-items.ts` Felder der übergeordneten Zeile (Kopie der kostenpflichtigen Optimierung, Arbeitsrechts-Hoheit, Modellversion), die keine Request-Keys sind — siehe „Arbeitsrecht und kostenpflichtige Flags“.
string | ausgelassen · Erforderlich: Nein — optional
Erlaubte Werte
Verhalten
Typische Fehler
TYPE_ERRORNicht unterstützter apiVersion-Wert.string · Erforderlich: Ja
Erlaubte Werte
Verhalten
Typische Fehler
INVALID_TIME_ZONEFehlt, leer oder keine gültige IANA-Zone.string, string · Erforderlich: Ja — beide
Erlaubte Werte
Verhalten
Typische Fehler
INVALID_DATE_RANGEFalsches Format, ungültige Daten oder leerer Bereich.SCHEDULE_SPAN_TOO_LONGMehr als maxScheduleDays Tage.string, string · Erforderlich: Ja — beide
Erlaubte Werte
Verhalten
Typische Fehler
INVALID_TIME_RANGEFehlende Werte oder null Slots für den Bereich.number (JSON-Zahl) · Erforderlich: Ja
Erlaubte Werte
Verhalten
Typische Fehler
INVALID_GRANULARITYNicht 60/15 oder im Plan nicht erlaubt.Record<string, number> · Erforderlich: Ja
Erlaubte Werte
Verhalten
Typische Fehler
INVALID_REQUIREMENTSKein Objekt oder ungültiger Zahlenwert.UNKNOWN_CELL_KEYKey nicht im berechneten Datums-Slot-Raster.array · Erforderlich: Ja — nicht leeres Array
Erlaubte Werte
Verhalten
Typische Fehler
INVALID_STAFFLeeres Array, zu viele Zeilen, ungültiges Objekt oder Bereinigung fehlgeschlagen.UNKNOWN_FIELDZusätzlicher Key am staff-Objekt im Strict-Modus.DUPLICATE_STAFF_IDDerselbe staffId zweimal.string[] | ausgelassen · Erforderlich: Nein — optional
Erlaubte Werte
SHORTFALL-Prüfung
Typische Fehler
INVALID_AVAILABLE_CELLUnbekannter cellKey oder leerer Eintrag.SHORTFALL_CELLSZu wenig Personal für den erforderlichen Bedarf in einer Zelle.n/v — serverseitig gespeichert · In der Anfrage: Nein — diese Keys niemals senden
Was die API in der übergeordneten Zeile speichert
Dokumentation
Bei unzulässigen Keys
UNKNOWN_FIELDStrict-Modus lehnt unbekannte Root- oder staff-Eigenschaften ab.Wie in `sanitize.ts` implementiert, vor oder während der Validierung. Diese Regeln erklären Ablehnungen als INVALID_STAFF.
staffId
displayName
Zell-Keys (requirements / availableCells)
202 Accepted
Der Anfragetext hat die Validierung bestanden und die Bedingung wurde geschrieben; die Optimierung kann asynchron weiterlaufen. Der Handler kann einen JSON-Body mit conditionId usw. zurückgeben.
Validierungsfehler liefern strukturierte Informationen mit stabilem `code`. Parsen vor der Validierung (INVALID_JSON, PAYLOAD_TOO_LARGE). Persistenzfehler können als DYNAMODB_ERROR erscheinen. PATCH /v1/schedule-defaults kann SCHEDULE_DEFAULTS_SAVE_FAILED (HTTP 400) mit Details liefern.
INVALID_JSON
Body ist kein gültiges JSON.
PAYLOAD_TOO_LARGE
UTF-8-Byte-Länge überschreitet maxPayloadBytes (Standard 512 KiB).
TYPE_ERROR
Falscher JSON-Typ oder nicht unterstützte apiVersion-Zeichenkette.
UNKNOWN_FIELD
Strict-Modus: nicht erlaubte Eigenschaft auf Root oder staff-Objekt.
INVALID_TIME_ZONE
timeZone fehlt oder ist kein gültiger IANA-Name.
INVALID_DATE_RANGE
Daten nicht YYYY-MM-DD, ungültiger Bereich oder leere Aufzählung.
SCHEDULE_SPAN_TOO_LONG
Zu viele Tage zwischen Start und Ende (siehe maxScheduleDays).
INVALID_TIME_RANGE
Zeitraum fehlt oder ergibt null Slots.
INVALID_GRANULARITY
slotGranularityMinutes nicht 60/15 oder im Plan nicht erlaubt.
INVALID_REQUIREMENTS
requirementsByCell kein Objekt oder Zahl nicht 0–15.
UNKNOWN_CELL_KEY
Key nicht im berechneten Planungsraster.
INVALID_STAFF
staff leer, zu groß, ungültige Zeile oder Bereinigung fehlgeschlagen.
DUPLICATE_STAFF_ID
Doppelte staffId-Werte.
INVALID_AVAILABLE_CELL
Leerer oder unbekannter Eintrag in availableCells.
SHORTFALL_CELLS
Unzureichende Verfügbarkeit gegenüber dem Bedarf.
DYNAMODB_ERROR
Vorübergehender oder Persistenzfehler nach der Validierung (handlerabhängig).
SCHEDULE_DEFAULTS_SAVE_FAILED
PATCH /v1/schedule-defaults: Validierung oder Geschäftsregeln fehlgeschlagen (siehe error.details).
LABOR_COMPLIANCE_REQUIRED
PATCH /v1/staff/{staffId}: laborConstraintMask gesendet, obwohl laborLawCompliance false ist.
| Code | Bedeutung |
|---|---|
| INVALID_JSON | Body ist kein gültiges JSON. |
| PAYLOAD_TOO_LARGE | UTF-8-Byte-Länge überschreitet maxPayloadBytes (Standard 512 KiB). |
| TYPE_ERROR | Falscher JSON-Typ oder nicht unterstützte apiVersion-Zeichenkette. |
| UNKNOWN_FIELD | Strict-Modus: nicht erlaubte Eigenschaft auf Root oder staff-Objekt. |
| INVALID_TIME_ZONE | timeZone fehlt oder ist kein gültiger IANA-Name. |
| INVALID_DATE_RANGE | Daten nicht YYYY-MM-DD, ungültiger Bereich oder leere Aufzählung. |
| SCHEDULE_SPAN_TOO_LONG | Zu viele Tage zwischen Start und Ende (siehe maxScheduleDays). |
| INVALID_TIME_RANGE | Zeitraum fehlt oder ergibt null Slots. |
| INVALID_GRANULARITY | slotGranularityMinutes nicht 60/15 oder im Plan nicht erlaubt. |
| INVALID_REQUIREMENTS | requirementsByCell kein Objekt oder Zahl nicht 0–15. |
| UNKNOWN_CELL_KEY | Key nicht im berechneten Planungsraster. |
| INVALID_STAFF | staff leer, zu groß, ungültige Zeile oder Bereinigung fehlgeschlagen. |
| DUPLICATE_STAFF_ID | Doppelte staffId-Werte. |
| INVALID_AVAILABLE_CELL | Leerer oder unbekannter Eintrag in availableCells. |
| SHORTFALL_CELLS | Unzureichende Verfügbarkeit gegenüber dem Bedarf. |
| DYNAMODB_ERROR | Vorübergehender oder Persistenzfehler nach der Validierung (handlerabhängig). |
| SCHEDULE_DEFAULTS_SAVE_FAILED | PATCH /v1/schedule-defaults: Validierung oder Geschäftsregeln fehlgeschlagen (siehe error.details). |
| LABOR_COMPLIANCE_REQUIRED | PATCH /v1/staff/{staffId}: laborConstraintMask gesendet, obwohl laborLawCompliance false ist. |
{
"apiVersion": "2026-04-01",
"timeZone": "Asia/Tokyo",
"scheduleStartDate": "2026-04-07",
"scheduleEndDate": "2026-04-13",
"timeRangeStart": "08:00",
"timeRangeEnd": "20:00",
"slotGranularityMinutes": 60,
"requirementsByCell": {
"2026-04-07__slot-0": 2
},
"staff": [
{
"staffId": "550e8400-e29b-41d4-a716-446655440000",
"displayName": "Example",
"availableCells": ["2026-04-07__slot-0"]
}
]
}Weiterführende Links. Pläne und kostenpflichtige Funktionen: docs/architecture/NURSE_SCHEDULING_SERVICE_SPECIFICATION.md. Anfragetext von POST /v1/schedule: docs/data-and-api/PUBLIC_API_SCHEDULE_REQUEST_BODY.md §1–§11. Anfragetext von PATCH /v1/schedule-defaults (Mandanten-Standardwerte): dieselbe Datei §12. Implementierung: app/lib/public-schedule-api/, app/features/schedule-settings/schedule-defaults-actions.ts, app/lib/public-api-write/weekly-shift-wish-tenant.ts. Bereitstellung: docs/aws/CDK_DEPLOY.md.