Zum Inhalt springen
LOGICAR Entwickler Suchen

#Fehler und Grenzen

Auf dieser Seite

#Das Format

Jede Fehlerantwort der API v1 ist ein Problem nach RFC 9457 („Problem Details for HTTP APIs“) mit dem Medientyp application/problem+json (Beispiel):

FeldInhalt
typeURI des Problemtyps — ein Typ je Code, sie führt zu seiner Zeile in der Tabelle unten, etwa https://docs.logicar.cloud/api/fehler#invalid-request.
titleKurzer Titel des Typs, für jedes Auftreten gleich.
statusDer HTTP-Status dieser Antwort.
detailWas in diesem Fall nicht stimmt, ein Satz für Menschen (englisch). Er kann sich ändern.
instanceDer Pfad Ihrer Anfrage.
codeDer feste Code zum Auswerten, etwa INVALID_REQUEST.
requestIdDie Kennung des Aufrufs, auch im Kopf X-Request-Id. Nennen Sie sie uns bei Rückfragen.
errorsNur bei Feldfehlern (400 INVALID_REQUEST, 422): jedes beanstandete Feld.

Werten Sie code aus (oder gleichwertig type), nicht detail — der Satz kann sich ändern, der Code nicht. Manche Codes geben zusätzliche Felder mit, etwa required und granted bei INSUFFICIENT_SCOPE; die Tabelle nennt sie. Felder, die Ihr System nicht kennt, übergeht es bitte. Interne Einzelheiten wie ein Stacktrace oder Kennungen anderer Konten stehen in keiner Antwort; bei 500 hilft uns die requestId.

#Fehlercodes

HTTPCodeBedeutungWas tun
400INVALID_REQUESTEin Pflichtfeld fehlt, ein Wert ist falsch oder ein Feld unbekannt. errors nennt jedes Feld mit Code und Grund — alle auf einmal; im Rumpf mit pointer (JSON Pointer), in Pfad und Abfrage mit parameter.Anfrage korrigieren. Unverändert wiederholt, bleibt es ein Fehler.
400INVALID_JSONDer Rumpf ist kein gültiges JSON.Gültiges JSON mit Content-Type: application/json senden.
400INVALID_IDEMPOTENCY_KEYIdempotency-Key ist länger als 200 Zeichen.Einen kürzeren Schlüssel verwenden, etwa eine UUID.
400INVALID_CURSORDer cursor der Liste ist ungültig.Den nextCursor der letzten Seite unverändert zurückgeben.
400INVALID_WEBHOOK_URLDie Webhook-Adresse ist nicht erlaubt; reason nennt den Grund, etwa HTTPS_REQUIRED oder PRIVATE_ADDRESS.Eine öffentliche https-Adresse ohne Weiterleitung eintragen.
400INVALID_SCENARIONur Sandbox: unbekannter Wert in X-Sandbox-Scenario — bei POST /quotes jeder außer QUOTE_REQUIRED. allowed nennt die möglichen.Einen Wert aus der Tabelle der Szenarien verwenden; bei POST /quotes den Kopf weglassen.
401UNAUTHORIZEDDie Anfrage trägt keine Anmeldung.Authorization: Bearer <Token oder Schlüssel> oder X-API-Key mitschicken.
401INVALID_CREDENTIALSDer 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.
401TOKEN_EXPIREDDas Zugriffstoken ist abgelaufen (nach einer Stunde).Ein neues Token holen (POST /oauth/token) und den Aufruf wiederholen.
401INVALID_TOKENDas Zugriffstoken ist ungültig — verändert, gekürzt oder nicht von LOGICAR.Ein neues Token holen und es unverändert mitschicken.
401ACCESS_TOKEN_REQUIREDDas 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.
401CREDENTIALS_EXPIREDDer Zugang ist abgelaufen (Ablaufdatum im Portal).Im Portal einen neuen Zugang anlegen oder die Laufzeit verlängern lassen.
401CREDENTIALS_DISABLEDDer Zugang ist gesperrt.Im Portal wieder freigeben — oder den Grund der Sperre klären.
403ACCOUNT_SUSPENDEDIhr Konto ist gesperrt.Uns kontaktieren.
403ACCOUNT_NOT_ELIGIBLEDas Konto ist kein Auftraggeber-Konto.Uns kontaktieren — Schnittstellen sind für Auftraggeber.
403FEATURE_NOT_ENABLEDDie API v1 ist für den Echtbetrieb Ihres Kontos noch nicht freigeschaltet. Die Sandbox ist es immer.Die Freischaltung bei Ihrem Ansprechpartner anfragen.
403QUOTE_ACCEPTANCE_NOT_AGREEDIhre 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.
403SANDBOX_ONLYDiesen Endpunkt gibt es nur in der Sandbox.Mit einem Testschlüssel (lc_test_…) oder einem Sandbox-Token aufrufen.
403INSUFFICIENT_SCOPEDem Zugang fehlt das Recht für diesen Aufruf. required nennt es, granted die vorhandenen.Im Portal dem Zugang das Recht geben — und ein neues Token holen, wenn es auf das Recht beschränkt war.
403IP_BLOCKEDAnfragen von Ihrer Absenderadresse sind bei LOGICAR gesperrt.Uns kontaktieren, mit der requestId der Antwort.
404NOT_FOUNDDiesen Endpunkt gibt es nicht.Pfad und Methode prüfen.
404ORDER_NOT_FOUNDZu dieser Kennung gibt es in Ihrem Konto keinen Auftrag und keine Anfrage.Kennung prüfen. Sandbox und Echtbetrieb sind getrennt.
404DOCUMENT_NOT_FOUNDDieses 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.
404QUOTE_NOT_FOUNDZu 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.
404QUOTE_DOCUMENT_NOT_FOUNDZu diesem Angebot gibt es (noch) kein PDF — in der Sandbox nie.Warten, bis das Angebot vorliegt (OFFERED); in der Sandbox gibt es keine Dokumente.
404SUBSCRIPTION_NOT_FOUNDDiesen Webhook-Endpunkt gibt es in der Umgebung des Zugangs nicht.Kennung und Umgebung (Test- oder Live-Schlüssel) prüfen.
409IDEMPOTENCY_KEY_REUSEDDerselbe Idempotency-Key — oder dieselbe externalOrderId — kam mit anderem Inhalt. Hat der Schlüssel schon vor mehr als 24 Stunden einen Auftrag angelegt, nennt existing diesen Auftrag (kind, id, Nummer).Für einen neuen Auftrag einen neuen Schlüssel verwenden; denselben nur für Wiederholungen.
409IDEMPOTENCY_REQUEST_IN_PROGRESSDer erste Aufruf mit diesem Schlüssel läuft noch.Nach Retry-After Sekunden wiederholen.
409EXTERNAL_ORDER_ID_EXISTSUnter dieser externalOrderId liegt schon ein Auftrag oder eine Anfrage. existing nennt ihn: kind, id und die Nummer.Den vorhandenen Vorgang abfragen, statt einen zweiten anzulegen.
409NO_CONTRACTING_PARTYFür Ihr Konto ist kein Auftraggeber (kaufmännischer Ansprechpartner) hinterlegt.Uns kontaktieren — das ist eine Lücke in der Einrichtung.
409ORDER_NOT_CHANGEABLEAb 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.
409ORDER_NOT_CANCELLABLEAb 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.
409REQUEST_HAS_QUOTEZu dieser Anfrage liegt schon ein Angebot vor.Das Angebot ablehnen (POST /quotes/{id}/decline), statt die Anfrage zurückzuziehen.
409QUOTE_NOT_OFFEREDZu 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).
409QUOTE_VERSION_MISMATCHAngeboten ist eine andere Fassung als die genannte (nachverhandelt). currentVersion nennt die aktuelle.Die aktuelle Fassung lesen und, wenn sie passt, diese annehmen.
409QUOTE_EXPIREDDie Gültigkeit des Angebots ist abgelaufen.Ein neues Angebot anfordern (POST /quotes).
409QUOTE_ALREADY_DECIDEDÜber das Angebot ist schon entschieden — angenommen, abgelehnt oder zurückgezogen. quoteStatus nennt den Stand.Den Stand mit GET /quotes/{id} abfragen; nach einer Annahme steht der Auftrag in order.
409SANDBOX_FINISHEDNur Sandbox: das Szenario dieses Vorgangs ist durchgelaufen.Einen neuen Testvorgang anlegen.
409TOO_MANY_SUBSCRIPTIONSHöchstens zehn Webhook-Endpunkte je Umgebung.Einen nicht mehr gebrauchten Endpunkt löschen.
413PAYLOAD_TOO_LARGEDer Rumpf ist zu groß.Freie Daten kürzen (metadata, instructions).
415UNSUPPORTED_MEDIA_TYPEZeichensatz oder Kodierung des Rumpfs kennen wir nicht — etwa charset=iso-8859-1 oder Content-Encoding: br.JSON in UTF-8 senden — unkomprimiert oder mit gzip bzw. deflate.
422VEHICLE_NOT_DRIVEABLEDRIVEN, aber das Fahrzeug ist nicht fahrbereit oder nicht verkehrssicher.TRAILER oder TRUCK wählen — oder die Angabe zum Fahrzeug prüfen.
422SERVICE_NOT_SUPPORTEDEine Leistung, die LOGICAR nicht anbietet (Ausfuhrkennzeichen, Zoll).Die Leistung weglassen und selbst beauftragen.
422SERVICE_NOT_APPLICABLEDie Leistung passt nicht zum Auftrag, etwa ein Kurzzeitkennzeichen für einen Transport auf dem Lkw. Ein Kurzzeitkennzeichen gibt es außerdem nur für Privatkunden (ein selbst registriertes Konto ohne Firmennamen) und nur mit requestedPickup mindestens 7 Tage im Voraus — das gilt auch bei der Annahme eines Angebots (POST /quotes/{id}/accept). service und reason nennen Leistung und Grund.Die Leistung weglassen — bei einem Angebot eine neue Fassung bei LOGICAR anfordern.
422TRANSPORT_TYPE_NOT_ALLOWEDIhre Vereinbarung lässt diese Transportart nicht zu.Eine vereinbarte Transportart wählen oder die Vereinbarung erweitern lassen.
429RATE_LIMITEDZu viele Anfragen mit diesem Zugang — oder zu viele abgewiesene Anmeldungen von Ihrer Adresse. limit und windowSeconds nennen die Grenze.Nach Retry-After Sekunden wiederholen.
429SANDBOX_LIMITNur Sandbox: das Tageslimit an Testvorgängen ist erreicht.Am nächsten Tag weiter testen oder uns um ein höheres Limit bitten.
500INTERNAL_ERRORUnerwarteter 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.
503MAINTENANCELOGICAR wird gewartet. maintenanceMessage und estimatedResumption nennen Anlass und erwartetes Ende, wenn bekannt.Später wiederholen — steht Retry-After im Kopf, nach so vielen Sekunden.
503NUMBER_COLLISIONNur Sandbox: bei der Vergabe der Nummer kam ein gleichzeitiger Aufruf dazwischen.Unverändert erneut senden.

Die bisherige Schnittstelle hat ihr eigenes Format und ihre eigenen Codes.

#Eingabefehler im Einzelnen

Bei INVALID_REQUEST nennt errors jedes beanstandete Feld — alle auf einmal, nicht nur das erste. Felder im Rumpf stehen als JSON Pointer (RFC 6901) in pointer, geschrieben wie im Beispiel von RFC 9457 mit führendem #; Parameter in Pfad oder Abfrage stehen mit ihrem Namen in parameter. code ist die Art des Fehlers:

http
HTTP/1.1 400 Bad Request
Content-Type: application/problem+json; charset=utf-8
X-Request-Id: 0e6a5b8c-3f1d-4d2a-9c7e-5b4a3f2e1d0c
json
{
  "type": "https://docs.logicar.cloud/api/fehler#invalid-request",
  "title": "The request is not valid",
  "status": 400,
  "detail": "The request is invalid. See errors.",
  "instance": "/api/v1/extern/orders",
  "code": "INVALID_REQUEST",
  "requestId": "0e6a5b8c-3f1d-4d2a-9c7e-5b4a3f2e1d0c",
  "errors": [
    { "pointer": "#/pickup/postalCode", "code": "invalid_type", "detail": "Invalid input: expected string, received undefined" },
    { "pointer": "#/vehicle/vin", "code": "invalid_format", "detail": "A VIN has 17 characters: letters and digits, no I, O or Q." },
    { "pointer": "#/pickup/zip", "code": "unrecognized_key", "detail": "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). Ein Eintrag der Liste GET /orders?limit=500 sähe so aus: { "parameter": "limit", "code": "too_big", "detail": "…" }.

Fachliche Absagen (422) haben dieselbe Form: code und detail des Problems sind die des ersten Grundes, errors nennt jeden Grund mit seinem eigenen Code und dem Feld (Beispiel).

#Token-Endpunkt

POST /oauth/token antwortet nach OAuth 2.0 (RFC 6749) mit error und error_description als application/json — so lesen es OAuth-Bibliotheken. Daneben stehen dieselben Felder wie in jedem Problem; code ist dort der Code von OAuth. Mehr unter Anmeldung.

HTTPerrorBedeutung
400invalid_requestgrant_type fehlt, oder die Anmeldung steht zugleich im Kopf (Basic) und im Rumpf.
400unsupported_grant_typeNur client_credentials ist möglich.
401invalid_clientClient-Kennung oder Secret falsch — oder der Zugang ist widerrufen, abgelaufen oder gesperrt. Welche Hälfte nicht stimmte, sagen wir absichtlich nicht.
400unauthorized_clientDas Konto ist gesperrt, kein Auftraggeber-Konto oder für den Echtbetrieb der API v1 nicht freigeschaltet.
400invalid_scopeEin angefragtes Recht hat der Zugang nicht — oder er hat gar keines.

Absagen, die nicht vom Token-Endpunkt selbst kommen, haben dort dieselbe Form; code ist dann der Code aus der Tabelle oben:

FallHTTPerrorcode
Zu viele Token-Abrufe, zu viele abgewiesene Anmeldungen oder zu viele Anfragen von Ihrer Adresse429invalid_requestRATE_LIMITED
Anfragen von Ihrer Adresse gesperrt403invalid_requestIP_BLOCKED
Rumpf unlesbar oder zu groß400, 413, 415invalid_requestINVALID_JSON, INVALID_REQUEST, PAYLOAD_TOO_LARGE, UNSUPPORTED_MEDIA_TYPE
Wartung503temporarily_unavailableMAINTENANCE
Fehler auf unserer Seite500server_errorINTERNAL_ERROR

#Grenzen

WasGrenzeAnmerkung
Anfragen je Zugang600 je Minutedarüber 429 mit Retry-After; RateLimit-* zeigt den Spielraum
Spitzen je Zugang50 je Sekundeauch innerhalb der Minutengrenze
Token-Abrufe30 je Minuteje client_id; ein Token gilt 1 h
Abgewiesene Anmeldungen je Adresse30 je Minuteschützt vor dem Raten von Schlüsseln
Webhook-Endpunkte10 je UmgebungEchtbetrieb und Sandbox getrennt
Antwortzeit Ihres Webhook-Endpunkts10 sdanach gilt der Versuch als gescheitert
Zeitstempel einer Webhook-Nachricht± 5 minältere Nachrichten verwerfen
Textfelder500 ZeichenexternalOrderId und Idempotency-Key: 200
Sandbox: Vorgänge500 je Tagje Mandant
Sandbox: automatischer Schrittalle 20 smit X-Sandbox-Mode: manual von Hand
Sandbox: Aufbewahrung30 Tagedanach 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.