So sind Fehlerantworten der LinkHarbor-API aufgebaut, was die wichtigsten Fehlercodes bedeuten und wie dein Code darauf reagieren sollte.
Jede Fehlerantwort der API hat dasselbe Format. Dein Code sollte sich auf den Fehlercode im Feld error verlassen, nicht auf den Text in message – der Code bleibt stabil, der Text kann sich ändern und erscheint in der Kontosprache.
Aufbau einer Fehlerantwort
{
"error": "validation_failed",
"message": "Some of the information provided is invalid. Please check and try again.",
"details": [
{ "field": "title", "reason": "minLength", "message": "…" }
],
"request_id": "6b1f0c2e-…"
} - error
- Maschinenlesbarer Code, zum Beispiel not_found. Bei den meisten Fehlern steht er zusätzlich im Header X-Error-Code – verlass dich aber auf das Feld im Body.
- message
- Lesbare Beschreibung in der Kontosprache: mit API-Key die des Workspace-Eigentümers, mit einer verbundenen App die der Person, die sie verbunden hat. Ohne gültigen Token – etwa bei 401 aus der Token-Prüfung – richtet sich die Sprache nach Accept-Language, sonst Englisch. Der Header Content-Language nennt die Sprache.
- details
- Nur wenn es mehr zu sagen gibt. Bei 422 aus der Eingabeprüfung eine Liste mit field, reason und message pro Problem; bei 422 aus der Fachlogik und allen anderen Fehlern ein Objekt, etwa mit reason, retry_after_sec oder einer Liste von issues. Bei einer überschrittenen Größe enthält es field, reason und limit, bei 413 request_too_large max_bytes und max_kb. Prüfe also, ob details eine Liste ist.
- request_id
- Die ID der Anfrage. Sie steht auch im Header X-Request-Id. Gib sie bei Fragen an den Support mit an.
Ausnahmen: Die Antwort bei 429 rate_limited hat statt details das Feld retry_after_sec; bei 429 und 403 insufficient_scope fehlt request_id im Body. 401 aus der Token-Prüfung und 422 aus der Schema-Prüfung haben keinen Header X-Error-Code, und bei der Schema-Prüfung ist nur das oberste message übersetzt, die Texte in details bleiben englisch. Der Header X-Request-Id ist immer gesetzt.
Die wichtigsten Codes
| HTTP | error | Bedeutung | Was tun |
|---|---|---|---|
| 400 | invalid_json | Der Body ist kein gültiges JSON | JSON prüfen |
| 400 | bad_request | Falscher Content-Type oder fehlerhafte Anfrage | Content-Type: application/json setzen |
| 401 | missing_bearer_token | Kein Token im Authorization-Header | Header Authorization: Bearer … setzen |
| 401 | invalid_token | Token abgelaufen, ungültig oder Key gelöscht | Neues Token holen; hilft das nicht, Key prüfen |
| 401 | invalid_api_key | Key-ID oder Secret beim Token-Tausch falsch | Zugangsdaten prüfen |
| 402 | plan_limit_reached | Plan-Limit erreicht, etwa bei Short Links | Upgrade oder Einträge löschen |
| 403 | insufficient_scope | Scope fehlt oder Endpunkt nicht für API-Keys freigegeben | Key mit passendem Scope anlegen |
| 403 | forbidden | Keine Berechtigung für diese Aktion | Im Dashboard erledigen |
| 403 | feature_not_available | Funktion nicht im Plan enthalten | Plan prüfen |
| 403 | block_type_requires_plan | Blocktyp erst in einem höheren Plan | Anderen Blocktyp wählen oder upgraden |
| 403 | template_locked | Premium-Template im aktuellen Plan nicht verfügbar | Template aus GET /v1/templates/available wählen |
| 403 | workspace_suspended, workspace_read_only, workspace_grace_expired | Workspace wegen offener Zahlung gesperrt oder nur lesbar | Zahlung im Dashboard klären |
| 404 | not_found | Ressource existiert nicht oder gehört nicht zu deinem Workspace | ID prüfen |
| 409 | conflict | Allgemeiner Konflikt mit dem aktuellen Zustand | Zustand neu laden, Eingabe ändern |
| 409 | workspace_template_in_use | Workspace-Template wird noch von Pages genutzt; die Zahl steht in details.count | Pages auf ein anderes Template umstellen, dann löschen |
| 409 | handle_taken, slug_taken | Handle bzw. Short-Link-Slug ist schon vergeben | Anderen Wert wählen |
| 409 | form_in_use, page_not_private, page_not_published, never_published | Konflikt mit dem Zustand: Formular noch auf einer Page, Page nicht privat bzw. nicht veröffentlicht, noch nie veröffentlicht | Zustand ändern, dann erneut |
| 409 | page_limit_reached, link_limit_reached, block_limit_reached, form_limit_reached, asset_limit_reached, asset_storage_limit_reached, workspace_template_limit_reached | Mengen- oder Speicher-Limit des Plans erreicht | Einträge entfernen oder upgraden |
| 409 | draft_not_publishable | Der Entwurf hat Probleme; die Liste steht in details.issues | Probleme beheben, dann erneut veröffentlichen |
| 413 | request_too_large | Body größer als für diesen Endpunkt erlaubt (64 KB, 1 MB oder 2 MB); die Grenze steht in details.max_kb | Weniger Daten pro Anfrage schicken, siehe Rate Limits |
| 413 | payload_too_large | Hochgeladene Datei größer als 10 MB | Datei verkleinern |
| 422 | validation_failed | Eingabe ungültig oder unbekanntes Feld; Einzelheiten in details | Felder laut details korrigieren |
| 422 | handle_reserved, target_url_invalid, target_url_scheme, target_url_host | Handle reserviert bzw. Ziel-URL ungültig oder nicht erlaubt | Anderen Wert wählen |
| 422 | workspace_template_disabled | Das gewählte Workspace-Template ist deaktiviert | Template unter „Domains & Templates“ aktivieren oder ein anderes wählen |
| 422 | template_css_external, template_section_invalid | Workspace-Template: CSS lädt von fremden Servern bzw. ein {{#if}}/{{#unless}}/{{#each}}-Abschnitt ist falsch platziert | Externe Adressen entfernen bzw. Abschnitt im selben Tag oder Text schließen |
| 422 | custom_css_external | Custom CSS lädt etwas von fremden Servern | Externe Adressen aus dem CSS entfernen |
| 429 | rate_limited, api_key_locked | Zu viele Anfragen bzw. Key nach Fehlversuchen gesperrt | Warten laut Retry-After bzw. details.retry_after_sec |
| 500 | internal_error | Unerwarteter Fehler | Später erneut versuchen, request_id notieren |
| 503 | service_unavailable | Dienst vorübergehend nicht erreichbar | Mit Pause erneut versuchen |
Eingabefehler lesen
Bei 422 validation_failed nennt details jedes Problem einzeln: field ist der Pfad des Feldes (bei verschachtelten Objekten mit Schrägstrichen, etwa theme_config/button_style), reason die verletzte Regel wie required, minLength, maxLength, enum oder additionalProperties. Bei additionalProperties steht in der Meldung, welche Felder unbekannt sind – häufig ein Tippfehler im Feldnamen.
Empfohlene Reaktion im Code
- 400, 413 und 422: nicht wiederholen, sondern die Anfrage korrigieren
- 401 invalid_token: einmal ein neues Token holen und wiederholen
- 403: nicht wiederholen; Scope, Plan oder Zuständigkeit prüfen
- 404: ID prüfen; nach einem Löschen ist das normal
- 409: Zustand neu laden und entscheiden, ob die Aktion noch nötig ist
- 429: warten laut Retry-After und dann wiederholen – siehe Rate Limits
- 500 und 503: mit wachsenden Pausen wenige Male wiederholen
Das könnte auch helfen
Nichts gefunden?
Schreib uns dein Anliegen – unser Support hilft dir persönlich weiter.