Zum Hauptinhalt springen

Fehler

Jeder Fehler kommt in derselben Hülle:

{
"error": {
"code": "insufficient_scope",
"message": "Für diesen Aufruf fehlt der Bereich „material:write“.",
"details": { }
}
}
  • code ist englisch, maschinenlesbar und stabil – darauf prüft ein Werkzeug.
  • message ist deutsch und für Menschen gedacht – die gehört ins Log oder in die Fehlermeldung der eigenen Oberfläche.
  • details steht nur bei manchen Fehlern und nennt Feld oder Ursache.

Alle Codes

StatusCodeBedeutungAbhilfe
400bad_requestDie Anfrage passt fachlich nicht (z. B. Enddatum vor Startdatum, updated_since auf einer Liste ohne Zeitfeld)Die Meldung nennt den Grund
400validation_failedEin Feld hat das falsche Formatdetails.fieldErrors nennt Feld und Grund
401missing_tokenKein Authorization: Bearer … im KopfHeader setzen
401invalid_tokenSchlüssel unbekannt oder widerrufenNeuen Schlüssel erzeugen
401token_expiredSchlüssel abgelaufenNeuen Schlüssel erzeugen (max. 183 Tage)
403insufficient_scopeDem Schlüssel fehlt der BereichErst die Obergrenze des Vereins prüfen, dann den Schlüssel – /me zeigt, was wirklich wirkt
404not_foundDiesen Datensatz oder Endpunkt gibt es nichtPfad und Kennung prüfen
404api_not_enabledDie Schnittstelle ist für diese Instanz nicht freigeschaltetZugang beantragen bzw. freigeben
409conflictDer Zustand passt nicht (z. B. Statuswechsel nicht erlaubt, Bestätigung liegt schon als Beleg vor)Aktuellen Stand lesen und neu entscheiden
409not_availableMaterial oder Fahrzeug ist im Zeitraum bereits vergebendetails.konflikte nennt die Gründe
413too_largeDie Datei überschreitet die ObergrenzeGrenzen siehe Konventionen
429rate_limitedZu viele AnfragenRateLimit-Reset Sekunden warten
500internal_errorServerfehlerNichts am Aufruf; die Details stehen im Server-Log

Bei 401 trägt die Antwort zusätzlich den Kopf WWW-Authenticate: Bearer.

Warum ein 500er nichts verrät

Treiber- und SQL-Meldungen verraten Tabellennamen und Struktur. Nach außen geht deshalb nur „Interner Serverfehler“ – vollständig steht der Fehler im Server-Log der Instanz (Bereich api-v1), mit Methode und Pfad.

Sonderfall: 409 not_available

Der Verleih prüft jeden Zeitraum gegen andere Ausleihen und Packlisten. Bei einem Konflikt kommt kein stiller Erfolg, sondern:

{
"error": {
"code": "not_available",
"message": "Bulli ist vom 14.08. bis 16.08. bereits vergeben.",
"details": { "konflikte": ["Bulli ist vom 14.08. bis 16.08. bereits vergeben."] }
}
}

Geprüft wird beim Anlegen, beim Ändern und noch einmal beim Bestätigen – zwischen Anfrage und Bestätigung kann jemand anderes gebucht haben. Wer die Konflikte vorab wissen will, ohne etwas anzulegen, nimmt POST /verleih/pruefen.

Sonderfall: 400 auf einer Liste

Zwei Fälle, die zunächst überraschen und beide Absicht sind:

  • updated_since auf einer Liste ohne Zeitfeld (z. B. der Sachstand der Nachweise). Eine leere Liste würde ein Abgleich-Werkzeug für immer verstummen lassen.
  • updated_since mit ungültigem Zeitpunkt. Erwartet wird ISO 8601, etwa 2026-07-01T00:00:00Z.

Diagnose in vier Schritten

  1. GET /me – kommt hier 401, liegt es am Schlüssel, nicht am Endpunkt.
  2. scopes in der Antwort vergleichen – steht dort weniger als erwartet, fehlt die Freigabe des Bereichs in Einstellungen → API, nicht das Recht am Schlüssel.
  3. Denselben Aufruf mit -i wiederholen und auf RateLimit-Remaining sehen.
  4. Server-Log der Instanz (Bereich api-v1): abgelehnte Zugänge, gedrosselte Anfragen und abgewiesene Eingaben stehen dort mit Pfad und Grund.

Hat dies deine Frage beantwortet?