Fehlerbehandlung¶
Alle API-Fehler folgen einem einheitlichen JSON-Format. Jede Fehlerantwort enthält eine eindeutige Fehler-ID, einen maschinenlesbaren Fehlercode, eine menschenlesbare Nachricht und ein details-Array für feldspezifische Validierungsfehler.
Fehlerstruktur¶
{
"error_id": "err_f47ac10b-58cc-4372-a567-0e02b2c3d479",
"error_code": "ENTITY_NOT_FOUND",
"message": "PlantInstance with key 'pi_xyz' not found.",
"details": [
{
"field": "key",
"reason": "No PlantInstance with key 'pi_xyz'.",
"code": "ENTITY_NOT_FOUND"
}
],
"timestamp": "2026-03-17T10:30:00.000000+00:00",
"path": "/api/v1/plant-instances/pi_xyz",
"method": "GET"
}
| Feld | Typ | Beschreibung |
|---|---|---|
error_id | String | Eindeutige UUID des Fehlerereignisses — für Support-Anfragen |
error_code | String | Maschinenlesbarer Code (vollständige Liste unten) |
message | String | Kurze Fehlerbeschreibung auf Englisch |
details | Array | Feldspezifische Fehlerdetails (kann leer sein) |
details[].field | String | Feldname oder Pfad zum fehlerhaften Wert |
details[].reason | String | Erläuterung des konkreten Problems |
details[].code | String | Maschinenlesbarer Detailcode |
timestamp | String | Zeitpunkt des Fehlers (ISO 8601, UTC) |
path | String | URL-Pfad der fehlgeschlagenen Anfrage |
method | String | HTTP-Methode der fehlgeschlagenen Anfrage |
error_id für Support nutzen
Die error_id wird im Server-Log protokolliert. Geben Sie diese ID bei der Fehlersuche oder in Support-Anfragen an — damit kann der Fehler serverseitig exakt nachvollzogen werden.
HTTP-Statuscodes¶
| Code | Bedeutung | Wann |
|---|---|---|
200 OK | Erfolg | Lesende Anfragen (GET) |
201 Created | Ressource erstellt | POST mit neuer Ressource |
204 No Content | Erfolg ohne Body | DELETE |
400 Bad Request | Fehlerhafte Anfrage | Syntaxfehler im Request-Body |
401 Unauthorized | Nicht authentifiziert | Kein oder ungültiges Token |
403 Forbidden | Keine Berechtigung | Authentifiziert, aber fehlende Rolle |
404 Not Found | Ressource nicht gefunden | Unbekannte ID oder Slug |
409 Conflict | Konflikt | Doppelter Eintrag oder ungültiger Zustandsübergang |
422 Unprocessable Entity | Validierungsfehler | Fachliche Regeln verletzt (z.B. Karenzzeit) |
423 Locked | Konto gesperrt | Zu viele fehlgeschlagene Loginversuche |
429 Too Many Requests | Rate Limit überschritten | Zu viele Anfragen pro Minute |
502 Bad Gateway | Externe Quelle nicht erreichbar | GBIF/Perenual-Timeout |
500 Internal Server Error | Interner Fehler | Unerwarteter Serverfehler |
Fehlercodes¶
Allgemeine Fehler¶
| Fehlercode | HTTP | Beschreibung |
|---|---|---|
ENTITY_NOT_FOUND | 404 | Die angeforderte Ressource existiert nicht |
DUPLICATE_ENTRY | 409 | Ein Eintrag mit diesem Wert existiert bereits |
VALIDATION_ERROR | 422 | Pydantic-Validierungsfehler (Typen, Pflichtfelder) |
INTERNAL_ERROR | 500 | Unerwarteter interner Fehler |
Authentifizierungs- und Autorisierungsfehler¶
| Fehlercode | HTTP | Beschreibung |
|---|---|---|
UNAUTHORIZED | 401 | Kein gültiges Token vorhanden |
INVALID_TOKEN | 401 | Token abgelaufen oder manipuliert |
FORBIDDEN | 403 | Authentifiziert, aber ohne ausreichende Rolle |
EMAIL_NOT_VERIFIED | 403 | E-Mail-Adresse noch nicht bestätigt |
ACCOUNT_LOCKED | 423 | Konto nach zu vielen Fehlversuchen gesperrt |
Phasen- und Statusfehler¶
| Fehlercode | HTTP | Beschreibung |
|---|---|---|
PHASE_TRANSITION_INVALID | 422 | Ungültiger Übergang im Phasenstatus (z.B. Rückwärtsübergang) |
INVALID_STATUS_TRANSITION | 422 | Ungültiger Statuswechsel eines Objekts |
INVALID_RUN_STATE | 409 | Operation im aktuellen Zustand nicht erlaubt |
Pflanzenschutz- und Erntefehler¶
| Fehlercode | HTTP | Beschreibung |
|---|---|---|
KARENZ_VIOLATION | 422 | Ernte nicht möglich — Karenzzeit noch nicht abgelaufen |
RESISTANCE_WARNING | 422 | Resistenzrisiko — Wirkstoff zu oft in Folge eingesetzt |
HST_VIOLATION | 422 | Trainingsmaßnahme (HST) in dieser Phase nicht erlaubt |
Substrat- und Kompatibilitätsfehler¶
| Fehlercode | HTTP | Beschreibung |
|---|---|---|
SUBSTRATE_EXHAUSTED | 422 | Substratcharge hat maximale Wiederverwendungszyklen überschritten |
ROTATION_VIOLATION | 422 | Pflanzenfamilie wurde zu kürzlich in diesem Slot angebaut |
INCOMPATIBLE_COMPANION | 422 | Zwei Pflanzenarten sind als Mischkultur unverträglich |
Externe Dienste¶
| Fehlercode | HTTP | Beschreibung |
|---|---|---|
EXTERNAL_SOURCE_ERROR | 502 | Externer Datendienst (GBIF, Perenual) nicht erreichbar |
ADAPTER_NOT_FOUND | 404 | Kein Adapter für die angegebene Quelle registriert |
RATE_LIMIT_EXCEEDED | 429 | Rate Limit des Servers oder eines externen Dienstes überschritten |
Validierungsfehler (422)¶
FastAPI und Pydantic erzeugen bei Eingabefehler automatisch strukturierte Validierungsfehler. Die details-Liste enthält für jedes fehlerhafte Feld einen eigenen Eintrag:
POST /api/v1/auth/register
Content-Type: application/json
{
"email": "kein-gueltige-email",
"password": "kurz",
"display_name": ""
}
Antwort (422):
{
"error_id": "err_b5e3c8a1-...",
"error_code": "VALIDATION_ERROR",
"message": "The input data is invalid.",
"details": [
{
"field": "body.email",
"reason": "value is not a valid email address",
"code": "value_error"
},
{
"field": "body.password",
"reason": "String should have at least 10 characters",
"code": "string_too_short"
},
{
"field": "body.display_name",
"reason": "String should have at least 1 character",
"code": "string_too_short"
}
],
"timestamp": "2026-03-17T10:30:00.000000+00:00",
"path": "/api/v1/auth/register",
"method": "POST"
}
Karenz-Violation (KARENZ_VIOLATION)¶
Der Karenz-Gate-Mechanismus verhindert die Erstellung einer Ernte, solange die Karenzzeit eines angewendeten Pflanzenschutzmittels noch nicht abgelaufen ist.
Antwort (422), wenn Karenzzeit aktiv:
{
"error_id": "err_c7d2e5f3-...",
"error_code": "KARENZ_VIOLATION",
"message": "Cannot harvest: safety interval for 'Pyrethrin' has 5 days remaining.",
"details": [
{
"field": "active_ingredient",
"reason": "Safety interval not elapsed: 5 days remaining.",
"code": "KARENZ_VIOLATION"
}
],
"timestamp": "2026-03-17T10:30:00.000000+00:00",
"path": "/api/v1/t/mein-garten/harvest/batches",
"method": "POST"
}
Karenzzeit ist rechtlich relevant
Die Karenzzeit (Pre-Harvest Interval) zwischen letzter Pflanzenschutzmittel-Anwendung und Ernte ist gesetzlich vorgeschrieben (PflSchG/CanG). Dieser Fehler darf clientseitig nicht ignoriert werden.
Konflikte (409)¶
HTTP 409 wird verwendet, wenn eine Operation aufgrund des aktuellen Zustands nicht durchführbar ist — etwa das Hinzufügen einer Pflanze zu einem bereits abgeschlossenen Durchlauf:
{
"error_id": "err_a1b2c3d4-...",
"error_code": "INVALID_RUN_STATE",
"message": "Operation 'add_plant' not allowed in status 'completed'.",
"details": [],
"timestamp": "2026-03-17T10:30:00.000000+00:00",
"path": "/api/v1/t/mein-garten/planting-runs/run_123/plants",
"method": "POST"
}
Rate Limiting (429)¶
Bei Überschreitung des Rate Limits antwortet die API mit HTTP 429. Der Retry-After-Header gibt an, nach wie vielen Sekunden ein erneuter Versuch möglich ist:
Interne Fehler (500)¶
Bei unerwarteten internen Fehlern gibt die API niemals Details über die serverseitige Ursache preis. Die error_id ist das einzige Instrument zur Fehlerkorrelation:
{
"error_id": "err_9f8e7d6c-...",
"error_code": "INTERNAL_ERROR",
"message": "An internal error occurred. Please contact support with the reference ID.",
"details": [],
"timestamp": "2026-03-17T10:30:00.000000+00:00",
"path": "/api/v1/t/mein-garten/plant-instances/",
"method": "GET"
}
Empfehlungen für API-Clients¶
- Fehlercode auswerten, nicht nur den HTTP-Statuscode. Mehrere semantisch unterschiedliche Fehler können denselben Statuscode haben (z.B. sind
KARENZ_VIOLATION,HST_VIOLATIONundROTATION_VIOLATIONalle HTTP 422). error_idprotokollieren. In eigenen Logs und bei Support-Anfragen immer dieerror_idangeben.details-Array iterieren für feldspezifische Fehlermeldungen in Formularvalidierungen.- Auf
401mit Token-Refresh reagieren. Nach Ablauf des Access Tokens (15 min) liefert die API401 UNAUTHORIZED. Der Client soll automatisch einen Refresh-Versuch starten. 409 INVALID_RUN_STATEnicht wiederholen. Dieser Fehler zeigt einen fachlichen Zustandskonflikt an — die Operation ist erst nach einer Zustandsänderung möglich.
Siehe auch¶
- API-Überblick — URL-Struktur und Endpunkt-Gruppen
- Authentifizierung — Auth-Fehler im Detail
- IPM-System — Karenzzeit-Konzept erklärt