#Fehler und Grenzen
Auf dieser Seite
#Fehlercodes
Jede Fehlerantwort hat die Form { "error": { "code", "message", "requestId", "details" } } (Format). Werten Sie code aus, nicht message — der Satz kann sich ändern, der Code nicht. Interne Einzelheiten wie ein Stacktrace stehen in keiner Antwort; bei 500 hilft uns die requestId.
| HTTP | Code | Bedeutung | Was tun |
|---|---|---|---|
| 400 | INVALID_REQUEST | Ein Pflichtfeld fehlt, ein Wert ist falsch oder ein Feld unbekannt. details.fields nennt jedes Feld mit Code und Grund — alle auf einmal. | Anfrage korrigieren. Unverändert wiederholt, bleibt es ein Fehler. |
| 400 | INVALID_JSON | Der Rumpf ist kein gültiges JSON. | Gültiges JSON mit Content-Type: application/json senden. |
| 400 | INVALID_IDEMPOTENCY_KEY | Idempotency-Key ist länger als 200 Zeichen. | Einen kürzeren Schlüssel verwenden, etwa eine UUID. |
| 400 | INVALID_CURSOR | Der cursor der Liste ist ungültig. | Den nextCursor der letzten Seite unverändert zurückgeben. |
| 400 | INVALID_WEBHOOK_URL | Die Webhook-Adresse ist nicht erlaubt; details.reason nennt den Grund, etwa HTTPS_REQUIRED oder PRIVATE_ADDRESS. | Eine öffentliche https-Adresse ohne Weiterleitung eintragen. |
| 400 | INVALID_SCENARIO | Nur Sandbox: unbekannter Wert in X-Sandbox-Scenario — bei POST /quotes jeder außer QUOTE_REQUIRED. details.allowed nennt die möglichen. | Einen Wert aus der Tabelle der Szenarien verwenden; bei POST /quotes den Kopf weglassen. |
| 401 | UNAUTHORIZED | Die Anfrage trägt keine Anmeldung. | Authorization: Bearer <Token oder Schlüssel> oder X-API-Key mitschicken. |
| 401 | INVALID_CREDENTIALS | Der Schlüssel ist unbekannt oder widerrufen — oder der Zugang hinter einem Token gibt es nicht mehr. | Den Zugang im Portal prüfen; ein widerrufener kommt nicht zurück. |
| 401 | TOKEN_EXPIRED | Das Zugriffstoken ist abgelaufen (nach einer Stunde). | Ein neues Token holen (POST /oauth/token) und den Aufruf wiederholen. |
| 401 | INVALID_TOKEN | Das Zugriffstoken ist ungültig — verändert, gekürzt oder nicht von LOGICAR. | Ein neues Token holen und es unverändert mitschicken. |
| 401 | ACCESS_TOKEN_REQUIRED | Das Secret eines OAuth-Clients wurde als Schlüssel geschickt. Ein OAuth-Client holt erst ein Token. | Mit Client-Kennung und Secret POST /oauth/token aufrufen und das Token mitschicken. |
| 401 | CREDENTIALS_EXPIRED | Der Zugang ist abgelaufen (Ablaufdatum im Portal). | Im Portal einen neuen Zugang anlegen oder die Laufzeit verlängern lassen. |
| 401 | CREDENTIALS_DISABLED | Der Zugang ist gesperrt. | Im Portal wieder freigeben — oder den Grund der Sperre klären. |
| 403 | ACCOUNT_SUSPENDED | Ihr Konto ist gesperrt. | Uns kontaktieren. |
| 403 | ACCOUNT_NOT_ELIGIBLE | Das Konto ist kein Auftraggeber-Konto. | Uns kontaktieren — Schnittstellen sind für Auftraggeber. |
| 403 | FEATURE_NOT_ENABLED | Die API v1 ist für den Echtbetrieb Ihres Kontos noch nicht freigeschaltet. Die Sandbox ist es immer. | Die Freischaltung bei Ihrem Ansprechpartner anfragen. |
| 403 | QUOTE_ACCEPTANCE_NOT_AGREED | Ihre Vereinbarung sieht die Annahme von Angeboten über die Schnittstelle nicht vor. | Das Angebot über den Link in der Angebotsmail annehmen — oder die Annahme per API in die Vereinbarung aufnehmen lassen. |
| 403 | SANDBOX_ONLY | Diesen Endpunkt gibt es nur in der Sandbox. | Mit einem Testschlüssel (lc_test_…) oder einem Sandbox-Token aufrufen. |
| 403 | INSUFFICIENT_SCOPE | Dem Zugang fehlt das Recht für diesen Aufruf. details.required nennt es, details.granted die vorhandenen. | Im Portal dem Zugang das Recht geben — und ein neues Token holen, wenn es auf das Recht beschränkt war. |
| 404 | NOT_FOUND | Diesen Endpunkt gibt es nicht. | Pfad und Methode prüfen. |
| 404 | ORDER_NOT_FOUND | Zu dieser Kennung gibt es in Ihrem Konto keinen Auftrag und keine Anfrage. | Kennung prüfen. Sandbox und Echtbetrieb sind getrennt. |
| 404 | DOCUMENT_NOT_FOUND | Dieses Dokument gibt es am Auftrag nicht — oder es ist für diesen Zugang nicht sichtbar. | Die Liste GET …/documents abfragen; Rechte des Zugangs prüfen. |
| 404 | QUOTE_NOT_FOUND | Zu dieser Kennung gibt es in Ihrem Konto keine Anfrage und kein Angebot. | Kennung der Anfrage, Anfrage- oder Angebotsnummer prüfen. Sandbox und Echtbetrieb sind getrennt. |
| 404 | QUOTE_DOCUMENT_NOT_FOUND | Zu diesem Angebot gibt es (noch) kein PDF — in der Sandbox nie. | Warten, bis das Angebot vorliegt (OFFERED); in der Sandbox gibt es keine Dokumente. |
| 404 | SUBSCRIPTION_NOT_FOUND | Diesen Webhook-Endpunkt gibt es in der Umgebung des Zugangs nicht. | Kennung und Umgebung (Test- oder Live-Schlüssel) prüfen. |
| 409 | IDEMPOTENCY_KEY_REUSED | Derselbe Idempotency-Key — oder dieselbe externalOrderId — kam mit anderem Inhalt. | Für einen neuen Auftrag einen neuen Schlüssel verwenden; denselben nur für Wiederholungen. |
| 409 | IDEMPOTENCY_REQUEST_IN_PROGRESS | Der erste Aufruf mit diesem Schlüssel läuft noch. | Nach Retry-After Sekunden wiederholen. |
| 409 | EXTERNAL_ORDER_ID_EXISTS | Unter dieser externalOrderId liegt schon ein Auftrag oder eine Anfrage. details nennt die Kennung. | Den vorhandenen Vorgang abfragen, statt einen zweiten anzulegen. |
| 409 | NO_CONTRACTING_PARTY | Für Ihr Konto ist kein Auftraggeber (kaufmännischer Ansprechpartner) hinterlegt. | Uns kontaktieren — das ist eine Lücke in der Einrichtung. |
| 409 | ORDER_NOT_CHANGEABLE | Ab der Abholung ändert die API nichts mehr; eine Anfrage, die auf ein Angebot wartet, gar nicht. | Uns anrufen — oder die Anfrage zurückziehen und neu stellen. |
| 409 | ORDER_NOT_CANCELLABLE | Ab der Abholung storniert die API nicht mehr; eine abgeschlossene Anfrage lässt sich nicht zurückziehen. | Uns anrufen: dann ist ein Fahrer mit dem Fahrzeug unterwegs. |
| 409 | REQUEST_HAS_QUOTE | Zu dieser Anfrage liegt schon ein Angebot vor. | Das Angebot ablehnen (POST /quotes/{id}/decline), statt die Anfrage zurückzuziehen. |
| 409 | QUOTE_NOT_OFFERED | Zu dieser Anfrage liegt (noch) kein Angebot vor, das sich annehmen oder ablehnen ließe. | Den Stand mit GET /quotes/{id} abfragen; vor dem Angebot die Anfrage bei Bedarf zurückziehen (POST /orders/{id}/cancel). |
| 409 | QUOTE_VERSION_MISMATCH | Angeboten ist eine andere Fassung als die genannte (nachverhandelt). details.currentVersion nennt die aktuelle. | Die aktuelle Fassung lesen und, wenn sie passt, diese annehmen. |
| 409 | QUOTE_EXPIRED | Die Gültigkeit des Angebots ist abgelaufen. | Ein neues Angebot anfordern (POST /quotes). |
| 409 | QUOTE_ALREADY_DECIDED | Über das Angebot ist schon entschieden — angenommen, abgelehnt oder zurückgezogen. details.status nennt den Stand. | Den Stand mit GET /quotes/{id} abfragen; nach einer Annahme steht der Auftrag in order. |
| 409 | SANDBOX_FINISHED | Nur Sandbox: das Szenario dieses Vorgangs ist durchgelaufen. | Einen neuen Testvorgang anlegen. |
| 409 | TOO_MANY_SUBSCRIPTIONS | Höchstens zehn Webhook-Endpunkte je Umgebung. | Einen nicht mehr gebrauchten Endpunkt löschen. |
| 413 | PAYLOAD_TOO_LARGE | Der Rumpf ist zu groß. | Freie Daten kürzen (metadata, instructions). |
| 422 | VEHICLE_NOT_DRIVEABLE | DRIVEN, aber das Fahrzeug ist nicht fahrbereit oder nicht verkehrssicher. | TRAILER oder TRUCK wählen — oder die Angabe zum Fahrzeug prüfen. |
| 422 | SERVICE_NOT_SUPPORTED | Eine Leistung, die LOGICAR nicht anbietet (Ausfuhrkennzeichen, Zoll). | Die Leistung weglassen und selbst beauftragen. |
| 422 | SERVICE_NOT_APPLICABLE | Die Leistung passt nicht zum Auftrag, etwa ein Kurzzeitkennzeichen für einen Transport auf dem Lkw. | Die Leistung weglassen. |
| 422 | TRANSPORT_TYPE_NOT_ALLOWED | Ihre Vereinbarung lässt diese Transportart nicht zu. | Eine vereinbarte Transportart wählen oder die Vereinbarung erweitern lassen. |
| 429 | RATE_LIMITED | Zu viele Anfragen mit diesem Zugang — oder zu viele abgewiesene Anmeldungen von Ihrer Adresse. | Nach Retry-After Sekunden wiederholen. |
| 429 | SANDBOX_LIMIT | Nur Sandbox: das Tageslimit an Testvorgängen ist erreicht. | Am nächsten Tag weiter testen oder uns um ein höheres Limit bitten. |
| 500 | INTERNAL_ERROR | Unerwarteter Fehler auf unserer Seite — oder ein Dokument, dessen Prüfsumme nicht stimmt. | Später wiederholen, mit demselben Idempotency-Key. Die requestId hilft uns beim Suchen. |
| 503 | NUMBER_COLLISION | Nur Sandbox: bei der Vergabe der Nummer kam ein gleichzeitiger Aufruf dazwischen. | Unverändert erneut senden. |
Der Token-Endpunkt POST /oauth/token antwortet im Format von OAuth 2.0; seine Codes stehen unter Anmeldung. Die bisherige Schnittstelle hat ihr eigenes Format und ihre eigenen Codes.
#Eingabefehler im Einzelnen
Bei INVALID_REQUEST nennt details.fields jedes beanstandete Feld — alle auf einmal, nicht nur das erste. field ist der Pfad im JSON, code die Art des Fehlers:
{
"error": {
"code": "INVALID_REQUEST",
"message": "The request is invalid. See details.fields.",
"requestId": "…",
"details": {
"fields": [
{ "field": "pickup.postalCode", "code": "invalid_type", "message": "Invalid input: expected string, received undefined" },
{ "field": "vehicle.vin", "code": "invalid_format", "message": "A VIN has 17 characters: letters and digits, no I, O or Q." },
{ "field": "pickup.zip", "code": "unrecognized_key", "message": "Unknown field." }
]
}
}
}Häufige Werte von code: invalid_type (fehlt oder falscher Typ), invalid_value (Wert nicht erlaubt), invalid_format (etwa FIN oder Zeitpunkt), too_big / too_small (Länge oder Zahl außerhalb der Grenzen), unrecognized_key (Feld gibt es nicht — etwa ein Tippfehler oder ein Preisfeld).
Fachliche Absagen (422) haben dieselbe Form, nur heißen die Einträge details.errors und tragen je einen eigenen code (Beispiel).
#Grenzen
| Was | Grenze | Anmerkung |
|---|---|---|
| Anfragen je Zugang | 600 je Minute | darüber 429 mit Retry-After; RateLimit-* zeigt den Spielraum |
| Spitzen je Zugang | 50 je Sekunde | auch innerhalb der Minutengrenze |
| Token-Abrufe | 30 je Minute | je client_id; ein Token gilt 1 h |
| Abgewiesene Anmeldungen je Adresse | 30 je Minute | schützt vor dem Raten von Schlüsseln |
| Webhook-Endpunkte | 10 je Umgebung | Echtbetrieb und Sandbox getrennt |
| Antwortzeit Ihres Webhook-Endpunkts | 10 s | danach gilt der Versuch als gescheitert |
| Zeitstempel einer Webhook-Nachricht | ± 5 min | ältere Nachrichten verwerfen |
| Textfelder | 500 Zeichen | externalOrderId und Idempotency-Key: 200 |
| Sandbox: Vorgänge | 500 je Tag | je Mandant |
| Sandbox: automatischer Schritt | alle 20 s | mit X-Sandbox-Mode: manual von Hand |
| Sandbox: Aufbewahrung | 30 Tage | danach werden Testvorgänge gelöscht |
Die Köpfe RateLimit-Limit, RateLimit-Remaining und RateLimit-Reset jeder Antwort zeigen, wie viel Spielraum bleibt. Wird es knapp, verteilen Sie Aufrufe gleichmäßiger, statt sie gesammelt zu schicken — und nutzen Sie Webhooks, statt den Stand in kurzen Abständen abzufragen.
Hinweis
Braucht Ihre Anbindung dauerhaft mehr, sprechen Sie uns an.