Logistivo CLI: Steuern Sie Ihren Logistikbetrieb aus dem Terminal und aus Ihrem ERP
Ein einziger Befehlskatalog speist drei Oberflächen: den Terminal-Client lg, den KI-Assistenten im Dashboard und den Kanal, über den sich externe KI-Assistenten verbinden. Eine Fähigkeit wird einmal geschrieben und erscheint in allen dreien – und für jede schreibende Aktion im Panel gibt es jetzt einen Befehl, sodass Ihre Skripte und Ihre eigenen KI-Agenten die Arbeit erledigen können, die Ihr Team am Bildschirm erledigt. Zahlungen, rechtliche Einwilligungen und die Kontoschließung bleiben bewusst im Browser. Diese Seite ist ein Vertrag. Die Befehlstabelle unten ist nicht von Hand geschrieben; sie wird bei jeder Anfrage aus dem Live-Befehlsregister erzeugt.
Was ist die Logistivo CLI?
Die Logistivo CLI (lg) ist ein Kommandozeilen-Client, der die Arbeit in Ihrem Logistivo-Konto – Ladungen und Touren, Transportanfragen, Angebote und Ausschreibungen, Flotte und Fahrer, Dokumente, Kontakte und Kontokorrente, Rechnungen und Buchhaltung, Lager und Bestand, Teammitglieder und Zolltarife – aus einem Terminal, einem Skript oder Ihrem eigenen KI-Agenten heraus erledigt. Die Befehle sind nicht fest in den Client eingebaut: Der Client lädt den Befehlskatalog vom Server und baut sich daraus selbst auf. Dieselben Befehle lassen sich ohne jede Installation über HTTP aufrufen – das ist der Weg, den ERP- und CRM-Integrationen nutzen – sowie über den MCP-Kanal, über den sich externe KI-Assistenten verbinden.
Eine einzige Befehlsform: lg --parameter=value. Der Katalog umfasst heute 519 Befehle in 125 Domänen; die längste Liste, die eine einzelne Rolle sieht, umfasst 452 Befehle in 112 Domänen.
Für jede schreibende Aktion im Panel gibt es einen Befehl – gemessen an den schreibenden Endpoints des Panels sind 100 % der Endpoints im Geltungsbereich abgedeckt. Zahlungen (3D Secure), rechtliche Einwilligungen und die Kontoschließung bleiben bewusst im Browser; für diese Fälle liefert ein Befehl stattdessen einen Link.
Befehle, die ein Dokument oder ein Foto entgegennehmen, funktionieren auch außerhalb des Browsers: Schreiben Sie --attachment_uuid=@./cmr.pdf, und lg lädt die Datei zuerst hoch; über HTTP laden Sie nach /api/common/commands:upload hoch und übergeben die zurückgegebene attachment_uuid.
Integrationsschlüssel tragen eine Zugriffsstufe: employee (Standard für neue Schlüssel) für das Tagesgeschäft, manager für Team, Einstellungen, Schlüssel und Geld. Ein Schlüssel hat nie mehr Rechte als die Person, für die er handelt.
Flags werden nie erfunden: Jedes Flag ist ein Parametername aus dem JSON Schema des jeweiligen Befehls, und von dort stammen auch sein Typ und die Angabe, ob es Pflicht ist.
Schreibende Befehle fragen nach einer Bestätigung; irreversible laufen nie ohne sie (HTTP 409, CLI-Exit-Code 4).
Wiederholungen erzeugen keine Duplikate: Ein Aufruf mit einem idempotency_key läuft höchstens einmal.
Jede Ausführung landet in einem einzigen Audit-Protokoll – ob sie aus einem Terminal, aus dem Chat oder von einem Assistenten kam, ist dokumentiert.
Was heute live ist und was noch kommt
Dieser Abschnitt steht absichtlich ganz oben auf der Seite. Der teuerste Fehler, den ein Integrationsdokument machen kann, ist, einen Endpoint, der noch nicht offen ist, so zu beschreiben, als wäre er es: Der Integrator schreibt den Code, der Endpoint liefert 404, und das Vertrauen kehrt nicht zurück.
Weil der Vertrag eingefroren ist, funktioniert der Integrationscode, den Sie heute schreiben, weiter, während die übrigen Teile öffnen. Felder, die Sie nicht kennen, müssen ignoriert werden; genau diese Regel erlaubt es uns, Neues hinzuzufügen, ohne etwas zu brechen.
Befehlskatalog und Identitätstabelle — Die öffentliche Domäne/Verb-Identität jedes Befehls ist eingefroren, und die Vertragsversion wird in jeder Katalogantwort und im Header X-Contract-Version als 1 veröffentlicht. Die Tabelle auf dieser Seite wird aus dem Live-Register erzeugt: Ein auf dem Server hinzugefügter Befehl erscheint hier von selbst, und ein entfernter verschwindet.
Discovery-Endpoint ohne Authentifizierung — GET /api/public/cli/catalog – Befehlsnamen, Domäne/Verb-Identität, Beschreibung, JSON-Schema-Parameter, Schranken-Flags und die Versionierungsfelder (since, deprecated_at, replaced_by, aliases). Keine Authentifizierung: Ein Token zu erstellen ist ein Schritt, der NACH der Integrationsentscheidung kommt, nicht davor. Die Antwort enthält überhaupt keine Mandantendaten.
Authentifizierte Katalog- und Ausführungs-Endpoints — GET /api/common/commands, GET /api/common/commands/{name} und POST /api/common/commands/{name}. Rollenschranke, Bestätigungsschranke, Idempotenz und Audit-Protokoll liegen an einem einzigen Durchsetzungspunkt, den auch der Chat und das Terminal durchlaufen.
Panel-Abdeckung: Für jede schreibende Aktion gibt es einen Befehl — 519 Befehle in 125 Domänen, abgeglichen mit den schreibenden Endpoints des Panels: Hinter jedem Endpoint im Geltungsbereich steht ein Befehl (ein Spiegel des Endpoints oder derselbe gemeinsame Service), und keiner ist unbelegt. Bewusst außerhalb des Geltungsbereichs: Zahlungen mit 3D Secure, rechtliche Einwilligungen, Kontoschließung und Anmeldung, die im Browser bleiben; die Verwaltung von Schlüsseln, Webhooks und Sandbox, die über integrierte lg-Befehle läuft; sowie die eigenen Endpoints der Fahrer-App.
Preflight (dry_run): sehen, ohne auszuführen — Mit dry_run: true im Request-Body läuft der Befehl nicht: Validierung, Rollen-/Scope-Schranke, Zielauflösung und Credit-Berechnung werden ausgeführt, und eine Vorschau kommt zurück; nichts wird geschrieben, kein Credit wird ausgegeben, und der Idempotency Key wird nicht verbraucht. Auch der Batch-Endpoint akzeptiert es, pro Batch. Ein Preflight erreicht nie den Handler des Befehls; bei der Einführung erzeugten 178 Preflights über alle damals im Katalog vorhandenen schreibenden Befehle keine einzige schreibende Anweisung.
Integrationsschlüssel — API-Schlüssel, die im Namen eines echten Teammitglieds handeln, ausgestellt im Panel oder mit lg keys create: Scope read/write, eine Zugriffsstufe (standardmäßig employee, oder manager), Laufzeit, letzte Nutzung, Rotieren, Übertragen und Widerrufen. lg login --api-key, lg whoami und ein serverseitig widerrufendes lg logout bauen darauf auf.
Sandbox – Schreibvorgänge proben, ohne die Produktion anzutasten — Ein separater Sandbox-Mandant pro Unternehmen mit demselben Befehlskatalog; er wird per Self-Service eröffnet und stellt seinen eigenen Schlüssel aus. Credits, Marktplatz und Webhook-Routing sind zwischen den beiden Umgebungen getrennt; die Umgebung wird aus dem Unternehmen des Schlüssels abgeleitet und kann nicht mit der Anfrage mitgegeben werden.
Versionierung, Fehlertaxonomie, Idempotenz und Rate Limits — Befehle tragen since / deprecated_at / replaced_by / aliases, und ein veralteter Befehl antwortet mit einem Header X-Deprecated. Geschäftliche Fehler tragen neben dem error_code der Transportebene einen stabilen error_key, und das Wörterbuch dieser Fehlerschlüssel wird im Katalog veröffentlicht. Idempotency Keys gelten pro Unternehmen, sind an einen Befehl gebunden und 24 Stunden gesperrt. Rate Limits gelten pro Token, in drei Buckets, und jede 429 trägt Retry-After.
Ausgehende Webhooks: ein POST, wenn etwas passiert — Signierter Push ist für 13 Ereignisse live. Abonnements werden im Panel oder mit lg webhooks verwaltet; die Signatur trägt ihren eigenen Zeitstempel, der Wiederholungsplan lautet 60 · 300 · 1800 · 7200 · 21600 Sekunden, und der Grund für eine Stummschaltung wird immer festgehalten. Hinter jedem Ereignisnamen steht eine Event-Klasse, die tatsächlich ausgelöst wird – nichts wird angekündigt und dann nie gesendet. Die Pull-Schiene (updated_since + cursor) wurde nicht entfernt: Push kam daneben hinzu, nicht an ihre Stelle.
Befehle, die Dateien entgegennehmen — 33 Befehle nehmen ein Dokument oder ein Foto entgegen – einen CMR, eine Rechnung, einen Fahrzeugschein, Palettenfotos. Laden Sie einmal nach POST /api/common/commands:upload hoch oder überlassen Sie das lg mit --attachment_uuid=@./file.pdf, und übergeben Sie die zurückgegebene attachment_uuid; MCP-Clients nutzen das Tool upload_attachment. Der Dateityp wird aus dem Inhalt erkannt, und ein Upload bleibt 24 Stunden nutzbar.
Der Terminal-Client lg — Auf npm unter der MIT-Lizenz veröffentlicht: Installieren Sie ihn mit `npm install -g @lgstv/lg` oder führen Sie ihn ohne Installation über `npx @lgstv/lg` aus. Er ist eine einzelne Datei ohne Abhängigkeiten, und weil die HTTP-Oberfläche offen ist, können Sie auch ohne ihn integrieren. Er meldet sich mit einem Freigabecode an, den Sie im Browser bestätigen, bleibt danach angemeldet und erneuert seine Sitzung selbstständig; er lädt lokale Dateien für Sie hoch (@path, --file, lg upload), verwaltet Integrationsschlüssel (lg keys), nimmt nie ein Geheimnis über die Befehlszeile entgegen, beachtet Retry-After, wiederholt 5xx mit demselben Idempotency Key und warnt bei veralteten Befehlen und neueren Vertragsversionen.
Inkrementeller Sync: Cursor-Paginierung und updated_since — Der Vertrag unten (limit + opaker, signierter cursor, next_cursor, updated_since) steht fest und wird schrittweise auf die Listenbefehle ausgerollt. Solange ein bestimmter Listenbefehl cursor und updated_since nicht in seinem JSON Schema ausweist, behandeln Sie ihn als kleines Fenster: Obergrenze 20 Zeilen, kein Cursor.
Was den Unterschied macht: Der Client kennt keine Befehle – er baut sie aus dem Katalog auf
Das ist die eine Entscheidung, die dem Rest dieser Seite ihren Sinn gibt. In einer gewöhnlichen CLI leben die Befehle im Client; bei Logistivo leben sie auf dem Server.
In der klassischen Anordnung braucht der Client eine neue Version, sobald der Server eine Fähigkeit hinzugewinnt, und der Nutzer muss sie installieren. Dazwischen wissen beide Seiten Unterschiedliches – und das ist der leiseste Fehlermodus bei Integrationen: Das Skript läuft, der Exit-Code ist 0, und der Befehl beschreibt schlicht nicht, was der Server kann.
Bei Logistivo ist die Definition eines Befehls ein einziger Datensatz: sein Name, was er tut, seine JSON-Schema-Parameter, welche Rollen ihn sehen dürfen, ob er eine Bestätigung braucht und ob seine Wirkung umkehrbar ist. Beim Start lädt lg diesen Katalog und erzeugt daraus seinen Hilfetext, seine Flags und seine Eingabevalidierung. Sobald auf dem Server ein Befehl hinzukommt, kennt lg ihn – ohne Client-Update.
Derselbe Katalog speist den KI-Assistenten im Dashboard und den Kanal, über den sich externe KI-Assistenten verbinden. Eine Fähigkeit wird einmal geschrieben und erscheint an drei Stellen – und alle drei durchlaufen dieselbe Rollenschranke, dieselbe Bestätigungsschranke und dasselbe Audit-Protokoll. Es gibt kein separates Inventar an CLI-Befehlen; gäbe es eines, würden die drei Oberflächen binnen sechs Monaten unbemerkt auseinanderlaufen.
Keine Versionsdrift — Die Befehlsliste, die der Client kennt, ist konstruktionsbedingt die Liste, die der Server hat. „Welche lg-Version hat diesen Befehl?“ ist eine Frage, die es nicht gibt.
Flag-Namen werden nie geraten — Die Flags eines Befehls sind genau die Parameternamen in seinem JSON Schema. Um zu erfahren, was ein Befehl akzeptiert, liest man kein Dokument, sondern den Katalog – und der Katalog ist immer aktuell.
Ihre CLI ist so groß wie Ihr Konto — Der Katalog ist nach Rollen gefiltert: Ein Befehl, den Ihre Rolle nicht sehen kann, erscheint nie in Ihrer Liste. Ein Frachtführer-Konto sieht 452 Befehle, ein Verlader 448, ein Zolldienstleister 312 und ein Affiliate-Konto (Empfehlungspartner) einen eigenen Satz von 55 Befehlen.
Die Dokumentation kann nicht hinterherhinken — Die Befehlstabelle auf dieser Seite stammt aus demselben Register. Es gibt nirgends eine Liste, die ein Mensch mit der Wirklichkeit synchron halten muss.
Die Namensregel – wie Befehlsnamen wachsen
Der Katalog wird wachsen. Neue Befehle werden nicht ad hoc benannt; es gelten sechs Regeln. Wir veröffentlichen sie hier, weil dies die Namen sind, die Ihre Integration jahrelang schreiben wird, und weil ihre Vorhersagbarkeit für Sie einen Wert hat.
Eine Domäne ist eine Entität im Plural — loads, demands, invoices, export-documents. Domänen aus zwei Wörtern stehen in kebab-case. Die einzige Ausnahme ist ein unzählbares Nomen: stock wird nie in den Plural gesetzt, weil „stocks“ im Englischen etwas anderes (Aktien) bedeutet.
Alle Verben einer Entität leben in einer Domäne — loads trägt jedes Verb, das auf eine Ladung wirkt: create, list, get, update, set-status, assign-driver, list-problems, archive und weitere. Für jedes Verb eine neue Domäne zu eröffnen (load-statuses, load-drivers), würde Nutzer dieselbe Entität an drei Stellen suchen lassen.
Das Verb sickert nie in die Domäne; die Domäne ist das, was sich ÄNDERT — Einen Fahrer zuzuweisen ändert die Ladung, nicht den Fahrer, deshalb heißt es lg loads assign-driver. Das indirekte Objekt (-driver) hängt am Verb, nie an der Domäne.
Eine Unterressource bekommt nie eine eigene Domäne — Eine Rechnungsposition und ein Dokumentposten lassen sich nicht eigenständig auflisten; sie werden über ihren Besitzer angesprochen – lg invoices add-line, lg export-documents add-item. Ein einziger Test entscheidet: Wenn Sie das Ding nicht unabhängig auflisten oder abrufen können, ist es keine Domäne.
Eingrenzen ist ein Flag, kein neues Verb — lg fleet-documents list --days=30 ist korrekt; es gibt kein separates Verb „list-expiring“, weil das Zeitfenster bereits ein Parameter ist. Ein qualifiziertes Verb wird nur verwendet, wenn die zurückgegebenen Zeilen nicht die Entität der Domäne sind: loads list-problems liefert Problemmarkierungen, keine Ladungen.
Das Paar (Domäne, Verb) ist im gesamten Katalog eindeutig — Selbst bei zwei Befehlen, deren Rollen sich nie überschneiden. Bekämen zwei Befehle dasselbe Paar, würde Ihr Integrationscode auf einen einzigen Namen schauen, während die CLI je nachdem, wer sie aufruft, unterschiedliche Dinge ausführt.
Abdeckung: alles im Panel, per Befehl
Viele Teams binden Logistivo an ihren eigenen KI-Agenten oder ihr eigenes Automatisierungs-Harness an, und ein Agent ist nur nützlich, wenn er die Arbeit zu Ende bringen kann. Deshalb gilt eine einfache Regel: Was ein Büronutzer im Panel ändern kann, kann auch ein Befehl ändern – hinter derselben Rollenschranke, derselben Bestätigungsschranke und demselben Audit-Protokoll.
Das ist gemessen, nicht behauptet. Jeder schreibende Endpoint hinter dem Panel wird mit dem Befehlsregister abgeglichen, und ein Endpoint gilt nur dann als abgedeckt, wenn ein Befehl ihn als seinen HTTP-Spiegel deklariert oder denselben gemeinsamen Service aufruft. Von den schreibenden Endpoints im Geltungsbereich sind 100 % abgedeckt, und keiner ist unbelegt. Jeder ausgelassene Endpoint trägt eine schriftliche Begründung – Identitäts- und Zahlungsschritte, die Control Plane der Integration, die eigenen Endpoints der Fahrer-App, Client-Telemetrie, tote Kopien ohne Aufrufer –, und diejenigen, die für einen Integrator relevant sind, sind unten aufgeführt.
Befehle, die eine Datei entgegennehmen, fallen unter dieselbe Regel: 33 Befehle in der Tabelle nehmen ein Dokument oder ein Foto entgegen, und alle funktionieren aus lg, über HTTP und über MCP (siehe Befehle, die Dateien entgegennehmen).
Auch Verwaltungsarbeit ist abgedeckt, hinter einem stärkeren Schlüssel: 62 Befehle in der Tabelle – Teammitglieder und Rollen, Unternehmenseinstellungen, Bankkonten, gespeicherte Karten, Integrationsschlüssel – brauchen einen Integrationsschlüssel der Stufe manager. Ein Schlüssel der Stufe employee, der Standard, erledigt das Tagesgeschäft und wird bei diesen Befehlen mit INSUFFICIENT_KEY_LEVEL abgelehnt.
Affiliate-Konten (Empfehlungspartner) haben einen eigenen Katalog: 55 Befehle in 20 Domänen – Empfehlungen, Leads, CRM-Notizen und Aufgaben, Vertriebspräsentationen, Erträge und Auszahlungen sowie die Konto- und Teambefehle, die jede Rolle hat. Die reinen Affiliate-Befehle stehen nicht in der öffentlichen Tabelle unten, die die drei Panel-Rollen auflistet; ein Affiliate-Konto sieht sie in GET /api/common/commands und in lg commands. Ein Unternehmen, das sowohl Affiliate als auch Verlader, Frachtführer oder Zolldienstleister ist, sieht beide Sätze.
Ein Agent sollte mit lg users get beginnen (API-Name get_current_user): Der Befehl liefert die Rolle, die Zugriffsstufe des verwendeten Schlüssels, die effektiven Berechtigungen und ob gerade eine ausstehende rechtliche Bestätigung oder eine nicht verifizierte Telefonnummer Schreibvorgänge blockiert – so kann der Agent eine Ablehnung vorhersagen, statt sie zu sammeln.
Die Abdeckung wird durch einen Bericht gemessen, der das Befehlsregister mit den schreibenden Endpoints des Panels vergleicht; ein Panel-Endpoint, der ohne Befehl hinzukommt, erscheint darin als unbelegt. Wenn Sie eine Panel-Aktion finden, die Sie nicht per Befehl erreichen, melden Sie sie dem Support.
1. Nach dem Link fragen — Arbeit, die in der eigenen Browsersitzung der Person stattfinden muss, ist kein Befehl, aber die Befehlsoberfläche kennt sie. lg handoff-links generate (API-Name get_browser_handoff_link) liefert einen logistivo.com-Link für die Zwecke, die Ihre Rolle erlaubt: package_purchase, payment_cards, legal_documents, integration_keys, affiliate_demo_accounts und account_close. Das ist kostenlos, schreibt nichts, und der Link trägt kein Geheimnis – die Person meldet sich wie gewohnt an.
2. An die Person übergeben — Zeigen Sie dem Benutzer den Link oder senden Sie ihn über Ihren eigenen Kanal. Er schließt den Schritt dort ab: die Vertragsbestätigung und die Zahlung mit 3D Secure für ein Paket, das Hinzufügen einer Karte, die Bestätigung ausstehender Rechtstexte, die Ausstellung eines API-Schlüssels, dessen Secret einmal angezeigt wird, oder die Schließung des eigenen Kontos.
3. Das Ergebnis per Befehl lesen — Ist der Schritt erledigt, ist sein Ergebnis wieder für Befehle sichtbar: das Paket und das Credit-Guthaben, die gespeicherte Karte (maskiert, nur die letzten vier Ziffern), der neue Schlüssel in der Schlüsselliste. Ein Agent nimmt nie eine Kartennummer, eine Zahlung oder eine Einwilligung in einem Chat entgegen.
Zahlungen und 3D Secure — Ein Paket zu kaufen oder hochzustufen und eine Karte hinzuzufügen erfordert 3D Secure im Browser. Befehle listen Pakete und Preise auf, lesen das Guthaben und seinen Verlauf, listen gespeicherte Karten (maskiert) auf, legen die Standardkarte fest und entfernen eine Karte; der Kauf selbst läuft über den Übergabelink.
Rechtliche Einwilligung — Rechtstexte bestätigt die Person selbst, im Browser. lg users get sagt Ihnen, dass eine Bestätigung aussteht; kein Befehl kann sie erteilen.
Kontoschließung, Anmeldung und Passwort — Das eigene Konto zu schließen, sich anzumelden und ein Passwort zu ändern sind Identitätsschritte und bleiben im Browser. lg user-accounts preview zeigt, was die Schließung des Kontos bedeuten würde, ohne sie durchzuführen.
Integrationsschlüssel, Webhooks und die Sandbox — Ihre Verwaltung gibt Secrets zurück, die einmal angezeigt werden müssen, und zwar in Ihrem Terminal; deshalb sind sie integrierte lg-Befehle (lg keys, lg webhooks, lg sandbox) über eigene HTTP-Endpoints statt Katalogbefehle. Der Katalog enthält nur die beiden geheimnisfreien Schlüsselbefehle: integration-keys list und integration-keys revoke.
Der Assistenten-Chat im Dashboard — Integrationsschlüssel können den KI-Assistenten-Chat im Dashboard nicht steuern; einen Lauf mit einem Schlüssel zu starten oder fortzusetzen, wird mit 403 beantwortet. Ein Agent verbindet sich stattdessen über die Befehls-Endpoints, lg oder den MCP-Kanal – dort läuft jeder Befehl auf der Zugriffsstufe des Schlüssels, und seine Schreibvorgänge werden als Integrations-Schreibvorgänge protokolliert.
Die Fahrer-App — Fahrerkonten haben keinen Befehlskatalog, und die Fahrer-App behält ihre eigenen Endpoints. Büronutzer verwalten Fahrer, deren Dokumente, Ausgaben und Touren über Befehle.
Installation und Identität
lg ist ein Node-Skript aus einer einzigen Datei ohne Abhängigkeiten (Node 18+), auf npm als @lgstv/lg veröffentlicht. Das Paket installiert zwei identische Befehle, lg und logistivo – verwenden Sie logistivo, falls lg auf Ihrem Rechner bereits ein Alias ist. Weil es nur eine Datei ist, funktioniert es auch, lg.mjs auf den ERP-Server eines Kunden zu kopieren. Für eine ERP/CRM-Integration brauchen Sie den Client nicht – dieselben Befehle sind über HTTP verfügbar.
1. Installieren — Node 18 oder neuer ist alles, was Sie brauchen; weitere Abhängigkeiten gibt es nicht. Installieren Sie das Paket global oder führen Sie es ohne Installation über npx aus.
2. Mit einem Freigabecode anmelden — lg login zeigt einen kurzen Freigabecode an und öffnet logistivo.com/connect in Ihrem Browser; über SSH, in CI oder mit --no-browser gibt der Befehl nur die Adresse aus, die Sie auf jedem Gerät öffnen können, auch auf Ihrem Smartphone. Melden Sie sich dort wie gewohnt an, prüfen Sie, dass der Code auf der Seite derselbe ist wie in Ihrem Terminal, wählen Sie Nur-Lese-Zugriff oder Lese- und Handlungszugriff und geben Sie die Anmeldung frei. Nichts Geheimes wird im Terminal eingegeben: kein Passwort, kein Schlüssel, kein Einmalcode. Die Sitzung bleibt danach auf diesem Computer angemeldet – das Schließen des Terminals meldet Sie nicht ab, und lg erneuert das Zugriffstoken selbstständig, bevor es abläuft. lg logout beendet die Sitzung auch auf dem Server, und Sie können sie im Panel unter Settings › Integration keys › AI and CLI connections entfernen. lg login --password (E-Mail und Passwort) bleibt als Ausweichweg erhalten. Erfordert lg 0.11 oder neuer.
3. Für Server und CI: ein Schlüssel, kein Freigabecode — Auf einem Server oder in einem CI-Job ist niemand da, der einen Code im Browser freigeben könnte. Stellen Sie im Panel (Settings › Integration keys) oder mit lg keys create einen Schlüssel aus – optional im Namen eines eigens dafür angelegten Teammitglieds mit eng gefassten Rechten – und legen Sie ihn in LOGISTIVO_TOKEN ab oder speichern Sie ihn mit lg login --api-key. Solange die Variable gesetzt ist, wird die Konfigurationsdatei nie gelesen. Details: Abschnitt „Verbindung mit einem API-Schlüssel“.
4. Prüfen und den Katalog erkunden — lg commands listet jeden Befehl, den Ihre Rolle sehen kann, nach Domänen gruppiert; lg help gibt die Verben dieser Domäne aus, und lg help die vollständige Parameterliste eines Befehls mit Typen und der Angabe, welche Parameter Pflicht sind. Nichts von diesem Text steckt im Client – alles kommt aus dem Katalog. Denken Sie daran, dass die Liste von Ihrer Rolle abhängt: Die Verben einer Domäne sind für einen Frachtführer und einen Verlader nicht dieselben (loads set-status zum Beispiel gibt es nur im Katalog des Frachtführers). Fehlt ein Verb, prüfen Sie Ihre Rolle, bevor Sie Ihre Installation prüfen.
Legen Sie den Schlüssel nie in die Versionskontrolle, ein CI-Log oder ein Chatfenster. Haben Sie sich mit einem Freigabecode oder einem Integrationsschlüssel angemeldet, beendet lg logout die Anmeldung auch auf dem Server; in einer Passwortsitzung (lg login --password) löscht der Befehl nur die LOKALE Kopie und sagt das ausdrücklich. Das Audit-Protokoll speichert Ihre Argumente, maskiert aber jedes Feld, dessen Name token, password, IBAN, card oder OTP enthält, als ***, ebenso jeden Parameter, den ein Befehl als geheim deklariert.
LOGISTIVO_TOKEN — Persönliches Zugriffstoken. Solange es gesetzt ist, wird die Konfigurationsdatei nie gelesen – das ist der bevorzugte Weg in CI und auf Servern.
LOGISTIVO_BASE_URL — Server-Root. Standard ist https://logistivo.com. Ändern Sie den Wert nur, wenn Sie auf Ihre eigene Umgebung zeigen; das Flag --base-url tut dasselbe für einen einzelnen Befehl.
LOGISTIVO_HOME — Verzeichnis für die Konfigurationsdatei und den Katalog-Cache. Standard ist ~/.logistivo. Trennen Sie es, wenn Sie auf einem Rechner mit zwei Konten arbeiten.
LOGISTIVO_PROFILE — Mit welchem Profil ausgeführt wird. `lg profile use` ist die dauerhafte Wahl; diese Variable gilt für einen einzelnen Lauf und ist der kürzeste Weg, in CI zwischen einem Live- und einem Sandbox-Profil zu wechseln. Ein unbekannter Profilname wird nicht stillschweigend ignoriert – er führt zu einem Fehler.
NO_COLOR — Wenn gesetzt, werden keine ANSI-Farben ausgegeben (die dauerhafte Form des Flags `--no-color`). Schalten Sie das für eine Brücke ein, die in eine Logdatei oder CI-Ausgabe schreibt; Farb-Escape-Sequenzen stören die Tools, die diese Logs später lesen.
Ergonomie des Clients
Diese Funktionen erleichtern die tägliche Arbeit mit dem Client `lg`. Keine von ihnen ändert den HTTP-Vertrag – überspringen Sie diesen Abschnitt, wenn Sie direkt über HTTP integrieren.
Mehrere Umgebungen und Schlüssel — Halten Sie Staging und Produktion oder Ihre Kunden- und Frachtführer-Brücken in getrennten Profilen. Die Profilliste gibt nie ein Token aus; jede Zeile zeigt den sha256-Fingerabdruck des Tokens. Der Befehlskatalog wird pro Profil, Host und Token zwischengespeichert, sodass zwei Rollen nie die Befehlsliste der jeweils anderen sehen können.
Inkrementeller Sync: lg sync — Führt die Sync-Schleife aus dem Kochbuch in einem einzigen Befehl aus: ein Watermark pro Entität, updated_since mit einem Cursor, JSONL-Ausgabe und eine Sicherheitsmarge von fünf Minuten. Verwenden Sie --full für das erste Backfill. Der Befehl ist rein lesend; ein Flag --write gibt es nicht. lg sync --list leitet die für Ihre Rolle synchronisierbaren Entitäten aus dem Katalog ab.
Fehlerbehandlung und Shell-Vervollständigung — Bei 422 benennt der Client das abgelehnte Feld als das Flag, das Sie eingegeben haben, und nennt den stabilen error_key zusammen mit der Erklärung, die der Katalog selbst dazu liefert. Bei 409 gibt er die fertige Befehlszeile mit --yes aus; bei 429 wartet er Retry-After ab. Die Shell-Vervollständigung deckt Domänen, Verben, Flags und Enum-Werte ab und funktioniert offline.
Geheime Parameter kommen nie auf die Befehlszeile — Einige wenige Befehle nehmen ein Geheimnis entgegen – die Anbindung der Buchhaltungsintegration Paraşüt zum Beispiel erfordert die Client-Zugangsdaten und das Passwort dieses Systems. lg akzeptiert einen solchen Wert nie als Flag, weil er sonst in Ihrer Shell-History und in der ps-Ausgabe landen würde: Der Client fragt ihn ohne Echo ab oder liest ihn aus ---file=PATH oder von stdin (---file=-) und hält ihn nur im Speicher. Ein Befehl, dessen Pflichtparameter geheim ist, läuft nur aus lg: Aus dem Chat, über MCP oder innerhalb von lg batch aufgerufen, wird er mit SECRET_REQUIRES_CLI abgelehnt. Das Audit-Protokoll hält den Wert immer als *** fest.
Verbindung mit einem API-Schlüssel
Ein ERP, CRM, Skript oder KI-Agent verbindet sich mit Logistivo über einen Integrationsschlüssel, der im Panel oder mit lg keys create ausgestellt wird. Der Schlüssel handelt im Namen eines echten Teammitglieds: Die Rolle dieser Person entscheidet über die Befehlsliste, die Zugriffsstufe des Schlüssels darüber, wie schwer die Arbeit sein darf, und wenn diese Person das Team verlässt, stirbt der Schlüssel mit ihr. Es gibt kein synthetisches „Servicekonto“, und es wird keines geben – die Mandantentrennung ist an den Benutzer gebunden, und eine Brücke ohne Eigentümer ist genau die Art, die jahrelang still weiterschreibt.
1. Einen Schlüssel im Panel ausstellen — Settings › Integration keys › New key. Geben Sie ihm einen Namen („ERP nightly sync“), wählen Sie Scope und Zugriffsstufe, und verkürzen Sie optional die Laufzeit. Der Schlüssel wird einmal angezeigt, nur auf diesem Bildschirm; der Server speichert ihn nicht. Verlieren Sie ihn, stellt „Rotate“ einen neuen aus – der alte wird sofort ungültig.
2. Aus dem Terminal verbinden — lg login --api-key prüft den Schlüssel, gibt Identität und Scope aus und lädt den Befehlskatalog herunter. lg whoami fragt den Server, als welcher Benutzer, in welchem Unternehmen, mit welcher Rolle und welchem Scope Sie laufen. lg logout widerruft den Schlüssel auch auf dem Server, so wie es dort auch eine mit Freigabecode geöffnete Sitzung beendet (nur das lg logout einer Passwortsitzung kann das nicht).
3. Oder reines HTTP — Der Schlüssel ist ein Zugriffstoken, das im Header Authorization: Bearer mitgesendet wird, und funktioniert direkt mit den drei Befehls-Endpoints. Auf einem Server oder in CI legen Sie ihn in LOGISTIVO_TOKEN ab; solange diese Variable gesetzt ist, wird die Konfigurationsdatei nie gelesen.
4. Oder Schlüssel aus dem Terminal verwalten: lg keys — lg keys ist der Terminal-Zwilling des Panel-Bildschirms: dieselben Endpoints, dieselbe Schranke (die Berechtigung zur Teamverwaltung und, wenn Sie mit einem Schlüssel aufrufen, ein Schlüssel der Stufe manager). create, rotate und transfer geben einmalig ein neues Token zurück: Mit --save-profile=NAME geht es direkt in ein lokales Profil und wird nie ausgegeben; andernfalls gibt der Client es einmal aus. Im Modus --json ist das Token nur enthalten, wenn Sie --show-secret hinzufügen, und ein Aufruf mit --json ohne eines der beiden Flags wird abgelehnt, bevor die Anfrage gesendet wird, sodass das Token nicht stillschweigend in der Ausgabe eines Skripts landen kann. rotate, transfer und revoke fragen nach einer Bestätigung (--yes); ein Schlüssel wird über seinen exakten Namen oder seine uuid angesprochen, nie über eine Vermutung. Die Zugriffsstufe geht unverändert auf einen rotierten oder übertragenen Schlüssel über.
Der Scope wird auf der gesamten API-Oberfläche durchgesetzt, nicht nur im Befehlskatalog: Ein rein lesender Schlüssel passiert Leseanfragen (GET/HEAD/OPTIONS), und jede andere schreibende Anfrage wird mit 403 forbidden beantwortet. Es gibt zwei bewusste Ausnahmen, und beide sind durch eine feinere Schranke geschützt: der Ausführungs-Endpoint für Befehle (die Entscheidung kommt aus dem eigenen read_only-Flag des Befehls, weil auch nicht schreibende Befehle mit POST aufgerufen werden) und ein Schlüssel, der sich selbst widerruft (lg logout, auch mit einem rein lesenden Schlüssel erlaubt). Scope, Domänenfreigaben und Zugriffsstufe sind drei unabhängige Achsen, und alle müssen passen: Ein read-Schlüssel kann selbst auf Stufe manager nicht schreiben, ein write-Schlüssel der Stufe employee kann das Team nicht verwalten, und eine Domänenfreigabe loads:write öffnet keine Verwaltungsarbeit. Stellen Sie den Schlüssel im Namen des Mitglieds mit den geringsten Rechten aus, das Ihre Anforderungen abdeckt: Die Rolle entscheidet, welche Datensätze Sie überhaupt sehen können.
read — Der Befehlskatalog und nicht schreibende Befehle (list, search, preview). Ein schreibender Befehl liefert 403 forbidden – vor der Bestätigungsschranke; ein rein lesender Schlüssel sieht nie auch nur eine 409. Die richtige Wahl für nächtlichen Sync und Reporting.
write — Jeder Befehl. Befehle, die eine Bestätigung erfordern, fragen weiterhin mit 409 danach; confirm: true (--yes in der CLI) funktioniert genau wie zuvor. Der Scope lockert die Bestätigungsschranke nie.
employee — Der Standard für jeden neuen Schlüssel. Tagesgeschäft: Ladungen, Transportanfragen, Angebote, Touren, Flotte und Flottendokumente, Dokumente, Kontakte – jeder Befehl, der keine Verwaltungsberechtigung braucht, plus die Flottenberechtigungen. Ein Befehl, der mehr braucht, antwortet mit 422, error_key INSUFFICIENT_KEY_LEVEL und required_key_level: manager; der entsprechende REST-Endpoint antwortet mit 403 und demselben Fehlerschlüssel. Die richtige Stufe für einen nächtlichen ERP-Sync, eine Telematik-Brücke oder ein Betriebsskript.
manager — Alles, was die Person, für die der Schlüssel handelt, tun darf, einschließlich Verwaltung: Teammitglieder und Rollen, Unternehmenseinstellungen, Integrationsschlüssel, Bankkonten und deren Verifizierung, gespeicherte Karten, Unternehmensbeziehungen, Affiliate-Auszahlungen. Ein manager-Schlüssel fügt nie ein Recht hinzu, das die Person nicht hat – ohne die Berechtigung zur Teamverwaltung kann er das Team trotzdem nicht verwalten. Schlüssel, die bereits vor der Einführung der Zugriffsstufen existierten, sind manager-Schlüssel und verhalten sich daher genau wie zuvor.
Ein Schlüssel pro Integration — Teilen sich CRM und ERP einen Schlüssel, heißt das eine abzuschneiden, auch das andere abzuschneiden. Geben Sie jeder Brücke ihren eigenen Schlüssel; die Liste zeigt sie ohnehin nach Namen.
Rotieren — Stellt ein neues Token aus und widerruft das alte sofort; die verbleibende Laufzeit bleibt erhalten. Nutzen Sie es bei Verdacht auf ein Leck und in regelmäßigen Abständen. Die Integration erhält 401, bis sie mit dem neuen Token aktualisiert ist.
Widerrufen — Der Schlüssel wird dauerhaft geschlossen; das lässt sich nicht rückgängig machen, stellen Sie bei Bedarf einen neuen Schlüssel aus. Wird das Mitglied, für das der Schlüssel handelt, aus dem Team entfernt oder deaktiviert, fällt der Schlüssel von selbst weg.
Laufzeit und Limit — Die Standardgültigkeit beträgt 180 Tage; Sie können sie beim Anlegen verkürzen, nie verlängern. Ein Benutzer kann höchstens 10 aktive Schlüssel haben. Der Zeitpunkt der letzten Nutzung ist in der Liste sichtbar; ein nie genutzter Schlüssel sagt das ausdrücklich.
Wer verwaltet — Ausstellen, Rotieren, Übertragen und Widerrufen steht Managern mit der Berechtigung zur Teamverwaltung offen – dieselbe Schranke wie beim Hinzufügen oder Entfernen von Teammitgliedern –, und geschieht es mit einem Integrationsschlüssel, muss dieser Schlüssel die Stufe manager haben. Ein Manager kann einen Schlüssel im Namen eines anderen Mitglieds ausstellen; für eine Brücke empfiehlt sich ein eigenes Mitglied mit eng gefassten Rechten.
Die ersten zehn Minuten: vom Panel zu Ihrem ersten Aufruf
Die teuersten Minuten einer Integration sind die ersten zehn. Die vier Schritte unten legen diesen Weg der Reihe nach dar; dieselbe Reihenfolge gibt es im Panel als Einrichtungsassistenten (Settings › Integration › Setup wizard), und der Einrichtungsassistent ruft genau die hier beschriebenen Endpoints auf. Ein Entwickler ohne Zugang zum Einrichtungsassistenten gelangt an dieselbe Stelle, indem er diesen Abschnitt liest.
Keiner der vier Schritte endet mit „ich habe es gesendet“. Ob der Schlüssel wirklich funktioniert, beantwortet das Anfrageprotokoll; ob der Webhook wirklich ankommt, beantwortet das Zustellprotokoll. Beide sind im Panel und in lg einsehbar. Eine Einrichtung, die nie gemessen wird, ist eine Einrichtung, von der man nur glaubt, dass sie funktioniert.
1. Entscheiden, was Sie tun werden – zuerst den Scope festlegen — Was ein Schlüssel sehen darf, lässt sich nicht später entscheiden: Sie wählen den Scope bei der Ausstellung. Es gibt zwei Achsen. Der grobe Scope (read / write) beantwortet nur „darf er schreiben“. Der feine Scope (Domänenfreigaben: loads:read, invoices:write) sagt, welche Domänen er berühren darf, und sobald er gesetzt ist, wird der Schlüssel fail-closed – jede Domäne, die Sie nicht ausgewählt haben, und jeder Endpoint, der keiner Domäne zugeordnet ist, liefert 403. Die Domänenliste im Panel ist keine handgeschriebene Liste; sie wird aus dem Live-Befehlskatalog Ihrer Rolle abgeleitet und zeigt, wie viele Befehle und REST-Endpoints jede Domäne öffnet. Die Endpoints für den Befehlskatalog, „wer bin ich“ (current) und „abmelden“ sind immer vom Scope ausgenommen: Ein Schlüssel muss sich immer selbst beschreiben und schließen können. Die dritte Achse ist die Zugriffsstufe: employee (der Standard) erledigt das Tagesgeschäft, manager zusätzlich Arbeit an Team, Einstellungen, Schlüsseln und Geld. Wählen Sie employee, es sei denn, die Brücke erledigt Verwaltungsarbeit.
2. Den Schlüssel ausstellen – das Token wird einmal angezeigt — Settings › Integration › New key. Geben Sie ihm einen Namen („ERP nightly sync“), wählen Sie den Benutzer, in dessen Namen er läuft, und die Zugriffsstufe, und verkürzen Sie die Laufzeit, wenn Sie möchten. Das rohe Token wird nur in dieser Antwort zurückgegeben; der Server speichert es nicht, und im Panel gibt es kein „erneut anzeigen“. Verlieren Sie es, rotieren Sie, um ein neues zu erhalten, und das alte stirbt sofort. Legen Sie das Token nie in die Versionskontrolle, ein CI-Log oder ein Chatfenster; legen Sie es in den Secret-Speicher des Zielsystems.
3. Den ersten Aufruf machen – und sehen, dass er WIRKLICH angekommen ist — Zwei Anfragen genügen. Die erste weist Ihre Identität nach (sie ist vom Scope ausgenommen und funktioniert mit jedem Schlüssel): Ist der Scope der erwartete, ist der Status active, rückt expires_at näher? Die zweite liest echte Daten aus der gewählten Domäne. Geht sie durch, stimmen Identität, Scope, die E-Mail-Schranke und der Netzwerkpfad. Geht sie nicht durch, raten Sie nicht: Das eigene Anfrageprotokoll des Schlüssels zeigt Zeile für Zeile, welcher Endpoint mit welchem Code und welchem stabilen Fehlerschlüssel abgelehnt wurde (INSUFFICIENT_SCOPE, IP_NOT_ALLOWED, KEY_ACTOR_BLOCKED …). Im Panel ist dieses Protokoll das Fenster „Recent requests“; im Terminal ist es lg logs. Der Einrichtungsassistent beobachtet genau dieses Protokoll und weigert sich, den Schritt grün zu schalten, bis er einen echten erfolgreichen Aufruf sieht.
4. Den Webhook einrichten – und vor allem anderen die Signatur prüfen — Auf Ereignisse zu warten ist günstiger, als jede Minute zu fragen. Registrieren Sie eine https-Adresse, wählen Sie die Ereignisse, die Sie interessieren, und binden Sie das Abonnement an Ihren Schlüssel: Wird der Schlüssel widerrufen, endet auch die Zustellung. Das Secret wird nur einmal angezeigt, beim Anlegen. Ihr empfangender Endpoint muss zuerst die Signatur prüfen: Der signierte String ist "{t}.{raw body}", und der Algorithmus ist HMAC-SHA256; der Zeitstempel steht INNERHALB der Signatur, also verwerfen Sie jede Anfrage, die älter als 300 Sekunden ist, selbst wenn die Signatur gültig ist. Vergleichen Sie in konstanter Zeit und serialisieren Sie den Body nie neu – sobald Sie das JSON parsen und wieder ausgeben, passt die Signatur nicht mehr. Im Panel löst „Send test“ einen echten signierten Ping aus, und Sie können die Zustellung Versuch für Versuch verfolgen.
Sandbox: Schreiben üben, ohne die Produktion anzutasten
Ein Preflight (dry_run) sagt Ihnen, was ein Befehl tun WÜRDE; aber ob die Idempotenz wirklich ein Replay liefert, ob der Webhook wirklich zugestellt wird, wie die Fehlerzweige aussehen und woher der Credit kommt, sieht man nur bei einem ECHTEN Schreibvorgang. Dafür gibt es die Sandbox: einen separaten Mandanten, der Ihr Unternehmen spiegelt – derselbe Code, derselbe Befehlskatalog – und Ihr Live-Journal nie berührt.
Die Sandbox ist kein Request-Flag, sie ist ein MANDANT. Ein separates Logistivo-Unternehmen, eröffnet für Ihres: mit eigenem Benutzer, eigenem Paket, eigenem Credit-Konto, eigenen Webhook-Abonnements. Die Umgebung wird aus dem Unternehmen des Schlüssels ABGELEITET und kann vom Aufrufer nicht mitgegeben werden; selbst wenn Sie das falsche Profil wählen, bricht die Anfrage serverseitig mit 403 ENVIRONMENT_MISMATCH ab. „Ich dachte, ich schreibe in die Sandbox, und habe in die Produktion geschrieben“ ist strukturell unmöglich.
Die Oberfläche ist identisch – gemessen: Der Katalog, den ein Sandbox-Schlüssel erhält, ist derselbe, den Ihr Live-Schlüssel erhält (bei einem Verlader-Schlüssel 448 Befehle auf beiden Seiten). Eine Brücke, die in der Sandbox funktioniert, funktioniert in der Produktion; nichts, was Sie lernen, müssen Sie zweimal lernen.
Die Sandbox öffnet sich nicht leer: Sie enthält generierte (NICHT kopierte) Startdaten – Kontakte, Ladungen in beiden Richtungen und Transportanfragen. Die Namen sind offenkundig erfunden, und die E-Mail-Adressen liegen in der Domain @sandbox.invalid; keine Zeile eines echten Mandanten wird je gelesen, geklont oder als Vorlage verwendet.
Einen Reset-Knopf gibt es bewusst NICHT, und kein Datensatz, keine Datei und kein Dokument wird je gelöscht. Wenn Sie neu anfangen möchten, eröffnet die Erneuerung eine neue Generation, und die alte bleibt ausgemustert bestehen. Ein paar hundert angesammelte Probezeilen kosten nichts im Vergleich zu einer Löschroutine, die an den falschen Mandanten angeschlossen ist.
1. Die Sandbox eröffnen — Eine Sandbox pro Unternehmen. Der Endpoint erfordert die Berechtigung zur Teamverwaltung (team.manage), also erledigt das ein Administrator in Ihrem Unternehmen. Existiert sie bereits, antwortet derselbe Endpoint per GET mit ihrem Zustand: Unternehmens-ID, verbleibende Credits, Anzahl aktiver Schlüssel, Abonnements, Generationsverlauf und die Obergrenzen.
2. Einen Sandbox-Schlüssel ausstellen und als zweites Profil behalten — Der Schlüssel wird im Namen des eigenen Brückenbenutzers der Sandbox ausgestellt und kommt mit dem Stempel environment: sandbox zurück; das rohe Token erscheint nur in dieser einen Antwort. Ersetzen Sie auf der lg-Seite nicht Ihren Live-Schlüssel – behalten Sie BEIDE als getrennte Profile; --sandbox und --live sind Wähler für einen einzelnen Lauf.
3. Tatsächlich schreiben — Hier kein --dry-run; Schreiben ist der ganze Sinn. Senden Sie denselben Idempotency Key zweimal und beobachten Sie, wie die zweite Antwort als status: replayed zurückkommt – das ist das gemessene Ergebnis in der Sandbox. Rufen Sie absichtlich einen bestätigungspflichtigen Befehl ohne Bestätigung auf und lesen Sie den 409-Body; probieren Sie einen Befehl außerhalb Ihres Scopes und lesen Sie die Ablehnung. Nichts davon hinterlässt eine Spur in Ihrem Live-Journal: Ihr Live-Guthaben bleibt über denselben Lauf hinweg unverändert.
4. Vor dem Go-live die Checkliste lesen — Der Go-live-Endpoint antwortet anhand dessen, was Sie in der Sandbox TATSÄCHLICH getan haben: Haben Sie geschrieben, haben Sie die Fehlerzweige gesehen, wurde ein Webhook zugestellt, haben Sie den Empfänger von der Probeadresse wegverlegt, haben Sie dem Schlüssel ein Ablaufdatum gegeben? Jeder Punkt kommt als pass / todo / unknown zurück. Dieselbe Antwort trägt außerdem einen SCOPE-VORSCHLAG, abgeleitet aus den Befehlen, die Sie tatsächlich aufgerufen haben – nutzen Sie ihn, um Ihren Live-Schlüssel nicht breiter auszustellen als nötig.
Credits und Abrechnung — Die Sandbox hat ein eigenes Credit-Konto, und Ihr Live-Guthaben bewegt sich nicht. Das ist eine Struktur, keine Prüfung: Credits werden pro Unternehmen gezählt, und die Sandbox ist ein separates Unternehmen. Sie startet im kostenlosen Paket, hat keine Zahlungsmethode und liegt außerhalb des monatlichen Abrechnungsfensters – sie kann auf keinem Weg eine Rechnung erreichen.
Marktplatz — Eine Transportanfrage, die Sie in der Sandbox eröffnen, erscheint NICHT auf den Bildschirmen echter Frachtführer und erreicht NICHT deren E-Mail- oder Push-Posteingang; und Sie sehen umgekehrt auch keine echten Transportanfragen. Die Trennung ist symmetrisch und wird in zwei separaten Abfragen durchgesetzt: Für wen eine Transportanfrage SICHTBAR ist und an wen sie GESENDET wird, sind verschiedene Fragen.
Webhooks — Auch Abonnements tragen den Umgebungsstempel. Ein Sandbox-Ereignis wird nie an ein Live-Abonnement zugestellt, und ein Live-Ereignis erreicht nie ein Sandbox-Abonnement; für ein Abonnement, dessen Stempel abgedriftet ist, wird überhaupt keine Zustellung eröffnet. Weil die Obergrenze für Abonnements pro Unternehmen gilt, zehren Ihre Probe-Abonnements nicht an Ihrem Live-Kontingent.
Startdaten — Die Beispieldatensätze in der Sandbox sind GENERIERT, nie von echten Mandanten kopiert. Das Befüllen ist idempotent: Ein zweiter Aufruf legt keine zweite Befüllung über Ihre eigenen Datensätze.
Derselbe Katalog — Ihre Rolle ist auch in der Sandbox Ihre Rolle, und die Befehlsliste ist identisch – gemessen, 448 Befehle auf beiden Seiten. Die Sandbox ist keine abgespeckte Demo; sie ist ein Zwilling Ihres Unternehmens.
Heutige Einschränkung: Webhook-Abonnements lassen sich nicht mit einem Sandbox-Schlüssel verwalten — Die Abonnement-Endpoints erfordern die Berechtigung zur Teamverwaltung (team.manage), und der Brückenbenutzer der Sandbox hat keine Teamrolle, daher antwortet `lg --sandbox webhooks …` heute mit 403. Die gesamte Befehlsoberfläche funktioniert – die Einschränkung betrifft nur das Abonnementverzeichnis. Wenn Sie Webhooks in der Sandbox proben möchten, wenden Sie sich an den Support; das ist gemessen und als offene Lücke erfasst.
GET /api/common/integration-sandbox — Zustand: ob sie existiert, welches Unternehmen, verbleibende Credits, Anzahl aktiver Schlüssel und Abonnements, Generationsverlauf, die Obergrenzen und ein Auslöser-Leitfaden, der zeigt, welcher Befehl welches Ereignis auslöst.
POST /api/common/integration-sandbox — Eröffnet die Sandbox (eine pro Unternehmen, idempotent). Erfordert die Berechtigung team.manage.
POST /api/common/integration-sandbox/keys — 201 + der Schlüssel und das rohe Token (nur hier, nur einmal). Der Stempel environment: sandbox wird aus dem Unternehmen abgeleitet; der Aufrufer kann ihn nicht mitgeben.
GET /api/common/integration-sandbox/go-live — Die Go-live-Checkliste und ein Scope-Vorschlag – berechnet aus Ihrem echten Datenverkehr in der Sandbox.
POST /api/common/integration-sandbox/renew — Eröffnet eine neue Sandbox-GENERATION und mustert die vorherige aus.
Das Befehlsmodell
Es gibt eine einzige Grammatik, und sie kennt keine Ausnahmen. Um zu wissen, wie ein Befehl aufgerufen wird, brauchen Sie nur das, was der Katalog über ihn sagt.
lg loads list --status=in_transport --limit=20 --json
Flag-Namen sind die Parameternamen des Schemas, und lg akzeptiert beide Schreibweisen: --load_code und --load-code erreichen dasselbe Feld (lg help zeigt die kebab-case-Form). An einem Flag sehen Sie also, in welchem JSON-Feld es landet, und der Wechsel von der CLI zu HTTP erfordert keine Namensübersetzung. Ein boolescher Parameter ohne Wert ist true (--only_open); das Gegenteil ist --no-only_open. Schreiben Sie ein Argument, dessen Wert mit einem Bindestrich beginnt, als --flag=value, sonst schluckt ein vergessenes Flag stillschweigend das nächste als seinen Wert. Bei einem Befehl, der eine Datei entgegennimmt, setzen Sie @ vor einen lokalen Pfad (--attachment_uuid=@./cmr.pdf) – siehe Befehle, die Dateien entgegennehmen.
lg — Der Client.
loads — Die Domäne – die Entität, mit der Sie arbeiten, im Plural.
list — Das Verb – was Sie mit dieser Entität tun, aus einem geschlossenen Vokabular, das nur durch bewusste Entscheidung wächst: einfache Verben (list, get, create, update, delete, search, preview, generate, extract …) und zusammengesetzte Verben, die benennen, was angehängt oder geändert wird (add-document, set-status, assign-driver). lg help listet die Verben einer Domäne.
--status=in_transport — Ein Parameter – sein Name ist exakt der Parametername im JSON Schema, und sein Wert muss zum Schematyp passen. Ein ungültiger Wert für ein Enum-Feld erreicht den Server nie.
--limit=20 — Zeilenanzahl bei Listenbefehlen. Die Obergrenze steht in der Parameterbeschreibung jedes Befehls – typischerweise 20 bei einem einfachen Listenaufruf und bis zu 100 im Sync-Modus (mit cursor oder updated_since).
--json — Rohe JSON-Ausgabe.
--json — Gibt rohes JSON aus. Das ist die einzige korrekte Form für Skripte: Die standardmäßige ausgerichtete Tabelle ist für Menschen gedacht, wählt ihre Spalten anhand der Daten und kann ihr Layout ohne Vorankündigung ändern. Schreiben Sie nie ein Skript, das die Tabellenausgabe parst.
--yes, -y — Passiert die Bestätigungsschranke (confirm: true über HTTP). Verwenden Sie es nur in einem Skript, das weiß, was es gleich tut; bei einem irreversiblen Befehl ist dieses Flag die Kurzform für „es gibt kein Zurück“.
--idempotency-key= — Macht das Wiederholen eines schreibenden Befehls sicher. Ein zweiter Aufruf mit demselben Idempotency Key führt den Befehl nicht erneut aus; er liefert das erste Ergebnis. Wenn Sie eine Wiederholungsschleife bauen, erzeugen Sie den Key SELBST und senden Sie bei jedem Versuch denselben.
--dry-run — Führt statt des Befehls einen Preflight aus: Validierung, Schranken und Credit-Berechnung laufen, nichts wird geschrieben (siehe Abschnitt Preflight). Gültig für jeden Befehl und für lg batch.
--refresh — Erzwingt eine Aktualisierung des Katalogs. lg speichert den Katalog eine Stunde lang zwischen; wenn Sie wissen, dass auf dem Server gerade ein Befehl hinzugekommen ist, verwenden Sie dieses Flag, statt zu warten.
--help, -h — Gibt die Katalogbeschreibung des Befehls aus: jeden Parameter, seinen Typ, seine Enum-Werte und ob er Pflicht ist. Im Client gibt es keine Hilfedatei.
--profile=, --sandbox, --live — Mit welchem Profil dieser eine Aufruf ausgeführt wird. --sandbox und --live wählen das Profil, das einen Sandbox- bzw. Live-Schlüssel hält; die Umgebung wird serverseitig aus dem Schlüssel abgeleitet, sodass eine Unstimmigkeit mit 403 ENVIRONMENT_MISMATCH abbricht, statt an die falsche Stelle zu schreiben.
--base-url, --timeout, --verbose, --no-color, --version — Der Reihe nach: einen einzelnen Befehl auf einen anderen Server richten, ein Timeout in Sekunden, Details zu Anfrage und Antwort, ANSI-Farben abschalten und die Client-Version.
Echte Beispiele
Jeder Befehl unten existiert heute im Katalog; kein Name und kein Parameter hier ist erfunden. Die Ausgaben sind gekürzt. Sie zeigen die Ebene `data.result`; über HTTP kommt dasselbe Objekt im Umschlag (Envelope) `{success, data:{…}}` an (siehe die HTTP-Befehls-API).
Ladungen, die gerade unterwegs sind — lg loads list --status=in_transport --limit=20
Eine Ladung vollständig, als rohes JSON — lg loads get --load_code=FSK2158 --json
Offene Markierungen zur Dokumentenkonsistenz — lg loads list-problems --only_open=true --limit=10
Das Land ermitteln — lg countries search --query=Germany --json
Mit der ermittelten ID filtern — lg loads list --receiving_country_id=57 --date_from=2026-09-01 --limit=20
Einen HS-Code anhand eines Produktnamens finden — lg tariffs search --query="aluminium profile"
Eine Ladung im Status weiterschalten (nur Frachtführer-Rolle) — lg loads set-status --load_code=FSK2158 --status=transit --date=2026-08-21 --yes
Entwurf — lg export-documents create --doc_type=proforma-invoice --currency_code=EUR --json
Erzeugen (bestätigungspflichtig) — lg export-documents generate --document_id=8412 --yes
Ohne Client: die HTTP-Befehls-API
lg ist eine Annehmlichkeit, nicht die Tür. Katalog und Ausführung laufen beide über drei HTTP-Endpoints (für Dateien gibt es einen vierten, den Upload-Endpoint – siehe Befehle, die Dateien entgegennehmen); eine ERP- oder CRM-Integration verbindet sich direkt hier. Die Identität ist ein persönliches Zugriffstoken im Header Authorization: Bearer. JEDE Antwort kommt im selben Umschlag zurück: `{ "success": bool, "data": { … }, "code": "…", "message": { … } }`. Der gesamte Vertrag steckt in `data` – `contract_version`, `command`, `status` und, als Ausgabe des Befehls, `result`; bei einem Fehler `error_code`, `error_key` und `error`. Die Antwortbeispiele auf dieser Seite zeigen aus Platzgründen das Objekt `data` statt des Umschlags; vergessen Sie nicht, `data` in Ihrem eigenen Code auszupacken. Auch `lg --json` gibt den GESAMTEN Umschlag aus, weshalb jq-Pfade mit `.data.result…` beginnen. Die einzige Ausnahme ist `/api/public/status`: Dieser Endpoint kommt ohne Umschlag aus, damit Watchdogs alarmieren können, ohne ihn zu parsen.
Eine Bestätigung mit 200 + ok:false anzufordern ist verboten und wird nie vorkommen. Der Grund ist einfach: Clients werten 200 als Erfolg, also würde eine als 200 zurückgegebene Bestätigungsanfrage den Ablauf stillschweigend beenden, und niemand würde es bemerken. Eine Bestätigung ist immer 409.
GET /api/common/commands — Der gesamte Katalog, den Ihre Rolle sehen kann: contract_version; pro Befehl name, domain, verb, description, JSON Schema, read_only, confirmation_needed, irreversible, credit_cost, since, deprecated_at, replaced_by, aliases sowie die Zugriffsfelder key_level, permission, file_params, secret_parameters und cli_only; auf oberster Ebene das Wörterbuch error_keys, rate_limits, idempotency_ttl_hours, Ihre Katalogrollen, der Vertrag für attachments (Upload) und die Zugriffsstufe des Schlüssels, mit dem Sie aufrufen. Sendet ein ETag; If-None-Match wird mit 304 beantwortet. ?domain= trifft auch eine alte (Alias-)Domäne. Bauen Sie Ihren Client daraus auf; codieren Sie keine Befehlsliste fest.
GET /api/common/commands/{name} — Ein Befehl vollständig. name ist der eingefrorene Befehlsname aus dem Katalog (list_loads), nicht die CLI-Identität. Ein veralteter Befehl antwortet mit einem Header X-Deprecated.
POST /api/common/commands/{name} — Ausführung. Body: { args, confirm?, idempotency_key? }. Der HTTP-Status der Antwort ist das Ergebnis selbst – alles außer 200 ist Information, kein Rauschen. Fehler tragen error_code (Transport) und, bei geschäftlichen Ablehnungen, error_key.
Befehle, die Dateien entgegennehmen
33 Befehle in der Tabelle nehmen ein Dokument oder ein Foto entgegen: einen CMR an eine Ladung anhängen, HS-Codes aus einer Rechnung lesen, ein Fahrzeug aus seinem Zulassungsdokument anlegen, eine Palette anhand von Fotos schätzen, ein Unternehmensdokument hochladen, eine Rechnung mit einer Packliste abgleichen. Im Browser ziehen Sie die Datei in ein Formular; überall sonst braucht es zwei Schritte – die Datei hochladen und dann ihre ID an den Befehl übergeben.
Ein Parameter nimmt eine Datei entgegen, wenn sein Name auf attachment_uuid oder attachment_uuids endet – photos[].attachment_uuid innerhalb einer Liste, front_attachment_uuid bei einem Scheck. Merken müssen Sie sich das nicht: Jede Katalogzeile trägt file_params mit den exakten Pfaden, das Schema kennzeichnet diese Felder (format: uuid, x-logistivo-file: true), und die Katalogantwort trägt einen Block attachments mit der Upload-Adresse, den akzeptierten Typen, den Größenlimits und der Lebensdauer. lg help zeigt sie ebenfalls an.
Hochladen ist ein Schreibvorgang, daher kann ein Schlüssel mit Scope read nicht hochladen; jeder Schlüssel mit Scope write kann es, auf beiden Zugriffsstufen. Uploads gehören dem Benutzer, nicht dem Schlüssel: Zwei Schlüssel desselben Benutzers sehen dieselben Uploads, und niemand kann die eines anderen verwenden. Eine ID, die unbekannt, abgelaufen oder nicht Ihre ist, wird schlicht nicht gefunden, und der Grund wird nicht offengelegt.
Anhänge im Dashboard-Chat und Befehls-Uploads sind getrennte Räume: Eine im Assistenten-Chat angehängte Datei lässt sich nicht per ID an einen Befehl übergeben, und ein Befehls-Upload erscheint nie in einem Chatverlauf.
Ein Upload ist kein Befehl und hat für sich genommen keine geschäftliche Wirkung: Mit Ihren Daten passiert nichts, bis ein Befehl die ID verwendet. Deshalb fragt das Hochladen auch nie nach einer Bestätigung – die Schranke trägt der Befehl, der die Datei verbraucht.
1. lg: ein @ vor einen lokalen Pfad setzen — lg lädt die Datei zuerst hoch und führt dann den Befehl mit der zurückgegebenen ID aus; ein Wert ohne @ ist die ID einer Datei, die Sie zuvor hochgeladen haben. Listen nehmen kommagetrennte Pfade oder ein wiederholtes Flag entgegen, verschachtelte Felder nehmen JSON entgegen, und --file ist eine Abkürzung, wenn der Befehl genau ein Dateifeld auf oberster Ebene hat. lg prüft jede Datei lokal (Existenz, Größe, Typ), bevor irgendetwas gesendet wird, und lg batch lädt jede unterschiedliche Datei einmal hoch, bevor der Batch läuft.
2. HTTP: hochladen, dann attachment_uuid übergeben — Senden Sie die Datei als multipart/form-data in einem Feld namens file. Ein neuer Upload antwortet mit 201; dieselbe Datei, vom selben Benutzer erneut hochgeladen, antwortet mit 200, dem Status replayed und derselben ID, und nichts wird geschrieben. Wie überall auf dieser Seite zeigt das Beispiel das Objekt data innerhalb des Umschlags.
3. MCP: das Tool upload_attachment — Ein MCP-Client kann kein multipart senden, daher bietet der Kanal ein zusätzliches Tool an, das nicht im Katalog steht: upload_attachment nimmt einen Dateinamen und den Inhalt als base64 entgegen und liefert dieselbe attachment_uuid. Es ruft denselben Service auf wie der HTTP-Upload, unter denselben Regeln.
Der Typ ergibt sich aus dem Inhalt — Der Dateiname und der angegebene Typ werden ignoriert; die gespeicherte Endung ist die erkannte. Für den Upload akzeptiert: jpg, jpeg, png, webp, heic, heif, pdf, xlsx, xls, csv, txt, doc, docx, xml, zip. Jeder Befehl wendet dann, bevor etwas läuft, seine eigene, engere Liste an und antwortet mit UNSUPPORTED_FILE_TYPE samt den akzeptierten Typen oder mit FILE_TOO_LARGE.
Größe — Bilder bis 10 MB, andere Dateien bis 15 MB.
Lebensdauer — Ein Upload kann 24 Stunden lang verwendet werden. Danach wird er nicht mehr aufgelöst (ATTACHMENT_NOT_FOUND) – gelöscht wird er nicht. Laden Sie erneut hoch, wenn ein Befehl aus diesem Grund fehlschlägt.
Gleiche Datei, gleiche ID — Ein erneuter Upload derselben Datei (gleicher Name, gleiche Größe und gleicher Inhalt) liefert die vorhandene ID, statt eine neue zu schreiben, solange ihr noch mindestens eine Stunde bleibt, und er verbraucht nichts von Ihrer täglichen Obergrenze.
Tägliche Obergrenzen — 300 Uploads pro Benutzer und Tag (TOO_MANY_FILES) und 2 GB pro Unternehmen und Tag (DAILY_LIMIT_REACHED); beide antworten mit 429 und retry_after.
POST /api/common/commands:upload — Multipart-Upload im Feld file. 201 für einen neuen Upload, 200 mit dem Status replayed für dieselbe Datei. Liefert data.attachment: attachment_uuid, filename, mime_type, size_bytes, sha256, extraction_status, expires_at und reused.
Die Bestätigungsschranke und irreversible Befehle
Jeder Befehl im Katalog trägt zwei Flags: confirmation_needed (erfordert er vor der Ausführung eine ausdrückliche Freigabe) und irreversible (lässt sich seine Wirkung rückgängig machen). Das sind getrennte Fragen, und beide werden auf dem Server durchgesetzt, statt sie den guten Manieren des Clients zu überlassen.
Bei der Schranke geht es um Verantwortung, nicht um Geschäftsregeln. Ein Angebot abzugeben ist der erste Schritt zu einem Frachtvertrag; eine Rechnung auszustellen erzeugt eine Buchung; eine Lagerbewegung ändert ein Bestandsbuch. Nichts davon sollte man jemals versehentlich zweimal ausführen können.
Die Schranke wird am TATSÄCHLICH ausgeführten Befehl abgelesen. Wenn ein Befehl einen anderen umschließt – wie es der generische Executor im Chat tut –, kommt die Schranke aus den Flags des Befehls, der wirklich läuft, nicht aus der Hülle. Mit einem festen Flag wäre einer von zwei Fehlern unvermeidlich: Entweder liefe der Rechnungsbefehl unbestätigt, oder jede Länderabfrage würde eine Bestätigungskarte auslösen.
read_only und nicht bestätigungspflichtig sind nicht dasselbe. Es gibt drei unterschiedliche Zustände: invoices preview ist nicht bestätigungspflichtig und schreibt nichts; loads create ist bestätigungspflichtig und schreibt; invoices create ist nicht bestätigungspflichtig, schreibt aber – ein Entwurf entsteht. Ein einziger Test klärt es: Hat sich, wenn der Befehl zurückkehrt, eine Zeile in der Datenbank geändert?
Manche Aktionen liegen nicht hinter dieser Schranke, weil sie gar keine Befehle sind: Ein Paket kaufen, eine Karte mit 3D Secure hinzufügen, Rechtstexte bestätigen und ein Konto schließen geschieht im eigenen Browser der Person. Dafür liefert lg handoff-links generate einen logistivo.com-Link – kostenlos, ohne Schreibvorgang, ohne Geheimnis –, und die Person schließt den Schritt dort ab. Kein Flag, wie auch immer es gesetzt ist, macht aus einer Zahlung oder einer Einwilligung einen API-Aufruf.
Technisch kann eine Integration die Schranke bei jedem Aufruf automatisch passieren, ratsam ist es aber nicht. Das richtige Muster: die Schranke nur für Befehle automatisieren, von denen Sie wissen, dass sie umkehrbar sind, und irreversible in die Warteschlange eines Menschen leiten.
1. Aufrufen — Rufen Sie den bestätigungspflichtigen Befehl ohne confirm auf. Nichts ändert sich.
2. Die Zusammenfassung lesen — Sie erhalten eine 409; confirmation.summary im Body ist ein für Menschen geschriebener Satz („Rechnung wird ausgestellt: X Ltd, 1.200,00 TRY“), kein Dump roher Argumente. Befehle mit Geldbezug tragen zusätzlich eine strukturierte Vorschau: Positionen, Summen, Warnungen.
3. Bestätigen — Wiederholen Sie denselben Aufruf mit confirm: true (--yes in der CLI). Irreversible Befehle sind so gekennzeichnet, dass sie höchstens einmal laufen.
Preflight: sehen, was ein schreibender Befehl tun würde, ohne ihn auszuführen
Der teuerste Schritt beim Anbinden einer ERP-Brücke ist es, herauszufinden, ob Ihr Body stimmt, indem Sie den Befehl TATSÄCHLICH ausführen: ein Rechnungsentwurf im Live-Buchungsjournal, ein verbrannter Credit, manuelles Aufräumen. dry_run beendet das – Sie fügen der Anfrage ein Feld hinzu, der Befehl läuft nicht, und Sie lesen, was passieren würde.
Das Register enthält heute 519 Befehle; 233 davon lesen nur und schreiben nichts. Von den übrigen 286 schreibenden Befehlen sind 251 bestätigungspflichtig: Ohne confirm aufgerufen, antworten sie bereits mit 409 und beschreiben, was sie tun würden. Die Lücke waren die anderen 35 – Rechnungsentwürfe, Exportdokument-Entwürfe, Positionen: genau die Kette, die eine Brücke als Erstes anbindet. Bei ihnen hieß Aufrufen bereits Ausführen.
Selbst bei bestätigungspflichtigen Befehlen gab es eine zweite Lücke: Die Schemavalidierung läuft NACH der Schranke. Ein Aufruf mit fehlendem Argument bekam also zuerst die Bestätigungskarte, bestätigte sie und erfuhr erst dann „dieses Feld fehlt“. Ein Preflight beantwortet beides in einem einzigen Roundtrip.
Und der häufigste – und am spätesten entdeckte – Brückenfehler ist dieser: Sie senden ein Feld, das nicht im Schema steht (customer_id, wo recipient_contact_id erwartet wird), der Server verwirft es stillschweigend, der Befehl liefert 200, und der Datensatz landet an der falschen Stelle. Die Preflight-Antwort listet solche Felder namentlich unter arguments.ignored auf; eine Fehlermeldung wird das nie tun.
Ein Preflight schreibt nichts, und das ist strukturell bedingt, bevor es eine Messung ist: Der Preflight-Pfad erreicht nie den Handler des Befehls, also gilt das für jeden Befehl, auch für die später hinzugekommenen. Bei der Einführung wurde es zudem gemessen: Jede SQL-Anweisung, die beim Preflight aller damals im Katalog vorhandenen schreibenden Befehle abgesetzt wurde (zwei Argumentsätze, zwei Rollen, 178 Preflights), wurde mitgeschnitten. Kein einziges INSERT/UPDATE/DELETE, kein einziger Job in der Warteschlange, keine einzige E-Mail; die Zeilenzahlen in 31 Tabellen und das Credit-Guthaben blieben unverändert.
Der Exit-Code ist derselbe, den der echte Aufruf liefern würde – würde laufen 0, Bestätigungsschranke 4, Idempotenzkonflikt 2, alles andere 1 –, sodass „lg … --dry-run || exit“ in einem CI-Schritt eine sinnvolle Schranke ist.
1. Mit dry_run aufrufen — Fügen Sie dem Request-Body "dry_run": true hinzu. Validierung, Rollen- und Scope-Schranke, Zielauflösung und Credit-Berechnung laufen alle; der Befehl nicht.
2. would_execute lesen — Das ist das eine Flag, nach dem Sie verzweigen. Ist es false, nennt would_stop.at, wo ein echter Aufruf anhalten würde: idempotency, target_precheck, confirmation_gate oder arguments.
3. Den Body korrigieren — arguments.ignored nennt die Felder, die stillschweigend verworfen würden, missing_required die Pflichtfelder, die Sie weggelassen haben, und would_charge, wie viele Credits anfallen würden und ob das Guthaben sie deckt.
4. dry_run weglassen — Wiederholen Sie das, bis would_execute true ist, entfernen Sie dann das Flag und machen Sie den echten Aufruf. Der Idempotency Key, den Sie beim Preflight gesendet haben, wurde nicht verbraucht, also läuft der echte Aufruf normal.
HTTP ist immer 200 — „Der Befehl würde fehlschlagen“ kommt nie als 4xx an – der Preflight selbst war erfolgreich, und die Vorhersage steht im Body. Die Ausnahme ist eine Ablehnung auf Transportebene, und dort verhält er sich genau wie ein echter Aufruf: 404 unbekannter Befehl, 403 Rolle/Scope, 429 Rate Limit.
Ein Schlüssel mit Scope read kann für einen schreibenden Befehl keinen Dry Run ausführen — Er erhält 403. Ein Preflight beantwortet „was passiert, wenn ich das MIT DIESEM SCHLÜSSEL aufrufe, jetzt“; einem lesenden Schlüssel grünes Licht zu geben und dann beim echten Aufruf eine 403 zu liefern, wäre genau die Überraschung, die der Preflight verhindern soll.
Der Idempotency Key wird nicht verbraucht — Ein beim Preflight gesendeter Key öffnet keine Zeile im Journal, und eine abgelaufene Sperre wird nicht freigegeben. Senden Sie also den Key, den Sie auch real verwenden wollen: Der Preflight sagt Ihnen, ob er noch frei ist, einen früheren Lauf wiederholen würde oder mit einem anderen Befehl kollidiert.
Kombinierbar mit confirm — Senden Sie dry_run und confirm zusammen, wird die Frage zu „wenn ich bestätige, was passiert dann?“. Es läuft trotzdem nichts.
Batch-Preflight gilt pro Batch — commands:batch akzeptiert ebenfalls dry_run, aber das Flag gehört zum Batch, nicht zu einem einzelnen Eintrag (es an einem Eintrag zu senden ergibt eine 422). Sie erhalten einen Bericht pro Eintrag plus die gesamten Credit-Kosten des Batches; ein unzureichendes Guthaben wird gemeldet, nicht abgelehnt.
Er ist nicht kostenlos — Jeder Preflight führt echte Abfragen aus (Vorschau, Guthaben) und zählt gegen das Rate Limit. Prüfen Sie nicht bei jedem Deployment den ganzen Katalog per Preflight; prüfen Sie die Befehle, die Sie geändert haben.
Idempotenz: warum Wiederholen keine Duplikate erzeugt
Ein ERP liest Ihre Fehlermeldung nicht, sieht Ihren Bildschirm nicht und schickt dieselbe Anfrage nach einem Timeout erneut. Dieser Abschnitt existiert genau für dieses Verhalten.
Ein Aufruf mit einem idempotency_key läuft höchstens einmal. Der zweite Aufruf führt den Befehl nicht erneut aus; er liefert das gespeicherte Ergebnis mit dem Status replayed. Wenn das Netzwerk abbricht, eine Anfrage in ein Timeout läuft oder eine Warteschlange denselben Job zweimal aufnimmt, erhalten Sie das erste Ergebnis statt einer doppelten Rechnung.
Verwenden Sie bei jedem schreibenden Befehl einen Idempotency Key (Idempotenzschlüssel). Das Feld read_only im Katalog liefert Ihnen diese Unterscheidung gratis: Jeder Befehl mit read_only: false verdient einen Idempotency Key.
Ihre Wiederholungsstrategie sollte exponentielles Backoff verwenden und bei jedem Versuch DENSELBEN Key mitsenden. Pro Versuch einen frischen Key zu erzeugen ist dasselbe, als würden Sie gar keine Idempotenz verwenden. Senden Sie denselben Key nicht parallel: Höchstens-einmal ist für aufeinanderfolgende Wiederholungen garantiert, nicht für zwei Anfragen, die gegeneinander um die Wette laufen.
Falle 1 – auch ein Fehlschlag wird festgeschrieben — Wurde die erste Ausführung von einer Geschäftsregel abgelehnt (failed), liefert ein zweiter Aufruf mit demselben Key denselben Fehler und denselben error_key und versucht es nicht erneut. Um das Argument zu korrigieren und es noch einmal zu versuchen, brauchen Sie einen NEUEN Key. Ein Key steht für einen Versuch, nicht für eine Absicht.
Falle 2 – ein großes Ergebnis wird ohne Body wiederholt — Das Journal speichert ein Ergebnis nur, wenn es kleiner als 64 KB ist. Ein größeres Ergebnis wird mit dem Status replayed, aber mit leerem Body wiederholt. Ihre Integration sollte sich auf das Signal „replayed“ verlassen statt auf den Body und die Daten mit dem passenden get-Befehl abrufen.
Falle 3 – ein Key gehört zu einem Befehl — Wird derselbe Key mit einem anderen Befehl gesendet, kommt 409 idempotency_conflict mit dem conflicting_command zurück; nichts läuft, und nichts wird wiederholt. Ein Client, der einen Key für zwei Verben teilt, ist fehlerhaft und erfährt das aus einem Fehler, nicht aus einer stillen Wiederholung.
Falle 4 – die Sperre gilt 24 Stunden, nicht für immer — Nach 24 Stunden ist derselbe Key eine neue Ausführung. Netzwerk-Wiederholungen kommen innerhalb von Minuten; die jährlich wiederkehrenden Belegnummern eines ERP dürfen nicht für immer „replayed“ bleiben. Der Katalog veröffentlicht das Fenster als idempotency_ttl_hours.
Falle 5 – ein Serverfehler sperrt den Key nicht — Ein 5xx server_error ist keine geschäftliche Ablehnung: Der Key wird nicht gebunden, also führt eine Wiederholung mit demselben Key den Befehl wirklich aus. Nur failed sperrt (Falle 1).
Geltungsbereich und Format – Ihr Unternehmen, beliebiger String, bevorzugt eine UUID — Die Eindeutigkeit wird über (Ihr Unternehmen, Key) durchgesetzt: Das INV-1001 eines anderen Mandanten kollidiert nie mit Ihrem und kann nie Ihr Ergebnis wiederholen. Verwenden Sie eine einfache UUID oder einen zusammengesetzten Wert, der konstruktionsbedingt eindeutig ist, etwa {ERP-Belegnummer}:{verb}.
Inkrementeller Sync und Paginierung
Eine ERP/CRM-Brücke sollte abholen, was sich geändert hat, nicht jede Stunde alles. Jeder Listenbefehl – loads list, demands list-own, contacts list, invoices list, teammates list, load-groups list, reservations list, drivers list, tenders list, products search, warehouses search – akzeptiert zwei gemeinsame Parameter und liefert ein gemeinsames Feld.
Warum es kein offset gibt: Auf einer lebenden Tabelle verschiebt sich ein Offset. Eine Zeile, die zwischen zwei Seiten eingefügt wird, lässt Sie einen Datensatz überspringen oder doppelt zählen – stillschweigend. Der Cursor bewegt sich nur vorwärts, sodass ein während des Durchlaufs eingefügter oder aktualisierter Datensatz am Ende der Liste landet: Nichts geht verloren, nichts wird doppelt.
Ein vollständiger Erstimport nutzt denselben Mechanismus: Beginnen Sie mit updated_since=1970-01-01T00:00:00Z und folgen Sie next_cursor, bis er null ist. Einen separaten „Export“-Endpoint gibt es nicht, weil keiner nötig ist.
Dasselbe mit lg: lg loads list --updated_since=2026-09-01T00:00:00Z --limit=100 --json, danach lg loads list --cursor= --json.
Setzen Sie für den nächsten Sync updated_since auf das größte updated_at, das Sie gesehen haben. Zeitstempel haben Sekundengenauigkeit, daher kann ein Datensatz an der Grenze zweimal ankommen – harmlos, solange Sie auf Ihrer Seite per external_ref oder code upserten. Ohne updated_since oder cursor läuft ein Befehl im Chat-Modus: menschliche Sortierung, höchstens 20 Zeilen, next_cursor null und truncated mit der Aussage „es gibt mehr“. Verwenden Sie diesen Modus nicht für den Sync.
Maschinenlesbare Fehlerschlüssel für diesen Abschnitt: INVALID_CURSOR, INVALID_UPDATED_SINCE, DUPLICATE_EXTERNAL_REF, EXTERNAL_REF_TOO_LONG, EXTERNAL_REF_INVALID. Alle antworten mit HTTP 422, error_code: "failed" und result.error_key im Body. Verzweigen Sie nach dem Schlüssel, nie nach dem Text.
updated_since — ISO-8601-Zeitstempel (UTC empfohlen, z. B. 2026-09-01T00:00:00Z). Zeilen, die zu diesem Zeitpunkt oder danach aktualisiert wurden. Er schaltet den Befehl in den Sync-Modus: feste Reihenfolge (updated_at, id) aufsteigend, limit auf 100 begrenzt.
cursor — Der next_cursor aus der vorherigen Antwort, unverändert. Er ist opak und signiert: Bauen oder bearbeiten Sie nie einen, verwenden Sie nie den Cursor eines anderen Unternehmens oder eines anderen Befehls wieder; all das wird mit INVALID_CURSOR abgelehnt.
limit — Seitengröße. 1–100 im Sync-Modus (Standard 10).
next_cursor (Antwort) — Cursor für die nächste Seite. null bedeutet, dass die Liste vollständig ist; das ist die einzig korrekte Antwort auf „gibt es mehr?“.
total (Antwort) — Zeilen, die den Filtern entsprechen, unabhängig von der Seite – für Fortschrittsanzeigen.
Ihr eigener Schlüssel: external_ref
Machen Sie unsere Auto-Increment-IDs (invoice_id, contact_id) nicht zum Geschäftsschlüssel in Ihrem ERP; sie sind opak und privat für Ihr Unternehmen. Ladungen, Transportanfragen, Kontakte, Rechnungen, Produkte und Lager tragen stattdessen Ihren Schlüssel.
Beim Schreiben setzen — loads create, demands create, contacts create und contacts update sowie invoices create akzeptieren ein optionales external_ref (max. 120 Zeichen) und geben es unverändert zurück.
Beim Lesen verwenden — loads get --external_ref=ORD-2026-0917, invoices get --external_ref=..., contacts get --external_ref=..., demands get --external_ref=... funktionieren alle; bei Listen- und Suchbefehlen ist --external_ref= ein Filter auf exakte Übereinstimmung.
Eindeutig pro Unternehmen — Ein zweiter Datensatz mit demselben Schlüssel wird mit 422 und result.error_key = DUPLICATE_EXTERNAL_REF abgelehnt; der Schlüssel eines anderen Unternehmens antwortet Ihnen mit „nicht gefunden“. Der Abgleich unterscheidet nicht zwischen Groß- und Kleinschreibung (ord-1 = ORD-1). Ein archivierter Datensatz behält seinen Schlüssel; stellen Sie ihn wieder her, bevor Sie den Schlüssel erneut verwenden.
Senden Sie auch einen idempotency_key — Eine Wiederholung nach einem Netzwerk-Timeout liefert das erste Ergebnis, statt ein Duplikat anzulegen. Die beiden sind nicht austauschbar: external_ref ist Ihr Geschäftsschlüssel, idempotency_key identifiziert einen Versuch.
Ausgehende Webhooks: Wir senden Ihnen einen POST, wenn etwas passiert
Alles bis hierher war Pull: Sie fragen, wir antworten. Eine ERP-Brücke musste einmal pro Minute fragen, um zu erfahren, dass eine Ladung ihren Status geändert hat, eine Rechnung ausgestellt wurde oder ein Angebot eingegangen ist. Das ist vorbei: Registrieren Sie eine https-Adresse, wählen Sie die Ereignisse, die Sie interessieren, und ein signierter POST kommt an, wenn sie eintreten.
Push kam NEBEN Pull hinzu, nicht an seine Stelle. Der inkrementelle Sync (updated_since + cursor) bleibt unangetastet und ist weiterhin das richtige Werkzeug: Der erste vollständige Import, das Nachladen der Historie und die Antwort auf „habe ich etwas verpasst?“ gehören dorthin. Webhooks verkürzen die Latenz von Minuten auf Sekunden. Eine gesunde Brücke nutzt beides – den Webhook als Auslöser, den Sync als Sicherheitsnetz.
Die Payload ist ein SIGNAL, keine Kopie des Datensatzes. Sie trägt die Kennungen (id, Ihr eigenes external_ref, status, Zeit); die Details holen Sie mit Ihrem eigenen Schlüssel per GET, und dieser Aufruf durchläuft ohnehin Ihre eigenen Berechtigungsschranken. Die offengelegten Daten bleiben daher auf Kennungsebene. Zwei Felder fehlen bewusst: die Identität des Unternehmens, das ein Angebot abgegeben hat (verdeckte Angebote erscheinen im Panel unter einem Alias; die Identität in einen Webhook zu schreiben, würde diese Vertraulichkeit über einen zweiten Kanal durchbrechen), und die Kontaktdaten von Reservierungen (es gibt keinen Grund, personenbezogene Daten über einen zusätzlichen Kanal zu bewegen).
Ereignisnamen sind EINGEFROREN. Ändert sich die Bedeutung eines Namens, wird ein neuer Name eröffnet, und der alte lebt während einer Abkündigungsfrist weiter. Ein neues Feld in der Payload erhöht die Vertragsversion NICHT – ein Konsument muss Felder ignorieren, die er nicht kennt.
GET /api/common/integration-webhooks — Das Verzeichnis plus Ereigniskatalog, Limits und Header-Namen. Jede Zeile trägt ihren Stummschaltungsgrund und eine Zustellübersicht der letzten 7 Tage.
POST /api/common/integration-webhooks — 201 + { webhook, secret, shown_once: true }. Das Secret erscheint nur hier.
PATCH /api/common/integration-webhooks/{uuid} — Name / Adresse / Ereignisse / Aktiv-Flag. Berührt das Secret NICHT.
DELETE /api/common/integration-webhooks/{uuid} — Entfernt es: Die Zeile wird per Soft Delete gelöscht (die Historie bleibt abfragbar), und ausstehende Zustellungen werden storniert.
POST /api/common/integration-webhooks/{uuid}/rotate-secret — 201 + ein neues Secret. Der alte Wert funktioniert ab diesem Moment nicht mehr.
POST /api/common/integration-webhooks/{uuid}/test — Ein Ping-Ereignis – echte Signatur, echter Pfad, echter Wiederholungsplan.
GET /api/common/integration-webhooks/{uuid}/deliveries — Die neuesten Zustellungen: Status, Versuchsnummer, HTTP-Code, Dauer, Fehler-Tag.
POST /api/common/integration-webhooks/deliveries/{uuid}/replay — Sendet eine einzelne Zustellung erneut: event_id bleibt ERHALTEN, die Zustell-ID ist neu, die Payload wird wortgetreu kopiert.
Ereigniskatalog
Hinter jedem der 13 Ereignisse unten steht eine Event-Klasse, die TATSÄCHLICH ausgelöst wird. Im Katalog gibt es keine „wäre schön“-Namen: Ein Ereignis, das angekündigt, aber nie ausgelöst wird, ist ein Ereignis, auf das der Integrator ewig wartet, und dieser Fehler ist still. Auch diese Tabelle ist nicht von Hand geschrieben – sie wird bei jedem Seitenaufruf aus dem Live-Katalog erzeugt.
invoice.payment_recorded fehlt bewusst: Diese Event-Klasse existiert im Code, wird aber nirgends ausgelöst. Das Zahlungsereignis wird an dem Tag hinzugefügt, an dem die Klasse tatsächlich ausgelöst wird – nicht vorher. Ein Ereignis zu früh anzukündigen ist schlimmer, als es nie hinzuzufügen.
load.created — A load became visible to your company (created by you or shared with you). (load)
load.status_changed — A load moved to a new status (pending, in_transport, transit, done). (load)
load.driver_assigned — A driver was assigned to a load. (load)
demand.created — A freight demand was created by your company. (demand)
demand.status_changed — A freight demand changed status. (demand)
demand_bid.created — A bid was placed on a demand you are party to. (demand_bid)
demand_bid.revised — A bid was revised (a new revision replaced the previous one). (demand_bid)
demand_bid.accepted — A bid was accepted. (demand_bid)
invoice.created — An invoice draft was created. (invoice)
invoice.issued — An invoice was issued (it now carries an invoice number). (invoice)
invoice.cancelled — An invoice was cancelled. (invoice)
warehouse_reservation.created — A warehouse dock/area reservation was created. (warehouse)
warehouse_reservation.status_changed — A warehouse reservation was approved, rejected or otherwise moved. (warehouse)
Die Signatur prüfen
Jede Anfrage trägt einen Header X-Logistivo-Signature: t=,v1=. Der signierte String ist ".", und der Algorithmus ist HMAC-SHA256. Das Präfix v1 hält das Schema versionierbar: Kommt je ein zweites Schema hinzu, trägt der Header t=…,v1=…,v2=…, und Sie wählen das, das Sie kennen.
Wir veröffentlichen zwei Referenz-Empfänger ohne Abhängigkeiten, einen für Node und einen für reines PHP. Beide wenden die vier Regeln oben an und testen sich mit --selftest selbst: gültige Signatur, manipulierter Body, falsches Secret, Zeitstempel außerhalb des Fensters, fehlerhafter Header, die Falle der Neu-Serialisierung und beide Arten von Wiederholung (gleiche Zustellung / gleiche Tatsache). Der Verifier ist das exakte Gegenstück des Codes, den wir selbst verwenden – wir konsumieren den Vertrag, den wir veröffentlichen.
Den ROHEN Body prüfen — Die Signatur wird über Bytes berechnet. Den Body zu dekodieren und neu zu serialisieren (JSON.stringify(req.body), json_encode($request->all())) macht aus denselben DATEN andere BYTES, und die Signatur passt nicht mehr. In Node liegt die Falle in der Zahlenformatierung (1.50 auf der Leitung wird zu 1.5; große Ganzzahlen verlieren Präzision), in PHP im Escaping von Zeichen (/ wird zu \/, İ wird zu \u0130). Verwenden Sie express.raw in Express und $request->getContent() in Laravel. Das ist der mit Abstand häufigste Fehler beim Schreiben eines Empfängers.
Den Zeitstempel prüfen — t steht INNERHALB der Signatur. Wer nur die Signatur prüft, erlaubt jedem, der eine gültige Anfrage mitgeschnitten hat, sie Stunden später erneut abzuspielen, und der Empfänger würde sie als verifiziertes Ereignis zählen. Verwerfen Sie jede Anfrage mit |now − t| > Toleranz, selbst wenn die Signatur korrekt ist. Das empfohlene Fenster beträgt 300 Sekunden.
In konstanter Zeit vergleichen — hash_equals / timingSafeEqual. Ein Vergleich mit == lässt einen Angreifer die Signatur Byte für Byte erraten.
Nach event_id deduplizieren, nicht nach id — event_id identifiziert die TATSACHE: Sie ist für zwei Abonnenten, die dasselbe Ereignis erhalten, gleich und bleibt bei einem Replay ERHALTEN. id (= X-Logistivo-Delivery) identifiziert die ZUSTELLUNG und ändert sich bei einem Replay. Beantworten Sie „habe ich das schon verarbeitet?“ mit event_id; mit id würde ein Replay dieselbe Arbeit zweimal ausführen.
Zustellung, Wiederholungen und Stummschaltung
Ihr Empfänger wird nicht immer erreichbar sein. Die Schiene geht davon aus: Ein vorübergehender Fehler kommt in den Wiederholungsplan, ein dauerhafter schaltet das Abonnement stumm – und der GRUND für die Stummschaltung wird immer festgehalten.
Der Grund für die Stummschaltung ist maschinenlesbar und stabil (delivery_failures, endpoint_gone, unsafe_target, key_revoked, by_user) und erscheint sowohl im Panel als auch in `lg webhooks list`. Eine Stummschaltung ohne Grund würde „warum kommt nichts an?“ unbeantwortbar machen. Die Reaktivierung setzt den Zähler und den Zeitstempel zurück.
Sie schreiben die Adresse; UNSER Server stellt die Anfrage. Ohne Schranke könnte ein Mandant, der eine Cloud-Metadatenadresse einträgt, uns dazu bringen, Anfragen aus unserem eigenen Netzwerk heraus zu senden. Deshalb wird die Adresse sowohl bei der Registrierung als auch bei JEDER Zustellung geprüft:
Timeouts — 8 s insgesamt, 4 s für den Verbindungsaufbau – ein langsamer Empfänger darf keinen Worker belegen. Stellen Sie die Arbeit in eine Warteschlange und geben Sie sofort 2xx zurück.
Wiederholungsplan — 60 · 300 · 1800 · 7200 · 21600 Sekunden → 6 Versuche, ein Fenster von rund 8,6 Stunden.
Der einzige dauerhafte Fehler: 410 Gone — Er bedeutet „lösch mich“: keine Wiederholung, das Abonnement wird sofort stummgeschaltet. Geben Sie bei einem Signaturfehler NIE 410 zurück.
Jeder andere Fehler — ALLE werden wiederholt, 4xx eingeschlossen. Ein verlorenes Geschäftsereignis kostet mehr als ein paar zusätzliche Anfragen: Ein Empfänger, der 403 liefert, während eine WAF-Regel aktualisiert wird, würde auf einer Schiene, die 4xx als dauerhaft behandelt, stillschweigend ein Ereignis „Rechnung ausgestellt“ verlieren.
Retry-After — Wird bei 429 und 503 beachtet (höchstens 6 Stunden).
Weiterleitungen — Werden NICHT verfolgt. Über eine 302 zu einer internen Adresse zu springen, würde die Adressschranke über einen zweiten Weg durchbrechen.
Automatische Stummschaltung — Nach 10 aufeinanderfolgenden erschöpften Zustellungen. Eine 410, ein unsicheres Ziel und der Widerruf des verknüpften Integrationsschlüssels schalten SOFORT stumm.
nur https, nur die Ports 443/8443, eingebettete Zugangsdaten (https://user:pass@…) werden abgelehnt;
localhost, einteilige Namen und interne Suffixe wie .internal / .local / .svc werden abgelehnt – die Absicht wird abgelehnt, bevor das Auflösungsergebnis überhaupt betrachtet wird, sodass Split-Horizon-DNS die Schranke nicht durchbrechen kann;
IP-Literale und ALLE Einträge der DNS-Auflösung müssen öffentlich sein. Löst ein Name sowohl auf eine öffentliche als auch auf eine private Adresse auf, fragt uns niemand, welche wir nehmen sollen → der Name wird rundweg abgelehnt;
bei der Zustellung wird die Adresse einmal aufgelöst, und die Verbindung wird auf die geprüfte Adresse festgenagelt: Das Fenster für DNS-Rebinding ist geschlossen;
der BODY der Antwort des Empfängers wird nirgends gespeichert (nur Statuscode, Dauer und ein kurzes Fehler-Tag) – so bleibt der „Lese“-Pfad, also das, was ein Loch in der Adressschranke eigentlich wert wäre, verschlossen.
Einen Konfigurationsschalter „private Adressen erlauben“ gibt es bewusst NICHT: Ein solcher Schalter bleibt eines Tages versehentlich eingeschaltet.
Wird EINMAL zurückgegeben, nur beim Anlegen des Abonnements und bei rotate-secret. Es wird auf dem Server verschlüsselt gespeichert und kann nie wieder ausgelesen werden; ein „erneut anzeigen“ gibt es nicht.
lg gibt es auf dem Bildschirm aus und belässt es dort – es schreibt es in keine Konfigurations- oder Cache-Datei.
Geht es verloren, rotieren Sie es; der alte Wert funktioniert IN DIESEM MOMENT nicht mehr. Für einen nahtlosen Wechsel sollte Ihr Empfänger während der Umstellung beide Secrets ausprobieren.
Eine Adressänderung berührt das Secret NICHT: Routinewartung wie „die URL ist umgezogen“ darf die Prüfung auf der Empfängerseite nicht brechen.
Zustand und Status: Niemand sollte eine verstummte Brücke vor Ihnen bemerken
Eine Integrationsbrücke stirbt selten laut. Meist verstummt sie in den frühen Morgenstunden: Ein Token läuft ab, die Person, in deren Namen der Schlüssel läuft, verlässt das Team, ein Scope wird eingeschränkt, oder der empfangende Endpoint beginnt, 403 zu liefern. Der Erste, der es bemerkt, ist fast immer der Kunde. lg status existiert, um diese Reihenfolge umzudrehen.
Ein Befehl beantwortet zwei Fragen auf einmal, weil bei einem Ausfall beide im selben Moment gestellt werden: Läuft die Plattform, und ist meine Brücke gesund? Die Plattformzeile funktioniert ohne Token – bei einer Störung ist das Token selbst der erste Verdächtige, und die Statusfrage daran zu knüpfen, würde Sie genau dann ohne Antwort lassen, wenn Sie eine brauchen.
Die Zustandsübersicht führt kein neues Protokoll; sie fasst drei bestehende Quellen in einem einzigen Satz zusammen: den täglichen Nutzungszähler (wie viel Sie aufgerufen haben und wie viel fehlschlug), das Anfrageprotokoll (welche Anfrage, wann und warum sie abgelehnt wurde) und das Zustellprotokoll der ausgehenden Webhooks (hat das Ereignis den Empfänger erreicht). Die Fehlerquote wird immer aus dem täglichen Zähler gelesen; das Detailprotokoll ist gedeckelt und sagt das klar, wenn die Grenze erreicht ist.
Dieselbe Übersicht erscheint im Panel: Unter Settings › Integration › Keys trägt jede Zeile ein Badge und darunter den Grund. Schwellenwerte werden nicht im Client berechnet; welche Stufe der Server auch vergeben hat, genau die zeigen sowohl das Panel als auch lg status an, sodass die beiden Bildschirme über denselben Schlüssel nie Unterschiedliches sagen können.
Ihr Watchdog braucht kein Token. Der Endpoint liefert nur Statuswörter; er enthält keine Version, keinen Hostnamen, keinen Queue-Namen, keine Job-Anzahl, keinen Fehlertext und keine Kundendaten – und kann es auch nicht.
Die Zustandsübersicht wird mit einer konstanten Anzahl von Abfragen pro Anfrage erzeugt; die Zahl der Abfragen wächst nicht mit der Zahl der Schlüssel. Für Details lesen Sie die letzten Anfragen dieses Schlüssels mit lg logs und die ausgehende Brücke mit lg webhooks list.
GESUND — Kein gemessener Fehler, und wir haben einen Erfolgsnachweis: einen erfolgreichen Aufruf im Protokoll oder Datenverkehr, der im Zähler fehlerfrei blieb.
ACHTUNG — Etwas beginnt zu brechen: Die Fehlerquote oder die Serie aufeinanderfolgender Fehlschläge hat einen Schwellenwert überschritten, Anfragen werden an der Schranke abgelehnt, der Schlüssel läuft bald ab, oder eine Brücke, die regelmäßig sprach, ist verstummt.
AUSFALL — Die Brücke funktioniert gerade nicht: Das Token wurde unbeabsichtigt widerrufen, ein geschlossener Schlüssel wird noch aufgerufen, es gab fünf Fehlschläge in Folge, die Fehlerquote liegt über fünfzig Prozent, oder ein Webhook-Abonnement wurde stummgeschaltet.
GESCHLOSSEN — Der Schlüssel wurde bewusst geschlossen, und niemand ruft ihn auf. Das ist eine Entscheidung, kein Fehler – und es wird nicht rot dargestellt.
KEINE DATEN — Es gibt keine Messung: Der Schlüssel wurde nie aufgerufen, oder die Messung selbst ist fehlgeschlagen. Keines von beiden ist grün.
Kein falsches Grün. Das Badge „gesund“ erfordert einen gemessenen Erfolgsnachweis; ein Schlüssel, der nie aufgerufen wurde, wird nie grün, weil keine einzige Messung zeigt, dass er funktioniert.
Kein falsches Rot. Schlüssel, die Sie absichtlich geschlossen haben, erscheinen als „Geschlossen“. Alles rot zu malen macht Rot bedeutungslos; ein geschlossener Schlüssel wird nur dann rot, wenn er nach dem Schließen weiter aufgerufen wird – und dann ist eine Brücke wirklich kaputt.
„Konnte nicht messen“ ist nicht dasselbe wie „keine Daten“. Schlägt eine Abfrage serverseitig fehl, zeigt die Zeile nicht stillschweigend null; sie sagt, dass die Messung nicht durchgeführt werden konnte.
Stille wird immer gemeldet, aber nie blind zu einer Warnung gemacht. Dass eine Monatsend-Brücke dreißig Stunden schweigt, ist normal; dass eine Brücke verstummt, die an mindestens fünf der letzten sieben Tage gesprochen hat, ist ein Fehler. Der Rhythmus wird gemessen, nicht angenommen.
Die Statusabfrage selbst verfälscht die Zustandswerte nicht. Aufrufe durch lg status erscheinen im Anfrageprotokoll, werden aber aus der Zustandsberechnung ausgeschlossen – sonst würde Ihre eigene erfolgreiche Statusabfrage die Fehlerserie zurücksetzen und genau den Fehler verbergen, den der Bildschirm zeigen soll.
Jede Zeile wird gemessen: Gegen die Datenbank wird eine echte Abfrage ausgeführt, der Befehlskatalog wird wirklich aufgebaut, der Live-Eintrag des Queue-Workers wird wirklich gelesen. Nichts wird angenommen.
Die Antwort selbst ist ebenfalls eine Messung: Wenn Sie den Body lesen können, läuft die Web-Schicht.
Die oberste Ebene leitet sich nur aus den erforderlichen Komponenten ab. Steht die Queue, lautet die Antwort degraded, nicht down – ein synchroner API-Aufruf braucht die Queue nicht, und die Plattform für ausgefallen zu erklären, wäre ein Fehlalarm.
Lässt sich der Zustand der Queue nicht messen, bleibt die oberste Ebene unberührt: Etwas nicht zu wissen ist nicht dasselbe, wie zu messen, dass etwas kaputt ist.
Ist die Plattform ausgefallen, liefert der Endpoint HTTP 503. Der Body kommt ohne Umschlag aus, damit Monitoring-Tools alarmieren können, ohne ihn zu parsen, und die Antwort wird nie in einem Cache gespeichert.
Fehler und Exit-Codes
Wonach eine Maschine verzweigt, ist ein stabiler String. Der Text im Feld error richtet sich an Menschen, ist lokalisiert und ändert sich ohne Vorankündigung – eine Integration, die nach Meldungstext verzweigt, wird nicht unterstützt, und wenn sie bricht, ist das kein Bug.
Zwei Taxonomien, zwei Felder. error_code ist die Transportebene (die Tabelle oben) und das, wonach Sie zuerst verzweigen. error_key ist der stabile Schlüssel der Geschäftsregel innerhalb von failed – INSUFFICIENT_CREDITS, NOT_FOUND, DUPLICATE_CONTACT, INSUFFICIENT_STOCK –, veröffentlicht als Wörterbuch im Katalog (error_keys) und unten. Ein Befehl, der noch keinen Schlüssel ausgibt, liefert error_key: null; behandeln Sie einen Schlüssel, der im Wörterbuch fehlt, als generischen Fehlschlag.
ok — HTTP 200 · error_code — · CLI 0 · —
replayed — HTTP 200 · error_code — · CLI 0 · Idempotentes Replay; die Arbeit lief NICHT erneut.
failed — HTTP 422 · error_code failed · CLI 1 · Nein – eine Geschäftsregel hat abgelehnt (siehe error_key). Sinnlos, solange sich das Argument nicht ändert.
idempotency_conflict — HTTP 409 · error_code idempotency_conflict · CLI 2 · Nein – der Key wurde zuerst für einen anderen Befehl verwendet (conflicting_command). Erzeugen Sie einen neuen Key.
forbidden — HTTP 403 · error_code forbidden · CLI 3 · Nein – Rollenschranke oder ein Schlüssel mit Scope read bei einem schreibenden Befehl.
(Schema) — HTTP 422 · error_code invalid_request · CLI 2 · Nein – der Request-Body oder ein Argument hat die Schemavalidierung nicht bestanden (errors{}); keine Geschäftsregel.
server_error — HTTP 500 · error_code server_error · CLI 6 · Ja – exponentielles Backoff mit DEMSELBEN Idempotency Key; der Key wurde nicht gesperrt.
401 unauthenticated — Das Token ist abgelaufen oder wurde widerrufen. Wiederholen hilft nicht; das Token muss ersetzt werden.
429 rate_limited — Rate Limit für dieses Token erreicht. Die Antwort trägt immer Retry-After und einen Body mit retry_after, limit und bucket; beachten Sie das, statt eine feste Verzögerung zu erfinden. lg wartet und versucht es bis zu dreimal erneut und beendet sich dann mit 5.
5xx server_error / Netzwerkfehler — Wiederholen Sie mit exponentiellem Backoff und DEMSELBEN Idempotency Key. Ein geänderter Key führt Arbeit erneut aus, die der Server womöglich bereits erledigt hat. lg versucht es dreimal (1 s, 2 s, 4 s) und beendet sich dann mit 6 und error_code network_error oder server_error.
Stabilitätsversprechen
Die teuerste Frage in einem Integrationsvertrag lautet: „Läuft der Code, den ich heute schreibe, auch morgen noch?“ Eine Zahl beantwortet sie: contract_version im Katalog und der Header X-Contract-Version in jeder Antwort. Sie beantwortet genau eine Frage – läuft früher geschriebener Code unverändert weiter? Ist die Zahl nicht gestiegen, ja. Ist sie gestiegen, nein: Etwas, auf das Sie sich verlassen haben, wurde entfernt oder eingeschränkt.
Weil eine Abkündigung nichts entfernt: Ihr bestehender Code läuft am Tag danach genau wie zuvor. Bei einer Abkündigung hochzuzählen, würde für eine einzige Änderung zwei Signale aussenden und Sie darauf trainieren, das erste zu ignorieren – und damit das Signal schwächen, das wirklich zählt. Die Abkündigung reist bereits mit dem Aufruf mit, den Sie gerade machen: deprecated_at und replaced_by in der Katalogzeile, ein Header X-Deprecated plus ein deprecated-Block in der Antwort dieses Befehls und eine einzeilige Warnung auf stderr, wenn Sie lg verwenden. Sie müssen nichts tun, um zu erfahren, dass etwas wegfällt; es steht bereits in Ihrem Log.
Zwischen Abkündigung und Entfernung liegen mindestens zwei Kalenderquartale. Während des gesamten Fensters antwortet der alte Befehl weiterhin und warnt bei jedem Aufruf. Wird ein CLI-Name ausgemustert, übernimmt sein Nachfolger diesen Namen als Alias: Während des Fensters erreicht der alte Name den alten Befehl, und am Tag der Entfernung landet derselbe Aufruf beim neuen – ohne dass Sie ein Client-Release ausliefern.
preview_invoice → get_invoice (angekündigt am 3. September 2026). get_invoice liefert denselben Vorschaublock und ergänzt die Positionen, die Steueraufschlüsselung, erfasste Zahlungen, den Restbetrag und die Adressierung über Ihren eigenen ERP-Schlüssel (external_ref). preview_invoice funktioniert weiter, ebenso lg invoices preview – beide warnen.
keine Änderung — Ein neuer Befehl · ein neuer OPTIONALER Parameter · ein neues Antwortfeld · ein neuer Fehlerschlüssel · ein neuer Endpoint — Nichts tun. Sie müssen Felder ignorieren, die Sie nicht kennen; ein Parser, der an einem unbekannten Feld scheitert, ist nicht konform.
keine Änderung — Eine ABKÜNDIGUNG: die Mitteilung, dass ein Befehl wegfällt — Ihr Code läuft weiter. Tragen Sie sich eine Aufgabe in den Kalender ein – das Fenster beträgt mindestens 6 Monate.
steigt — Einen Befehl entfernen · einen alten CLI-Namen ausmustern · ein Antwortfeld streichen · einen optionalen Parameter zur Pflicht machen · ein Enum einschränken — Es bedeutet, dass Sie das Fenster verpasst haben; die Mitteilung hat Sie an drei verschiedenen Stellen erreicht.
Der API-Name eines Befehls (etwa list_loads) ist für immer eingefroren; das ist der Name, den Sie in HTTP-Aufrufen verwenden.
error_code (Transport) und error_key (Geschäftsregel) sind stabile Strings. Neue können hinzukommen – behandeln Sie einen Schlüssel, den Sie nicht im Wörterbuch finden, als generischen Fehlschlag, nicht als Bruch.
Die Zuordnung zwischen HTTP-Status und dem Feld status im Body ist fest.
Die Versionsnummer sinkt nie und ist in jeder Antwort lesbar – auch bei 304 und 429 ohne Body.
Den TEXT von Fehlern und Beschreibungen. Er ist lokalisiert und ändert sich ohne Vorankündigung; nach Meldungstext zu verzweigen wird nicht unterstützt.
Das Fehlen von Feldern, die Sie nicht kennen. Ein hinzugefügtes Feld erhöht die Version nicht.
Auto-Increment-IDs als Geschäftsschlüssel. Führen Sie Ihren eigenen Schlüssel mit external_ref.
Dynamische Fehlerschlüssel, die aus Klassennamen abgeleitet sind; sie sind nicht Teil des Vertrags.
Identitätstabelle der Befehle
Die Tabelle unten ist nicht von Hand geschrieben: Sie wird bei jeder Auslieferung dieser Seite aus dem Live-Befehlsregister erzeugt. Ein auf dem Server hinzugefügter Befehl erscheint hier von selbst. Die Spalte „Schranke“ sagt Ihnen, ob ein Befehl nach einer Bestätigung fragt und ob sich seine Wirkung rückgängig machen lässt; die Spalte „Rollen“ sagt Ihnen, welche Kontotypen ihn in ihrem Katalog finden. Badges kennzeichnen die Befehle, die einen Schlüssel der Stufe manager brauchen, die, die eine Datei entgegennehmen, und die, die nur aus lg laufen.
Der API-Name (list_loads) ist eingefroren und ändert sich nicht; er ist der Name, den Sie in HTTP-Aufrufen verwenden. Die CLI-Identität (loads list) unterliegt der Versionierungsrichtlinie: Einmal angekündigt, ändert sie sich nur mit einer Versionserhöhung und einem Migrationsfenster, in dem der Katalog das alte Paar als Alias ausliefert. Die Beschreibungen hier stammen aus dem jeweiligen Datensatz des Befehls und sind gekürzt – für den vollständigen Text, Parametertypen und Enum-Werte lesen Sie den Katalog-Endpoint oder führen Sie lg help aus. Befehle nur für Affiliates sind hier nicht aufgeführt; ein Affiliate-Konto sieht sie in seinem eigenen Katalog.
lg account-settings get — Read the account settings (Settings → Account): the company display name (and legal name, read-only), the signed-in user's own name and e-mail (e-mail is read-only here), the saved load code prefix and how the company… (lesend · — · Verlader · API: get_account_settings) [manager-Schlüssel]
lg account-settings update — Change account settings (Settings → Account): company_name (the company's display name, company-wide), first_name / last_name (the signed-in user's own name — when only one is given the other part is kept),… (schreibend · Bestätigung · Verlader · API: update_account_settings) [manager-Schlüssel]
lg accounting-settings get — Read the company's accounting and invoicing settings and say whether they are set up (muhasebe ayarları, fatura ayarları, e-fatura / e-invoice profile, KDV / VAT tax regime, fatura numaralandırma serisi / invoice… (lesend · — · alle · API: get_accounting_settings)
lg accounting-settings set-status — Turn the company's accounting module on or off (muhasebe modülünü aç/kapa). (schreibend · Bestätigung · alle · API: set_accounting_module)
lg accounting-settings update — Update the company's accounting/invoicing settings (muhasebe ve fatura ayarlarını değiştir): legal name, default currency, provider (local/parasut), country, tax regime (KDV/VAT/GST/none), default invoice line… (schreibend · Bestätigung · alle · API: update_accounting_settings)
lg addresses list — Loading and delivery addresses already used on this company's previous loads (newest first): address_id, name, street, city and country. query filters by name, street or city. limit 1-50 (default 20). (lesend · — · alle · API: list_worked_addresses)
lg addresses search — Find a place for a route plan stop: the company's own address book first, then a geocoder (counted against the daily routing allowance) when the book has fewer than 3 hits. (lesend · — · Frachtführer · API: lookup_address)
lg ai-settings get — Read our company's AI switches (Settings → AI), e.g. ai_file_classify ("AI document analysis"): whether files posted into our load chats are read by AI, sorted into document types and split into company documents, or… (lesend · — · Verlader · API: get_ai_settings) [manager-Schlüssel]
lg ai-settings update — Turn our company's AI switches on or off (Settings → AI) — e.g. "stop AI from analysing the files in our load chats" → settings=[{"slug":"ai_file_classify","enabled":false}]. settings is a list of {slug, enabled}; slugs… (schreibend · Bestätigung · Verlader · API: update_ai_settings) [manager-Schlüssel]
lg announcements list — Show the system announcements Logistivo sent to this user (new features, maintenance, policy changes) — newest first. (lesend · — · alle · API: list_announcements)
lg announcements mark-read — Mark system announcements as read for this user. (schreibend · — · alle · API: mark_announcements_read)
lg attachments get — Read a file the user attached to THIS conversation (listed in the user message as [Attachments] with their attachment_uuid). (lesend · — · alle · API: read_attachment) [nimmt eine Datei: attachment_uuid]
lg background-jobs get — Check a background job that another command queued and returned a job_id for (document consistency re-analysis, file classification, tariff inquiry, tariff invoice reading, receipt pack…): status pending / running /… (lesend · — · alle · API: get_background_job)
lg bank-accounts create — Add one of YOUR OWN company bank accounts to the account book (the accounts you get paid into). (schreibend · Bestätigung + irreversibel · alle · API: create_company_bank_account) [manager-Schlüssel]
lg bank-accounts delete — Delete one of OUR OWN company bank accounts (for example a closed account). (schreibend · Bestätigung + irreversibel · alle · API: delete_company_bank_account) [manager-Schlüssel]
lg bank-accounts extract — Read a supplier's bank accounts (IBAN, bank, holder, currency) from one of ITS invoices and save them on that business contact. (schreibend · Bestätigung + irreversibel · alle · API: extract_supplier_bank_accounts) [nimmt eine Datei: attachment_uuid]
lg bank-accounts list — List bank accounts. (lesend · — · alle · API: list_bank_accounts)
lg bank-accounts preview — Check an IBAN without saving anything: is it valid (country, length, checksum) and which bank it belongs to (detected offline from the bank code where known). (lesend · — · alle · API: preview_bank_account_iban)
lg bank-accounts set-default — Make one of OUR OWN bank accounts the default — the IBAN printed on our invoices and e-invoices. (schreibend · Bestätigung + irreversibel · alle · API: set_default_company_bank_account) [manager-Schlüssel]
lg bank-accounts set-status — Confirm or reject a bank account that was read from a document by AI or written by an integration — your own account or a business contact's account (find the ones waiting with list_bank_accounts… (schreibend · Bestätigung + irreversibel · alle · API: decide_bank_account_verification) [manager-Schlüssel]
lg bank-accounts update — Update one of OUR OWN company bank accounts (the accounts customers pay us into): IBAN, bank, account holder, branch code, account number or currency. (schreibend · Bestätigung + irreversibel · alle · API: update_company_bank_account) [manager-Schlüssel]
lg banks list — List the banks of Turkey with their bank_id and SWIFT/BIC code — the bank_id that create_company_bank_account and update_company_bank_account need. (lesend · — · alle · API: list_banks)
lg bids accept — Accept a carrier's bid on one of this company's demands. (schreibend · Bestätigung + irreversibel · Verlader · API: accept_demand_bid)
lg bids calculate — Before bidding: what this carrier would earn and how many credits a bid would cost if the customer accepts it. (lesend · — · Frachtführer · API: calculate_bid_earnings)
lg bids cancel — Withdraw (geri çek) one of THIS carrier company's PENDING bids. (schreibend · Bestätigung + irreversibel · Frachtführer · API: cancel_demand_bid)
lg bids create — Submit a bid (teklif ver) on an open demand. amount_per_vehicle is the freight PER VEHICLE, not the total. (schreibend · Bestätigung + irreversibel · Frachtführer · API: create_demand_bid)
lg bids get — Detail of ONE bid this carrier company submitted: demand, status (pending / accepted / revised / cancelled / price_too_high), price per vehicle and total, currency, vehicle count, customs included or customs price,… (lesend · — · Frachtführer · API: get_my_demand_bid)
lg bids list — List the bids (teklif) THIS carrier company has submitted, newest first, with their outcome. (lesend · — · Frachtführer · API: list_my_bids)
lg bids revise — Revise this carrier's own PENDING bid on a demand: the old bid is marked revised and a NEW bid replaces it (it gets a new bid code). (schreibend · Bestätigung + irreversibel · Frachtführer · API: revise_demand_bid)
lg carbon-reports calculate — Calculate the CO2 emission of an EXISTING load (load_code: weight and route from the load, including its Ro-Ro leg) OR of a route you describe (transport_mode road|roro + weight_kg + departure_address + arrival_address,… (lesend · — · alle · API: calculate_load_carbon_emission)
lg carbon-reports download — Export ALL of the company's saved CO2 emission reports to one Excel file (one row per report: date, route, mode, weight, distance, emission, factor, method) and return a short-lived download link. (lesend · — · alle · API: export_carbon_emission_reports)
lg carbon-reports generate — Produce the signed CO2 emission report (PDF, with QR code) for a load OR for a route, save it to the company's report list and return a download link. (schreibend · Bestätigung + irreversibel · alle · API: generate_carbon_emission_report)
lg carbon-reports get — Read one CO2 emission report in full: total emission in kg, transport mode, weight, distance, emission factor, calculation method and source, the departure/arrival addresses, the leg breakdown for multi-modal routes… (lesend · — · alle · API: get_carbon_emission_report)
lg carbon-reports list — List the CO2 emission reports this company has generated (newest first): report number, file name, who created it and when. (lesend · — · alle · API: list_carbon_emission_reports)
lg carrier-routes get — This carrier's route definitions (Rota Yönetimi): the countries served — always ↔ Türkiye in both directions — and the vehicle types and load types operated, with ids and names. (lesend · — · Frachtführer · API: get_carrier_routes)
lg carrier-routes set — REPLACE this carrier's route definitions (Rota Yönetimi) with the given FULL sets: countries served (each to/from Türkiye, both directions), vehicle types and load types. (schreibend · Bestätigung · Frachtführer · API: set_carrier_routes) [manager-Schlüssel]
lg chart-of-accounts list — List the chart of accounts available to this company (Turkish uniform chart: 100 Kasa, 102 Bankalar, 120 Alıcılar, 320 Satıcılar, 391 Hesaplanan KDV, 600/601 Satışlar…), optionally filtered by code/name text or type. (lesend · — · alle · API: list_chart_of_accounts)
lg checks assign-invoices — Allocate a pending, field-confirmed cheque to one or more open LOCAL invoices of the same contact and currency: in = sales invoices (collection), out = purchase invoices (payment). (schreibend · Bestätigung + irreversibel · alle · API: attach_check_to_invoices) [manager-Schlüssel]
lg checks bounce — Record that a cheque BOUNCED (came back unpaid). (schreibend · Bestätigung + irreversibel · alle · API: mark_check_bounced)
lg checks cancel — CANCEL a pending cheque (e.g. registered by mistake, returned before use): no journal entry is written and any invoice reservation is released. (schreibend · Bestätigung + irreversibel · alle · API: cancel_settlement_check) [manager-Schlüssel]
lg checks collect — Record that a cheque was COLLECTED (money reached the bank for an incoming cheque, or left the bank for an outgoing one) on its due date. (schreibend · Bestätigung + irreversibel · alle · API: mark_check_collected)
lg checks create — Register a cheque in the cheque portfolio. (schreibend · Bestätigung · alle · API: create_settlement_check) [manager-Schlüssel] [nimmt eine Datei: front_attachment_uuid, back_attachment_uuid]
lg checks get — Read one cheque in full: its identity (number, serial, bank and branch, drawer with tax number, IBAN), the face amount and currency, issue and due dates, the counterparty, the status with every timestamp (executed,… (lesend · — · alle · API: get_settlement_check)
lg checks list — List the cheque portfolio of this company: cheque number, direction (in = received from a customer, out = given to a supplier), drawer and bank, face amount with its currency, issue and DUE date, the counterparty… (lesend · — · alle · API: list_settlement_checks)
lg checks remove-invoices — Release a pending cheque's invoice allocation: the reservations are removed (invoices become payable again) and the cheque goes back to the unallocated pending cheques. (schreibend · Bestätigung · alle · API: detach_check_from_invoices) [manager-Schlüssel]
lg checks run — EXECUTE a pending, allocated cheque against its invoices: the reservations become payments (the invoice balances close), and the notes receivable (121, received cheque) or notes payable (321, given cheque) journal… (schreibend · Bestätigung + irreversibel · alle · API: execute_settlement_check) [manager-Schlüssel]
lg checks update — Correct a pending cheque's fields and CONFIRM them — the human sign-off on what AI read from the photo (or on a manual entry). (schreibend · Bestätigung · alle · API: update_settlement_check) [manager-Schlüssel]
lg companies add-role — Add a role to this company (firmaya rol ekle): customer (shipper), carrier, customs (customs broker) or affiliate. (schreibend · Bestätigung + irreversibel · alle · API: add_company_role) [manager-Schlüssel]
lg companies delete-logo — Remove this company's logo (firma logosu) from the branded login portal, documents and the panel. (schreibend · Bestätigung + irreversibel · alle · API: delete_company_logo) [manager-Schlüssel]
lg companies get — This company's own profile (firma profili): legal name, tax number and tax office, address and postal code, city/country, payment term (vade), the company roles it has (customer/carrier/customs/affiliate) and the roles… (lesend · — · alle · API: get_company_profile)
lg companies invite — Invite a company that is NOT on Logistivo yet by e-mail (e.g. a carrier we want to give a load to). (schreibend · Bestätigung + irreversibel · alle · API: invite_company_to_platform)
lg companies list — Logistivo platform companies this company has already worked with on loads (shared load chats), by company_type: customer (shippers), carrier or customs (customs brokers). (lesend · — · alle · API: list_platform_companies)
lg companies search — Check whether a company is on Logistivo — by EXACTLY ONE of: tax_number (exact VKN / tax id), vat_number (exact EU/UK VAT number) or email (any e-mail of that company, matched by its domain; then company_type is… (lesend · — · alle · API: search_platform_companies)
lg companies set-brand-colors — Set the two colours of this company's branded login portal (markalı giriş portalı, /p//login) — primary_color and secondary_color as #RRGGBB hex. (schreibend · Bestätigung · Frachtführer, Zolldienstleister · API: set_company_brand_colors) [manager-Schlüssel]
lg companies set-logo — Make an uploaded image this company's logo (firma logosu) — shown on the branded login portal, documents and the panel. attachment_uuid is a JPEG or PNG image (max 8 MB) uploaded to this conversation or with `lg upload`. (schreibend · Bestätigung + irreversibel · alle · API: set_company_logo) [manager-Schlüssel] [nimmt eine Datei: attachment_uuid]
lg companies update — Update this company's profile (firma profili) — send ONLY the fields that change: legal_name (ticaret unvanı), tax_number (VKN / VAT id), tax_branch (vergi dairesi), address_street, postal_code, city_id, country_code… (schreibend · Bestätigung · alle · API: update_company_profile) [manager-Schlüssel]
lg company-documents create — File a document the user attached (in this chat, or uploaded to the command surface) as one of the company's own documents (firma evrakı yükle): tax certificate (vergi levhası), signature circulars (imza sirküleri),… (schreibend · Bestätigung · alle · API: upload_company_document) [nimmt eine Datei: attachment_uuid]
lg company-documents delete — Remove one of the company's own documents (tax certificate, signature circular, trade registry gazette, permits…) from its document list — e.g. a wrong or outdated upload. document_id is the one shown by… (schreibend · Bestätigung + irreversibel · alle · API: delete_company_document)
lg company-documents list — List this company's own filed documents (tax certificate, signature circulars, trade registry gazette, contracts, TIO/L2 permits, files uploaded to chats…) with their type, number, validity date and verification status. (lesend · — · alle · API: list_company_documents)
lg company-documents list-missing — Which company documents (tax certificate, signature circulars, trade registry gazette, TIO/L2/C2 permits …) this company is REQUIRED to have for its company type and country, which of them are on file and verified, and… (lesend · — · alle · API: list_missing_company_documents)
lg company-domains create — Add an e-mail domain to our company (e.g. firma.com.tr) and e-mail a 6-digit verification code to a mailbox ON that domain. (schreibend · Bestätigung + irreversibel · alle · API: create_company_domain) [manager-Schlüssel]
lg company-domains delete — Remove one of our UNVERIFIED company domains (e.g. added by mistake). (schreibend · Bestätigung + irreversibel · alle · API: delete_company_domain) [manager-Schlüssel]
lg company-domains list — List our company's e-mail domains (Company settings → Domains): each row has company_domain_id, domain, verified (true once the 6-digit code was entered) and, for unverified ones, the mailbox the last code was sent to. (lesend · — · alle · API: list_company_domains)
lg company-domains resend — E-mail a NEW 6-digit verification code for one of our unverified company domains (the previous code stops working). (schreibend · Bestätigung + irreversibel · alle · API: resend_company_domain_code) [manager-Schlüssel]
lg company-domains verify — Verify one of our unverified company domains with the 6-digit code that was e-mailed to the mailbox on that domain. (schreibend · Bestätigung + irreversibel · alle · API: verify_company_domain) [manager-Schlüssel]
lg company-relationships accept — Accept a connection proposal another company sent us (relationship_id from list_company_relationships direction=incoming). (schreibend · Bestätigung + irreversibel · alle · API: accept_company_relationship) [manager-Schlüssel]
lg company-relationships create — Send a connection proposal to link one of our business contacts with its company on the Logistivo platform (company_id from search_platform_companies). (schreibend · Bestätigung + irreversibel · alle · API: create_company_relationship) [manager-Schlüssel]
lg company-relationships list — List our company connections on the platform (direction=outgoing, default: the connections in our directory, with status and roles such as carrier/customs_broker/supplier) or the connection proposals other companies… (lesend · — · alle · API: list_company_relationships)
lg company-relationships reject — Reject a connection proposal another company sent us (relationship_id from list_company_relationships direction=incoming). (schreibend · Bestätigung + irreversibel · alle · API: reject_company_relationship) [manager-Schlüssel]
lg company-relationships revoke — End a company connection we are a party of (either side may end it), or withdraw a pending proposal. (schreibend · Bestätigung + irreversibel · alle · API: revoke_company_relationship) [manager-Schlüssel]
lg contacts add-address — Add an address to a business contact (e.g. a warehouse or branch): a label, the full street address and the country (ISO-2 code); postal code optional. (schreibend · Bestätigung · alle · API: add_business_contact_address)
lg contacts add-bank-account — Add a bank account (IBAN) to a business contact so it can be used on payment instructions and invoices. (schreibend · Bestätigung + irreversibel · alle · API: add_business_contact_bank_account)
lg contacts add-person — Add a person (yetkili kişi) to a business contact: first name, last name and e-mail are required; phone, phone country code, job title and a note are optional. (schreibend · Bestätigung · alle · API: add_business_contact_person)
lg contacts archive — Archive a business contact (cariyi arşivle): it disappears from lists and pickers and becomes read-only, but nothing is deleted — invoices, loads and bank accounts stay linked, and restore_business_contact brings it… (schreibend · Bestätigung · alle · API: archive_business_contact)
lg contacts create — Create a new business contact (cari) in the company directory. (schreibend · Bestätigung · alle · API: create_business_contact)
lg contacts delete-address — Delete one of a business contact's addresses. (schreibend · Bestätigung + irreversibel · alle · API: delete_business_contact_address)
lg contacts delete-bank-account — Delete one of a business contact's bank accounts (for example an old or wrong IBAN). (schreibend · Bestätigung + irreversibel · alle · API: delete_business_contact_bank_account)
lg contacts delete-person — Delete a person from a business contact, together with that person's notification preferences. (schreibend · Bestätigung + irreversibel · alle · API: delete_business_contact_person)
lg contacts extract — Read a business card, letterhead or invoice header (image or PDF) and return the company details on it — legal name, tax number and office, VAT number, e-mail, phone, IBAN (checksum-checked, bank detected), address,… (lesend · — · alle · API: extract_business_contact_from_image) [nimmt eine Datei: attachment_uuid]
lg contacts extract-text — Read pasted text (Excel/CSV rows, e-mail signatures, a typed list) and return up to 100 draft records of ONE kind: companies, persons, addresses or bank_accounts. (lesend · — · alle · API: extract_business_contacts_from_text)
lg contacts get — Read one business contact in full (identity, tax data, address, e-mail/phone, bank accounts, platform link) together with its account summary: ledger balance (positive = they owe us), open receivables and open payables. (lesend · — · alle · API: get_business_contact)
lg contacts invite — Invite a business contact to join Logistivo by e-mail. (schreibend · Bestätigung + irreversibel · alle · API: invite_business_contact)
lg contacts list — List the company's business contacts (customers, carriers, suppliers, consignees) with optional text search over name, legal name and tax number. (lesend · — · alle · API: list_business_contacts)
lg contacts list-addresses — List the saved addresses of one business contact (label, street address, postal code, country) with address_id, needed by update/delete. (lesend · — · alle · API: list_business_contact_addresses)
lg contacts list-person-notifications — Show which load notifications a contact person receives and on which channel (e-mail, push, SMS), plus the notification types that can be chosen with their allowed channels — use those slugs with… (lesend · — · alle · API: list_business_contact_person_notifications)
lg contacts list-persons — List the people (yetkili kişiler) saved on one business contact: name, e-mail, phone, job title, note, and which load notifications each one receives. (lesend · — · alle · API: list_business_contact_persons)
lg contacts list-routes — Show which countries a business contact that is linked to a carrier on the platform serves: its declared route pairs (from-country → to-country) and the distinct country list. (lesend · — · alle · API: list_business_contact_routes)
lg contacts remove-company-link — Remove the link between a business contact and its company on the Logistivo platform. (schreibend · Bestätigung + irreversibel · alle · API: unlink_business_contact_company) [manager-Schlüssel]
lg contacts restore — Bring an archived business contact back (cariyi arşivden geri al): it returns to lists and pickers and can be edited again. (schreibend · Bestätigung · alle · API: restore_business_contact)
lg contacts search — Resolve a business contact (customer/partner/recipient) by name, legal name or tax number to its contact_id. (lesend · — · alle · API: lookup_business_contact)
lg contacts set-default-bank-account — Make one of a business contact's bank accounts its DEFAULT account — the one pre-selected when you pay this contact. (schreibend · Bestätigung + irreversibel · alle · API: set_default_business_contact_bank_account)
lg contacts set-person-notifications — Turn load notifications on or off for a contact person, per notification type and channel (e-mail, push, SMS). (schreibend · Bestätigung · alle · API: set_business_contact_person_notifications)
lg contacts update — Update fields of an existing business contact. (schreibend · Bestätigung · alle · API: update_business_contact)
lg contacts update-address — Correct one of a business contact's addresses. (schreibend · Bestätigung · alle · API: update_business_contact_address)
lg contacts update-bank-account — Correct one of a business contact's bank accounts: IBAN, account holder, bank name, BIC/SWIFT, currency, label, account type, branch code or account number. (schreibend · Bestätigung + irreversibel · alle · API: update_business_contact_bank_account)
lg contacts update-person — Correct a contact person's details. (schreibend · Bestätigung · alle · API: update_business_contact_person)
lg containers calculate — Decode and validate a container number (konteyner numarası) per ISO 6346 — owner code, category, serial, check digit (is it correct, and what it should be) and, when known, the operating line with its public tracking… (lesend · — · alle · API: decode_container_number)
lg conversations add-file — Post a file into an OFFER (demand-bid) chat as this user — e.g. a price sheet or a vehicle photo for the other company. conversation_code comes from list_conversations (rows whose subject is demand_bid). (schreibend · Bestätigung + irreversibel · alle · API: send_conversation_file) [nimmt eine Datei: attachment_uuid]
lg conversations add-invitation — Invite a person from ANOTHER company into a load chat by e-mail (sohbete dışarıdan davet). (schreibend · Bestätigung + irreversibel · alle · API: invite_to_conversation)
lg conversations add-message — Post a message into a load/bid conversation AS THIS USER (not as an assistant). (schreibend · Bestätigung + irreversibel · alle · API: send_conversation_message)
lg conversations add-participants — Add people to a load/demand conversation (sohbete kişi ekle) — "Ayşe'yi FKZ8515 sohbetine ekle". (schreibend · Bestätigung · alle · API: add_conversation_participants)
lg conversations create — Open the freight chat with a carrier that bid on one of OUR demands (navlun sohbetini başlat) — bid_code comes from get_demand / the bids of a demand. (schreibend · Bestätigung + irreversibel · Verlader · API: start_bid_conversation)
lg conversations list — List the chat conversations this user is a member of (load chats, bid chats and private carrier channels), newest activity first. (lesend · — · alle · API: list_conversations)
lg conversations list-files — List the files shared in a load/bid chat, newest first: document type, title, file name, who posted it and when. (lesend · — · alle · API: list_conversation_files)
lg conversations list-invitations — Show the e-mail invitations to a load chat that have not been accepted yet: who was invited, by whom and when, and what they will be allowed to see. (lesend · — · alle · API: list_conversation_invitations)
lg conversations list-messages — Read the most recent messages of one conversation — give it a load code (e.g. (lesend · — · alle · API: list_conversation_messages)
lg conversations list-participants — Who is in this conversation — name and company of every participant. (lesend · — · alle · API: list_conversation_participants)
lg conversations mark-read — Mark one conversation as read for this user (clears its unread badge), or with all=true every load, bid and direct-message chat at once. (schreibend · — · alle · API: mark_conversation_read)
lg conversations remove-message — Delete one of THIS user's own messages from a conversation (message_id from list_conversation_messages with `mine` true). (schreibend · Bestätigung + irreversibel · alle · API: delete_conversation_message)
lg conversations remove-participant — Remove someone from a load/bid chat, cancel a pending e-mail invitation to it, or leave it yourself (give your own user_id). (schreibend · Bestätigung + irreversibel · alle · API: remove_conversation_participant)
lg conversations update-message — Edit one of THIS user's own messages in a conversation (message_id comes from list_conversation_messages, where `mine` is true). (schreibend · Bestätigung · alle · API: update_conversation_message)
lg countries search — Resolve a country by name (Turkish, English or the local/native name) or ISO 3166-1 alpha-2 code to its country_id, for the sending/receiving country on a load. (lesend · — · alle · API: lookup_country)
lg currencies list — The currencies the platform knows (currency_id, code, name, symbol) with the latest exchange rate against the Turkish lira (buying / selling, rate date). currency_id is what forms such as bank accounts take. (lesend · — · alle · API: list_currencies)
lg custom-reports generate — Custom report counted server-side over ALL records of a dataset: filter, group (dates by month etc.), count/sum/avg/min/max (money per currency) or list rows; format=xlsx|pdf|csv gives a file. (lesend · — · alle · API: build_report)
lg customs-companies list — Customs broker companies this customer can assign when accepting a bid (accept_demand_bid customs_company_id): the Logistivo customs companies you already work with in your chats. (lesend · — · Verlader · API: list_customs_companies)
lg customs-locations search — Search customs offices / customs locations (gümrük müdürlüğü, gümrük lokasyonu) by name or street — for the exit and destination customs of a load. (lesend · — · alle · API: lookup_customs_location)
lg demand-bid-reports get — Bid report across ALL demands at once, counted server-side: for a customer the bids RECEIVED on its demands, for a carrier the bids it PLACED. (lesend · — · Verlader, Frachtführer · API: get_demand_bid_report)
lg demand-reports get — Demand report (Talep Raporu) with optional filters: status, demanding company, transport mode, pickup / delivery countries, loading-date window. (lesend · — · Verlader, Frachtführer · API: get_demand_report)
lg demand-settings get — This carrier company's demand settings: whether demands opened by forwarder companies reach the company (accept_demands_from_forwarders). (lesend · — · Frachtführer · API: get_demand_settings) [manager-Schlüssel]
lg demand-settings update — Change this carrier company's demand settings. accept_demands_from_forwarders=false stops demands opened by forwarder companies from reaching the company (only shippers' demands remain); true lets them in again. (schreibend · Bestätigung · Frachtführer · API: update_demand_settings) [manager-Schlüssel]
lg demand-targets search — Resolve a pickup/delivery location for a demand to a target token ("5-" = district/postal area, "10-" = seaport address). (lesend · — · Verlader · API: lookup_demand_target)
lg demands create — Open a freight demand (talep) so carriers can bid. (schreibend · Bestätigung + irreversibel · Verlader · API: create_demand) [nimmt eine Datei: attachment_uuids]
lg demands download — File for ONE demand owned by this company. export_type=details_pdf: the demand's detail sheet (route, dates, cargo, pallets) as PDF. export_type=sales_xlsx: the sales report workbook — demand information, every bid… (lesend · — · Verlader · API: download_demand_export)
lg demands extract — Read a freight request text (an e-mail body, a note, a voice transcript) and return the demand fields it contains in the demand wizard's shape: transport mode, countries, ports, locations, dates, load type, vehicle… (lesend · — · Verlader · API: extract_demand_from_text)
lg demands get — Detail of ONE freight demand. (lesend · — · Verlader, Frachtführer · API: get_demand)
lg demands list — List freight demands (talep) this carrier is allowed to bid on, newest first. (lesend · — · Frachtführer · API: list_open_demands)
lg demands list-own — List the freight demands (talep) OWNED by this customer company, newest first, with route, dates, vehicles, status and bid count. (lesend · — · Verlader · API: list_demands)
lg demands options — Reference lists needed to build a freight demand (talep) with create_demand: vehicle types (id, name, transport mode), payment maturity options (id + days; company_default_maturity_option_id is what the company normally… (lesend · — · Verlader · API: get_demand_form_options)
lg demands set-status — Close (make passive) one of this company's ACTIVE demands so carriers stop bidding. (schreibend · Bestätigung + irreversibel · Verlader · API: close_demand)
lg demands update — Edit one of this company's ACTIVE demands that has NO bids yet (a demand with bids or a closed one cannot be edited). (schreibend · Bestätigung · Verlader · API: update_demand) [nimmt eine Datei: attachment_uuids]
lg direct-conversations add-message — Send a direct message AS THIS USER (never as an assistant) — either into an existing chat (conversation_code from list_direct_conversations) or to one person (to_user_id from list_direct_message_contacts; their private… (schreibend · Bestätigung + irreversibel · alle · API: send_direct_message)
lg direct-conversations create — Start a direct chat. (schreibend · Bestätigung + irreversibel · alle · API: create_direct_conversation)
lg direct-conversations download — Produce the whole direct-message or group chat as a PDF (the same file as the panel's export button: participants and every message with date and time) and return a short-lived download link. (lesend · — · alle · API: export_direct_conversation_pdf)
lg direct-conversations list — List this user's direct-message (DM) chats and group chats — person-to-person messaging, separate from load/bid chats (those are list_conversations). (lesend · — · alle · API: list_direct_conversations)
lg direct-conversations list-contacts — List the people this user can direct-message: their own teammates plus people they share a load/bid chat with. (lesend · — · alle · API: list_direct_message_contacts)
lg direct-conversations list-messages — Read the latest messages of one direct-message or group chat (conversation_code from list_direct_conversations), oldest→newest, with who wrote them. `mine: true` marks this user's own messages; only those, and only… (lesend · — · alle · API: list_direct_conversation_messages)
lg direct-conversations mark-read — Mark one direct-message or group chat as read for this user (clears its unread badge). (schreibend · — · alle · API: mark_direct_conversation_read)
lg direct-conversations remove-message — Delete one of THIS user's own direct messages (message_id from list_direct_conversation_messages, mine and editable true), only within 5 minutes of sending. (schreibend · Bestätigung + irreversibel · alle · API: delete_direct_message)
lg direct-conversations update — Rename a GROUP direct chat (private one-to-one chats have no title). (schreibend · Bestätigung · alle · API: rename_direct_conversation)
lg direct-conversations update-message — Edit one of THIS user's own direct messages (message_id from list_direct_conversation_messages, where mine and editable are true). (schreibend · Bestätigung · alle · API: update_direct_message)
lg document-checks run — Cross-check documents the user attached to THIS conversation against each other and report the discrepancies: mismatched party names, quantities, weights, amounts, dates, container or reference numbers between an… (schreibend · — · alle · API: check_document_compliance) [nimmt eine Datei: attachment_uuids]
lg document-types list — List the platform's document types (slug and name) — the values document_type_slug accepts in upload_company_document, add_driver_document and the vehicle document commands. (lesend · — · alle · API: list_document_types)
lg documents download — Get a short-lived (15 minute) download/preview link for one document by its document_id (from list_load_documents or list_company_documents). (lesend · — · alle · API: get_document_link)
lg drive-rest-estimates get — One driver's GPS-ESTIMATED driving/rest status and driving time left under EU 561/2006 / AETR: current activity and since when, driving_left_today_s = the legal driving time left today under the daily, weekly (56 h) AND… (lesend · — · Frachtführer · API: get_driver_drive_rest_estimate)
lg drive-rest-estimates list — Fleet overview of the GPS-ESTIMATED driving/rest status and driving time left (EU 561/2006 / AETR): per driver the current activity, driving_left_today_s = the legal driving time left today under the daily, weekly (56… (lesend · — · Frachtführer · API: list_driver_drive_rest_estimates)
lg driver-accounts get — Answer "how much do we owe this driver / how much does the driver owe us". (lesend · — · Verlader, Frachtführer · API: get_driver_account_summary)
lg driver-accounts list-candidates — Before opening or filling a driver settlement statement: which of ONE driver's receipts and advances can go on it, and why the others cannot. (lesend · — · Verlader, Frachtführer · API: list_driver_account_candidates)
lg driver-advances cancel — Cancel (void) a recorded driver money movement that did not really happen or was entered with the wrong amount. (schreibend · Bestätigung + irreversibel · Verlader, Frachtführer · API: cancel_driver_advance)
lg driver-advances create — Record a money movement between the company and a driver: an advance handed to the driver, money the driver gave back, a closing payout, or a carry-forward opening balance. (schreibend · Bestätigung · Verlader, Frachtführer · API: create_driver_advance) [nimmt eine Datei: attachment_uuid]
lg driver-advances delete — Delete a driver money movement that was entered by mistake (duplicate, wrong driver). (schreibend · Bestätigung + irreversibel · Verlader, Frachtführer · API: delete_driver_advance)
lg driver-advances list — List the money movements between the company and its drivers: cash advances handed out, money paid back by the driver, closing payouts and carry-forward opening balances. (lesend · — · Verlader, Frachtführer · API: list_driver_advances)
lg driver-advances update — Correct the non-money details of a recorded driver money movement: its reference, note, or the load it belongs to. (schreibend · Bestätigung · Verlader, Frachtführer · API: update_driver_advance)
lg driver-availabilities create — Record that a driver is unavailable on some days — "Ali is on leave 14-20 November", "Mehmet rests at home next week", "Kemal is sick from today". (schreibend · Bestätigung · Frachtführer · API: create_driver_availability)
lg driver-availabilities delete — Delete ONE availability period (id from list_driver_availabilities) — the driver counts as available again on those days. (schreibend · Bestätigung + irreversibel · Frachtführer · API: delete_driver_availability)
lg driver-availabilities list — List drivers' leave, home-rest, sick and other unavailability periods (newest planning input), optionally for one driver and/or a date window. (lesend · — · Frachtführer · API: list_driver_availabilities)
lg driver-availabilities update — Correct one availability period (id from list_driver_availabilities): kind, dates, Schengen presence or note. (schreibend · Bestätigung · Frachtführer · API: update_driver_availability)
lg driver-expense-settings get — Read this company's driver expense module settings: is the module switched on, which currency receipts and advances are converted into, whether receipts need approval (and above which amount), whether drivers may… (lesend · — · Verlader, Frachtführer · API: get_driver_expense_settings)
lg driver-expense-settings update — Change this company's driver expense module settings — only the fields you pass change. (schreibend · Bestätigung · Verlader, Frachtführer · API: update_driver_expense_settings) [manager-Schlüssel]
lg driver-expenses create — File one or MANY expense receipts the user attached to this conversation (fuel, toll, ferry, parking, repair, meal…) into the driver expense ledger as pending expenses of ONE of this company's drivers. (schreibend · Bestätigung + irreversibel · Verlader, Frachtführer · API: process_receipt) [nimmt eine Datei: attachment_uuid, attachment_uuids]
lg driver-expenses declare — Record a driver expense WITHOUT a receipt (fişsiz şoför harcaması) — "Mehmet dün 40 EUR otopark ödedi, fişi yok", "log 120 PLN toll for driver X". (schreibend · Bestätigung · Verlader, Frachtführer · API: create_driver_expense)
lg driver-expenses delete — Delete a driver expense entered by mistake (duplicate receipt, wrong driver, test entry). (schreibend · Bestätigung + irreversibel · Verlader, Frachtführer · API: delete_driver_expense)
lg driver-expenses download — Get the download link of a receipt pack that generate_driver_receipt_pack prepared in the background. (lesend · — · Verlader, Frachtführer · API: download_driver_receipt_pack)
lg driver-expenses generate — Produce ONE PDF that contains the driver receipts of a selection — for a trip, a load, a driver statement or a date window — e.g. to hand to accounting or the customer. (lesend · — · Verlader, Frachtführer · API: generate_driver_receipt_pack)
lg driver-expenses get — Read one driver expense (receipt) by its id: merchant, amount, currency, converted amount, category, payment channel, whether it is charged to the driver, and the approval status. (lesend · — · Verlader, Frachtführer · API: get_driver_expense)
lg driver-expenses list — List driver expense receipts (fuel, toll, ferry, parking, food, repair…) with a converted total. (lesend · — · Verlader, Frachtführer · API: list_driver_expenses)
lg driver-expenses list-loads — For ONE driver: which loads they carried and, per load, how many receipts there are, how many still await approval, how much is reimbursable to the driver, how much is company-billed (fuel card / DKV / UTA — never the… (lesend · — · Verlader, Frachtführer · API: list_driver_expense_loads)
lg driver-expenses list-trips — For ONE driver: which trips (load groups) they drove and, per trip, the number of loads and the driver's OWN receipt figures (count, awaiting approval, reimbursable, company-billed fuel-card / DKV / UTA, still… (lesend · — · Verlader, Frachtführer · API: list_driver_expense_trips)
lg driver-expenses review — Approve or reject ONE driver expense (receipt) from the chat, or send an already-decided one back to pending. status=approved means the company accepts the expense (an approved reimbursable receipt can then be counted… (schreibend · Bestätigung · Verlader, Frachtführer · API: review_driver_expense)
lg driver-expenses set-in-account — Count driver receipts INTO the driver's account (include=true, default) or take them OUT of it (include=false). (schreibend · Bestätigung · Verlader, Frachtführer · API: set_driver_expenses_in_account)
lg driver-expenses update — Correct a recorded driver expense (receipt or no-receipt): amount, currency, date, category, how it was paid, merchant, description or the load it belongs to — "the parking was 45 EUR not 40", "that fuel was paid with… (schreibend · Bestätigung · Verlader, Frachtführer · API: update_driver_expense)
lg driver-expenses update-conversion — Retry the currency conversion of ONE driver receipt whose exchange rate could not be resolved (it then sits outside every total and cannot go into a driver statement). (schreibend · — · Verlader, Frachtführer · API: retry_driver_expense_conversion)
lg driver-schedules accept — Apply ONE schedule suggestion (suggestion_id from get_driver_schedule): the proposed driver is assigned to the load (or every consignment of the trip — consignments still held by another driver are taken over, and the… (schreibend · Bestätigung · Frachtführer · API: apply_driver_schedule_suggestion)
lg driver-schedules generate — Compute schedule suggestions for a 7-90 day window starting within 30 days: which driver should take each unassigned load, trip and route plan so that nobody runs out of Schengen days, leave is respected and vehicles do… (schreibend · Bestätigung · Frachtführer · API: generate_driver_schedule)
lg driver-schedules get — Read one schedule run (schedule_id from generate_driver_schedule / list_driver_schedules): summary (jobs covered, unassignable jobs and why, vehicle idle days before → after, lowest Schengen margin), the suggestions in… (lesend · — · Frachtführer · API: get_driver_schedule)
lg driver-schedules list — List the company's schedule-suggestion runs, newest first: id (schedule_id), status (queued | running | completed | failed), the planned window, objective and whether the run is out of date (is_stale — planning inputs… (lesend · — · Frachtführer · API: list_driver_schedules)
lg driver-schedules reject — Dismiss ONE open schedule suggestion (suggestion_id from get_driver_schedule) so it is no longer offered; nothing is assigned or changed elsewhere. (schreibend · — · Frachtführer · API: dismiss_driver_schedule_suggestion)
lg driver-statements cancel — Cancel a statement that should not exist (opened by mistake, duplicated). (schreibend · Bestätigung + irreversibel · Verlader, Frachtführer · API: cancel_driver_account)
lg driver-statements create — Open a NEW draft settlement statement for a driver. (schreibend · Bestätigung · Verlader, Frachtführer · API: create_driver_account)
lg driver-statements download — Give a short-lived download link to the PDF statement of a FINALISED driver settlement statement — the document the driver sees and signs, with every line, the fuel-card block that is outside the driver maths, and the… (lesend · — · Verlader, Frachtführer · API: download_driver_account_pdf)
lg driver-statements finalize — FINALISE a draft settlement statement — it freezes the document, makes it visible to the driver and (for settle_cash) writes the counter-entry into the advance ledger. (schreibend · Bestätigung + irreversibel · Verlader, Frachtführer · API: finalize_driver_account) [manager-Schlüssel]
lg driver-statements get — Read one driver settlement statement in full: its status and revision, the driver, the currency, every total (expenses, advances, repayments, receiptless declarations), the NET balance with the sentence that says which… (lesend · — · Verlader, Frachtführer · API: get_driver_account)
lg driver-statements list — List the driver settlement statements (mutabakat belgesi) of this company: code, which driver, status (draft / finalized / cancelled), currency, the net balance and what it means, how many expense and advance lines it… (lesend · — · Verlader, Frachtführer · API: list_driver_accounts)
lg driver-statements reopen — Reopen a FINALISED statement so it can be corrected (a late receipt arrived, a line was wrong). (schreibend · Bestätigung · Verlader, Frachtführer · API: reopen_driver_account) [manager-Schlüssel]
lg driver-statements update — Change the note printed on a DRAFT driver settlement statement (e.g. "September trips, fuel excluded"). (schreibend · Bestätigung · Verlader, Frachtführer · API: update_driver_account)
lg driver-statements update-lines — Attach receipts/advances to a DRAFT statement, or detach ones that should not be on it. (schreibend · Bestätigung · Verlader, Frachtführer · API: update_driver_account_lines)
lg driver-statuses list — Fleet command centre — every driver's live operational status in one list: last position and its AGE, signal health (streaming / delayed / stale / no_signal / permission_denied / app_missing), duty (on_trip / assigned /… (lesend · — · Verlader, Frachtführer · API: list_fleet_driver_statuses)
lg drivers add-document — Record a driver paper — visa, passport, residence permit, driving licence, SRC certificate, psychotechnic certificate, travel health insurance — for ONE of this carrier's drivers, so its expiry is tracked. (schreibend · Bestätigung · Frachtführer · API: add_driver_document) [nimmt eine Datei: attachment_uuid]
lg drivers archive — Archive (deactivate) a driver: their account is disabled, open mobile sessions are revoked and the login link stops working. (schreibend · Bestätigung + irreversibel · Frachtführer · API: archive_driver)
lg drivers calculate — Check whether ONE driver can take a job: Schengen 90/180 days left at the end of the trip (expected and worst case, counting the drive back out and the driver's later planned work), leave / home-rest / sick periods,… (lesend · — · Frachtführer · API: check_driver_for_trip)
lg drivers create — Create a new driver account for this carrier company. (schreibend · Bestätigung · Frachtführer · API: create_driver)
lg drivers delete-document — Remove a driver paper from the driver's file. (schreibend · Bestätigung + irreversibel · Frachtführer · API: delete_driver_document)
lg drivers get — Full detail of ONE driver of this carrier: identity, archive state, mobile app state, last GPS position, assigned load codes, ALL driver documents (passport, visa, licence, SRC… with expiry and days_to_expiry) and the… (lesend · — · Frachtführer · API: get_driver)
lg drivers list — List this carrier company's drivers with their status, current country, expiring/expired document counts, assigned load codes and vehicle plates. (lesend · — · Frachtführer · API: list_drivers)
lg drivers list-candidates — Rank the company's drivers for a job — which drivers are available and can do it (Schengen days at trip end incl. the drive back, leave/home-rest, other jobs, estimated driving/rest readiness, distance to the start)… (lesend · — · Frachtführer · API: list_trip_driver_candidates)
lg drivers list-documents — List ONE driver's documents (passport, visa, residence permit, licence, SRC, ADR, health insurance…) with document number, issuing country, valid_until, days_to_expiry, is_expired and AI extraction status. (lesend · — · Frachtführer · API: list_driver_documents)
lg drivers list-locations — A driver's GPS trail — the raw position pings from the driver app in a time window, oldest to newest, with the first and last timestamps and the point count. (lesend · — · Frachtführer · API: list_driver_locations)
lg drivers login-link — Produce the driver's 48-hour mobile app login link (sensitive credential). (schreibend · Bestätigung · Frachtführer · API: get_driver_login_link)
lg drivers request-location — Ask a driver's phone for a fresh position ("where is Ahmet right now — ping him"). (schreibend · — · Frachtführer · API: request_driver_location)
lg drivers search — Resolve one of this company's drivers by name to its driver_id. (lesend · — · Frachtführer · API: lookup_driver)
lg drivers update — Correct a driver's first/last name. (schreibend · Bestätigung · Frachtführer · API: update_driver)
lg drivers update-document — Correct a driver paper already on file — most often its expiry date (valid_until) after a renewal, but also the document number, the issuing country, the type or the note. (schreibend · Bestätigung · Frachtführer · API: update_driver_document)
lg drivers update-login-link — Generate a NEW 48-hour mobile login link for a driver and kill the old one (lost phone, expired or leaked link). (schreibend · Bestätigung + irreversibel · Frachtführer · API: refresh_driver_login_link)
lg equipment-damages create — Open a damage record on one of the company's own vehicles or trailers (dorse hasar kaydı aç) — "33ABC12 dorsesinin sol arka kapısında ezik var", "record a scratch on the rear bumper of the truck". (schreibend · Bestätigung · alle · API: create_equipment_damage)
lg equipment-damages delete — Delete a damage record that was opened by mistake (a duplicate, the wrong vehicle). (schreibend · Bestätigung + irreversibel · alle · API: delete_equipment_damage)
lg equipment-damages generate — Produce the equipment damage ledger as an Excel file (the same file as the panel's export button) and return a short-lived download link — e.g. "give me this year's open trailer damages as Excel". (lesend · — · alle · API: export_equipment_damages)
lg equipment-damages list — List the equipment/trailer damages recorded for this company: which vehicle, where on it (area and angle), damage type and severity, whether it is still open or repaired, the estimated and actual repair cost, who is… (lesend · — · alle · API: list_equipment_damages)
lg equipment-damages update — Update an existing damage record: mark it repaired (with repair date, cost and note), dismissed or disputed, change severity/type/area/description, set the estimated cost, or set/clear the responsible driver. (schreibend · Bestätigung · alle · API: update_equipment_damage)
lg equipment-inspection-links create — Create a one-time link so a driver or agent who is NOT on the platform (port agent, another company's driver) can upload the hand-over photos of one of the company's trailers/vehicles from a phone, without an account. (schreibend · Bestätigung · alle · API: create_equipment_inspection_link)
lg equipment-inspections create — Record an equipment hand-over inspection of one of the company's own trailers or vehicles on behalf of a driver or the office — "record the pickup inspection of trailer 34ABC12 with these 4 photos, driver Ali".… (schreibend · Bestätigung · alle · API: create_equipment_inspection) [nimmt eine Datei: photos[].attachment_uuid]
lg equipment-inspections delete — Delete an equipment inspection that was recorded by mistake (wrong vehicle, duplicate), together with its photos. (schreibend · Bestätigung + irreversibel · alle · API: delete_equipment_inspection)
lg equipment-inspections get — Full detail of ONE equipment hand-over inspection: vehicle, event (pickup / dropoff / interim), who did it and where and when, the AI analysis status with its overall condition and summary, the damages that inspection… (lesend · — · alle · API: get_equipment_inspection)
lg equipment-inspections list — List the equipment hand-over inspections (teslim-tesellüm controls) of this company: which vehicle, the event type (hand-over, take-over, interim), when and where it happened, who performed it (driver or office user, or… (lesend · — · alle · API: list_equipment_inspections)
lg equipment-inspections run — Run the AI damage analysis again on the photos of one equipment inspection (for example after the analysis failed, or photos were added later). (schreibend · Bestätigung · alle · API: reanalyze_equipment_inspection)
lg equipment-settings get — Read the company's equipment inspection settings: whether the module is on, at which hand-overs an inspection is required (pickup / dropoff), whether photos are required, the minimum photo count, which angles are… (lesend · — · alle · API: get_equipment_settings)
lg equipment-settings update — Change the company's equipment inspection settings — e.g. "turn on equipment inspection and require at least 4 photos with front, rear, left and right at pickup". (schreibend · Bestätigung · alle · API: update_equipment_settings) [manager-Schlüssel]
lg equipment-timelines get — Who has one trailer/vehicle right now (custody: in custody of a driver since the last pickup, or released at the last dropoff), the inspections it went through (newest first) and its OPEN damages — in one read. (lesend · — · alle · API: get_equipment_timeline)
lg export-documents add-item — Append a line item to an export document. (schreibend · — · alle · API: add_export_document_item)
lg export-documents create — Create a new export document draft. (schreibend · — · alle · API: create_export_document_draft)
lg export-documents create-set — Create SEVERAL export document drafts (a set, e.g. commercial invoice + packing list) from ONE source in one go: the source is read once by AI and every chosen document is filled from it. (schreibend · — · alle · API: create_export_document_set) [nimmt eine Datei: attachment_uuid]
lg export-documents delete — Delete one export document of this company (draft or generated). (schreibend · Bestätigung + irreversibel · alle · API: delete_export_document)
lg export-documents duplicate — Copy an existing export document into a NEW draft of the same type (same parties, items and terms; no document number, not generated). (schreibend · — · alle · API: duplicate_export_document)
lg export-documents extract — Read a pasted order e-mail, offer or confirmation — or an Excel/CSV/TXT item list given as attachment_uuid — and fill an export document from it. (schreibend · — · alle · API: extract_export_document_from_text) [nimmt eine Datei: attachment_uuid]
lg export-documents generate — Produce the final PDF of an export document AND return a short-lived signed download link for it, so the user gets the file straight from the chat. (schreibend · Bestätigung + irreversibel · alle · API: generate_export_document)
lg export-documents generate-set — Generate several export documents as PDFs in one go and return a short-lived download link for each generated one. (schreibend · Bestätigung + irreversibel · alle · API: generate_export_document_set)
lg export-documents get — Read one export document in full: every filled field as dot-paths, the line items with their 1-based positions, the server-computed totals and which required fields are still empty. (lesend · — · alle · API: get_export_document)
lg export-documents list — List the export documents of the current company (proforma invoice, commercial invoice, packing list, shipping instruction, delivery note, certificate/movement applications, exporter declaration, insurance request). (lesend · — · alle · API: list_export_documents)
lg export-documents options — List the export document types and the ready-made document sets with their credit cost. (lesend · — · alle · API: get_export_document_options)
lg export-documents preview — Before generating several export documents as PDFs, show what it would cost: which documents would spend a credit, which are free (already generated), the total, the remaining balance and the required fields still empty… (lesend · — · alle · API: plan_export_document_generation)
lg export-documents remove-item — Delete one line item by its 1-based position. (schreibend · — · alle · API: remove_export_document_item)
lg export-documents set — Set one or more fields on an export document draft. (schreibend · — · alle · API: set_export_document_fields)
lg export-documents update-item — Change columns of one existing line item, addressed by its 1-based position from get_export_document. (schreibend · — · alle · API: update_export_document_item)
lg finance calculate — Build a budget / financial forecast (bütçe tahmini, gelecek yıl bütçesi, nakit/ciro projeksiyonu) from the company's MEASURED history, month by month. (lesend · — · alle · API: generate_budget_forecast)
lg finance get — One call that returns the measured financial BASE for a period — the numbers a budget, a forecast, a business plan, a cash-flow projection or a board summary is built on, instead of chaining six separate reads. (lesend · — · alle · API: get_financial_snapshot)
lg fleet-documents list — List fleet documents that expire soon (or already expired): vehicle papers (insurance, inspection, permits) and — for carriers — driver papers (passport, visa, licence, SRC). (lesend · — · Verlader, Frachtführer · API: list_expiring_documents)
lg freight-invoices archive — Archive (remove from the active list) a freight invoice YOUR company uploaded — e.g. a duplicate or the wrong file. (schreibend · Bestätigung + irreversibel · alle · API: archive_freight_invoice)
lg freight-invoices create — Attach 1-20 freight invoices (navlun faturası) to a load. (schreibend · Bestätigung · alle · API: upload_freight_invoices) [nimmt eine Datei: attachment_uuids]
lg freight-invoices list — List the freight invoices (navlun faturaları) of a load that your company is a party to: who uploaded it, amount and currency, invoice date, the AI reading status, and which load parties it is shared with. (lesend · — · alle · API: list_freight_invoices)
lg freight-invoices set-visibility — Choose which load parties can see a freight invoice YOUR company uploaded — e.g. "share the invoice with the receiver too", "only we should see it". (schreibend · Bestätigung · alle · API: set_freight_invoice_visibility)
lg freight-reports get — Freight (navlun) cost report over the loads this company can see: agreed freight totals per currency plus the EUR equivalent, freight-invoice totals, how many loads have NO freight recorded (listed by code), a breakdown… (lesend · — · Verlader, Frachtführer · API: get_freight_cost_report)
lg fuel-cards create — Register a fuel card (DKV, UTA and the like) in the fleet card book, optionally tied to a driver or a vehicle. (schreibend · Bestätigung · Verlader, Frachtführer · API: create_fuel_card)
lg fuel-cards delete — Delete a fuel / toll card (DKV, UTA, Shell…) that was entered BY MISTAKE. (schreibend · Bestätigung + irreversibel · Verlader, Frachtführer · API: delete_fuel_card)
lg fuel-cards list — List the company's fuel and toll cards (DKV, UTA, Eurowag, E100, Shell, OMV, Aral, Petrol Ofisi, Opet…) with the last four digits, the driver or vehicle they are tied to, and whether they are active. (lesend · — · Verlader, Frachtführer · API: list_fuel_cards)
lg fuel-cards update — Update a fuel card: move it to another driver or vehicle, change its label or note, or DEACTIVATE it (is_active false) when the card is cancelled. (schreibend · Bestätigung · Verlader, Frachtführer · API: update_fuel_card)
lg handoff-links generate — Get the logistivo.com link for work that deliberately stays in the browser: package_purchase (buy or upgrade a package; optional package_slug from list_packages and billing_period monthly|yearly pre-select it — the… (lesend · — · alle · API: get_browser_handoff_link)
lg import-duties get — Read the Turkish import duty table for one GTİP code: customs duty (İthalat Rejimi Kararı) and additional customs duty / İGV, with every country-group column, plus the statutory duty from the nomenclature. (lesend · — · alle · API: get_import_duty_rates)
lg integration-keys list — List the company's integration (API) keys: name, uuid, which teammate it acts as, scope (read/write) and allowed domains, access level (manager/employee), environment (live/sandbox), status (active/revoked/expired),… (lesend · — · alle · API: list_integration_keys) [manager-Schlüssel]
lg integration-keys revoke — Revoke one of the company's integration (API) keys by its uuid from list_integration_keys: the key stops working immediately and cannot be re-enabled (issue a new key instead). (schreibend · Bestätigung + irreversibel · alle · API: revoke_integration_key) [manager-Schlüssel]
lg invitations create — Invite colleagues to this company by e-mail — one address in email, or up to 20 at once in emails (all-or-nothing: the seat limit and every address's domain are checked before anything is sent). (schreibend · Bestätigung + irreversibel · alle · API: invite_teammate) [manager-Schlüssel]
lg invitations list — List teammate invitations of this company that are not completed yet (pending / e-mail verified / account created), with invitation_code, e-mail, role and expiry. (lesend · — · alle · API: list_pending_invitations)
lg invitations resend — Re-send a pending teammate invitation e-mail and extend its expiry by 14 days. (schreibend · Bestätigung + irreversibel · alle · API: resend_invitation) [manager-Schlüssel]
lg invitations revoke — Cancel a pending teammate invitation so its link stops working (it can later be re-sent). (schreibend · Bestätigung · alle · API: revoke_invitation) [manager-Schlüssel]
lg invoice-settings get — Read the invoice document settings (fatura ayarları, fatura şablonu ayarları): which invoice templates exist, which template configuration is the company default, which fields of it are filled (logo, seller address,… (lesend · — · alle · API: get_invoice_settings)
lg invoice-templates create — Create a new invoice template configuration for your company: a base template plus field values (colours, font, header / footer text, IBANs shown, QR code, language; logo and signature from uploaded images). (schreibend · Bestätigung + irreversibel · alle · API: create_invoice_template) [manager-Schlüssel] [nimmt eine Datei: logo_attachment_uuid, signature_image_attachment_uuid]
lg invoice-templates delete — Delete one of your invoice template configurations. (schreibend · Bestätigung + irreversibel · alle · API: delete_invoice_template) [manager-Schlüssel]
lg invoice-templates get — Show the fillable fields of an invoice template (logo, colours, font, header / footer text, IBANs shown, QR code, signature, language) with their types, options and defaults — and, for one of your configurations, its… (lesend · — · alle · API: get_invoice_template)
lg invoice-templates set-default — Make one of your invoice template configurations the company default; the previous default stops being default. (schreibend · Bestätigung · alle · API: set_default_invoice_template) [manager-Schlüssel]
lg invoice-templates update — Edit one of your invoice template configurations: switch its base template, rename it, change field values (merged over the stored ones — only the keys you pass change), replace the logo / signature image, or make it… (schreibend · Bestätigung + irreversibel · alle · API: update_invoice_template) [manager-Schlüssel] [nimmt eine Datei: logo_attachment_uuid, signature_image_attachment_uuid]
lg invoices add-line — Add a line item to a DRAFT invoice and recompute totals (tax auto-resolved if tax_rate_id omitted). (schreibend · — · alle · API: add_invoice_line)
lg invoices add-payment — Record money received (sales invoice) or paid (purchase invoice) against ONE issued invoice: writes the payment, posts the balanced journal entry and reduces the remaining balance. (schreibend · Bestätigung + irreversibel · alle · API: record_invoice_payment)
lg invoices cancel — Cancel an ISSUED invoice this company issued: posts the reversing journal entry and marks the invoice cancelled. (schreibend · Bestätigung + irreversibel · alle · API: cancel_invoice)
lg invoices create — Create a DRAFT invoice (reversible) issued by the current company to a recipient business contact. (schreibend · — · alle · API: create_invoice_draft)
lg invoices delete-draft — Delete a DRAFT invoice of this company together with its lines and taxes. (schreibend · Bestätigung + irreversibel · alle · API: delete_invoice_draft)
lg invoices download — Get a short-lived download link for the PDF of an invoice visible to this company (and the e-invoice XML when one exists). (lesend · — · alle · API: download_invoice_pdf)
lg invoices get — Read one invoice in full: parties, load link, dates, every line with tax, tax breakdown, totals, remaining balance and the payments recorded against it. (lesend · — · alle · API: get_invoice)
lg invoices issue — Issue (finalize) a DRAFT invoice: assigns a number and posts accounting entries. (schreibend · Bestätigung + irreversibel · alle · API: issue_invoice)
lg invoices list — List invoices visible to this company — the ones it issued and the ones issued to it (as a linked party). (lesend · — · alle · API: list_invoices)
lg invoices preview — Show the user a full preview of a DRAFT invoice (recipient, line items, tax breakdown, totals) WITHOUT issuing it. (lesend · — · alle · API: preview_invoice · veraltet: 2026-09-03 · ersetzt durch get_invoice)
lg invoices remove-line — Remove one line from a DRAFT invoice your company issued; the totals are recalculated. (schreibend · Bestätigung · alle · API: remove_invoice_line)
lg invoices reverse-payment — Undo ONE payment/collection recorded on an invoice: posts the reversing journal entry, gives the amount back to the invoice's remaining balance and removes the payment row. (schreibend · Bestätigung + irreversibel · alle · API: reverse_invoice_payment)
lg invoices update — Edit the header of a DRAFT invoice your company issued: recipient contact, currency, issue / due date, the printed note and the invoice template. (schreibend · — · alle · API: update_invoice_draft)
lg invoices update-line — Edit one line of a DRAFT invoice your company issued (text, quantity, unit, net unit price, discount, tax rate, order). (schreibend · — · alle · API: update_invoice_line)
lg join-requests approve — Approve a pending join request: the applicant becomes a user of our company with the EMPLOYEE role, takes one team seat and is e-mailed the decision. (schreibend · Bestätigung + irreversibel · alle · API: approve_join_request) [manager-Schlüssel]
lg join-requests list — List PENDING requests from people asking to join our company (they signed up with an e-mail on one of our verified domains and picked our company). (lesend · — · alle · API: list_join_requests) [manager-Schlüssel]
lg join-requests reject — Reject a pending join request: the applicant does not join our company and is e-mailed the decision. (schreibend · Bestätigung + irreversibel · alle · API: reject_join_request) [manager-Schlüssel]
lg journal-entries create — Post a manual double-entry journal entry (yevmiye fişi). (schreibend · Bestätigung + irreversibel · alle · API: create_journal_entry)
lg journal-entries get — Read one journal entry with its lines (account code/name, debit, credit, counterparty) and totals. (lesend · — · alle · API: get_journal_entry)
lg journal-entries list — List journal entries (yevmiye fişleri) of the company, newest first, with optional date window. (lesend · — · alle · API: list_journal_entries)
lg language-settings get — Read the signed-in user's own language settings (dil ayarları). (lesend · — · alle · API: get_language_settings)
lg language-settings update — Change the signed-in user's OWN language settings — "dilimi İngilizce yap", "e-postalarım Türkçe gelsin", "sohbet mesajlarını Almancaya çevir". (schreibend · — · alle · API: set_language)
lg load-ai-settings get — Read our company's load AI reminder setting (Settings → Loads): whether the assistant posts reminders into load chats about loads whose status was not updated (ai_warning_enabled) and on which days (warning_frequency:… (lesend · — · alle · API: get_load_ai_settings)
lg load-ai-settings update — Change our company's load AI reminders (Settings → Loads): ai_warning_enabled turns the reminders the assistant posts into load chats on or off; warning_frequency picks the days (daily, mon_wed_fri, weekly_wed,… (schreibend · Bestätigung · alle · API: update_load_ai_settings) [manager-Schlüssel]
lg load-containers create — Add a sea container number to a load (yüke konteyner ekle) — "add MSC container MSCU1234565 to FKZ8515". (schreibend · Bestätigung · Verlader, Frachtführer · API: add_load_container)
lg load-containers delete — Delete a container record from a load (konteyneri sil) — only while its vessel tracking has NOT started (otherwise refused with INVALID_STATUS). (schreibend · Bestätigung + irreversibel · alle · API: delete_load_container)
lg load-containers get — Show one container of a load and the last known position of the ship carrying it (konteyner konumu): ship name/IMO, latitude/longitude, speed, course, destination, ETA and the position time. (lesend · — · alle · API: get_load_container)
lg load-containers list — List the sea containers recorded on a load (konteynerler) with their shipping line, whether vessel tracking has started and which ship carries them. (lesend · — · alle · API: list_load_containers)
lg load-containers set-tracking — Start vessel tracking for a load from its containers (konteyner takibini başlat): the shipping line is queried for each container until the vessel carrying it is found; that ship is then tracked on the load's map and… (schreibend · Bestätigung · alle · API: start_load_container_tracking)
lg load-documents create — File one or MANY documents the user attached to this conversation onto a load: each file is stored as a company document and posted into the load's chat, where every participant (customer, carrier, customs broker) sees… (schreibend · Bestätigung + irreversibel · alle · API: attach_chat_file_to_load) [nimmt eine Datei: attachment_uuid, attachment_uuids]
lg load-documents list — List the documents (CMR, invoice, packing list, customs papers, photos…) filed on a load — i.e. the files shared in that load's chat. (lesend · — · alle · API: list_load_documents)
lg load-groups add-loads — Merge EXISTING loads into a groupage trip you own as consignments (they keep their own code, chat, documents and participants; only the trip membership changes — nothing is duplicated and NO credit is used). (schreibend · Bestätigung · Verlader, Frachtführer · API: add_loads_to_group)
lg load-groups create — Create a groupage trip (parsiyel/sefer): ONE truck carrying several ISOLATED consignments; each consignment is its own load with its own chat/documents/status and receivers never see each other. (schreibend · Bestätigung + irreversibel · Verlader, Frachtführer · API: create_load_group)
lg load-groups download — Download the route report of a groupage trip (sefer / parsiyel, code like LGV00253): route_pdf = detailed route report with map and itinerary, route_xlsx = the same as Excel, driver_sheet_pdf = the simplified driver… (schreibend · — · Verlader, Frachtführer · API: download_load_group_report)
lg load-groups get — Detail of one groupage trip: consignments visible to you (load code, status, receiver, route, driver), planned date, optimised master route summary and stop count. (lesend · — · Verlader, Frachtführer · API: get_load_group)
lg load-groups list — List groupage trips (parsiyel / sefer: one truck, several isolated consignment loads) this company owns or — for carriers — carries, newest first, with visible consignment count and route optimisation state. (lesend · — · Verlader, Frachtführer · API: list_load_groups)
lg load-groups optimize — Re-optimise the master route of a groupage trip you own and RETURN the new itinerary: the ordered stops (pickup → export customs → import customs → dropoff), each stop's address and consignment codes, the total distance… (schreibend · — · Verlader, Frachtführer · API: optimize_trip_route)
lg load-groups remove-load — Take one consignment out of a groupage trip you own. (schreibend · Bestätigung · Verlader, Frachtführer · API: remove_load_from_group)
lg load-heatmaps generate — Produce the load heatmap report (PDF, with QR code and the list of your active loads: code, departure, arrival, date, weight), save it to the company's reports and return a download link. (schreibend · Bestätigung + irreversibel · alle · API: generate_load_heatmap_report)
lg load-heatmaps get — Load heatmap data in words: the densest departure and arrival areas of your active loads, ranked by number of loads and by total kilograms. (lesend · — · alle · API: get_load_heatmap)
lg load-locations create — Report a position for a load on behalf of the carrier (konum bildir) — "FKZ8515 is at Kapıkule now", "the truck is at 41.0, 28.9". (schreibend · Bestätigung + irreversibel · Frachtführer · API: report_load_location)
lg load-locations list — Show a load's position history (konum geçmişi) and its last known position — "where is FKZ8515 now", "where was it yesterday", "show the truck's track". (lesend · — · alle · API: list_load_locations)
lg load-locations list-routes — Show the road route segments drawn on a load's tracking map (rota parçaları), each with distance (metres) and duration (seconds): from the pickup address to the first reported position, between reported positions, and… (lesend · — · alle · API: list_load_route_segments)
lg load-notifications list-recipients — Show which load parties can receive a load notification (departure, arrival, daily location) and how many of their people are subscribed per channel (e-mail, push, SMS). (lesend · — · alle · API: list_load_notification_recipients)
lg load-notifications send — Send a departure / arrival / daily-location notification about a load to chosen load parties — e.g. "notify the receiver that FRT6470 arrived". (schreibend · Bestätigung + irreversibel · alle · API: send_load_notification)
lg load-notifications send-email — E-mail a departure / arrival / location update about a load to people you choose from YOUR OWN company directory (business contact persons) — e.g. "e-mail Mehmet at Arkas the location of FKZ8515". (schreibend · Bestätigung + irreversibel · alle · API: send_load_email_notification)
lg load-participants create — Add a party to a load (yüke taraf ekle) — "FKZ8515'e Arkas'ı alıcı olarak ekle" — or assign a sub-carrier. business_contact_id comes from lookup_business_contact (your own directory). (schreibend · Bestätigung · alle · API: add_load_participant)
lg load-participants delete — Remove a party or a sub-carrier from a load (yükten taraf çıkar) — "FKZ8515'ten alt taşıyıcı Yılmaz Nakliyat'ı kaldır". participant_id comes from list_load_participants. (schreibend · Bestätigung · alle · API: remove_load_participant)
lg load-participants list — List a load's parties (yük tarafları): sender, receiver, carrier and sub-carriers, organizer, sender/receiver customs brokers — with participant_id (needed by every other load-participant command), position (0 = primary… (lesend · — · alle · API: list_load_participants)
lg load-participants set-order — Put the parties of one role in a new order (load owner only); the first id becomes the primary. participant_ids must list ALL current rows of that role (from list_load_participants). (schreibend · Bestätigung · alle · API: reorder_load_participants)
lg load-participants set-primary — Make a party the primary one in its role (load owner only) — e.g. the main receiver or main customs broker. participant_id from list_load_participants. (schreibend · Bestätigung · alle · API: set_primary_load_participant)
lg load-participants update — Change one load party's settings (load owner only) — "Arkas FKZ8515'i görmesin": share_with_assigned_company (can the linked company see the load; cannot be turned off for a sub-carrier), conversation_user_ids (only… (schreibend · Bestätigung · alle · API: update_load_participant)
lg load-party-suggestions approve — Accept a party suggestion: link the suggested business contact to your OWN load as sender or receiver (business_contact_id and party_role from list_load_party_suggestions). (schreibend · Bestätigung · alle · API: confirm_load_party_suggestion)
lg load-party-suggestions list — Show sender/receiver suggestions for one of your OWN loads: parties named in the load's documents that match a contact in your directory but are not linked to the load yet. (lesend · — · alle · API: list_load_party_suggestions)
lg load-party-suggestions reject — Close wrong party suggestions on your OWN load so they are not suggested again — "bu önerileri bir daha gösterme". (schreibend · — · alle · API: dismiss_load_party_suggestions)
lg load-reports get — Build a report of your ACTIVE loads, optionally filtered by sender, receiver, transport mode, departure country or arrival country. format=summary (default) answers in chat: the number of loads and how many are in each… (lesend · — · alle · API: get_load_report)
lg load-reports options — List the companies you can filter the load report by — the senders, receivers, carriers and other parties that appear on your active loads — with their company id and role. (lesend · — · alle · API: get_load_report_options)
lg load-types search — Resolve a load/transport type (e.g. (lesend · — · alle · API: lookup_load_type)
lg load-vehicles delete — Detach the fleet equipment from a load: both slots by default, or only the tractor unit / only the trailer. (schreibend · Bestätigung · alle · API: clear_load_equipment)
lg load-vehicles get — Show which tractor unit (or truck/van) and which trailer are attached to a load, whether they belong to your own fleet, and whether the load can still be changed. (lesend · — · alle · API: get_load_equipment)
lg load-vehicles set — Attach one of your own fleet vehicles to a load: the tractor unit / truck slot (plate) and/or the trailer slot (trailer_plate). (schreibend · Bestätigung · alle · API: assign_vehicle_to_load)
lg loads add-order-reference — Attach an order reference to a load (sipariş referansı ekle) — "FKZ8515'e satın alma siparişi PO-4471 ekle". order_type is the kind of order (e.g. purchase, sales), order_no the number. (schreibend · Bestätigung + irreversibel · alle · API: add_load_order_reference)
lg loads analyze-documents — Re-run the background AI consistency analysis of a load's documents (does the invoice contradict the CMR, the packing list, the declared weight…) and refresh the load's problem flag with the outcome. (schreibend · — · alle · API: reanalyze_load_documents)
lg loads archive — Archive one of the company's OWN loads (yükü arşivle) — "FKZ8515'i arşive al". (schreibend · Bestätigung + irreversibel · alle · API: archive_load)
lg loads assign-driver — Assign one of this company's drivers to a load so the driver sees it in the mobile app and starts reporting position. (schreibend · Bestätigung · Frachtführer · API: assign_driver_to_load)
lg loads audit-documents — Cross-check the documents already attached to loads and report, PER LOAD, whether their package counts and gross weights agree. (lesend · — · alle · API: audit_load_documents)
lg loads close-problem — Close the open document-consistency flag of ONE load, from the chat. action=resolved means the contradiction was actually fixed (a corrected document was uploaded); action=dismissed means it was a false alarm and should… (schreibend · Bestätigung · alle · API: resolve_load_problem_flag)
lg loads create — Open a freight load (yük). (schreibend · Bestätigung + irreversibel · alle · API: create_load)
lg loads download — Generate a load's CMR consignment note as a PDF and return a short-lived download link — "FKZ8515'in CMR'ını ver". (lesend · — · alle · API: download_load_cmr)
lg loads extract — Read a booking/order text (an e-mail body, a note, an ERP export line) and return the load fields it contains, in the quick-load form's shape: transport mode, countries, dates, load type, vehicle type, weight, goods… (lesend · — · Verlader · API: extract_load_from_text)
lg loads get — Read one load in full by its code: route, dates, weight, current status, parties (sender/receiver/carrier), agreed freight (freight_amount + freight_currency) with its freight invoices (number, date, total), latest… (lesend · — · alle · API: get_load)
lg loads list — List the freight loads (yük) this company can see, newest first. (lesend · — · alle · API: list_loads)
lg loads list-associated — List the loads of the same multi-vehicle order as a given load (aynı siparişin diğer araçları) — every active load that shares its vehicle group code (LG…) and that your company can see, with status, date and carrier. (lesend · — · alle · API: list_associated_loads)
lg loads list-billing-targets — Show who you can invoice for a load: its commercial parties (sender, receiver, carrier) you are allowed to bill, each with recipient_contact_id to pass to create_invoice_draft and in_my_directory (true = already in your… (lesend · — · alle · API: list_load_billing_targets)
lg loads list-problems — List loads whose uploaded documents the AI consistency check found to CONTRADICT each other (e.g. invoice weight vs CMR weight). (lesend · — · alle · API: list_load_problem_flags)
lg loads list-status-history — Show a load's status history (durum geçmişi) in order — when it went pending, in transport, transit, delivered (done). (lesend · — · alle · API: list_load_status_history)
lg loads list-stops — List the stops of a multi-stop load (çok duraklı yük — several pickups/drop-offs on one load) in route order, with type (pickup, dropoff, customs_exit, customs_entry), company, address, leg distance/duration and whether… (lesend · — · alle · API: list_load_stops)
lg loads optimize — Re-order the stops of a multi-stop load for the shortest driving route (pickups first, then drop-offs) and store the new order with leg distances — "optimise FKZ8515's stops". (schreibend · — · alle · API: optimize_load_stops)
lg loads options — Read a load's editable fields, their current values and the allowed options (load types, vehicle types, goods classes, stackability, incoterms, movement types) — "FKZ8515'te neyi değiştirebilirim?". (lesend · — · alle · API: get_load_edit_form)
lg loads preview-copy — Prepare a copy draft of one of your company's OWN loads (yükü kopyala) — "FKZ8515'in aynısından bir tane daha açalım": transport mode, countries, addresses, load type, vehicle type, weight, goods class, incoterms, ports… (lesend · — · alle · API: get_load_copy_template)
lg loads remove-driver — Remove the driver from a load (the opposite of assign_driver_to_load): the load disappears from the driver's app and GPS tracking of the load stops. (schreibend · Bestätigung · Frachtführer · API: unassign_driver_from_load)
lg loads search — Full-text search across your loads (yük ara) — company names, pickup/delivery address, order references, load code, text written in the load chat and text read from documents shared in the chat: "içinde PO-4471 geçen… (lesend · — · alle · API: search_loads)
lg loads set-status — Move a load to a new transport status and append it to the load's status history (this is what the customer sees on the tracking screen). (schreibend · Bestätigung + irreversibel · Frachtführer · API: update_load_status)
lg loads set-stop-status — Mark one stop of a multi-stop load as completed, or undo it (completed=false) — "FKZ8515's second drop-off is done". (schreibend · Bestätigung · Frachtführer · API: mark_load_stop_completed)
lg loads set-tracking — Turn a load's GPS location tracking on or off (konum takibi) — "stop location tracking for FKZ8515", "resume tracking". (schreibend · Bestätigung · Frachtführer · API: set_load_location_tracking)
lg loads update — Edit an existing load (yükü düzenle): loading date, weight, load type, vehicle types, goods class, stackability, pickup/delivery address, incoterms, movement type, loading/destination port. (schreibend · Bestätigung + irreversibel · alle · API: update_load)
lg maturity-options list — The selectable payment terms (vade): maturity_option_id and the number of days (0 = cash / peşin). maturity_option_id is what update_company_profile takes. (lesend · — · alle · API: list_maturity_options)
lg notification-settings get — Read our company's notification switches (Settings → Notifications): which e-mail notifications (type "notification") and push notifications (type "web-push") are on for the whole company — e.g. message, load, demand… (lesend · — · Verlader · API: get_notification_settings) [manager-Schlüssel]
lg notification-settings update — Turn our company's notification switches on or off (Settings → Notifications) — e.g. stop load chat push notifications or message e-mails for the whole company. settings is a list of {slug, enabled}; slugs come from… (schreibend · Bestätigung · Verlader · API: update_notification_settings) [manager-Schlüssel]
lg notifications list — Read the signed-in user's own notification inbox (the bell icon): what happened, which kind of event it was, when, whether it is still unread, and the panel address the notification points at. (lesend · — · alle · API: list_notifications)
lg notifications mark-read — Mark ALL of the signed-in user's unread notifications as read (empty the bell). (schreibend · — · alle · API: mark_notifications_read)
lg packages get — Read this company's package and CREDIT balance: how many credits are left, how many the package grants per year, how many were used, the renewal date, and the assistant token usage of the current period (1,000,000… (lesend · — · alle · API: get_credit_balance)
lg packages list — List the Logistivo packages this company can buy: slug, name, monthly price and yearly upfront total in the company's BILLING currency (TRY for Türkiye-billed companies, EUR otherwise — never converted with an exchange… (lesend · — · alle · API: list_packages)
lg pallets add-measurement — Record a NEW measurement for an existing pallet (dimensions in centimetres and/or gross weight in kilograms). (schreibend · Bestätigung · alle · API: add_pallet_measurement)
lg pallets add-proof — Attach a proof photo to one of this company's pallets (e.g. the wrapped pallet, its label, damage on arrival). (schreibend · — · alle · API: add_pallet_proof) [nimmt eine Datei: attachment_uuid]
lg pallets calculate — Suggest the missing base side of a pallet from a standard footprint (EUR 120×80, industrial 120×100, half 80×60; ±5 cm) when only one base side is known, and compute the volume when length, width and height are all… (lesend · — · alle · API: complete_pallet_dimensions)
lg pallets create — Register a NEW pallet in a warehouse, optionally with its first measurement. warehouse_id is required — resolve the warehouse name with lookup_warehouse first. (schreibend · Bestätigung · alle · API: create_pallet)
lg pallets delete — Delete one of this company's pallet records. (schreibend · Bestätigung + irreversibel · alle · API: delete_pallet)
lg pallets delete-proof — Remove one proof photo from one of this company's pallets. (schreibend · Bestätigung + irreversibel · alle · API: delete_pallet_proof)
lg pallets extract — Estimate a pallet's content label, dimensions (cm) and gross weight (kg) from photo(s) the user attached to THIS conversation. (schreibend · — · alle · API: extract_pallet_from_photos) [nimmt eine Datei: attachment_uuids]
lg pallets get — Read one pallet in full: its identity (code, label, SKU, barcode), status, warehouse and area, the FULL measurement history (each row with its id, source — manual, lidar, arcore or ai_photo — and confidence), its proof… (lesend · — · alle · API: get_pallet)
lg pallets list — List the pallets of this company: code, label, SKU/barcode, status, which warehouse and area it sits in, its latest measured dimensions (cm) and gross weight, and how many proof photos it has. (lesend · — · alle · API: list_pallets)
lg pallets update — Update an existing pallet: its status (in_stock, in_transit, reserved, shipped, disposed), its label/SKU/barcode/note, or MOVE it to another warehouse or area. (schreibend · Bestätigung · alle · API: update_pallet)
lg parasut-contacts create — Create a new customer or supplier contact IN PARAŞÜT and keep its local copy. (schreibend · Bestätigung + irreversibel · alle · API: create_parasut_contact)
lg parasut-contacts list — List the customer / supplier contacts held in Paraşüt (the local copy synchronised from Paraşüt): parasut_contact_id (the Paraşüt id used by create_parasut_sales_invoice — NOT a business contact id), name, short name,… (lesend · — · alle · API: list_parasut_contacts)
lg parasut-invoices create — Issue a SALES invoice in Paraşüt for one of this company's Paraşüt contacts, as an e-invoice (scenario commercial or basic — the recipient must be an e-invoice user) or an e-archive invoice (scenario e_archive); check… (schreibend · Bestätigung + irreversibel · alle · API: create_parasut_sales_invoice)
lg parasut-invoices list — List invoices held in Paraşüt (local copy): sales invoices (default) or purchase bills, newest issue date first — invoice id and number, item type, description, issue / due date, net / gross / VAT totals, currency,… (lesend · — · alle · API: list_parasut_invoices)
lg parasut-invoices options — Return the options of the Paraşüt invoice form: income/expense categories (category_id), the Paraşüt bank and cash accounts, and — with tax_number — whether that VKN is a registered e-invoice user (then use scenario… (lesend · — · alle · API: get_parasut_invoice_options)
lg parasut-settings delete — Disconnect Paraşüt from this company: the saved credentials are removed, the accounting provider switches back to local when it was Paraşüt, and the LOCAL copies pulled from Paraşüt (contacts, invoices, bank accounts,… (schreibend · Bestätigung + irreversibel · alle · API: disconnect_parasut) [manager-Schlüssel]
lg parasut-settings get — Show the Paraşüt integration status of this company: whether it is connected, the Paraşüt firm number, the user name, the client id/secret MASKED (last 4 characters only), when it was connected, the token status and the… (lesend · — · alle · API: get_parasut_settings) [manager-Schlüssel]
lg parasut-settings update — Connect this company's Paraşüt account or renew its credentials (replaces an existing connection). (schreibend · Bestätigung · alle · API: connect_parasut) [manager-Schlüssel] [nur CLI]
lg payables list — Payables ("whom do we owe how much"): per-supplier totals of recorded purchase invoices — invoiced, paid, remaining, earliest due date — with a per-currency breakdown and an overall summary. (lesend · — · alle · API: list_payables)
lg payment-cards delete — Remove a saved payment card (card_id from list_payment_cards). (schreibend · Bestätigung + irreversibel · alle · API: delete_payment_card) [manager-Schlüssel]
lg payment-cards list — List the company's saved payment cards, MASKED (last four digits only), with the card holder name, expiry and which one is the default card the monthly subscription is charged to. (lesend · — · alle · API: list_payment_cards)
lg payment-cards set-default — Make one of the saved cards (card_id from list_payment_cards) the DEFAULT card: the monthly package payment is charged to it from now on, and every other card loses the default flag. (schreibend · Bestätigung + irreversibel · alle · API: set_default_payment_card) [manager-Schlüssel]
lg payment-instructions cancel — CANCEL a pending bank payment instruction: the reservation on its invoices is released so they can be paid another way, and the instruction becomes "cancelled". (schreibend · Bestätigung + irreversibel · alle · API: cancel_settlement_instruction)
lg payment-instructions download — Get the bank payment instruction document (PDF) with a short-lived download link. (lesend · — · alle · API: download_settlement_instruction)
lg payment-instructions get — Read one bank payment instruction: its code, template, effective date, status with timestamps and cancel reason, its note, and — when the PDF has already been rendered — a short-lived signed link to it so the user gets… (lesend · — · alle · API: get_settlement_instruction)
lg payment-instructions list — List the bank payment instructions of this company: instruction code, which template (bank format) it uses, its effective date, status (pending, executed, cancelled) and when it was executed or cancelled. (lesend · — · alle · API: list_settlement_instructions)
lg payment-instructions run — EXECUTE a pending bank payment instruction (banka talimatını yürüt / uygula): the reserved invoices are paid, the payments and journal entries are written with the instruction's effective date, and the instruction… (schreibend · Bestätigung + irreversibel · alle · API: execute_settlement_instruction)
lg planning-boards get — The planning calendar: for every driver, the stretches of days with planned work inside the Schengen area (planned_in), days assumed inside (drive back, assumed_in), planned work outside (planned_out), leave / rest… (lesend · — · Frachtführer · API: get_planning_board)
lg plans archive — Close a plan because the user says the work is finished or abandoned. (schreibend · — · alle · API: archive_plan)
lg plans create — Write down a multi-step job so it survives between conversations ("link these 5 loads to a trip, then invoice them"). (schreibend · Bestätigung · alle · API: create_plan)
lg plans get — Read one plan: the steps that were agreed AND the commands that actually ran while it was active. (lesend · — · alle · API: get_plan)
lg plans list — List this company's plans, newest first. (lesend · — · alle · API: list_plans)
lg ports search — Find a seaport by name or UN/LOCODE (liman ara) — "Mersin", "TRMER", "Trieste". (lesend · — · alle · API: lookup_port)
lg preferences create — Remember a lasting preference of THIS user, so it applies to every future conversation too ("always show amounts in EUR", "write driver names surname first", "I want the weekly summary on Mondays"). (schreibend · — · alle · API: remember_preference)
lg preferences delete — Forget one stored preference of this user. (schreibend · — · alle · API: forget_preference)
lg preferences list — List what you have been asked to remember about THIS user, with the labels. (lesend · — · alle · API: list_preferences)
lg product-brands create — Create a new product brand for this company (the panel's "new brand"). (schreibend · Bestätigung · Verlader · API: create_product_brand)
lg product-brands list — List this company's product brands (id, name, code, active flag, number of products). (lesend · — · Verlader · API: list_product_brands)
lg product-categories create — Create a new product category for this company (the panel's "new category"). (schreibend · Bestätigung · Verlader · API: create_product_category)
lg product-categories list — List this company's product categories (id, name, code, active flag, number of products). (lesend · — · Verlader · API: list_product_categories)
lg products add-image — Add a photo to a product's gallery. (schreibend · — · Verlader · API: add_product_image) [nimmt eine Datei: attachment_uuid]
lg products create — Define a new product in this company's catalogue so stock can be recorded against it: name plus optionally its unit of measure, SKU, barcode, category, brand, minimum stock level, reorder quantity and lot tracking. (schreibend · Bestätigung · Verlader · API: create_product)
lg products delete — Delete a product from this company's catalogue. (schreibend · Bestätigung + irreversibel · Verlader · API: delete_product)
lg products delete-image — Remove one photo from a product's gallery (image_id from get_product). (schreibend · Bestätigung + irreversibel · Verlader · API: delete_product_image)
lg products extract — Read product details (name, description, SKU, barcode, unit, category, brand) from 1-5 photos of the product or its label — the panel's "fill from photo" button. (schreibend · — · Verlader · API: extract_product_from_photos) [nimmt eine Datei: attachment_uuids]
lg products get — Show one product of this company in full: code, SKU, barcode, unit, category and brand, low-stock threshold and reorder quantity, lot tracking, its photos (with image_id for delete_product_image /… (lesend · — · Verlader · API: get_product)
lg products list — List the products of this company: code, name, SKU/barcode, unit, category and brand, whether it is active, and its low-stock threshold. (lesend · — · Verlader · API: list_products)
lg products list-low-stock — List the products whose quantity on hand is BELOW their low-stock threshold (strictly below — a product exactly at the threshold is not listed), with the quantity on hand and the threshold itself. (lesend · — · Verlader · API: list_low_stock_products)
lg products options — List the units of measure a product can be held in (slug for create_product / update_product unit, with Turkish and English names). (lesend · — · Verlader · API: get_product_options)
lg products search — Resolve a product to its product_id + on-hand quantity. (lesend · — · Verlader · API: lookup_product)
lg products set-primary-image — Make one of a product's photos its cover image (image_id from get_product). (schreibend · — · Verlader · API: set_product_primary_image)
lg products update — Correct an existing product: its name, unit, SKU, barcode, category, brand, minimum stock level, reorder quantity, lot tracking, note, or whether it is active. (schreibend · Bestätigung · Verlader · API: update_product)
lg receivables get — Account statement of one contact: every sales invoice issued to them and every collection, in date order with a running balance, plus totals (invoiced, paid, open balance, open invoice count). (lesend · — · alle · API: get_receivable_statement)
lg receivables list — Receivables ("who owes us how much"): per-contact totals of issued sales invoices — invoiced, paid, remaining — with a per-currency breakdown and an overall summary. (lesend · — · alle · API: list_receivables)
lg report-files create — Turn a table you compiled from tool results into a downloadable Excel (default), PDF or CSV file — any custom table, list, comparison or export, with optional charts. (lesend · — · alle · API: create_report_file)
lg reports get — Financial reports from posted journal entries: trial_balance (per-account debit/credit/balance as of a date), balance_sheet (as of a date) or income_statement (revenues/expenses/net income for a date range; defaults to… (lesend · — · alle · API: get_accounting_report)
lg reservations approve — As the warehouse owner, approve a pending reservation received at your warehouse (the booker is notified). (schreibend · Bestätigung · Verlader · API: approve_reservation)
lg reservations cancel — Cancel (withdraw) a warehouse reservation you booked, or — as the warehouse owner (customer) — cancel a reservation received at your warehouse. (schreibend · Bestätigung + irreversibel · alle · API: cancel_reservation)
lg reservations complete — As the warehouse owner, mark an APPROVED reservation at one of your warehouses as completed (the vehicle came and the work is done). (schreibend · Bestätigung + irreversibel · Verlader · API: complete_reservation)
lg reservations create — Book a warehouse dock time slot. (schreibend · Bestätigung · alle · API: create_reservation)
lg reservations get — Detail of one warehouse reservation you booked or (customer) one received at your warehouse: warehouse, area, time window, status, contact, notes, rejection reason. (lesend · — · alle · API: get_reservation)
lg reservations list — List warehouse dock reservations. side=booked_by_me (default): reservations this user/company booked at other companies' warehouses. side=received (customer role only): reservations other companies made at ONE of your… (lesend · — · alle · API: list_reservations)
lg reservations list-slots — Available dock time slots of one day with remaining capacity. (lesend · — · alle · API: list_reservation_slots)
lg reservations reject — As the warehouse owner, reject a pending reservation received at your warehouse, with an optional reason shown to the booker. (schreibend · Bestätigung + irreversibel · Verlader · API: reject_reservation)
lg reservations reschedule — As the warehouse owner, move a PENDING or APPROVED reservation at one of your warehouses to a new time. (schreibend · Bestätigung · Verlader · API: reschedule_reservation)
lg roro-routes list — For a load you are carrying, list the Ro-Ro (ferry) lines closest to its PICKUP address, nearest first: the line name, its departure and arrival ports and how many kilometres the pickup point is from the departure port. (lesend · — · Frachtführer · API: list_nearby_roro_routes)
lg roro-routes select — Select the Ro-Ro (ferry) line a load you are carrying will use. (schreibend · Bestätigung · Frachtführer · API: select_roro_route)
lg roro-routes set-required — Mark whether a load you are carrying will travel by Ro-Ro (ferry) or not. (schreibend · Bestätigung · Frachtführer · API: set_load_roro_required)
lg route-plans assign-driver — Assign a driver (and, on a double-crew plan, a co-driver; optionally the vehicle/trailer) to a saved route plan (route_plan_id or route_plan_code). (schreibend · Bestätigung · Frachtführer · API: assign_driver_to_route_plan)
lg route-plans calculate — Calculate a multi-stop truck journey WITHOUT saving it: truck driving time (car time × hgv_factor, capped speed), the EU 561/2006 / AETR breaks, daily and weekly rests, weekend/holiday driving bans and border waits, and… (schreibend · Bestätigung · Frachtführer · API: calculate_route_plan)
lg route-plans create — Save a route plan as a DRAFT (same arguments as calculate_route_plan, plus name, vehicle_id, trailer_id, start_flex_days). (schreibend · Bestätigung · Frachtführer · API: create_route_plan)
lg route-plans delete — Cancel and delete a route plan (route_plan_id or route_plan_code). (schreibend · Bestätigung + irreversibel · Frachtführer · API: delete_route_plan)
lg route-plans get — One saved route plan: stops with arrival/departure ranges, the summary (distance, truck driving time, arrival optimistic / expected / conservative, breaks, daily/weekly rests, reduced rests, border waits), Schengen days… (lesend · — · Frachtführer · API: get_route_plan)
lg route-plans list — List the company's saved route plans, newest first: code, name, status (draft | assigned | converted | cancelled), departure, crew, driver, vehicle, linked load/trip, stops, arrival range and Schengen day count. (lesend · — · Frachtführer · API: list_route_plans)
lg route-plans preview — Compare 1-6 variants of the same journey side by side — different drivers, departure days or a double crew: arrival range, driving and rest counts, Schengen days left at the end for every crew member, availability /… (schreibend · Bestätigung · Frachtführer · API: compare_route_plan_scenarios)
lg route-plans remove-driver — Take the driver (and co-driver) off an assigned route plan (route_plan_id or route_plan_code); the plan goes back to draft and stops counting as planned Schengen days for them. (schreibend · Bestätigung · Frachtführer · API: unassign_driver_from_route_plan)
lg route-plans select — Link a saved route plan (route_plan_id or route_plan_code) to the load or trip it was planned for — give load_code OR trip_code; give neither to remove the link. (schreibend · Bestätigung · Frachtführer · API: link_route_plan)
lg route-plans update — Change a saved route plan (route_plan_id or route_plan_code): any create_route_plan field — name, departure, stops, crew, options, vehicle. (schreibend · Bestätigung · Frachtführer · API: update_route_plan)
lg schengen-stays calculate — Project ONE driver's Schengen 90/180 days into the future: days used today, then how the remaining days move with the loads, trips and route plans already assigned to him (plus the drive back out) and his leave /… (lesend · — · Frachtführer · API: get_driver_schengen_projection)
lg schengen-stays create-set — Import drivers' past Schengen entry/exit periods (passport stamps) from an Excel/CSV file — one row per stay: driver code or name, entry date, exit date (empty = still inside). (schreibend · Bestätigung · Frachtführer · API: import_driver_schengen_periods) [nimmt eine Datei: attachment_uuid]
lg schengen-stays download — Give a short-lived download link to the Schengen history import template, pre-filled with the company's active drivers (user code + name; entry/exit date cells empty). (lesend · — · Frachtführer · API: download_schengen_import_template)
lg schengen-stays get — One driver's full Schengen 90/180 picture: days used (confirmed / declared / inferred), days left (signed; negative = overstay), latest exit date, breach date, when days come back (regain schedule), per-country day… (lesend · — · Frachtführer · API: get_driver_schengen_detail)
lg schengen-stays list — Fleet-wide Schengen 90/180 compliance: which drivers breached the 90-days-in-180 rule or are close to it, how many days each has left (days_remaining is SIGNED — negative means overstay), the latest exit date… (lesend · — · Frachtführer · API: list_schengen_compliance)
lg schengen-stays list-periods — List the Schengen stay periods DECLARED for a driver (passport stamps / starting balance) with their period_id, entry and exit dates and day count. (lesend · — · Frachtführer · API: list_driver_schengen_periods)
lg schengen-stays remove-period — Delete ONE wrongly entered declared Schengen period of a driver (period_id from list_driver_schengen_periods). (schreibend · Bestätigung + irreversibel · Frachtführer · API: delete_driver_schengen_period)
lg schengen-stays set-baseline — Set a driver's Schengen starting balance — what happened BEFORE GPS tracking: either the exact periods inside the zone from passport stamps (baseline_mode=periods) or just "X days used in the last 180"… (schreibend · Bestätigung · Frachtführer · API: set_driver_schengen_baseline)
lg schengen-stays set-exemption — Exempt a driver from Schengen 90/180 tracking (EU/EFTA passport, residence permit, national long-stay visa) or switch the rule back on. (schreibend · Bestätigung · Frachtführer · API: set_driver_schengen_exemption)
lg settlements cancel — CANCEL a bulk collection / payment (settlement batch). (schreibend · Bestätigung + irreversibel · alle · API: cancel_settlement_batch) [manager-Schlüssel]
lg settlements create — Close several open invoices of ONE contact in ONE currency in a single bulk collection (direction in) or bulk payment (direction out). instrument transfer = money already moved by bank transfer (payments + journal… (schreibend · Bestätigung + irreversibel · alle · API: create_settlement_batch)
lg settlements get — Read one bulk collection / payment (settlement batch) in full: code, direction (in = collection, out = payment), instrument (transfer, bank instruction or cheque), status, counterparty, currency and total, value date,… (lesend · — · alle · API: get_settlement_batch)
lg settlements list — List bulk collection/payment batches (code, direction, instrument, contact, currency, total, value date, status), newest first. (lesend · — · alle · API: list_settlement_batches)
lg settlements list-counterparties — List the business contacts that have OPEN local invoices in one money direction — in = customers owing us (sales invoices), out = suppliers we owe (purchase invoices) — each with its default open-invoice currency and… (lesend · — · alle · API: list_settlement_counterparties)
lg settlements list-invoices — Open LOCAL invoices of one contact in one currency that can be allocated in a bulk collection (direction in = sales invoices) or bulk payment (direction out = purchase invoices), each with payable_remaining (remaining… (lesend · — · alle · API: list_settlement_invoices)
lg settlements options — Return the options of the bulk collection / payment form: allowed currencies, this company's OWN bank accounts (bank_account_id for create_settlement_batch / attach_check_to_invoices), bank instruction templates, batch… (lesend · — · alle · API: get_settlement_options)
lg ship-trackings create — Attach a ship to a load and track it on the load's map (yüke gemi bağla), or swap the ship (replace_ship_id = the ship being replaced) — "FKZ8515 sails on MSC Gülsün, track it". (schreibend · Bestätigung · Verlader, Frachtführer · API: track_ship_for_load)
lg ship-trackings delete — Stop tracking a ship on a load (gemi takibini durdur). (schreibend · Bestätigung · Verlader, Frachtführer · API: stop_ship_tracking)
lg ship-trackings get — Show the ship(s) tracked on a load and their position history since the load was created (yükün gemi takibi) — "where is FKZ8515's ship now". (lesend · — · alle · API: get_load_ship_tracking)
lg ships search — Search the ship registry (gemi sicili) by name, IMO or MMSI — "what is MSC Gülsün's IMO", "find the vessel 9839430". (lesend · — · alle · API: lookup_ship)
lg stock adjust — Record a stock count correction (sayım düzeltme) or write-off (fire). mode=set sets the absolute on-hand at the slot; mode=delta applies a signed change (negative reduces). reason is required. (schreibend · Bestätigung + irreversibel · Verlader · API: create_stock_adjustment)
lg stock list — Read current on-hand stock levels. (lesend · — · Verlader · API: check_stock_level)
lg stock list-movements — List the stock movements of this company, newest first: which product moved, in or out (or a transfer or a count adjustment), how much, in which warehouse and area, on which pallet, who performed it and when. (lesend · — · Verlader · API: list_stock_movements)
lg stock move — Record a stock movement: inbound (giriş), outbound (çıkış), or transfer between locations. (schreibend · Bestätigung + irreversibel · Verlader · API: create_stock_movement)
lg stock options — List the stock movement types (receipt, issue, transfer, count adjustment …) with their slug and Turkish/English names — the values create_stock_movement and list_stock_movements use. (lesend · — · Verlader · API: get_stock_options)
lg sub-companies create — Add a group / sub company (alt firma) to this customer company: legal_name (ticaret unvanı), tax_office (vergi dairesi), tax_number and the full address — all four required. (schreibend · Bestätigung · Verlader · API: create_sub_company) [manager-Schlüssel]
lg sub-companies delete — Delete one of this customer company's group / sub companies (alt firma) by sub_company_id from list_sub_companies. (schreibend · Bestätigung + irreversibel · Verlader · API: delete_sub_company) [manager-Schlüssel]
lg sub-companies list — This customer company's group / sub companies (alt firmalar, grup şirketleri — Settings › Sub Companies): sub_company_id, legal name, tax office, tax number and address. (lesend · — · Verlader · API: list_sub_companies)
lg tariff-chapters get — Answer "which chapter is this GTİP in / what does chapter 76 cover / what do the chapter notes say?". (lesend · — · alle · API: get_tariff_chapter)
lg tariff-matrices get — FREE. (lesend · — · alle · API: get_tariff_matrix)
lg tariff-matrices list — FREE. (lesend · — · alle · API: list_tariff_matrix_runs)
lg tariff-matrices preview — FREE. (lesend · — · alle · API: plan_tariff_matrix)
lg tariff-matrices run — Run an official duty + anti-dumping inquiry for ONE tariff code across MANY origin and destination countries at once, and record it. (schreibend · Bestätigung + irreversibel · alle · API: run_tariff_matrix)
lg tariffs coverage — FREE. (lesend · — · alle · API: get_tariff_coverage)
lg tariffs extract — Read an invoice or proforma the user attached to THIS conversation and pull out its product lines with candidate GTİP/HS codes, plus the origin and destination it names. (schreibend · — · alle · API: extract_tariff_codes_from_invoice) [nimmt eine Datei: attachment_uuid]
lg tariffs get — Read the result of a tariff inquiry that was already run: duty rate, the column it came from, the statutory rate, anti-dumping measures and the data notes. (lesend · — · alle · API: get_tariff_inquiry)
lg tariffs inquiry — Start an official duty / anti-dumping inquiry for one GTİP/HS code and a COUNTRY PAIR (origin → destination). (schreibend · Bestätigung + irreversibel · alle · API: run_tariff_inquiry)
lg tariffs list — List this company's recent tariff inquiries (code, direction, counterpart country, status, date) so the user can find an earlier one by code or country instead of running a new inquiry. (lesend · — · alle · API: list_tariff_inquiries)
lg tariffs search — Search the Turkish customs nomenclature (GTİP / HS) by goods description or by a partial code, and return matching codes with their official descriptions. (lesend · — · alle · API: lookup_tariff_code)
lg teammates delete — Remove a person from the company team. (schreibend · Bestätigung + irreversibel · alle · API: remove_teammate) [manager-Schlüssel]
lg teammates list — List the other users of this company (drivers excluded) with e-mail, active state and RBAC role (manager | employee | fleet-manager), plus seat_usage (team seats used / limit / remaining under the package). role narrows… (lesend · — · alle · API: list_teammates)
lg teammates set-role — Change a team member's role (for example make them a manager, or move them back to employee). (schreibend · Bestätigung · alle · API: update_teammate_role) [manager-Schlüssel]
lg teammates set-status — Activate or deactivate a team member. (schreibend · Bestätigung · alle · API: set_teammate_status) [manager-Schlüssel]
lg tender-bids create — Submit YOUR bid for a tender using a file the user attached to THIS conversation (the filled specification spreadsheet, a PDF offer, or a zip). (schreibend · Bestätigung + irreversibel · Frachtführer · API: submit_tender_bid) [nimmt eine Datei: attachment_uuid]
lg tender-bids get — Read YOUR OWN bid on a tender: its status (submitted, revision requested, accepted, rejected), when it was submitted and which files it carries. (lesend · — · Frachtführer · API: get_my_tender_bid)
lg tender-bids set-status — As the tender owner, ACCEPT a carrier's bid, REJECT it, or ask for a REVISION. (schreibend · Bestätigung + irreversibel · Verlader · API: decide_tender_bid)
lg tenders add-document — Attach a file to one of YOUR tenders as an additional specification document (accepted: pdf, xlsx, xls, doc, docx; at most 10 MB). (schreibend · Bestätigung · Verlader · API: add_tender_document) [nimmt eine Datei: attachment_uuid]
lg tenders create — Open a NEW document-based freight tender and generate its specification Excel from the lanes the user gives (origin → destination, vehicle/load type, monthly volume). (schreibend · Bestätigung · Verlader · API: create_tender) [nimmt eine Datei: attachment_uuid]
lg tenders delete-document — Remove a specification file from one of YOUR tenders (document_id from get_tender → documents[]). (schreibend · Bestätigung + irreversibel · Verlader · API: delete_tender_document)
lg tenders extract — Draft the specification (terms) text of a tender from a tender document the user supplies (accepted: pdf, xlsx, xls; at most 10 MB). (lesend · — · Verlader · API: extract_tender_specification) [nimmt eine Datei: attachment_uuid]
lg tenders generate — Generate a specification Excel for an EXISTING tender from the lanes/items the user gives and attach it to the tender as a document; returns a short-lived download link. (schreibend · Bestätigung · Verlader · API: generate_tender_excel)
lg tenders get — Read one tender in full: specification text, dates, attached specification files (with short-lived download links) and — for the tender owner — every carrier bid with its status; a carrier sees only its own bid. (lesend · — · Verlader, Frachtführer · API: get_tender)
lg tenders list — List document-based freight tenders. (lesend · — · Verlader, Frachtführer · API: list_tenders)
lg tenders update — Edit one of YOUR tenders: title, description, specification text, the bidding window (start_date / end_date), the price-validity window, whether it still accepts bids (is_active), its status, and who it is shared with. (schreibend · Bestätigung · Verlader · API: update_tender)
lg trade-measures get — Answer "is there an anti-dumping / countervailing / safeguard measure on this GTİP code when importing INTO TURKEY?" straight from the Ministry of Trade's measures-in-force list, which we sync every day. (lesend · — · alle · API: get_trade_measures)
lg trade-measures list — Browse Türkiye's trade-defence measures WITHOUT a GTİP code: by origin country ("which measures apply to goods from China"), by product ("which countries have a measure on aluminium foil"), by measure type, or by end… (lesend · — · alle · API: list_trade_measures)
lg user-accounts preview — Show what closing MY OWN account would do, without closing it: whether I am a manager, whether I am the only user (then the company is deactivated too), whether I must first hand the manager role to a teammate… (lesend · — · alle · API: preview_account_closure)
lg users get — Who am I? (lesend · — · alle · API: get_current_user)
lg vehicle-assignments create — Hand a fleet vehicle over to a driver (open an assignment), so their expense receipts and trips are attached to the right tractor unit or trailer. (schreibend · Bestätigung · Verlader, Frachtführer · API: assign_vehicle_to_driver)
lg vehicle-assignments list — List which driver currently holds which vehicle (tractor unit / trailer). (lesend · — · Verlader, Frachtführer · API: list_vehicle_assignments)
lg vehicle-assignments revoke — Close an open vehicle assignment: the driver hands the vehicle back. (schreibend · Bestätigung · Verlader, Frachtführer · API: end_vehicle_assignment)
lg vehicle-expenses create — Record a cost against one of the company's own vehicles without an invoice file — category, amount and currency are required, the rest is optional. (schreibend · Bestätigung · Verlader, Frachtführer · API: create_vehicle_expense) [nimmt eine Datei: attachment_uuid]
lg vehicle-expenses delete — Delete a vehicle cost entered by mistake (duplicate, wrong plate, test entry). (schreibend · Bestätigung + irreversibel · Verlader, Frachtführer · API: delete_vehicle_expense)
lg vehicle-expenses list — List the cost records of the company's own vehicles (maintenance, tyres, repair, roadworthiness test, insurance, fuel, tolls, parts) with a EUR total and a breakdown per category and per currency. (lesend · — · Verlader, Frachtführer · API: list_vehicle_expenses)
lg vehicle-expenses update — Correct a recorded vehicle cost: category, amount, currency, vendor, invoice number, invoice date or description — "the tyre invoice was 580 not 850". (schreibend · Bestätigung · Verlader, Frachtführer · API: update_vehicle_expense)
lg vehicles add-document — File a paper of one of the company's own vehicles — registration (ruhsat), traffic or kasko insurance, roadworthiness inspection, tachograph calibration, CMR insurance, green card, ADR certificate — from an uploaded… (schreibend · Bestätigung · Verlader, Frachtführer · API: add_vehicle_document) [nimmt eine Datei: attachment_uuid]
lg vehicles archive — Take a vehicle out of service (archive it) or put an archived one back into service. (schreibend · Bestätigung · Verlader, Frachtführer · API: archive_vehicle)
lg vehicles create — Add a vehicle to this company's fleet: plate plus its kind (truck, tractor unit, trailer, van, pickup, car), optionally brand, model, model year, VIN and a note. (schreibend · Bestätigung · Verlader, Frachtführer · API: create_vehicle) [nimmt eine Datei: attachment_uuid]
lg vehicles delete — Delete a vehicle record that was created BY MISTAKE (wrong plate, duplicate). (schreibend · Bestätigung + irreversibel · Verlader, Frachtführer · API: delete_vehicle)
lg vehicles delete-document — Remove a paper from a vehicle's file (a duplicate row, a paper filed on the wrong vehicle, an old registration). (schreibend · Bestätigung + irreversibel · Verlader, Frachtführer · API: delete_vehicle_document)
lg vehicles get — Full detail of ONE fleet vehicle: identity (plate, kind, brand, model, model year, VIN), whether it is active or archived, ALL of its papers with their expiry date and days_to_expiry, how many papers expire soon or… (lesend · — · Verlader, Frachtführer · API: get_vehicle)
lg vehicles list — List this company's fleet vehicles with plate, kind (truck / tractor unit / trailer / van / pickup / car), brand, model, model year, VIN and how many of their papers (insurance, inspection, permits) expire soon or have… (lesend · — · Verlader, Frachtführer · API: list_vehicles)
lg vehicles search — Resolve one of this company's fleet vehicles (truck, tractor unit, trailer, van, pickup, car) to its vehicle_id by plate, brand, model or VIN. (lesend · — · Verlader, Frachtführer · API: lookup_vehicle)
lg vehicles update — Correct a fleet vehicle's fields: plate, kind, brand, model, model year, VIN or note. (schreibend · Bestätigung · Verlader, Frachtführer · API: update_vehicle)
lg vehicles update-document — Correct a vehicle paper already on file — most often its expiry date (valid_until) after a renewal or a wrong AI reading, but also its type, number, issue date, issuer, the plate printed on it, issuing country, title or… (schreibend · Bestätigung · Verlader, Frachtführer · API: update_vehicle_document)
lg wallets get — Read this company's Logistivo WALLET balance — the prepaid MONEY balance (amount + currency). (lesend · — · alle · API: get_wallet_balance)
lg wallets list-transactions — List this company's Logistivo WALLET movements, newest first: top-ups and money spent on packages or paid features, with the amount, the balance before/after, who did it and when. (lesend · — · alle · API: list_wallet_transactions)
lg warehouse-areas create — Add a new area to one of this company's warehouses — an open area, a closed area or a loading ramp — with how many vehicles it can take at the same time (its booking slot capacity). (schreibend · Bestätigung · Verlader · API: create_warehouse_area)
lg warehouse-areas delete — Delete one area/ramp of a warehouse. (schreibend · Bestätigung + irreversibel · Verlader · API: delete_warehouse_area)
lg warehouse-areas update — Change a warehouse area's name, type (open_area, closed_area, ramp), vehicle capacity, display order or active flag. (schreibend · Bestätigung · Verlader · API: update_warehouse_area)
lg warehouse-links create — Create a public booking link for one of this company's warehouses, to share with a carrier, supplier or customer: anyone holding the URL can book a slot (the booking still waits for your approval). (schreibend · Bestätigung · Verlader · API: create_warehouse_link)
lg warehouse-links list — List the public booking links shared for one of this company's warehouses: the full URL (anyone holding it can book a slot), the area it is limited to (if any), the expiry, and whether it is active. (lesend · — · Verlader · API: list_warehouse_links)
lg warehouse-links revoke — Permanently revoke a warehouse booking link: the URL stops working for everyone and cannot be brought back (create a new link if needed). (schreibend · Bestätigung + irreversibel · Verlader · API: revoke_warehouse_link)
lg warehouse-links set-status — Turn a warehouse booking link off (nobody can book through it) or back on. (schreibend · Bestätigung · Verlader · API: set_warehouse_link_status)
lg warehouses create — Define a new warehouse for this company so stock can be held and dock slots booked there: a name and its street address are enough. (schreibend · Bestätigung · Verlader · API: create_warehouse)
lg warehouses delete — Delete one of this company's warehouses. (schreibend · Bestätigung + irreversibel · Verlader · API: delete_warehouse)
lg warehouses get — Read one warehouse in full: its identity and address, working days and hours, holiday opening, capacity, reservation slot rules (slot length, minimum and maximum duration), its safety and driver rules, the… (lesend · — · Verlader · API: get_warehouse)
lg warehouses list — List the warehouses of this company: name, address, whether it is active, its working days and hours, open/closed area capacity, the dock slot length and how many areas (racks/bays) it has. (lesend · — · Verlader · API: list_warehouses)
lg warehouses search — Resolve a warehouse by name to its warehouse_id, with its areas. (lesend · — · Verlader · API: lookup_warehouse)
lg warehouses set-equipment — Set a warehouse's equipment list IN FULL (forklift, transpallet = pallet truck, other; with quantity and an optional name/specification). (schreibend · Bestätigung · Verlader · API: set_warehouse_equipment)
lg warehouses update — Update a warehouse: its name or address, working days and hours, holiday opening, capacity, dock slot rules, the driver/safety flags or the active flag. (schreibend · Bestätigung · Verlader · API: update_warehouse)
ERP- und CRM-Integration — Identität: keine Servicekonten, sondern ein echter Benutzer
Ein ERP oder CRM verbindet sich mit Logistivo als echter Benutzer eines Unternehmens, mit einem persönlichen Zugriffstoken, das im Panel erzeugt wurde. Ein synthetisches Servicekonto – ohne Unternehmen, von der Mandantentrennung ausgenommen, ohne Verantwortlichen – wird nie angelegt.
Das ist Architektur, keine Vorliebe. Die Mandantentrennung beruht vollständig auf dem Unternehmen des Benutzers; für eine Identität ohne Unternehmen wird der Isolationsbereich wirkungslos, und eine einzige falsche Abfrage mit diesem Token liest Daten, die ihm nicht gehören. Der zweite Grund ist das Audit: Die Benutzerspalte im Protokoll verknüpft „wer hat das ausgeführt“ mit einer Person; ein Servicekonto macht diese Spalte bedeutungslos und lässt eine Rechnungen ausstellende Integration ohne Eigentümer zurück. Der dritte ist der Widerruf: Gehört ein Token einer Person, verstummt die Integration, wenn diese Person geht. Eine Brücke ohne Eigentümer ist die Brücke, die jahrelang still weiterschreibt.
In der Praxis: Das Unternehmen legt im Panel einen normalen Benutzer an (zum Beispiel „ERP Bridge“, im Besitz eines namentlich benannten Mitarbeiters), gibt ihm eine eng gefasste Rolle, erzeugt aus der Sitzung dieses Benutzers ein Token und hinterlegt es im ERP.
Dieser Benutzer ist im Berechtigungssystem sichtbar, seine Rechte lassen sich beschneiden, und sein Token lässt sich einzeln widerrufen. Verboten ist nicht, ein Konto anzulegen – verboten ist, ein Konto anzulegen, das an keinen Mandanten gebunden ist.
Eine Integration pro Token. Teilen sich zwei Systeme ein Token, ist die Granularität des Widerrufs dahin: Das CRM abzuschneiden heißt, auch das ERP abzuschneiden.
ERP- und CRM-Integration — Versionierung und Abkündigung
Die Katalogantwort trägt eine Ganzzahl contract_version; die Katalogzeilen der Befehle tragen since, deprecated_at und replaced_by. Die Vertragsversion steigt nur bei inkompatiblen Änderungen.
Die Version steigt NICHT bei: einem neuen Befehl, einem neuen optionalen Parameter, einem neuen Feld in einer Antwort. Ein Konsument muss Felder ignorieren, die er nicht kennt; ein Client, der bei einem unbekannten Feld einen Fehler wirft, ist nicht konform.
Die Version STEIGT bei: Entfernen oder Umbenennen eines Befehls, Entfernen eines Antwortfelds, Umwandeln eines optionalen Parameters in einen Pflichtparameter, Einschränken eines Enums. Die alte Form bleibt mindestens zwei Kalenderquartale (6 Monate) mit deprecated_at und replaced_by bestehen.
Die Abkündigung wird im Katalog angekündigt, nicht nur in einem Changelog. Weil der Client sich aus dem Katalog aufbaut, gibt ein Befehl mit gesetztem deprecated_at ohne jedes Client-Release eine Warnung aus, und der Integrator sieht sie in seinen Logs.
Der API-Name ist für immer eingefroren. Die CLI-Identität (Domäne/Verb) konnte vor ihrer Ankündigung frei neu zugeschnitten werden; nach der Ankündigung ändert sie sich nur mit einer Versionserhöhung und einem Migrationsfenster, in dem das alte Paar als Alias ausgeliefert wird.
In der Praxis: Die Katalogantwort und der Header X-Contract-Version tragen die Version; jede Katalogzeile eines Befehls trägt since, deprecated_at, replaced_by und aliases (alte Domäne/Verb-Paare). Ein veralteter Befehl lässt sich weiterhin aufrufen und antwortet mit einem Header X-Deprecated: name; deprecated_at=…; replaced_by=… plus einem deprecated-Objekt im Body. ?domain= im Katalog löst eine alte Alias-Domäne zum aktuellen Befehl auf.
Ein Client, der Version 1 versteht und auf eine größere Zahl trifft, sollte eine Warnung protokollieren und weitermachen; lg tut genau das. Die laufenden Ausmusterungen sind oben im Stabilitätsversprechen aufgeführt.
ERP- und CRM-Integration — Stabile Kennungen: Geben Sie Ihrem ERP nie eine Auto-Increment-ID als Schlüssel
Interne Auto-Increment-IDs sind opak und mandantengebunden: Die gültige ID eines anderen Unternehmens liefert Ihnen „nicht gefunden“, keine Daten. Opak zu sein macht sie aber nicht zu Geschäftsschlüsseln. Was ein ERP in seinem eigenen Datensatz speichert, muss ein Geschäftsschlüssel sein.
Ladung: code (der Kundencode, z. B. FSK2158). loads get funktioniert bereits per code.
Land: ISO 3166-1 alpha-2. countries search liefert den Code.
HS / Tarif: der Code selbst – die Nomenklatur ist bereits universell.
Rechnung: die Rechnungsnummer, sobald ausgestellt. Ein Entwurf hat nur eine Oberflächen-ID, und eine Entwurfs-ID ist KEIN Geschäftsschlüssel – das ERP sollte seine eigene Referenz führen und nie eine Entwurfs-ID dauerhaft speichern.
Produkt, Lager, Kontakt: heute nur eine Oberflächen-ID. Die Regel für neue Befehle ist eindeutig: Jeder Befehl, der eine Oberflächen-ID liefert, liefert auch den eigenen Geschäftsschlüssel des Mandanten (SKU, Code, Steuernummer), damit das ERP auf seiner Seite abgleichen kann.
ERP- und CRM-Integration — Paginierung, Filterung und inkrementeller Sync
Listenbefehle nehmen limit entgegen und liefern count. Für einen nächtlichen Sync verpflichtet sich der Vertrag zu Folgendem; ein Listenbefehl, der ihn übernommen hat, weist cursor und updated_since in seinem JSON Schema aus, und bis dahin behandeln Sie ihn als kleines Fenster (Obergrenze 20 Zeilen, kein Cursor).
Anfrage: limit (1 bis zur Obergrenze des jeweiligen Befehls) plus cursor (opak, nur vorwärts, vom Server signiert). offset wird NICHT verwendet – in einer lebenden Tabelle verschiebt sich ein Offset; ein Datensatz, der zwischen zwei Seiten eingefügt wird, lässt das ERP eine Zeile überspringen oder doppelt zählen, und zwar stillschweigend.
Antwort: { count, total?, next_cursor|null }. count ist die Zahl der Zeilen in dieser Antwort; ist next_cursor null, ist die Liste vollständig. Geben Sie next_cursor unverändert zurück – er ist keine Seitennummer, und Sie bauen ihn nicht selbst.
Ein manipulierter oder fremder Cursor wird mit 422 invalid_request abgelehnt; ein Cursor ist an das Unternehmen gebunden, das ihn erhalten hat, und kann keine Daten eines anderen Mandanten durchblättern.
Filterung: die benannten Parameter im JSON Schema, mit UND verknüpft. Eine freie Abfragesprache gibt es nicht – eine DSL wäre eine zweite Abfrageoberfläche, die wir verteidigen müssten.
Inkrementeller Sync: updated_since (ISO-8601, UTC) plus der Cursor. Speichern Sie das neueste updated_at, das Sie gesehen haben, und geben Sie es beim nächsten Lauf zurück; ohne das holt jedes ERP jede Stunde alles neu.
Externe Referenz: Schreibende Befehle akzeptieren external_ref (Ihren eigenen Belegschlüssel), eindeutig pro Unternehmen; ein zweites create mit demselben external_ref wird abgelehnt statt dupliziert, und list/get liefern es zurück, damit Sie Datensätze auf Ihrer Seite abgleichen können.
ERP- und CRM-Integration — Rate Limits
Der Schlüssel für das Limit ist das Token, nicht die IP: Ein ERP kommt hinter einem einzigen NAT hervor, und ein IP-basiertes Limit würde ein ganzes Unternehmen als einen Benutzer zählen. Zwei Integrationen mit zwei Schlüsseln fressen sich nie gegenseitig das Kontingent weg – der zweite Grund für „eine Integration pro Schlüssel“.
Discovery ohne Authentifizierung (public/cli/catalog): 30 pro Minute. Es ist ein Wörterbuch, keine Datenquelle; lesen Sie es einmal, während Sie Ihre Brücke schreiben, nie in einer Produktionsschleife.
Katalog-Endpoints (GET common/commands, GET common/commands/{name}): 120 pro Minute und Token. Der Katalog ändert sich selten und antwortet auf If-None-Match mit 304; laden Sie ihn nicht vor jedem Befehl neu – lg speichert ihn eine Stunde lang zwischen.
Lesende Befehle (POST common/commands/{name} mit read_only: true): 120 pro Minute und Token.
Schreibende Befehle (POST common/commands/{name} mit read_only: false; ein unbekannter Name zählt ebenfalls hierzu): 30 pro Minute und Token. Schreibvorgänge haben Nebenwirkungen; eine außer Kontrolle geratene Schleife wird abgerechnet.
Befehle, die Credits verbrauchen (credit_cost in der Katalogzeile ist nicht null – zum Beispiel tariffs inquiry und export-documents generate): Das eigentliche Limit sind CREDITS, nicht die Zahl der Anfragen. Eine Antwort mit 200 kann einen Credit verbraucht haben.
Tägliche Obergrenzen pro Unternehmen, gemeinsam mit dem Panel: Befehle, die E-Mails oder Push-Nachrichten an Personen außerhalb Ihres Unternehmens senden, zehren von 300 ausgehenden Benachrichtigungen pro Tag, und das Starten kostenpflichtiger Container- oder Schiffsverfolgung von 100 pro Tag. Über der Obergrenze antwortet ein Befehl mit DAILY_LIMIT_REACHED und retry_after; Datei-Uploads haben eigene Obergrenzen (siehe Befehle, die Dateien entgegennehmen).
429 trägt immer Retry-After und einen Body { error_code: "rate_limited", retry_after, limit, bucket }; beachten Sie das, statt eine feste Verzögerung zu erfinden. Der Katalog veröffentlicht die aktuellen Zahlen unter rate_limits.
ERP- und CRM-Integration — Was wir nicht tun werden
Das ist oft der nützlichste Teil eines Vertrags: Zu wissen, was nie kommen wird, lässt Sie darum herum planen.
Kein Servicekonto und kein Principal, der nicht an einen Mandanten gebunden ist.
Keine Zahlung, keine Kartennummer und keine rechtliche Einwilligung über die API oder einen Chat. Diese Schritte bleiben im Browser der Person; ein Befehl gibt Ihnen den Link.
Kein zweiter Weg: Es gibt keinen direkten Datenbankzugriff, keinen Shell-Zugang und keinen Bulk-Endpoint, der den einzigen Durchsetzungspunkt umgeht. Rollenschranke, Bestätigungsschranke, Idempotenz und Audit-Protokoll werden nur dort durchgesetzt.
Nach dem Text von Fehlermeldungen zu verzweigen wird nicht unterstützt; der Text ist lokalisiert und ändert sich ohne Vorankündigung.
Keine Offset-Paginierung.
Eine Oberflächen-ID als Geschäftsschlüssel in Ihrem ERP zu verwenden wird nicht unterstützt.
Ausgehende Webhooks werden nicht in diesen Vertrag gezwängt – aber es GIBT sie jetzt, und sie sind auf dieser Seite dokumentiert (der Webhook-Abschnitt oben). Der Katalog ist eine PULL-Oberfläche, und der Ereignisstrom ist ein SEPARATER Vertrag: Ereignisnamen und das Payload-Schema werden nach eigenen Regeln versioniert und sind nicht an die Vertragsversion des Befehlskatalogs gebunden.
Der maschinenlesbare Katalog
Diese Seite wurde für Menschen geschrieben. Für einen KI-Assistenten oder einen automatisierten Client gibt es dieselben Informationen als strukturierte Kopie ohne Authentifizierung.
GET /api/public/cli/catalog erfordert keine Authentifizierung und liefert die öffentliche Identität der Befehle: den eingefrorenen API-Namen, die CLI-Identität aus Domäne/Verb, die Beschreibung, die JSON-Schema-Parameter, die Flags read_only, confirmation_needed und irreversible, das credit_cost sowie die Zugriffsfelder key_level, permission, file_params, secret_parameters und cli_only. Er liefert keine personenbezogenen Daten, keine Mandantendaten und keine Beispieldatensätze – nur, was die Oberfläche ist.
Der richtige Weg für einen externen Agenten, ihn zu nutzen: den Katalog lesen, in EIGENEN Worten erklären, welche Aufgaben möglich sind, und, wenn eine Ausführung nötig ist, den Nutzer darauf verweisen, sie in seiner eigenen Umgebung mit seinem eigenen Token auszuführen. Der Agent fragt nie nach dem Token eines Nutzers, erzeugt keines und leitet keines weiter.
Logistivo für Registrierung und Frachtanfragen mit einem KI-Assistenten zu verbinden, ist ein separater Kanal mit eigener Seite:
Der Katalog ist ohne Authentifizierung zugänglich, die Ausführung nicht. Es gibt keinen Weg, einen Befehl im Namen eines Agenten auszuführen – was läuft, ist immer die eigene Identität des Nutzers.
Ein Logistivo-Passwort, ein Verifizierungscode oder ein Zugriffstoken geht nie durch einen Chat. Bauen Sie keinen Ablauf, der eines davon abfragt, erzeugt oder weiterleitet.
Ob ein Befehl irreversibel ist, steht im Katalog. Schlagen Sie bei einem Befehl mit irreversible: true nie „probieren wir es einfach“ vor.
Befehle, deren credit_cost nicht null ist (zum Beispiel tariffs inquiry und export-documents generate), haben ein finanzielles Ergebnis; rufen Sie sie nicht in einer automatisierten Schleife auf.
Zahlungen, Kartennummern und rechtliche Einwilligungen laufen nie über einen Chat oder einen Agenten. Bieten Sie stattdessen den Link aus handoff-links generate an; die Person schließt den Schritt in ihrem eigenen Browser ab.
Ein Agent, der mit dem Schlüssel eines Nutzers handelt, sollte zuerst users get aufrufen: Der Befehl liefert die Rolle, die Zugriffsstufe des Schlüssels, die effektiven Berechtigungen und ob eine ausstehende Einwilligung oder Telefonverifizierung Schreibvorgänge blockiert – sagen Sie Ablehnungen voraus, statt sie zu sammeln.
Ein Klartext-Zwilling dieser Seite liegt unter /cli.md; verwenden Sie ihn, wenn Sie Markdown zuverlässiger parsen als HTML.
Die maschinenlesbare Definition: OpenAPI 3.1 und Postman
Der Katalog oben ist Logistivos eigenes Format. Dieselben Informationen werden außerdem in zwei Industriestandard-Formaten veröffentlicht, die Ihre Tools bereits verstehen: als OpenAPI-3.1-Definition und als Postman-Collection. Keine von beiden ist von Hand geschrieben – beide werden bei jeder Anfrage aus dem Live-Befehlsregister erzeugt und können daher nicht veralten.
Die Definition IST der Katalog, keine zweite Wirklichkeit. Jeder Befehl erscheint als Operation POST /api/common/commands/; das Body-Schema ist das eigene JSON Schema des Befehls (Byte für Byte das, was der Assistent sieht), das Antwortschema ist der gemeinsame Umschlag, die Schranken-Flags (read_only, confirmation_needed, irreversible und das Credit-Badge) stehen in der Erweiterung x-logistivo, und die geschäftlichen Fehlerschlüssel stehen unter x-error-keys. Ein ausgemusterter Befehl ist mit deprecated: true markiert und bleibt während seines sechsmonatigen Fensters aufrufbar.
Neben der Befehlsoberfläche stehen auch die REST-Endpoints in der Definition, die den Integrationsvertrag tragen: 10 Listen-Endpoints mit inkrementellem Sync (updated_since + cursor + limit) und 7 schreibende Endpoints, die Ihren eigenen Schlüssel (external_ref) akzeptieren. Die REST-Oberfläche von Logistivo ist weit größer; der Rest ist ABSICHTLICH weggelassen. Diese Payloads sind der eigene Vertrag des Produkts, und ein aus Vermutungen geschriebenes Schema würde Ihren generierten Client beim ersten Aufruf brechen – und Sie würden den Fehler in Ihrem Code suchen, nicht in unserem.
Die Definition wird für die ROLLE dessen erzeugt, der fragt: Der Befehl einer anderen Rolle gelangt nie in das Dokument, denn eine Definition ist ein Vertrag und kein Wörterbuch, und alles darin muss mit diesem Token aufrufbar sein. Die Version ohne Authentifizierung ist die Vereinigung der drei Rollen, und dort gibt jede Operation unter x-logistivo.roles an, welche Rollen sie sehen.
Verlassen Sie sich nicht auf unser Wort – prüfen Sie es: npx @redocly/cli lint logistivo-openapi.json läuft ohne eine einzige Warnung durch.
GET /api/common/spec/openapi.json — Die OpenAPI-3.1-Definition für die Rolle Ihres Tokens. Trägt ein ETag; If-None-Match liefert Ihnen eine 304, sodass Sie sie nicht bei jedem Build erneut herunterladen.
GET /api/common/spec/postman.json — Derselbe Umfang als Postman-v2.1-Collection, mit den Variablen base_url und token und Ordnern, die bereits nach Befehlsdomäne gruppiert sind.
GET /api/public/cli/openapi.json — Die Version ohne Authentifizierung – die Vereinigung der drei Rollen. Zum Entwerfen und Kalkulieren der Brücke, bevor Sie ein Token haben.
GET /api/public/cli/postman.json — Die Postman-Collection ohne Authentifizierung: eine Datei, die Sie Ihrem Team übergeben können.
559 Operationen — 519 Befehle + 36 REST- und Control-Plane-Operationen + 4 Katalog- und Identitäts-Endpoints. Die Zahlen auf dieser Seite sind nicht von Hand getippt; sie werden bei jeder Anfrage aus dem Live-Dokument gezählt, sodass sie am Tag, an dem ein Befehl ausgeliefert wird, auch hier steigen – und sie gehen in der Summe auf.
Das Sicherheitsschema — bearerAuth: ein Passport-Token, das für einen echten Benutzer ausgestellt wurde. Ein Schlüssel mit Scope read darf nur Operationen aufrufen, die mit x-logistivo.read_only: true gekennzeichnet sind; ein Schreibversuch liefert 403 VOR der Bestätigungsschranke, sodass ein rein lesender Schlüssel nie eine 409 sieht.
Jeder Fehlerzweig ist ausgeschrieben — Jede Operation beschreibt 401/403/404/409/422/429/500 getrennt. Die zwei Bedeutungen von 409 (Bestätigung erforderlich / Idempotenzkonflikt) und die zwei Bedeutungen von 422 (Schemafehler / geschäftliche Ablehnung) sind im Dokument unterschieden, sodass Ihr Generator sie nicht zu einem einzigen Zweig zusammenfasst.
Kein Zeitstempel — Das Dokument enthält keinen Erzeugungszeitpunkt. Derselbe Katalog erzeugt dieselben Bytes, deshalb funktioniert das ETag tatsächlich, und eine Definition, die Sie in die Versionskontrolle einchecken, sieht nicht bei jedem Download „geändert“ aus.
Wir haben keine Produkt-Payloads erfunden — Bei REST-Schreib-Endpoints ist nur das Vertragsfeld (external_ref) beschrieben; der Rest des Bodys bleibt als additionalProperties: true offen, und der Leser wird auf die Produktdokumentation verwiesen. Eine Definition, die unvollständig, aber wahr ist, schlägt eine, die vollständig, aber erfunden ist.
Die Fehlerschlüssel-Liste pro Operation ist NICHT erschöpfend — x-error-keys listet nur die Schlüssel auf, die sich mit Sicherheit aus dem eigenen Datensatz des Befehls ergeben, und sagt das mit x-error-keys-exhaustive: false. Das vollständige Wörterbuch steht an der Wurzel des Dokuments; behandeln Sie jeden Schlüssel, den Sie nicht kennen, als generischen Fehlschlag. Eine erfundene „vollständige Liste“ hätte Sie dazu verleitet, den default-Zweig nie zu schreiben.
Discovery-Tools sind nicht in der Definition — search_commands, run_command und list_capabilities existieren nur innerhalb der Chat-Schleife und können nicht über HTTP aufgerufen werden. Wären sie enthalten, hätte Ihr Generator drei Methoden geschrieben, die nie funktionieren könnten.
Codegenerierung: ein typisierter Client aus der Definition
Sie haben die Definition; erzeugen Sie jetzt funktionierenden Code daraus. `lg codegen` liest das OpenAPI-Dokument und schreibt einen Client aus einer einzigen Datei ohne Abhängigkeiten – TypeScript (Typdeklarationen plus ein dünner Aufruf-Wrapper) oder PHP (eine Client-Klasse mit PHPDoc-Array-Shapes). Kein `npm install`, kein Composer: `fetch` auf der TypeScript-Seite, `ext-curl` auf der PHP-Seite.
Die Generierung findet auf IHREM Rechner statt, nicht auf unserem Server. Das ist keine Vorliebe: Pinnen Sie die Definition einmal in Ihrem Repository (`lg spec --out=...`), und derselbe Befehl läuft bei jedem Build ohne Netzwerk und ohne Token, sodass Ihre CI nie von unserer Verfügbarkeit abhängt. Und weil der generierte Code Code ist, der in Ihrem ERP LÄUFT, bedeutet es, ihn in Ihrem Repository zu halten, statt ihn von einer API zu ziehen, dass jede Änderung in `git diff` sichtbar wird.
Der generierte Client behandelt alle drei Logistivo-Schienen korrekt, und er erfährt aus dem Dokument, welche welche ist, statt zu raten: Jede Operation deklariert ihre Schiene in `x-logistivo.surface`. Die Befehlsschiene packt den Umschlag `{success, data:{…}}` aus; eine REST-Sync-Liste ist NICHT umschlossen und wird unverändert zurückgegeben (sie auszupacken würde `next_cursor` verlieren); ein REST-Schreibvorgang liefert den eigenen Produkt-Body des Endpoints. Ein Allzweck-Generator kennt diese Unterscheidung nicht – unserer schon.
Die Typen sind keine Vermutungen: Die Argument-Schnittstelle jedes Befehls wird aus genau dem JSON Schema erzeugt, das der Assistent sieht. Pflicht bleibt Pflicht, Enums werden zu Union-Typen, verschachtelte Objekte zu verschachtelten Typen. In der Praxis: Verlangt der Server ein Feld, scheitert der Aufruf, der es vergisst, nicht mit einer 422 in der Produktion – er scheitert zur Kompilierzeit.
In die Datei wird kein Generierungszeitstempel geschrieben: Dieselbe Definition mit denselben Flags erzeugt dieselben Bytes. Ein erneutes Generieren erzeugt daher kein Rauschen in `git diff`, und das Einzige, was sich wirklich geändert hat – der Vertrag –, bleibt sichtbar.
1. Die Definition pinnen — Die Definition wird für Ihre Rolle erzeugt; jede Operation darin ist mit diesem Token aufrufbar. Committen Sie die Datei. lg login --api-key= lg spec --out=logistivo-openapi.json
2. Den Client generieren — Heraus kommt eine Datei, die JEDE Operation der gepinnten Definition als Methode enthält: die Befehle, die Ihre Rolle aufrufen kann, die REST-Endpoints, die den Integrationsvertrag tragen, und die Discovery-Endpoints. Die Anzahl ist die IHRER Rolle, nicht die Gesamtzahl der Plattform – heute ergibt ein Verlader-Schlüssel 448 Befehlsmethoden, ein Frachtführer 452, ein Zolldienstleister 312. Generieren Sie aus der öffentlichen Definition ohne Authentifizierung, liegt die Obergrenze bei 559 Operationen. lg codegen ts --from=logistivo-openapi.json --out=logistivo-client.ts lg codegen php --from=logistivo-openapi.json --out=LogistivoClient.php --namespace="Acme\\Logistivo" # or straight from the server, without downloading first: lg codegen ts --out=logistivo-client.ts
3. Prüfen, dann verwenden — Lässt sich der generierte Code nicht kompilieren, liegt der Fehler bei uns, nicht bei Ihnen: Die Integrität der Definition wird durch eine ausführbare Prüfung auf dem Server abgesichert. npx tsc --noEmit --strict --target ES2022 --module ESNext --moduleResolution bundler logistivo-client.ts php -l LogistivoClient.php
Eine Methode pro Operation — Jeder Befehl im Dokument, jeder REST-Endpoint, der den Integrationsvertrag trägt, und die Discovery-Endpoints. Generieren Sie aus der Definition Ihrer Rolle, erhalten Sie nur, was Sie aufrufen können (448 Befehle für einen Verlader); generieren Sie aus der öffentlichen Definition, erhalten Sie alle 559 Operationen. Am Tag, an dem auf dem Server ein Befehl hinzukommt, bringt ein erneutes Generieren ihn mit; auf ein Client-Release müssen Sie nicht warten.
Argumenttypen — Das `args`-Schema jedes Befehls wird zu einem Interface (in PHP zu einem Array-Shape). Pflichtfelder bleiben Pflicht, Enums werden zu Unions. In TypeScript ist ein vergessenes Pflichtfeld ein Kompilierfehler; in PHP sehen Ihre IDE und PHPStan dieselbe Form.
Fehlerklassen — Die Transport-Taxonomie (`error_code`) und die Geschäfts-Taxonomie (`error_key`) sind getrennte Felder; die Bestätigungsschranke und das Rate Limit sind eigene Fehlertypen. Die Union der Fehlerschlüssel bleibt für unbekannte Werte offen – deklariert der Server einen neuen Schlüssel, kompiliert Ihr Code weiter und fällt in den `default`-Zweig.
Eine korrekte Wiederholungsrichtlinie — Automatische Wiederholungen gelten nur für sichere Aufrufe: Lesevorgänge und Schreibvorgänge, die einen Idempotency Key tragen. Ein Schreibvorgang ohne Key, der in ein Timeout läuft, bedeutet nicht „es wurde nichts geschrieben“, also wiederholt der Client ihn nie blind. Bei einer 429 wartet er das `Retry-After` des Servers ab, statt eine Verzögerung zu erfinden.
Ergebnis-Bodys sind nicht typisiert — Befehlsergebnisse kommen als `unknown` zurück (`mixed` in PHP), aus demselben Grund wie in der Definition selbst: Ergebnisformen sind die geschäftliche Ausgabe des Befehls, nicht Teil des Vertrags. Ein geratener Ergebnistyp würde in dem Moment zu lügen beginnen, in dem sich zum ersten Mal ein Feld verschiebt.
Die generierte Datei wird nicht von Hand bearbeitet — Sie ist eine Ausgabe, keine Quelle. Brauchen Sie zusätzliches Verhalten, umschließen Sie die generierte Klasse; alles, was Sie in sie hineinschreiben, geht bei der nächsten Generierung verloren.
Discovery-Tools werden nicht generiert — `search_commands`, `run_command` und `list_capabilities` leben nur innerhalb der Chat-Schleife und können nicht über HTTP aufgerufen werden; sie fehlen in der Definition und daher auch im Client. Sie aufzunehmen hätte bedeutet, drei Methoden zu schreiben, die nie funktionieren.
Ehrlicher Umfang
Wir erweitern diesen Abschnitt lieber, als ihn zu kürzen. Der Wert eines Integrationsvertrags liegt weniger in dem, was er verspricht, als darin, wie klar er sagt, was er nicht tut.
Die CLI läuft im Kontext eines Mandantenbenutzers — Jeder Befehl läuft unter dem Unternehmen und der Rolle des Benutzers, dessen Token vorgelegt wird. Ein Plattformbetreiber-Modus – ein administrativer Modus, der unternehmensübergreifend liest – liegt außerhalb dieser Oberfläche und wird von hier aus nicht geöffnet.
Ihre Befehlsliste hängt von Ihrer Rolle ab — Ein Verlader-Konto sieht 448 Befehle, ein Frachtführer 452, ein Zolldienstleister 312, ein Affiliate 55. Fehlt ein Befehl in Ihrem Katalog, prüfen Sie zuerst die Rolle; ist er gelistet, wird aber abgelehnt, prüfen Sie Scope und Zugriffsstufe des Schlüssels. Fahrerkonten haben überhaupt keinen Zugang zu dieser Oberfläche.
Manche Befehle verbrauchen Credits — Tarifabfragen, Dokumentenerzeugung und einige andere KI-gestützte Befehle zehren vom Credit-Guthaben Ihres Pakets. Jede Katalogzeile trägt credit_cost {mode, credits}: fixed ist die exakte Belastung pro Aufruf, read_only belastet nie, und computed bedeutet, dass die Belastung vom Aufruf abhängt – credits ist dann null, und der tatsächliche Betrag erscheint auf der Bestätigungskarte. Ein Preflight (dry_run) sagt Ihnen, was ein Aufruf kosten würde und ob Ihr Guthaben das deckt.
Integrationsschlüssel können den Dashboard-Chat nicht steuern — Der KI-Assistent im Dashboard ist für Menschen da. Einen Assistentenlauf mit einem Integrationsschlüssel zu starten oder fortzusetzen, wird mit 403 abgelehnt; Agenten nutzen die Befehls-Endpoints, lg oder den MCP-Kanal, wo jeder Befehl auf der Zugriffsstufe des Schlüssels läuft und seine Schreibvorgänge als Integrations-Schreibvorgänge protokolliert werden.
Der Katalog ersetzt nicht die bestehende REST-API — Die REST-Oberfläche, auf der die Web- und Mobil-Apps von Logistivo laufen, bleibt, wo sie ist, und unterliegt weiterhin der Regel der Abwärtskompatibilität. Der Befehlskatalog ersetzt kein Ressourcen-CRUD; er ist die VERB-Ebene – der einzige, auditierte Weg, etwas zu tun.
Listenbefehle liefern heute kleine Fenster — Solange ein Listenbefehl cursor und updated_since nicht in seinem Schema ausweist, liegt seine Obergrenze bei 20 Zeilen ohne Cursor. Er ist nicht dafür gedacht, eine vollständige Kopie Ihrer Daten zu extrahieren; der inkrementelle Sync wird Befehl für Befehl ausgerollt.
Häufig gestellte Fragen
Wofür wird die Logistivo CLI verwendet?
Sie erledigt die Arbeit in Ihrem Logistivo-Konto aus einem Terminal, einem Skript oder Ihrem eigenen KI-Agenten heraus: Ladungen und Touren, Transportanfragen, Angebote und Ausschreibungen, Flotte, Fahrer und ihre Ausgaben, Dokumente, Kontakte und Kontokorrente, Rechnungen und Buchhaltung, Lager und Bestand, Teammitglieder, HS-Tarife und Antidumpingzölle. Für jede schreibende Aktion im Panel gibt es einen Befehl; Zahlungen, rechtliche Einwilligungen und die Kontoschließung bleiben bewusst im Browser. Dieselben Befehle lassen sich für ERP/CRM-Integrationen über HTTP und über den MCP-Kanal aufrufen.
Wie werden Befehle in der Logistivo CLI benannt?
Die Form ist lg --parameter=value. Die Domäne ist eine Entität im Plural (loads, demands, invoices, export-documents), und das Verb stammt aus einem geschlossenen Vokabular, das nur durch bewusste Entscheidung wächst (list, get, create, update, search, set-status, generate und so weiter). Alle Verben einer Entität leben in einer Domäne, und das Paar (Domäne, Verb) ist im gesamten Katalog eindeutig.
Wie authentifiziere ich mich bei der CLI?
Interaktiv zeigt lg login einen Freigabecode an, den Sie in Ihrem Browser bestätigen, nachdem Sie sich bei Logistivo angemeldet haben – weder Passwort noch Schlüssel werden im Terminal eingegeben, und die Sitzung bleibt angemeldet und erneuert sich selbst, bis Sie lg logout ausführen. lg login --password (E-Mail und Passwort) bleibt als Ausweichweg erhalten. Auf Servern und in CI verwenden Sie einen Integrationsschlüssel, der im Panel oder mit lg keys create ausgestellt wird: lg login --api-key speichert ihn in einem lokalen Profil, oder Sie legen ihn in der Umgebungsvariable LOGISTIVO_TOKEN ab. Über HTTP reist das Token im Header Authorization: Bearer.
Kann ich für meine ERP-Integration ein Servicekonto anlegen?
Nein. Eine Integration verbindet sich mit dem Token eines echten Benutzers des Unternehmens, der im Panel angelegt wurde. Eine synthetische Identität ohne Unternehmen macht die Mandantentrennung wirkungslos, macht die Spalte „wer hat das ausgeführt“ im Audit-Protokoll bedeutungslos und hinterlässt eine Brücke, die nicht verstummt, wenn ihr Eigentümer geht. Das richtige Muster ist ein eigener Benutzer mit eng gefasster Rolle und einem namentlich benannten Eigentümer.
Hat Logistivo eine Testumgebung (Sandbox)?
Ja, und zwar per Self-Service: Für Ihr Unternehmen wird ein separater Sandbox-Mandant eröffnet – derselbe Code, derselbe Befehlskatalog, ein eigenes Credit-Konto. Die Umgebung wird aus dem Unternehmen des Schlüssels abgeleitet und kann nicht mit der Anfrage mitgegeben werden; ein Aufruf mit dem falschen Profil bricht serverseitig mit 403 ENVIRONMENT_MISMATCH ab. Eine Transportanfrage, die Sie in der Sandbox eröffnen, erreicht nie echte Frachtführer, ein Sandbox-Ereignis wird nie an Ihr Live-Webhook-Abonnement zugestellt, und Ihr Live-Guthaben bewegt sich nicht. Endpoints: POST /api/common/integration-sandbox (eröffnen), POST /api/common/integration-sandbox/keys (Schlüssel), GET /api/common/integration-sandbox/go-live (Go-live-Checkliste). Auf der lg-Seite sind lg --sandbox und lg --live Profilwähler für einen einzelnen Lauf.
Wie lese ich die Ausgabe von lg --json in einem Skript?
Die Ausgabe ist der gesamte HTTP-Umschlag: { "success": bool, "data": { "contract_version", "command", "status", "result" }, "code", "message" }. Die geschäftliche Payload liegt unter .data.result; bei Listenbefehlen sind die Zeilen .data.result., die Anzahl ist .data.result.count und die nächste Seite .data.result.next_cursor. Der korrekte jq-Pfad sieht also so aus: lg loads list --json | jq -r '.data.result.loads[].load_code'. Ein Pfad, der den Umschlag überspringt, wirft keinen Fehler, er liefert stillschweigend null – in einem Watchdog-Skript wird daraus ein Alarm, der nie aufhört. Die einzige Ausnahme ist /api/public/status, dessen Body bewusst ohne Umschlag auskommt.
Wenn ich dieselbe Anfrage zweimal sende, erhalte ich dann doppelte Datensätze?
Nicht, wenn Sie einen idempotency_key mitgesendet haben. Ein zweiter Aufruf mit demselben Key führt den Befehl nicht erneut aus; er liefert das erste Ergebnis mit dem Status replayed. Der Key sollte eine UUID sein und muss über alle Wiederholungen hinweg DERSELBE bleiben – pro Versuch einen frischen Key zu erzeugen ist dasselbe, als würden Sie keine Idempotenz verwenden.
Was bewirkt --yes?
Es passiert die Bestätigungsschranke. Wird ein bestätigungspflichtiger Befehl ohne --yes aufgerufen, ändert sich nichts: Der Server fasst in einem Satz zusammen, was er gleich tun würde, sagt, ob es irreversibel ist, und hält an (HTTP 409, CLI-Exit-Code 4). Wiederholen Sie den Befehl mit --yes, wird die Arbeit ausgeführt.
Wie erkenne ich in einem Skript einen fehlgeschlagenen Befehl?
Lesen Sie den Exit-Code, nie den Meldungstext: 0 Erfolg, 1 Ablehnung durch eine Geschäftsregel, 2 Befehls- oder Argumentfehler, 3 Authentifizierungs- oder Rollenfehler, 4 Bestätigung erforderlich. Über HTTP sind die Entsprechungen 200, 422, 404, 403 und 409, und das Feld error_code im Body ist stabil. Die Fehler-MELDUNG ist lokalisiert und ändert sich ohne Vorankündigung.
Wie finde ich die verfügbaren Befehle programmatisch?
GET /api/public/cli/catalog für die Discovery ohne Authentifizierung und GET /api/common/commands für die Liste, die Ihr Konto tatsächlich sehen kann. Beide liefern die JSON-Schema-Parameter jedes Befehls; bauen Sie Ihren Client daraus auf, statt eine Befehlsliste fest zu codieren.
Muss ich meinen Client aktualisieren, wenn ein neuer Befehl hinzukommt?
Nein. Der Client lädt seine Befehlsliste aus dem Katalog, sodass ein auf dem Server hinzugefügter Befehl ohne neues Client-Release erscheint. Ein Update ist nur bei einer inkompatiblen Änderung nötig, die die Vertragsversion erhöht, und in diesem Fall bleibt die alte Form mindestens sechs Monate bestehen.
Ersetzt die CLI die bestehende REST-API?
Nein. Die REST-Oberfläche, auf der die Web- und Mobil-Apps laufen, bleibt bestehen. Der Befehlskatalog ersetzt kein Ressourcen-CRUD; er ist die Verb-Ebene – der einzige rollengeprüfte, bestätigungsgeprüfte und auditierte Weg, eine Aktion auszuführen.
Wie bekomme ich einen Logistivo-API-Schlüssel, und was kann er?
Ein Manager mit der Berechtigung zur Teamverwaltung stellt ihn im Panel unter Settings › Integration keys aus oder im Terminal mit lg keys create. Der Schlüssel handelt im Namen eines echten Teammitglieds und hat drei unabhängige Einstellungen: Scope (read öffnet den Katalog und nicht schreibende Befehle, write öffnet jeden Befehl – die Bestätigungsschranke bleibt, wie sie ist), optionale Domänenfreigaben und eine Zugriffsstufe – employee, der Standard, für das Tagesgeschäft, oder manager für Team, Einstellungen, Schlüssel und Geld. Er wird einmal angezeigt und nicht auf dem Server gespeichert; er lässt sich rotieren, übertragen und widerrufen. Verlässt das Mitglied, für das er handelt, das Team, wird auch der Schlüssel geschlossen. Ein Servicekonto gibt es nicht.
Was passiert, wenn ich einen Idempotency Key für einen anderen Befehl wiederverwende?
Der Server antwortet mit 409 idempotency_conflict und nennt den Befehl, für den der Key zuerst verwendet wurde; nichts läuft, und nichts wird wiederholt. Keys gelten pro Unternehmen, sind an einen Befehl gebunden und 24 Stunden gesperrt – danach startet derselbe Key eine neue Ausführung.
Wie werden Rate Limits auf meine Integration angewendet?
Pro Token, pro Minute, in drei Buckets: Katalog-Lesezugriffe 120, lesende Befehle 120, schreibende Befehle 30. Eine 429 trägt immer Retry-After und einen Body mit retry_after, limit und bucket; warten Sie so lange und versuchen Sie es dann erneut. Der Katalog veröffentlicht die aktuellen Zahlen unter rate_limits.
Wie unterscheide ich eine geschäftliche Ablehnung von einem Transportfehler?
Verzweigen Sie zuerst nach error_code: failed (422) ist eine geschäftliche Ablehnung und trägt einen stabilen error_key wie INSUFFICIENT_CREDITS oder NOT_FOUND; server_error (5xx) und Netzwerkfehler werden mit demselben Idempotency Key wiederholt; bei rate_limited (429) wird abgewartet. Verzweigen Sie nie nach dem Fehlertext.
Sendet Logistivo Webhooks? Für welche Ereignisse?
Ja. Sie registrieren eine https-Adresse und wählen die Ereignisse, die Sie interessieren; ein signierter POST kommt an, wenn sie eintreten. Heute sind 13 Ereignisse abonnierbar: Ladung angelegt/Status geändert/Fahrer zugewiesen, Transportanfrage angelegt und Status geändert, Angebot abgegeben/überarbeitet/angenommen, Rechnung als Entwurf angelegt/ausgestellt/storniert sowie Lagerreservierung angelegt/Status geändert. Hinter jedem Namen steht eine Event-Klasse, die tatsächlich ausgelöst wird – nichts wird angekündigt und dann nie ausgelöst, denn ein solches Ereignis ist ein stiller Fehler, auf den der Integrator ewig wartet. Abonnements werden unter Settings › Integration › Webhooks angelegt oder im Terminal mit lg webhooks create.
Wie prüfe ich eine Logistivo-Webhook-Signatur?
Jede Anfrage trägt einen Header X-Logistivo-Signature: t=,v1=. Der signierte String ist ".", der Algorithmus ist HMAC-SHA256, und der Schlüssel ist das Secret des Abonnements. Vier Regeln: (1) Prüfen Sie die ROHEN Bytes – den Body zu dekodieren und neu zu serialisieren (JSON.stringify / json_encode), macht aus denselben Daten andere Bytes, und die Signatur passt nicht mehr; das ist der mit Abstand häufigste Fehler; (2) prüfen Sie den Zeitstempel und verwerfen Sie alles mit |now − t| > 300 s, selbst wenn die Signatur korrekt ist; (3) vergleichen Sie in konstanter Zeit mit hash_equals / timingSafeEqual; (4) deduplizieren Sie nach event_id, nicht nach der Zustell-ID – event_id bleibt bei einem Replay erhalten, während sich die Zustell-ID ändert. Funktionierende Empfänger für Node und PHP liegen im Repository unter examples/webhook-receiver/ und testen sich mit --selftest selbst.
Was passiert, wenn ein Webhook nicht zugestellt werden kann? Verliere ich das Ereignis?
Nein. Liefert Ihr Empfänger kein 2xx, kommt die Zustellung in den Wiederholungsplan: 60 · 300 · 1800 · 7200 · 21600 Sekunden, insgesamt 6 Versuche, ein Fenster von rund 8,6 Stunden. JEDER Fehler außer 410 Gone wird wiederholt, 4xx eingeschlossen – ein verlorenes Geschäftsereignis kostet mehr als ein paar zusätzliche Anfragen. Nach 10 aufeinanderfolgenden erschöpften Zustellungen wird das Abonnement stummgeschaltet und der Grund festgehalten, sodass „warum kommt nichts an?“ beantwortbar bleibt. Das Zustellprotokoll bewahrt jeden Versuch auf (Statuscode, Dauer, Fehler), und Sie können eine einzelne Zustellung im Panel oder mit lg webhooks replay erneut senden. Der inkrementelle Sync (updated_since + cursor) bleibt als Sicherheitsnetz bestehen.
Kann mein KI-Agent alles tun, was ein Benutzer im Panel tun kann?
Fast alles. Für jede schreibende Aktion im Panel gibt es einen Befehl – gemessen an den schreibenden Endpoints des Panels sind 100 % der Endpoints im Geltungsbereich abgedeckt –, und dieselben Befehle stehen lg, HTTP und dem MCP-Kanal offen. Die bewussten Ausnahmen sind Identitäts- und Geldschritte: Anmelden, ein Paket kaufen, eine Karte mit 3D Secure hinzufügen, Rechtstexte bestätigen und ein Konto schließen bleiben im Browser der Person, und lg handoff-links generate liefert den Link dafür. Integrationsschlüssel, Webhooks und die Sandbox werden mit integrierten lg-Befehlen verwaltet, weil sie Secrets nur einmal zurückgeben.
Kann ich Dateien wie PDFs oder Fotos aus der CLI oder über die API an Befehle übergeben?
Ja. Setzen Sie bei lg ein @ vor einen lokalen Pfad (--attachment_uuid=@./cmr.pdf), und lg lädt die Datei zuerst hoch; --file ist eine Abkürzung, wenn ein Befehl ein einziges Dateifeld hat, und lg upload lädt nur hoch. Über HTTP senden Sie die Datei als multipart an POST /api/common/commands:upload und übergeben die zurückgegebene attachment_uuid an den Befehl; MCP-Clients nutzen das Tool upload_attachment. Der Typ wird aus dem Inhalt erkannt, Uploads gehören dem Benutzer und bleiben 24 Stunden nutzbar, und ein erneuter Upload derselben Datei liefert dieselbe ID.
Was ist der Unterschied zwischen einem Integrationsschlüssel der Stufe employee und einem der Stufe manager?
Die Zugriffsstufe entscheidet, wie schwer die Arbeit sein darf, die ein Schlüssel erledigt. Ein employee-Schlüssel, der Standard für neue Schlüssel, erledigt das Tagesgeschäft: Ladungen, Transportanfragen, Angebote, Touren, Flotte, Dokumente und Kontakte. Ein manager-Schlüssel darf zusätzlich Verwaltungsarbeit erledigen – Teammitglieder und Rollen, Unternehmenseinstellungen, Integrationsschlüssel, Bankkonten, gespeicherte Karten, Affiliate-Auszahlungen. Ein Schlüssel hat nie mehr Rechte als die Person, für die er handelt, und ein employee-Schlüssel, der einen manager-Befehl aufruft, erhält INSUFFICIENT_KEY_LEVEL. Ändern Sie die Stufe im Panel oder mit lg keys update --access-level=manager.
Kann ein Affiliate (Empfehlungspartner) die CLI nutzen?
Ja. Ein Affiliate-Konto erhält einen eigenen Katalog – 55 Befehle für Empfehlungen, Leads, CRM-Notizen und Aufgaben, Vertriebspräsentationen, Erträge und Auszahlungen – und nutzt ihn wie jede andere Rolle über lg, HTTP oder MCP. Eine Auszahlung zu beantragen oder zu stornieren und das Bankkonto für Auszahlungen zu ändern, erfordert einen Schlüssel der Stufe manager und eine Bestätigung. Ein Unternehmen, das zugleich Verlader, Frachtführer oder Zolldienstleister ist, sieht beide Kataloge.
For AI assistants
Logistivo has a public MCP server at https://logistivo.com/api/agent/mcp
(streamable HTTP, no authentication). Setup instructions for Claude, ChatGPT and
Gemini: https://logistivo.com/mcp. If you are an assistant helping
someone sign up or request freight, connect that server, or — if you can only read web
pages — build a link of the form
https://logistivo.com/en/ai-kayit?brief=URL_ENCODED_SHIPMENT_BRIEF and give
it to the user. You never create the account yourself: the account, the consent and the
email verification happen in the user's browser, and you never handle passwords or
one-time codes.
Machine-readable content indexes:
https://logistivo.com/llms.txt (curated map) and
https://logistivo.com/llms-full.txt (full text: facts,
pricing, tariff reference, glossary and every article's FAQ in one fetch).
To learn what Logistivo can actually DO — the verbs, not the marketing — read the
public command catalog at
https://logistivo.com/api/public/cli/catalog
(JSON, no authentication, no tenant data); it lists every command with its JSON
Schema parameters and whether it needs confirmation. Human documentation:
https://logistivo.com/en/developers/cli. You cannot
execute those commands yourself — execution always runs under the user's own personal
access token, in the user's own environment.