Übersicht

23. Errors

Fehlerformat der öffentlichen Endpunkte

Die Endpunkte aus 20-api.md antworten konsistent mit einem JSON-Objekt, das mindestens ein status-Feld enthält. Es gibt kein einheitliches globales Fehlerschema mit Fehlercode — jeder Endpunkt definiert seine eigenen status-Werte, passend zu seiner Domäne:

{ "status": "fehler", "detail": "Bitte alle Pflichtfelder ausfüllen." }

Gebräuchliche status-Werte je nach Endpunkt: ok, fehler, nicht_gefunden, belegt (Buchungsseiten: Slot vergeben), rate_limit, spam (wird absichtlich wie ok behandelt, siehe 24-rate-limits.md), bestaetigung_erforderlich (Newsletter Double-Opt-in).

HTTP-Statuscodes

CodeBedeutung
200Erfolgreich (auch bei als Spam erkannten Einsendungen — bewusst, siehe 24-rate-limits.md)
400Pflichtfelder fehlen oder Anfrage ist nicht auswertbar (z. B. ungültiges JSON)
401Fehlender/ungültiger Bearer-Token bei internen, authentifizierten Routen
403Zugriff verweigert — z. B. Domain nicht freigegeben (Chat-Widget) oder Plan reicht nicht (siehe unten)
404Ressource existiert nicht (Buchungsseite, Formular, Widget)
409Konflikt — z. B. Zeitslot bereits gebucht
429Echtes Rate-Limit erreicht
500Unerwarteter Serverfehler
503Feature global deaktiviert oder benötigte Konfiguration fehlt

Plan-Gating-Fehler (interne, eingeloggte Aktionen)

Reicht der Plan des Kontos für eine Funktion nicht aus (siehe 26-billing.md), wirft der Server einen FeatureNotAvailableError mit einer für Endnutzer verständlichen Meldung, z. B.:

Dieses Feature ist in Ihrem aktuellen Plan nicht enthalten. Bitte upgraden Sie unter Abrechnung. (Feature: ai)

Dies wird ausschließlich serverseitig anhand der authentifizierten userId geprüft — nie anhand eines vom Client mitgesendeten Plan-Werts.

Fehlerhinweis für externe Formular-/Kalender-Einbindungen

Da /api/public/formulare/submit mit multipart/form-data arbeitet, führt fehlendes Content-Type-Handling im eigenen Code meist zu 400 { "status": "fehler" } — beim manuellen Nachbauen des Requests (statt Browser-FormData) unbedingt echten Multipart-Body senden, kein JSON.