Logistivo CLI: stuur je logistieke operatie aan vanuit een terminal en vanuit je ERP
Eén commandocatalogus voedt drie oppervlakken: de lg-terminalclient, de AI-assistent in het dashboard en het kanaal waarmee externe AI-assistenten verbinding maken. Een functie wordt één keer geschreven en verschijnt in alle drie — en elke schrijfactie in het paneel heeft nu een commando, zodat je scripts en je eigen AI-agents het werk kunnen doen dat je team op het scherm doet. Betalingen, juridische toestemming en het sluiten van een account blijven bewust in de browser. Deze pagina is een contract. De commandotabel hieronder is niet met de hand geschreven; ze wordt bij elk verzoek gegenereerd uit het live commandoregister.
Wat is de Logistivo CLI?
De Logistivo CLI (lg) is een opdrachtregelclient die het werk in je Logistivo-account uitvoert — ladingen en ritten, aanvragen, biedingen en tenders, wagenpark en chauffeurs, documenten, contacten en rekeningen-courant, facturen en boekhouding, magazijn en voorraad, teamleden en douanetarieven — vanuit een terminal, een script of je eigen AI-agent. De commando's zitten niet in de client ingebakken: de client haalt de commandocatalogus op van de server en bouwt zichzelf daaruit op. Dezelfde commando's zijn via HTTP aan te roepen zonder iets te installeren — dat is de route die ERP- en CRM-integraties gebruiken — en via het MCP-kanaal waarmee externe AI-assistenten verbinding maken.
Eén commandovorm: lg --parameter=value. De catalogus bevat vandaag 519 commando's in 125 domeinen; de breedste lijst die één rol ziet, telt 452 commando's in 112 domeinen.
Elke schrijfactie in het paneel heeft een commando — gemeten tegen de schrijf-endpoints van het paneel is 100% van de endpoints binnen de scope gedekt. Betalingen (3D Secure), juridische toestemming en het sluiten van een account blijven bewust in de browser; daarvoor geeft een commando in plaats daarvan een link terug.
Commando's die een document of foto aannemen, werken ook buiten de browser: schrijf --attachment_uuid=@./cmr.pdf en lg uploadt het bestand eerst; via HTTP upload je naar /api/common/commands:upload en geef je de teruggegeven attachment_uuid door.
Integratiesleutels hebben een toegangsniveau: employee (de standaard voor nieuwe sleutels) voor dagelijkse operaties, manager voor team, instellingen, sleutels en geld. Een sleutel heeft nooit meer rechten dan de persoon namens wie hij handelt.
Vlaggen worden nooit verzonnen: elke vlag is een parameternaam uit het eigen JSON Schema van het commando, en hetzelfde geldt voor het type en voor de vraag of de parameter verplicht is.
Schrijvende commando's vragen om bevestiging; onomkeerbare commando's draaien nooit zonder (HTTP 409, CLI-exitcode 4).
Opnieuw proberen levert geen duplicaten op: een aanroep met een idempotency_key wordt hoogstens één keer uitgevoerd.
Elke uitvoering komt in één auditlogboek terecht — of ze uit een terminal, uit de chat of van een assistent kwam, staat vastgelegd.
Wat er vandaag live is, en wat eraan komt
Deze sectie staat met opzet bovenaan de pagina. De duurste fout die een integratiedocument kan maken, is een endpoint dat nog niet open is beschrijven alsof het dat wel is: de integrator schrijft de code, het endpoint geeft 404 terug, en het vertrouwen komt niet meer terug.
Omdat het contract bevroren is, blijft de integratiecode die je vandaag schrijft werken terwijl de resterende onderdelen opengaan. Velden die je niet kent, moeten worden genegeerd; die regel is wat ons in staat stelt toe te voegen zonder iets te breken.
Commandocatalogus en identiteitstabel — De publieke domain/verb-identiteit van elk commando is bevroren en de contractversie wordt als 1 gepubliceerd in elk catalogusantwoord en in de header X-Contract-Version. De tabel op deze pagina wordt gegenereerd uit het live register: een commando dat op de server wordt toegevoegd, verschijnt hier vanzelf, en een verwijderd commando verdwijnt.
Discovery-endpoint zonder authenticatie — GET /api/public/cli/catalog — commandonamen, domain/verb-identiteit, beschrijving, JSON Schema-parameters, poortvlaggen en de versievelden (since, deprecated_at, replaced_by, aliases). Geen authenticatie: een token aanmaken is een stap die NA de integratiebeslissing komt, niet ervoor. Het antwoord bevat helemaal geen tenantgegevens.
Geauthenticeerde catalogus- en uitvoeringsendpoints — GET /api/common/commands, GET /api/common/commands/{name} en POST /api/common/commands/{name}. De rolcontrole, de bevestigingspoort, idempotency en het auditlogboek zitten op één enkel handhavingspunt waar ook de chat en de terminal doorheen gaan.
Paneeldekking: elke schrijfactie heeft een commando — 519 commando's in 125 domeinen, gecontroleerd tegen de schrijf-endpoints van het paneel: elk endpoint binnen de scope wordt gedekt door een commando (een spiegel van het endpoint of dezelfde gedeelde service), en geen enkel is onbewezen. Bewust buiten de scope: betalingen met 3D Secure, juridische toestemming, het sluiten van een account en inloggen, die in de browser blijven; het beheer van sleutels, webhooks en de sandbox, wat ingebouwde lg-commando's zijn; en de eigen endpoints van de chauffeursapp.
Preflight (dry_run): zien zonder uit te voeren — Met dry_run: true in de request body wordt het commando niet uitgevoerd: validatie, de rol-/scopecontrole, doelresolutie en de creditberekening draaien allemaal en er komt een preview terug; er wordt niets geschreven, er worden geen credits verbruikt en de idempotency key wordt niet opgebruikt. Ook het batch-endpoint accepteert het, per batch. Een preflight komt nooit in de handler van het commando; bij de lancering leverden 178 preflights over alle schrijfcommando's die toen in de catalogus stonden geen enkel schrijfstatement op.
Integratiesleutels — API-sleutels die namens een echt teamlid handelen, uitgegeven in het paneel of met lg keys create: lees-/schrijfscope, een toegangsniveau (standaard employee, of manager), looptijd, laatste gebruik, roteren, overdragen en intrekken. lg login --api-key, lg whoami en een lg logout die ook aan de serverkant intrekt, zijn daarop gebouwd.
Sandbox — schrijfacties oefenen zonder productie aan te raken — Een aparte sandbox-tenant per bedrijf met dezelfde commandocatalogus; je opent hem zelf (selfservice) en hij geeft zijn eigen sleutel uit. Credits, de marketplace en de webhook-routering zijn gescheiden tussen de twee omgevingen; de omgeving wordt afgeleid van het bedrijf van de sleutel en kan niet met het verzoek worden meegegeven.
Versiebeheer, fouttaxonomie, idempotency en rate limits — Commando's dragen since / deprecated_at / replaced_by / aliases en een verouderd commando antwoordt met een header X-Deprecated. Zakelijke fouten dragen een stabiele error_key naast de error_code op transportniveau, en het woordenboek met sleutels wordt in de catalogus gepubliceerd. Idempotency keys zijn beperkt tot je bedrijf, gebonden aan één commando en 24 uur vergrendeld. Rate limits gelden per token, in drie buckets, en elke 429 bevat Retry-After.
Uitgaande webhooks: een POST wanneer er iets gebeurt — Ondertekende push is live voor 13 events. Abonnementen worden beheerd vanuit het paneel of met lg webhooks; de handtekening draagt haar eigen tijdstempel, het retryschema is 60 · 300 · 1800 · 7200 · 21600 seconden en de reden van stillegging wordt altijd vastgelegd. Elke eventnaam wordt gedekt door een eventklasse die daadwerkelijk wordt verzonden — niets wordt aangekondigd en daarna nooit verstuurd. Het pull-spoor (updated_since + cursor) is niet verwijderd: push is ernaast toegevoegd, niet in plaats ervan.
Commando's die bestanden aannemen — 33 commando's nemen een document of foto aan — een CMR, een factuur, een kentekenbewijs, palletfoto's. Upload één keer naar POST /api/common/commands:upload, of laat lg het doen met --attachment_uuid=@./file.pdf, en geef de teruggegeven attachment_uuid door; MCP-clients gebruiken de tool upload_attachment. Het bestandstype wordt uit de inhoud bepaald, en een upload blijft 24 uur bruikbaar.
De lg-terminalclient — Gepubliceerd op npm onder de MIT-licentie: installeer met `npm install -g @lgstv/lg`, of draai hem zonder installatie via `npx @lgstv/lg`. Het is één enkel bestand zonder afhankelijkheden, en omdat het HTTP-oppervlak open is, kun je ook zonder de client integreren. Hij logt in met een goedkeuringscode die je in de browser bevestigt en blijft daarna ingelogd, waarbij hij zijn sessie zelf vernieuwt; hij uploadt lokale bestanden voor je (@path, --file, lg upload), beheert integratiesleutels (lg keys), neemt nooit een geheim aan op de opdrachtregel, respecteert Retry-After, probeert 5xx opnieuw met dezelfde idempotency key en waarschuwt bij verouderde commando's en nieuwere contractversies.
Incrementele sync: cursorpaginering en updated_since — Het contract hieronder (limit + ondoorzichtige, ondertekende cursor, next_cursor, updated_since) ligt vast en wordt uitgerold over de lijstcommando's. Zolang een bepaald lijstcommando cursor en updated_since niet in zijn JSON Schema aankondigt, behandel je het als een klein venster: maximaal 20 rijen, geen cursor.
Wat dit anders maakt: de client kent geen commando's, hij bouwt ze op
Dit is de ene beslissing die de rest van de pagina betekenis geeft. In een gewone CLI wonen de commando's in de client; bij Logistivo wonen ze op de server.
In de klassieke opzet heeft de client, wanneer de server een nieuwe functie krijgt, een nieuwe release nodig en moet de gebruiker die installeren. In de tussentijd weten de twee kanten verschillende dingen — en dat is de stilste faalwijze bij integraties: het script draait, de exitcode is 0, en het commando beschrijft gewoon niet wat de server kan.
Bij Logistivo is de definitie van een commando één enkel record: de naam, wat het doet, de JSON Schema-parameters, welke rollen het mogen zien, of het bevestiging nodig heeft en of het effect omkeerbaar is. Wanneer lg start, haalt het die catalogus op en genereert het daaruit de helptekst, de vlaggen en de invoervalidatie. Zodra er op de server een commando wordt toegevoegd, kent lg het — zonder client-update.
Dezelfde catalogus voedt de AI-assistent in het dashboard en het kanaal waarmee externe AI-assistenten verbinding maken. Een functie wordt één keer geschreven en verschijnt op drie plekken — en alle drie gaan door dezelfde rolcontrole, dezelfde bevestigingspoort en hetzelfde auditlogboek. Er is geen aparte inventaris van CLI-commando's; als die er was, zouden de drie oppervlakken binnen zes maanden ongemerkt uit elkaar groeien.
Geen versiedrift — De commandolijst die de client kent, is per constructie de lijst die de server heeft. "In welke lg-versie zit dit commando?" is een vraag die niet bestaat.
Vlagnamen worden nooit geraden — De vlaggen van een commando zijn precies de parameternamen in zijn JSON Schema. Je leert wat een commando accepteert niet door een document te lezen, maar door de catalogus te lezen — en de catalogus is altijd actueel.
Je CLI is zo groot als je account — De catalogus wordt per rol gefilterd: een commando dat je rol niet kan zien, verschijnt nooit in je lijst. Een vervoerdersaccount ziet 452 commando's, een verlader 448, een douane-expediteur 312, en een affiliate-account (doorverwijspartner) een eigen set van 55 commando's.
De documentatie kan niet achterlopen — De commandotabel op deze pagina komt uit hetzelfde register. Er bestaat nergens een lijst die een mens synchroon moet houden met de werkelijkheid.
De naamgevingsregel — hoe commandonamen groeien
De catalogus zal groeien. Nieuwe commando's krijgen geen naam op goed geluk; er worden zes regels toegepast. We publiceren ze hier omdat dit de namen zijn die je integratie jarenlang zal schrijven, en hun voorspelbaarheid is iets waard voor je.
Een domein is een entiteit in het meervoud — loads, demands, invoices, export-documents. Domeinen van twee woorden zijn kebab-case. De enige uitzondering is een ontelbaar zelfstandig naamwoord: stock wordt nooit in het meervoud gezet, omdat "stocks" iets anders betekent.
Alle werkwoorden van één entiteit wonen in één domein — loads bevat elk werkwoord dat op een lading werkt: create, list, get, update, set-status, assign-driver, list-problems, archive en meer. Per werkwoord een nieuw domein openen (load-statuses, load-drivers) zou een gebruiker op drie plekken naar dezelfde entiteit laten zoeken.
Het werkwoord lekt nooit in het domein; het domein is wat er VERANDERT — Een chauffeur toewijzen verandert de lading, niet de chauffeur, dus het is lg loads assign-driver. Het meewerkend voorwerp (-driver) hangt aan het werkwoord, nooit aan het domein.
Een subresource krijgt nooit een eigen domein — Een factuurregel en een documentitem kun je niet zelfstandig opsommen; ze worden via hun eigenaar aangesproken — lg invoices add-line, lg export-documents add-item. Eén test beslist: als je het ding niet zelfstandig kunt opsommen (list) of ophalen (get), is het geen domein.
Vernauwen is een vlag, geen nieuw werkwoord — lg fleet-documents list --days=30 is correct; er is geen apart werkwoord "list-expiring", omdat het venster al een parameter is. Een samengesteld werkwoord wordt alleen gebruikt wanneer de rijen die het teruggeeft niet de domeinentiteit zijn: loads list-problems geeft probleemmeldingen terug, geen ladingen.
Het paar (domein, werkwoord) is uniek in de hele catalogus — Zelfs voor twee commando's waarvan de rollen nooit overlappen. Als hetzelfde paar aan twee commando's werd gegeven, zou je integratiecode naar één naam kijken terwijl de CLI verschillende dingen uitvoerde, afhankelijk van wie hem aanriep.
Dekking: alles in het paneel, vanuit een commando
Veel teams koppelen Logistivo aan hun eigen AI-agent of automatiseringsharnas, en een agent is alleen nuttig als hij het werk kan afmaken. Daarom is de regel eenvoudig: wat een kantoorgebruiker in het paneel kan wijzigen, kan een commando ook wijzigen — achter dezelfde rolcontrole, dezelfde bevestigingspoort en hetzelfde auditlogboek.
Dit is gemeten, niet beweerd. Elk schrijf-endpoint achter het paneel wordt gecontroleerd tegen het commandoregister, en een endpoint telt alleen als gedekt wanneer een commando het als zijn HTTP-spiegel declareert of dezelfde gedeelde service aanroept. Van de schrijf-endpoints binnen de scope is 100% gedekt en geen enkel onbewezen. Elk weggelaten endpoint heeft een schriftelijke reden — stappen rond identiteit en betaling, het control plane van de integratie, de eigen endpoints van de chauffeursapp, clienttelemetrie, dode kopieën zonder aanroeper — en de endpoints die voor een integrator van belang zijn, staan hieronder.
Commando's die een bestand aannemen, vallen onder dezelfde regel: 33 commando's in de tabel nemen een document of foto aan, en ze werken allemaal vanuit lg, via HTTP en via MCP (zie Commando's die bestanden aannemen).
Ook beheerwerk is gedekt, achter een sterkere sleutel: 62 commando's in de tabel — teamleden en rollen, bedrijfsinstellingen, bankrekeningen, opgeslagen kaarten, integratiesleutels — vereisen een integratiesleutel op managerniveau. Een sleutel op employee-niveau, de standaard, voert dagelijkse operaties uit en wordt bij die commando's geweigerd met INSUFFICIENT_KEY_LEVEL.
Affiliate-accounts (doorverwijspartners) hebben een eigen catalogus: 55 commando's in 20 domeinen — doorverwijzingen, leads, CRM-notities en -taken, salespresentaties, verdiensten en uitbetalingen, plus de account- en teamcommando's die elke rol heeft. De commando's die alleen voor affiliates zijn, staan niet in de publieke tabel hieronder, die de drie paneelrollen toont; een affiliate-account ziet ze in GET /api/common/commands en in lg commands. Een bedrijf dat zowel affiliate als verlader, vervoerder of douane-expediteur is, ziet beide sets.
Een agent moet beginnen met lg users get (API-naam get_current_user): dat geeft de rol, het toegangsniveau van de gebruikte sleutel, de effectieve rechten en of een openstaande juridische goedkeuring of een niet-geverifieerd telefoonnummer op dit moment schrijfacties blokkeert — zodat de agent een weigering kan voorspellen in plaats van haar te verzamelen.
Dekking wordt gemeten met een rapport dat het commandoregister vergelijkt met de schrijf-endpoints van het paneel; een paneel-endpoint dat zonder commando wordt toegevoegd, verschijnt daarin als onbewezen. Vind je een actie in het paneel die je niet vanuit een commando kunt bereiken, meld die dan bij support.
1. Vraag om de link — Werk dat in de eigen browsersessie van de persoon moet gebeuren, is geen commando, maar het commando-oppervlak weet ervan. lg handoff-links generate (API-naam get_browser_handoff_link) geeft een logistivo.com-link terug voor de doelen die je rol toestaat: package_purchase, payment_cards, legal_documents, integration_keys, affiliate_demo_accounts en account_close. Het is gratis, schrijft niets, en de link bevat geen geheim — de persoon logt zoals gewoonlijk in.
2. Geef hem aan de persoon — Toon de link aan de gebruiker of stuur hem via je eigen kanaal. De persoon rondt de stap daar af: de contractgoedkeuring en de 3D Secure-betaling voor een pakket, een kaart toevoegen, openstaande juridische teksten goedkeuren, een API-sleutel uitgeven waarvan het geheim één keer wordt getoond, of het eigen account sluiten.
3. Lees de uitkomst met een commando — Zodra de stap is afgerond, is het resultaat weer zichtbaar voor commando's: het pakket en het creditsaldo, de opgeslagen kaart (gemaskeerd, alleen de laatste vier cijfers), de nieuwe sleutel in de sleutellijst. Een agent neemt nooit een kaartnummer, een betaling of een toestemming aan in een chat.
Betalingen en 3D Secure — Een pakket kopen of upgraden en een kaart toevoegen vereisen 3D Secure in de browser. Commando's tonen pakketten en prijzen, lezen het saldo en de geschiedenis ervan, tonen opgeslagen kaarten (gemaskeerd), stellen de standaardkaart in en verwijderen er een; de aankoop zelf loopt via de overdrachtslink.
Juridische toestemming — Juridische teksten goedkeuren doet de persoon zelf, in de browser. lg users get vertelt je dat er een goedkeuring openstaat; geen enkel commando kan die geven.
Account sluiten, inloggen en wachtwoord — Je eigen account sluiten, inloggen en een wachtwoord wijzigen zijn identiteitsstappen en blijven in de browser. lg user-accounts preview laat zien wat het sluiten van het account zou betekenen, zonder het te doen.
Integratiesleutels, webhooks en de sandbox — Het beheer ervan geeft geheimen terug die één keer, in je terminal, moeten worden getoond, dus het zijn ingebouwde lg-commando's (lg keys, lg webhooks, lg sandbox) op hun eigen HTTP-endpoints in plaats van catalogus-commando's. De catalogus bevat alleen de twee sleutelcommando's zonder geheim: integration-keys list en integration-keys revoke.
De assistentchat in het dashboard — Integratiesleutels kunnen de chat met de AI-assistent in het dashboard niet aansturen; een run starten of voortzetten met een sleutel geeft 403. Een agent maakt in plaats daarvan verbinding via de commando-endpoints, lg of het MCP-kanaal — daar draait elk commando op het toegangsniveau van de sleutel en worden de schrijfacties als integratieschrijfacties vastgelegd.
De chauffeursapp — Chauffeursaccounts hebben geen commandocatalogus, en de chauffeursapp houdt haar eigen endpoints. Kantoorgebruikers beheren chauffeurs, hun documenten, onkosten en ritten via commando's.
Installatie en identiteit
lg is een Node-script van één bestand zonder afhankelijkheden (Node 18+), gepubliceerd op npm als @lgstv/lg. Het pakket installeert twee identieke commando's, lg en logistivo — gebruik logistivo als lg op je machine al een alias is. Omdat het één bestand is, werkt het ook om lg.mjs naar de ERP-server van een klant te kopiëren. Je hebt de client niet nodig om een ERP/CRM-integratie te bouwen — dezelfde commando's zijn beschikbaar via HTTP.
1. Installeren — Node 18 of nieuwer is alles wat je nodig hebt; er zijn geen andere afhankelijkheden. Installeer het globaal of draai het zonder installatie via npx.
2. Inloggen met een goedkeuringscode — lg login toont een korte goedkeuringscode en opent logistivo.com/connect in je browser; via SSH, in CI of met --no-browser drukt het alleen het adres af, dat je op elk apparaat kunt openen, ook op je telefoon. Log daar zoals gewoonlijk in, controleer of de code op de pagina dezelfde is als die in je terminal, kies toegang voor alleen lezen of voor lezen en handelen, en keur goed. Er wordt niets geheims in de terminal getypt: geen wachtwoord, geen sleutel, geen eenmalige code. De sessie blijft daarna op die computer ingelogd — de terminal sluiten logt je niet uit, en lg vernieuwt het access token zelf voordat het verloopt. lg logout beëindigt de sessie ook op de server, en je kunt haar in het paneel verwijderen onder Settings › Integration keys › AI and CLI connections. lg login --password (e-mailadres en wachtwoord) blijft beschikbaar als terugvaloptie. Vereist lg 0.11 of nieuwer.
3. Voor servers en CI: een sleutel, geen goedkeuringscode — Op een server of in een CI-job is er niemand die een code in een browser kan goedkeuren. Geef een sleutel uit in het paneel (Settings › Integration keys) of met lg keys create — eventueel namens een speciaal daarvoor bestemd teamlid met beperkte rechten — en zet hem in LOGISTIVO_TOKEN, of sla hem op met lg login --api-key. Zolang de variabele is gezet, wordt het configuratiebestand nooit gelezen. Details: de sectie "Verbinden met een API-sleutel".
4. Controleren en de catalogus verkennen — lg commands toont elk commando dat je rol kan zien, gegroepeerd per domein; lg help toont de werkwoorden van dat domein, en lg help toont de volledige parameterlijst van één commando met de types en welke parameters verplicht zijn. Geen van die teksten zit in de client — alles komt uit de catalogus. Onthoud dat de lijst afhangt van je rol: de werkwoorden van één domein zijn niet dezelfde voor een vervoerder en voor een verlader (loads set-status staat bijvoorbeeld alleen in de vervoerderscatalogus). Ontbreekt er een werkwoord, controleer dan eerst je rol voordat je je installatie controleert.
Zet de sleutel nooit in versiebeheer, een CI-log of een chatvenster. Als je met een goedkeuringscode of een integratiesleutel bent ingelogd, beëindigt lg logout de sessie ook op de server; in een wachtwoordsessie (lg login --password) verwijdert het alleen de LOKALE kopie en zegt het dat ook expliciet. Het auditlogboek slaat je argumenten op, maar maskeert elk veld waarvan de naam token, password, IBAN, card of OTP bevat als ***, evenals elke parameter die een commando als geheim declareert.
LOGISTIVO_TOKEN — Persoonlijk access token. Zolang deze is gezet, wordt het configuratiebestand nooit gelezen — dit is de voorkeursroute in CI en op servers.
LOGISTIVO_BASE_URL — Root van de server. Standaard https://logistivo.com. Wijzig dit alleen als je naar je eigen omgeving wijst; de vlag --base-url doet hetzelfde voor één commando.
LOGISTIVO_HOME — Map voor het configuratiebestand en de cataloguscache. Standaard ~/.logistivo. Scheid ze als je met twee accounts op één machine werkt.
LOGISTIVO_PROFILE — Onder welk profiel er wordt gedraaid. `lg profile use` is de blijvende keuze; deze variabele geldt voor één run en is de kortste manier om in CI te wisselen tussen een live- en een sandboxprofiel. Een onbekende profielnaam wordt niet stilzwijgend genegeerd — dat geeft een fout.
NO_COLOR — Als deze is gezet, wordt er geen ANSI-kleur afgedrukt (de permanente vorm van de vlag `--no-color`). Zet hem aan voor een koppeling die naar een logbestand of CI-uitvoer schrijft; escapereeksen voor kleur breken de tools die die logs later lezen.
Ergonomie van de client
Deze functies maken het dagelijks gebruik van de `lg`-client makkelijker. Geen ervan verandert het HTTP-contract — sla deze sectie over als je rechtstreeks via HTTP integreert.
Meerdere omgevingen en sleutels — Houd staging en productie, of je klant- en vervoerderskoppelingen, in aparte profielen. De profiellijst toont nooit een token; elke rij toont de sha256-vingerafdruk van het token. De commandocatalogus wordt per profiel, host en token gecachet, zodat twee rollen nooit elkaars commandolijst kunnen zien.
Incrementele sync: lg sync — Draait de sync-lus uit het kookboek in één commando: een watermerk per entiteit, updated_since met een cursor, JSONL-uitvoer en een veiligheidsmarge van vijf minuten. Gebruik --full voor de eerste backfill. Het commando is alleen-lezen; er is geen vlag --write. lg sync --list leidt de synchroniseerbare entiteiten voor je rol af uit de catalogus.
Foutmeldingen en shell-completion — Bij 422 benoemt de client het geweigerde veld als de vlag die je hebt getypt, samen met de stabiele error_key en de eigen uitleg daarvan uit de catalogus. Bij 409 drukt hij de kant-en-klare opdrachtregel met --yes af; bij 429 wacht hij Retry-After af. Shell-completion dekt domeinen, werkwoorden, vlaggen en enum-waarden, en werkt offline.
Geheime parameters komen nooit op de opdrachtregel — Een paar commando's nemen een geheim aan — het koppelen van de boekhoudintegratie Paraşüt vraagt bijvoorbeeld de client credentials en het wachtwoord van dat systeem. lg accepteert zo'n waarde nooit als vlag, omdat die dan in je shellgeschiedenis en in de uitvoer van ps terechtkomt: het vraagt erom zonder echo, of leest het uit ---file=PATH of uit stdin (---file=-), en houdt het alleen in het geheugen. Een commando waarvan een verplichte parameter geheim is, draait alleen vanuit lg: aangeroepen vanuit de chat, via MCP of binnen lg batch wordt het geweigerd met SECRET_REQUIRES_CLI. Het auditlogboek legt de waarde altijd vast als ***.
Verbinden met een API-sleutel
Een ERP, CRM, script of AI-agent maakt verbinding met Logistivo via een integratiesleutel die is uitgegeven in het paneel of met lg keys create. De sleutel handelt namens een echt teamlid: de rol van die persoon bepaalt de commandolijst, het toegangsniveau van de sleutel bepaalt hoe zwaar het werk mag zijn, en wanneer die persoon het team verlaat, sterft de sleutel mee. Er is geen synthetisch "serviceaccount" en dat komt er ook niet — multi-tenant-isolatie is gebonden aan de gebruiker, en een koppeling zonder eigenaar is het soort dat jarenlang stilletjes blijft schrijven.
1. Geef een sleutel uit in het paneel — Settings › Integration keys › New key. Geef hem een naam ("ERP nachtelijke sync"), kies de scope en het toegangsniveau, en verkort eventueel de looptijd. De sleutel wordt één keer getoond, alleen op dat scherm; de server slaat hem niet op. Ben je hem kwijt, dan geeft Rotate een nieuwe uit — de oude wordt onmiddellijk ongeldig.
2. Verbinden vanuit de terminal — lg login --api-key valideert de sleutel, toont de identiteit en de scope, en downloadt de commandocatalogus. lg whoami vraagt de server als welke gebruiker, met welk bedrijf, welke rol en welke scope je draait. lg logout trekt de sleutel ook op de server in, net zoals het daar een sessie met een goedkeuringscode beëindigt (alleen de lg logout van een wachtwoordsessie kan dat niet).
3. Of gewoon HTTP — De sleutel is een access token dat in de header Authorization: Bearer wordt meegestuurd en werkt rechtstreeks tegen de drie commando-endpoints. Zet hem op een server of in CI in LOGISTIVO_TOKEN; zolang die variabele is gezet, wordt het configuratiebestand nooit gelezen.
4. Of beheer sleutels vanuit de terminal: lg keys — lg keys is de terminaltweeling van het paneelscherm: dezelfde endpoints, dezelfde controle (het recht voor teambeheer, en een sleutel op managerniveau wanneer je het met een sleutel aanroept). create, rotate en transfer geven één keer een nieuw token terug: met --save-profile=NAME gaat het rechtstreeks naar een lokaal profiel en wordt het nooit afgedrukt; anders drukt lg het één keer af. In de modus --json wordt het token alleen opgenomen als je --show-secret toevoegt, en een aanroep met --json zonder een van beide vlaggen wordt geweigerd voordat het verzoek wordt verstuurd, zodat het token niet ongemerkt in de uitvoer van een script kan belanden. rotate, transfer en revoke vragen om bevestiging (--yes); een sleutel wordt aangesproken met zijn exacte naam of zijn uuid, nooit met een gok. Het toegangsniveau gaat ongewijzigd over op een geroteerde of overgedragen sleutel.
De scope wordt gehandhaafd over het hele API-oppervlak, niet alleen in de commandocatalogus: een alleen-lezen-sleutel laat leesverzoeken (GET/HEAD/OPTIONS) door en elk ander schrijvend verzoek antwoordt met 403 forbidden. Er zijn twee bewuste uitzonderingen en beide worden bewaakt door een fijnere controle: het endpoint voor commando-uitvoering (de beslissing komt uit de eigen vlag read_only van het commando, omdat ook niet-schrijvende commando's met POST worden aangeroepen) en een sleutel die zichzelf intrekt (lg logout, ook toegestaan met een alleen-lezen-sleutel). Scope, domeinrechten en toegangsniveau zijn drie onafhankelijke assen en ze moeten alle drie slagen: een leessleutel kan zelfs op managerniveau niet schrijven, een schrijfsleutel op employee-niveau kan het team niet beheren, en een domeinrecht loads:write opent geen beheerwerk. Geef de sleutel uit namens het lid met de minste rechten dat aan je behoeften voldoet: de rol bepaalt welke records je überhaupt kunt zien.
read — De commandocatalogus en niet-schrijvende commando's (list, search, preview). Een schrijvend commando geeft 403 forbidden — vóór de bevestigingspoort; een alleen-lezen-sleutel ziet zelfs nooit een 409. De juiste keuze voor nachtelijke sync en rapportage.
write — Elk commando. Commando's die bevestiging vereisen, vragen er nog steeds om met 409; confirm: true (--yes in de CLI) werkt precies zoals voorheen. De scope versoepelt de bevestigingspoort nooit.
employee — De standaard voor elke nieuwe sleutel. Dagelijkse operaties: ladingen, aanvragen, biedingen, ritten, wagenpark en wagenparkdocumenten, documenten, contacten — elk commando dat geen beheerrecht nodig heeft, plus de wagenparkrechten. Een commando dat meer nodig heeft, antwoordt 422 met error_key INSUFFICIENT_KEY_LEVEL en required_key_level: manager; het bijbehorende REST-endpoint antwoordt 403 met dezelfde sleutel. Het juiste niveau voor een nachtelijke ERP-sync, een telematicakoppeling of een operationeel script.
manager — Alles wat de persoon namens wie de sleutel handelt mag doen, inclusief beheer: teamleden en rollen, bedrijfsinstellingen, integratiesleutels, bankrekeningen en de verificatie ervan, opgeslagen kaarten, bedrijfsrelaties, affiliate-uitbetalingen. Een managersleutel voegt nooit een recht toe dat de persoon niet heeft — zonder het recht voor teambeheer kan hij het team nog steeds niet beheren. Sleutels die al bestonden voordat toegangsniveaus werden ingevoerd, zijn managersleutels, dus ze gedragen zich precies zoals voorheen.
Eén sleutel per integratie — Delen CRM en ERP een sleutel, dan betekent de ene afsluiten ook de andere afsluiten. Geef elke koppeling een eigen sleutel; de lijst toont ze sowieso op naam.
Roteren — Geeft een nieuw token uit en trekt het oude onmiddellijk in; de resterende looptijd blijft behouden. Gebruik het bij een vermoeden van een lek en met regelmatige tussenpozen. De integratie krijgt 401 totdat ze met het nieuwe token is bijgewerkt.
Intrekken — De sleutel wordt permanent gesloten; dat kan niet ongedaan worden gemaakt, geef zo nodig een nieuwe sleutel uit. Wordt het lid namens wie de sleutel handelt uit het team verwijderd of gedeactiveerd, dan vervalt de sleutel vanzelf.
Looptijd en limiet — De standaardgeldigheid is 180 dagen; je kunt die bij het aanmaken verkorten, nooit verlengen. Een gebruiker kan maximaal 10 actieve sleutels hebben. Het tijdstip van laatste gebruik is zichtbaar in de lijst; bij een nooit gebruikte sleutel staat dat er expliciet bij.
Wie beheert — Uitgeven, roteren, overdragen en intrekken staat open voor managers met het recht voor teambeheer — dezelfde controle als voor het toevoegen of verwijderen van teamleden — en als het met een integratiesleutel gebeurt, moet die sleutel op managerniveau staan. Een manager kan namens een ander lid een sleutel uitgeven; voor een koppeling wordt een speciaal daarvoor bestemd lid met beperkte rechten aanbevolen.
De eerste tien minuten: van het paneel naar je eerste aanroep
De duurste minuten van een integratie zijn de eerste tien. De vier stappen hieronder zetten dat pad op volgorde; dezelfde volgorde bestaat in het paneel als wizard (Settings › Integration › Setup wizard), en de wizard roept precies de endpoints aan die hier worden beschreven. Een ontwikkelaar zonder toegang tot de wizard komt op dezelfde plek uit door deze sectie te lezen.
Geen van de vier stappen eindigt met "ik heb het verstuurd". Of de sleutel echt werkt, wordt beantwoord door het verzoekenlogboek; of de webhook echt aankomt, door het afleveringslogboek. Beide zijn open in het paneel en in lg. Een setup die nooit wordt gemeten, is een setup waarvan alleen wordt geloofd dat hij werkt.
1. Bepaal wat je gaat doen — stel eerst de scope in — Je kunt niet later beslissen wat een sleutel mag zien: je kiest de scope wanneer je hem uitgeeft. Er zijn twee assen. De grove scope (read / write) beantwoordt alleen "mag hij schrijven". De fijne scope (domeinrechten: loads:read, invoices:write) zegt welke domeinen hij mag aanraken, en zodra die is ingesteld, wordt de sleutel fail-closed — elk domein dat je niet hebt geselecteerd, en elk endpoint dat aan geen enkel domein is gekoppeld, geeft 403. De domeinlijst in het paneel is geen handgeschreven lijst; hij wordt afgeleid uit de live commandocatalogus van je rol en toont hoeveel commando's en REST-endpoints elk domein opent. De commandocatalogus en de endpoints "wie ben ik" (current) en "uitloggen" zijn altijd vrijgesteld van scope: een sleutel moet zichzelf altijd kunnen beschrijven en sluiten. De derde as is het toegangsniveau: employee (de standaard) voert dagelijkse operaties uit, manager doet ook werk rond team, instellingen, sleutels en geld. Kies employee, tenzij de koppeling beheerwerk doet.
2. Geef de sleutel uit — het token wordt één keer getoond — Settings › Integration › New key. Geef hem een naam ("ERP nachtelijke sync"), kies de gebruiker namens wie hij draait en het toegangsniveau, en verkort de looptijd als je wilt. Het ruwe token wordt alleen in dat antwoord teruggegeven; de server slaat het niet op en er is geen "opnieuw tonen" in het paneel. Ben je het kwijt, roteer dan om een nieuw token te krijgen; het oude sterft meteen. Zet het token nooit in versiebeheer, een CI-log of een chatvenster; zet het in de secret store van het doelsysteem.
3. Doe de eerste aanroep — en zie dat die ECHT is aangekomen — Twee verzoeken zijn genoeg. Het eerste bewijst je identiteit (het is vrijgesteld van scope en werkt met elke sleutel): is de scope wat je verwachtte, staat de status op active, nadert expires_at. Het tweede leest echte gegevens uit het domein dat je hebt gekozen. Slaagt het, dan zijn identiteit, scope, de e-mailcontrole en het netwerkpad allemaal in orde. Slaagt het niet, ga dan niet gokken: het eigen verzoekenlogboek van de sleutel laat rij voor rij zien welk endpoint werd geweigerd, met welke code en welke stabiele foutsleutel (INSUFFICIENT_SCOPE, IP_NOT_ALLOWED, KEY_ACTOR_BLOCKED …). In het paneel is dat logboek het venster "Recent requests"; in de terminal is het lg logs. De wizard bewaakt precies dit logboek en weigert de stap groen te maken totdat hij een echte geslaagde aanroep ziet.
4. Zet de webhook op — en verifieer de handtekening voordat je iets anders doet — Wachten op events is goedkoper dan elke minuut vragen. Registreer een https-adres, kies de events die je belangrijk vindt en bind het abonnement aan je sleutel: wordt de sleutel ingetrokken, dan stopt ook de aflevering. Het secret wordt maar één keer getoond, bij het aanmaken. Je ontvangende endpoint moet eerst de handtekening verifiëren: de ondertekende string is "{t}.{raw body}" en het algoritme is HMAC-SHA256; de tijdstempel zit BINNEN de handtekening, dus laat elk verzoek vallen dat ouder is dan 300 seconden, ook als de handtekening geldig is. Vergelijk in constante tijd en serialiseer de body nooit opnieuw — zodra je de JSON parseert en opnieuw afdrukt, klopt de handtekening niet meer. Vanuit het paneel vuurt "Send test" een echte ondertekende ping af en kun je de aflevering poging voor poging volgen.
Sandbox: schrijven oefenen zonder productie aan te raken
Preflight (dry_run) vertelt je wat een commando ZOU doen; maar of idempotency echt een replay geeft, of de webhook echt wordt afgeleverd, hoe de foutvertakkingen eruitzien en waar de credits vandaan komen, zie je alleen bij een ECHTE schrijfactie. Daar is de sandbox voor: een aparte tenant die je bedrijf spiegelt — dezelfde code, dezelfde commandocatalogus — en die nooit je live administratie aanraakt.
De sandbox is geen vlag in het verzoek, het is een TENANT. Een apart Logistivo-bedrijf dat voor het jouwe wordt geopend: een eigen gebruiker, een eigen pakket, een eigen creditadministratie, eigen webhookabonnementen. De omgeving wordt AFGELEID van het bedrijf van de sleutel en kan niet door de aanroeper worden meegegeven, dus zelfs als je het verkeerde profiel kiest, stopt het verzoek aan de serverkant met 403 ENVIRONMENT_MISMATCH. "Ik dacht dat ik naar de sandbox schreef en schreef naar productie" is structureel onmogelijk.
Het oppervlak is identiek — gemeten: de catalogus die een sandboxsleutel ophaalt, is dezelfde als die van je livesleutel (bij een verladerssleutel 448 commando's aan beide kanten). Een koppeling die in de sandbox werkt, werkt in productie; niets wat je leert, hoef je twee keer te leren.
De sandbox opent niet leeg: hij bevat gegenereerde (NIET gekopieerde) seeddata — contacten, ladingen in beide richtingen en aanvragen. De namen zijn openlijk verzonnen en de e-mailadressen vallen onder het domein @sandbox.invalid; er wordt nooit een rij van een echte tenant gelezen, gekloond of als sjabloon gebruikt.
Er is bewust GEEN resetknop, en er wordt nooit een record, bestand of document verwijderd. Wil je een schone start, dan opent een vernieuwing een nieuwe generatie en blijft de oude bestaan, buiten gebruik. Een paar honderd opgestapelde oefenrijen kosten niets vergeleken met een verwijderroutine die aan de verkeerde tenant is gekoppeld.
1. Open de sandbox — Eén sandbox per bedrijf. Het endpoint vereist het recht voor teambeheer (team.manage), dus een beheerder in je bedrijf doet dit. Bestaat hij al, dan antwoordt hetzelfde endpoint via GET met zijn toestand: bedrijfs-id, resterende credits, aantal actieve sleutels, abonnementen, generatiegeschiedenis en de maxima.
2. Geef een sandboxsleutel uit en bewaar die als tweede profiel — De sleutel wordt uitgegeven namens de eigen koppelingsgebruiker van de sandbox en komt terug met de stempel environment: sandbox; het ruwe token verschijnt alleen in dat ene antwoord. Vervang aan de kant van lg je livesleutel niet — bewaar ze ALLEBEI als aparte profielen; --sandbox en --live zijn kiezers voor één run.
3. Echt schrijven — Hier geen --dry-run; schrijven is juist het punt. Stuur dezelfde idempotency key twee keer en zie het tweede antwoord terugkomen als status: replayed — dat is het gemeten resultaat in de sandbox. Roep met opzet een bevestigingsplichtig commando aan zonder bevestiging en lees de body van de 409; probeer een commando buiten je scope en lees de weigering. Niets daarvan laat een spoor na in je live administratie: je live saldo blijft gedurende dezelfde run ongewijzigd.
4. Lees de checklist voordat je live gaat — Het go-live-endpoint antwoordt op basis van wat je ECHT in de sandbox hebt gedaan: heb je geschreven, heb je de foutvertakkingen gezien, is er een webhook afgeleverd, heb je de ontvanger van het oefenadres gehaald, heb je een vervaldatum op de sleutel gezet. Elk item komt terug als pass / todo / unknown. Hetzelfde antwoord bevat ook een SCOPEVOORSTEL dat is afgeleid van de commando's die je echt hebt aangeroepen — gebruik het om je livesleutel niet breder uit te geven dan je nodig hebt.
Credits en facturatie — De sandbox heeft een eigen creditadministratie en je live saldo beweegt niet. Dat is een structuur, geen controle: credits worden per bedrijf geteld en de sandbox is een apart bedrijf. Hij opent op het gratis niveau, heeft geen betaalmethode en valt buiten het maandelijkse incassovenster — langs geen enkele weg kan hij bij een factuur uitkomen.
Marketplace — Een aanvraag die je in de sandbox opent, verschijnt NIET op de schermen van echte vervoerders en bereikt NIET hun e-mail- of pushinbox; en jij ziet ook geen echte aanvragen. De scheiding is symmetrisch en wordt in twee aparte queries afgedwongen: voor wie een aanvraag ZICHTBAAR is en naar wie ze wordt VERSTUURD, zijn verschillende vragen.
Webhooks — Abonnementen dragen ook de omgevingsstempel. Een sandbox-event wordt nooit aan een live abonnement afgeleverd en een live event bereikt nooit een sandboxabonnement; voor een abonnement waarvan de stempel is afgedreven, wordt helemaal geen aflevering geopend. Omdat het maximum aantal abonnementen per bedrijf geldt, eten je oefenabonnementen niet van je live quotum.
Seeddata — De voorbeeldrecords in de sandbox zijn GEGENEREERD, nooit gekopieerd van echte tenants. Seeden is idempotent: een tweede aanroep legt geen tweede seed bovenop je eigen records.
Dezelfde catalogus — Je rol is ook in de sandbox je rol, en de commandolijst is identiek — gemeten, 448 commando's aan beide kanten. De sandbox is geen uitgeklede demo; hij is een tweeling van je bedrijf.
Huidige beperking: webhookabonnementen kunnen niet met een sandboxsleutel worden beheerd — De abonnementsendpoints vereisen het recht voor teambeheer (team.manage), en de koppelingsgebruiker van de sandbox heeft geen teamrol, dus `lg --sandbox webhooks …` antwoordt vandaag 403. Het hele commando-oppervlak werkt — de beperking geldt alleen voor het abonnementenregister. Wil je webhooks in de sandbox oefenen, vraag het dan aan support; dit is gemeten en vastgelegd als openstaand gat.
GET /api/common/integration-sandbox — Toestand: of hij bestaat, welk bedrijf, resterende credits, aantallen actieve sleutels en abonnementen, generatiegeschiedenis, de maxima, en een triggergids die laat zien welk commando welk event opwekt.
POST /api/common/integration-sandbox — Opent de sandbox (één per bedrijf, idempotent). Vereist het recht team.manage.
POST /api/common/integration-sandbox/keys — 201 + de sleutel en het ruwe token (alleen hier, alleen één keer). De stempel environment: sandbox wordt afgeleid van het bedrijf; de aanroeper kan hem niet meegeven.
GET /api/common/integration-sandbox/go-live — De go-live-checklist en een scopevoorstel — berekend uit je echte verkeer in de sandbox.
POST /api/common/integration-sandbox/renew — Opent een nieuwe GENERATIE van de sandbox en zet de vorige buiten gebruik.
Het commandomodel
Er is één grammatica en die kent geen uitzonderingen. Om te weten hoe je een commando aanroept, heb je alleen nodig wat de catalogus erover zegt.
lg loads list --status=in_transport --limit=20 --json
Vlagnamen zijn de parameternamen uit het schema, en lg accepteert beide schrijfwijzen: --load_code en --load-code bereiken hetzelfde veld (lg help toont de kebab-case-vorm). Aan een vlag zie je dus in welk JSON-veld hij terechtkomt, en de overstap van de CLI naar HTTP vraagt geen naamvertaling. Een booleaanse parameter zonder waarde is true (--only_open); het tegenovergestelde is --no-only_open. Schrijf een argument waarvan de waarde met een streepje begint als --flag=value, anders slikt een vergeten vlag stilzwijgend de volgende in als waarde. Bij een commando dat een bestand aanneemt, zet je @ voor een lokaal pad (--attachment_uuid=@./cmr.pdf) — zie Commando's die bestanden aannemen.
lg — De client.
loads — Het domein — de entiteit waaraan je werkt, in het meervoud.
list — Het werkwoord — wat je met die entiteit doet, uit een gesloten woordenschat die alleen door een bewuste beslissing groeit: eenvoudige werkwoorden (list, get, create, update, delete, search, preview, generate, extract …) en samengestelde werkwoorden die benoemen wat er wordt toegevoegd of gewijzigd (add-document, set-status, assign-driver). lg help toont de werkwoorden van een domein.
--status=in_transport — Een parameter — de naam is precies de parameternaam uit het JSON Schema en de waarde moet overeenkomen met het type in het schema. Een ongeldige waarde in een enum-veld bereikt de server nooit.
--limit=20 — Aantal rijen bij lijstcommando's. Het maximum staat in de parameterbeschrijving van elk commando — doorgaans 20 bij een gewone lijstaanroep en tot 100 in syncmodus (met cursor of updated_since).
--json — Ruwe JSON-uitvoer.
--json — Drukt ruwe JSON af. Dit is de enige juiste vorm voor scripts: de standaard uitgelijnde tabel is voor mensen, kiest haar kolommen op basis van de data en kan zonder aankondiging van indeling veranderen. Schrijf nooit een script dat de tabeluitvoer parseert.
--yes, -y — Passeert de bevestigingspoort (confirm: true via HTTP). Gebruik het alleen in een script dat weet wat het gaat doen; bij een onomkeerbaar commando is deze vlag een afkorting voor "er is geen weg terug".
--idempotency-key= — Maakt het veilig om een schrijvend commando opnieuw te proberen. Een tweede aanroep met dezelfde sleutel voert het commando niet opnieuw uit; hij geeft het eerste resultaat terug. Bouw je een retrylus, genereer de sleutel dan ZELF en stuur bij elke poging dezelfde.
--dry-run — Voert een preflight uit in plaats van het commando: validatie, de controles en de creditberekening draaien, er wordt niets geschreven (zie de sectie over preflight). Geldig bij elk commando en bij lg batch.
--refresh — Forceert een verversing van de catalogus. lg cachet de catalogus een uur; als je weet dat er net een commando op de server is toegevoegd, gebruik dan dit in plaats van te wachten.
--help, -h — Toont de catalogusbeschrijving van het commando, elke parameter, het type, de enum-waarden en of de parameter verplicht is. Er zit geen helpbestand in de client.
--profile=, --sandbox, --live — Onder welk profiel deze ene aanroep draait. --sandbox en --live kiezen het profiel met een sandbox- of een livesleutel; de omgeving wordt op de server afgeleid van de sleutel, dus bij een mismatch stopt het met 403 ENVIRONMENT_MISMATCH in plaats van naar de verkeerde plek te schrijven.
--base-url, --timeout, --verbose, --no-color, --version — Respectievelijk: één commando naar een andere server laten wijzen, een timeout in seconden, details van request en response, ANSI-kleur uitschakelen, en de clientversie.
Echte voorbeelden
Elk commando hieronder bestaat vandaag in de catalogus; geen enkele naam of parameter hier is verzonnen. De uitvoer is ingekort. De uitvoer toont het niveau `data.result`; via HTTP komt hetzelfde object binnen in de envelop `{success, data:{…}}` (zie de HTTP-commando-API).
Ladingen die nu onderweg zijn — lg loads list --status=in_transport --limit=20
Eén lading volledig, ruwe JSON — lg loads get --load_code=FSK2158 --json
Openstaande meldingen over documentconsistentie — lg loads list-problems --only_open=true --limit=10
Het land bepalen — lg countries search --query=Germany --json
Filteren met de gevonden id — lg loads list --receiving_country_id=57 --date_from=2026-09-01 --limit=20
Een HS-code vinden op basis van een productnaam — lg tariffs search --query="aluminium profile"
Een lading een stap verder zetten (alleen vervoerdersrol) — lg loads set-status --load_code=FSK2158 --status=transit --date=2026-08-21 --yes
Concept — lg export-documents create --doc_type=proforma-invoice --currency_code=EUR --json
Genereren (bevestigingsplichtig) — lg export-documents generate --document_id=8412 --yes
Zonder de client: de HTTP-commando-API
lg is een gemak, niet de toegangsdeur. Catalogus en uitvoering lopen allebei via drie HTTP-endpoints (bestanden hebben een vierde, het upload-endpoint — zie Commando's die bestanden aannemen); een ERP- of CRM-integratie maakt hier rechtstreeks verbinding. De identiteit is een persoonlijk access token dat wordt meegestuurd in Authorization: Bearer. ELK antwoord komt terug in dezelfde envelop: `{ "success": bool, "data": { … }, "code": "…", "message": { … } }`. Het hele contract zit in `data` — `contract_version`, `command`, `status` en, als uitvoer van het commando, `result`; bij een fout `error_code`, `error_key` en `error`. De antwoordvoorbeelden op deze pagina tonen het object `data` in plaats van de envelop, om ruimte te besparen; vergeet niet om in je eigen code `data` uit te pakken. Ook `lg --json` drukt de HELE envelop af, en daarom beginnen jq-paden met `.data.result…`. De enige uitzondering is `/api/public/status`: dat endpoint is envelopvrij, zodat watchdogs kunnen alarmeren zonder het te parseren.
Om bevestiging vragen met 200 + ok:false is verboden en zal nooit gebeuren. De reden is eenvoudig: clients behandelen 200 als succes, dus een bevestigingsverzoek dat als 200 terugkomt, zou de flow stilletjes doden en niemand zou het merken. Bevestiging is altijd 409.
GET /api/common/commands — De hele catalogus die je rol kan zien: contract_version; per commando name, domain, verb, description, JSON Schema, read_only, confirmation_needed, irreversible, credit_cost, since, deprecated_at, replaced_by, aliases en de toegangsvelden key_level, permission, file_params, secret_parameters en cli_only; op het hoogste niveau het woordenboek error_keys, rate_limits, idempotency_ttl_hours, je catalogusrollen, het contract voor attachments (upload) en het toegangsniveau van de sleutel waarmee je aanroept. Stuurt een ETag mee; If-None-Match antwoordt 304. ?domain= matcht ook een oud domein (alias). Bouw je client hieruit op; codeer geen commandolijst hard.
GET /api/common/commands/{name} — Eén commando volledig. name is de bevroren commandonaam uit de catalogus (list_loads), niet de CLI-identiteit. Een verouderd commando antwoordt met een header X-Deprecated.
POST /api/common/commands/{name} — Uitvoering. Body: { args, confirm?, idempotency_key? }. De HTTP-status van het antwoord is het resultaat zelf — alles behalve 200 is informatie, geen ruis. Fouten dragen error_code (transport) en, bij zakelijke afwijzingen, error_key.
Commando's die bestanden aannemen
33 commando's in de tabel nemen een document of foto aan: een CMR aan een lading koppelen, HS-codes uit een factuur lezen, een voertuig aanmaken op basis van het kentekenbewijs, een pallet schatten op basis van foto's, een bedrijfsdocument uploaden, een factuur vergelijken met een paklijst. In de browser sleep je het bestand naar een formulier; overal elders kost het twee stappen — het bestand uploaden en daarna de id ervan aan het commando doorgeven.
Een parameter neemt een bestand aan wanneer de naam eindigt op attachment_uuid of attachment_uuids — photos[].attachment_uuid binnen een lijst, front_attachment_uuid bij een cheque. Dat hoef je niet te onthouden: elke catalogusrij bevat file_params met de exacte paden, het schema markeert die velden (format: uuid, x-logistivo-file: true), en het catalogusantwoord bevat een blok attachments met het uploadadres, de geaccepteerde types, de groottelimieten en de geldigheidsduur. lg help toont ze ook.
Uploaden is een schrijfactie, dus een sleutel met leesscope kan niet uploaden; elke sleutel met schrijfscope kan het wel, op beide toegangsniveaus. Uploads horen bij de gebruiker, niet bij de sleutel: twee sleutels van dezelfde gebruiker zien dezelfde uploads, en niemand kan die van iemand anders gebruiken. Een id die onbekend, verlopen of niet van jou is, wordt simpelweg niet gevonden, en de reden wordt niet bekendgemaakt.
Bijlagen in de dashboardchat en commando-uploads zijn gescheiden ruimtes: een bestand dat in de assistentchat is bijgevoegd, kan niet via de id aan een commando worden doorgegeven, en een commando-upload verschijnt nooit in een chatgesprek.
Een upload is geen commando en heeft op zichzelf geen zakelijk effect: er gebeurt niets met je gegevens totdat een commando de id gebruikt. Daarom vraagt uploaden ook nooit om bevestiging — het commando dat het bestand gebruikt, draagt de poort.
1. lg: zet @ voor een lokaal pad — lg uploadt het bestand eerst en voert daarna het commando uit met de teruggegeven id; een waarde zonder @ is de id van een bestand dat je eerder hebt geüpload. Lijsten nemen door komma's gescheiden paden of een herhaalde vlag aan, geneste velden nemen JSON aan, en --file is een snelkoppeling wanneer het commando precies één bestandsveld op het hoogste niveau heeft. lg controleert elk bestand lokaal (bestaat het, grootte, type) voordat er iets wordt verstuurd, en lg batch uploadt elk afzonderlijk bestand één keer voordat de batch draait.
2. HTTP: uploaden, daarna attachment_uuid doorgeven — Stuur het bestand als multipart/form-data in een veld met de naam file. Een nieuwe upload antwoordt 201; hetzelfde bestand dat door dezelfde gebruiker opnieuw wordt geüpload, antwoordt 200 met status replayed en dezelfde id, en er wordt niets geschreven. Zoals overal op deze pagina toont het voorbeeld het object data binnen de envelop.
3. MCP: de tool upload_attachment — Een MCP-client kan geen multipart versturen, dus het kanaal biedt één extra tool die niet in de catalogus staat: upload_attachment neemt een bestandsnaam en de inhoud als base64 aan en geeft dezelfde attachment_uuid terug. Hij roept dezelfde service aan als de HTTP-upload, onder dezelfde regels.
Het type komt uit de inhoud — De bestandsnaam en het opgegeven type worden genegeerd; de opgeslagen extensie is de gedetecteerde. Geaccepteerd voor upload: jpg, jpeg, png, webp, heic, heif, pdf, xlsx, xls, csv, txt, doc, docx, xml, zip. Elk commando past daarna zijn eigen, smallere lijst toe voordat er iets draait en antwoordt met UNSUPPORTED_FILE_TYPE en de geaccepteerde types, of met FILE_TOO_LARGE.
Grootte — Afbeeldingen tot 10 MB, andere bestanden tot 15 MB.
Geldigheidsduur — Een upload kan 24 uur worden gebruikt. Daarna wordt hij niet meer opgelost (ATTACHMENT_NOT_FOUND) — hij wordt niet verwijderd. Upload opnieuw als een commando om die reden mislukt.
Zelfde bestand, zelfde id — Hetzelfde bestand opnieuw uploaden (zelfde naam, grootte en inhoud) geeft de bestaande id terug in plaats van een nieuwe te schrijven, zolang die nog minstens een uur geldig is, en het telt niet mee voor je dagelijkse maximum.
Dagelijkse maxima — 300 uploads per gebruiker per dag (TOO_MANY_FILES) en 2 GB per bedrijf per dag (DAILY_LIMIT_REACHED); beide antwoorden 429 met retry_after.
POST /api/common/commands:upload — Multipart-upload in het veld file. 201 voor een nieuwe upload, 200 met status replayed voor hetzelfde bestand. Geeft data.attachment terug: attachment_uuid, filename, mime_type, size_bytes, sha256, extraction_status, expires_at en reused.
De bevestigingspoort en onomkeerbare commando's
Elk commando in de catalogus draagt twee vlaggen: confirmation_needed (is er expliciete goedkeuring nodig voordat het draait) en irreversible (kan het effect ongedaan worden gemaakt). Het zijn afzonderlijke vragen, en beide worden op de server gehandhaafd in plaats van overgelaten aan de goede manieren van de client.
De poort gaat over verantwoordelijkheid, niet over bedrijfsregels. Een bod uitbrengen is de eerste stap naar een vrachtcontract; een factuur uitgeven maakt een boeking in de boekhouding aan; een voorraadmutatie wijzigt een grootboek. Geen van deze mag ooit iets zijn dat je per ongeluk twee keer kunt uitvoeren.
De poort wordt gelezen van het EFFECTIEVE commando. Wanneer het ene commando het andere omhult — zoals de generieke uitvoerder in de chat doet — komt de poort uit de vlaggen van het commando dat daadwerkelijk zal draaien, niet van de wrapper. Met een vaste vlag zou een van twee fouten onvermijdelijk zijn: óf het factuurcommando zou onbevestigd draaien, óf elke opzoeking van een land zou een bevestigingskaart oproepen.
read_only en niet bevestigingsplichtig zijn niet hetzelfde. Er zijn drie verschillende toestanden: invoices preview is niet bevestigingsplichtig en schrijft niets; loads create is bevestigingsplichtig en schrijft; invoices create is niet bevestigingsplichtig maar schrijft wel — er ontstaat een concept. Eén test beslist: is er, wanneer het commando terugkeert, een rij in de database veranderd?
Sommige acties zitten niet achter deze poort, omdat het helemaal geen commando's zijn: een pakket kopen, een kaart toevoegen met 3D Secure, juridische teksten goedkeuren en een account sluiten gebeuren in de eigen browser van de persoon. Daarvoor geeft lg handoff-links generate een logistivo.com-link terug — gratis, zonder iets te schrijven, zonder geheim — en de persoon rondt de stap daar af. Geen enkele vlag, hoe die ook staat, maakt van een betaling of een toestemming een API-aanroep.
Technisch kan een integratie de poort bij elke aanroep automatisch passeren, maar dat is niet aan te raden. Het juiste patroon is de poort alleen te automatiseren voor commando's waarvan je weet dat ze omkeerbaar zijn, en onomkeerbare commando's naar de wachtrij van een mens te leiden.
1. Aanroepen — Roep het bevestigingsplichtige commando aan zonder confirm. Er verandert niets.
2. Lees de samenvatting — Je krijgt een 409; confirmation.summary in de body is een zin die voor een mens is geschreven ("About to issue an invoice: X Ltd, 1,200.00 TRY"), geen dump van ruwe argumenten. Monetaire commando's bevatten ook een gestructureerde preview: regelitems, totalen, waarschuwingen.
3. Bevestigen — Herhaal dezelfde aanroep met confirm: true (--yes in de CLI). Onomkeerbare commando's zijn zo gemarkeerd dat ze hoogstens één keer draaien.
Preflight: zien wat een schrijfcommando zou doen, zonder het uit te voeren
De duurste stap bij het aansluiten van een ERP-koppeling is uitvinden of je body klopt door het commando ECHT uit te voeren: een conceptfactuur in het live grootboek, een verbrande credit, handmatig opruimen. dry_run maakt daar een einde aan — je voegt één veld toe aan het verzoek, het commando draait niet, en je leest wat er zou gebeuren.
Het register bevat vandaag 519 commando's; 233 daarvan lezen alleen en schrijven niets. Van de overige 286 schrijfcommando's zijn er 251 bevestigingsplichtig: zonder confirm aangeroepen antwoorden ze al met 409 en beschrijven ze wat ze zouden doen. Het gat zat in de andere 35 — factuurconcepten, concepten van exportdocumenten, regelitems: precies de keten die een koppeling als eerste aansluit. Voor die commando's was aanroepen hetzelfde als uitvoeren.
Zelfs bij bevestigingsplichtige commando's was er een tweede gat: schemavalidatie draait NA de poort. Een aanroep met een ontbrekend argument kreeg dus eerst de bevestigingskaart, bevestigde die, en hoorde pas daarna "dit veld ontbreekt". Een preflight beantwoordt beide in één round trip.
En de meest voorkomende — en het laatst ontdekte — koppelingsbug is deze: je stuurt een veld dat niet in het schema staat (customer_id waar recipient_contact_id wordt verwacht), de server laat het stilzwijgend vallen, het commando geeft 200 terug en het record belandt op de verkeerde plek. Het preflight-antwoord noemt die velden bij naam onder arguments.ignored; een foutmelding zal dat nooit doen.
Een preflight schrijft niets, en dat is structureel nog voordat het een meting is: het preflightpad komt nooit in de handler van het commando, dus het geldt voor elk commando, ook voor de later toegevoegde. Het werd bij de lancering ook gemeten: elk SQL-statement dat werd uitgevoerd tijdens het preflighten van elk schrijfcommando dat toen in de catalogus stond (twee sets argumenten, twee rollen, 178 preflights), werd vastgelegd. Geen enkele INSERT/UPDATE/DELETE, geen enkele job in de wachtrij, geen enkele e-mail; het aantal rijen in 31 tabellen en het creditsaldo bleven ongewijzigd.
De exitcode is dezelfde die de echte aanroep zou geven — zou draaien 0, bevestigingspoort 4, idempotency-conflict 2, al het andere 1 — dus "lg … --dry-run || exit" is een zinvolle poort in een CI-stap.
1. Aanroepen met dry_run — Voeg "dry_run": true toe aan de request body. Validatie, de rol- en scopecontrole, doelresolutie en de creditberekening draaien allemaal; het commando niet.
2. Lees would_execute — Dat is de enige vlag waarop je vertakt. Als die false is, noemt would_stop.at waar een echte aanroep zou stoppen: idempotency, target_precheck, confirmation_gate of arguments.
3. Je body repareren — arguments.ignored noemt de velden die stilzwijgend zouden wegvallen, missing_required de verplichte velden die je bent vergeten, en would_charge hoeveel credits er zouden worden afgeschreven en of het saldo die dekt.
4. dry_run weglaten — Herhaal totdat would_execute true is, verwijder dan de vlag en doe de echte aanroep. De idempotency key die je tijdens de preflight stuurde, is niet opgebruikt, dus de echte aanroep draait normaal.
HTTP is altijd 200 — "Het commando zou mislukken" komt nooit binnen als 4xx — de preflight zelf is geslaagd en de voorspelling staat in de body. De uitzondering is een weigering op transportniveau, en daar gedraagt het zich precies als een echte aanroep: 404 onbekend commando, 403 rol/scope, 429 rate limit.
Een sleutel met leesscope kan geen dry run van een schrijfcommando doen — Hij krijgt 403. Een preflight beantwoordt "wat gebeurt er als ik dit MET DEZE SLEUTEL aanroep, nu"; een leessleutel groen licht geven en daarna een 403 bij de echte aanroep zou precies de verrassing zijn die de preflight moet voorkomen.
De idempotency key wordt niet opgebruikt — Een sleutel die tijdens een preflight wordt gestuurd, opent geen regel in het logboek, en een verlopen lock wordt niet vrijgegeven. Stuur dus de sleutel die je echt wilt gebruiken: de preflight vertelt je of hij nog vrij is, een eerdere uitvoering zou herhalen (replay) of botst met een ander commando.
Hij combineert met confirm — Stuur dry_run en confirm samen en de vraag wordt "als ik bevestig, wat gebeurt er dan?". Nog steeds draait er niets.
Batch-preflight geldt per batch — commands:batch accepteert ook dry_run, maar de vlag hoort bij de batch, niet bij een item (op een item meesturen geeft 422). Je krijgt een rapport per item plus de totale creditkosten van de batch; een ontoereikend saldo wordt gemeld, niet geweigerd.
Hij is niet gratis — Elke preflight voert echte queries uit (preview, saldo) en telt mee voor de rate limit. Doe niet bij elke deploy een preflight van de hele catalogus; doe een preflight van de commando's die je hebt gewijzigd.
Idempotency: waarom opnieuw proberen geen duplicaten oplevert
Een ERP leest je foutmelding niet, ziet je scherm niet en stuurt na een timeout hetzelfde verzoek opnieuw. Deze sectie bestaat precies voor dat gedrag.
Een aanroep met een idempotency_key draait hoogstens één keer. De tweede aanroep voert het commando niet opnieuw uit; hij geeft het vastgelegde resultaat terug met status replayed. Valt het netwerk weg, verloopt een verzoek of pakt een wachtrij dezelfde job twee keer op, dan krijg je het eerste resultaat in plaats van een dubbele factuur.
Gebruik een sleutel bij elk schrijvend commando. Het veld read_only in de catalogus geeft je dat onderscheid gratis: elk commando met read_only: false verdient een idempotency key.
Je retrystrategie moet exponential backoff gebruiken en bij elke poging DEZELFDE sleutel meesturen. Per poging een nieuwe sleutel genereren is hetzelfde als helemaal geen idempotency gebruiken. Stuur dezelfde sleutel niet parallel: at-most-once is gegarandeerd voor opeenvolgende retries, niet voor twee verzoeken die met elkaar racen.
Valkuil 1 — ook een mislukking wordt vastgelegd — Als de eerste uitvoering door een bedrijfsregel werd afgewezen (failed), geeft een tweede aanroep met dezelfde sleutel dezelfde fout en dezelfde error_key terug en probeert hij het niet opnieuw. Om het argument te corrigeren en het opnieuw te proberen heb je een NIEUWE sleutel nodig. Een sleutel staat voor een poging, niet voor een intentie.
Valkuil 2 — een groot resultaat wordt zonder body herhaald — Het logboek slaat een resultaat alleen op als het kleiner is dan 64 KB. Een groter resultaat wordt herhaald met status replayed, maar met een lege body. Je integratie moet vertrouwen op het signaal "replayed" in plaats van op de body, en de gegevens ophalen met het bijbehorende get-commando.
Valkuil 3 — een sleutel hoort bij één commando — Dezelfde sleutel met een ander commando sturen geeft 409 idempotency_conflict terug met de conflicting_command; er draait niets en er wordt niets herhaald. Een client die één sleutel deelt over twee werkwoorden is kapot en leert dat van een foutmelding, niet van een stille replay.
Valkuil 4 — de lock duurt 24 uur, niet eeuwig — Na 24 uur is dezelfde sleutel een nieuwe uitvoering. Netwerk-retries komen binnen enkele minuten binnen; de jaarlijks terugkerende documentnummers van een ERP mogen niet voor altijd "replayed" blijven. De catalogus publiceert het venster als idempotency_ttl_hours.
Valkuil 5 — een serverfout vergrendelt de sleutel niet — Een 5xx server_error is geen zakelijke afwijzing: de sleutel wordt niet gebonden, dus een nieuwe poging met dezelfde sleutel voert het commando echt uit. Alleen failed vergrendelt (valkuil 1).
Scope en formaat — je bedrijf, elke string, bij voorkeur een UUID — Uniciteit wordt afgedwongen op (je bedrijf, sleutel): de INV-1001 van een andere tenant botst nooit met de jouwe en kan nooit jouw resultaat herhalen. Gebruik een gewone UUID of een samenstelling die per constructie uniek is, zoals {ERP-document-no}:{verb}.
Incrementele sync en paginering
Een ERP/CRM-koppeling moet ophalen wat er veranderd is, niet elk uur alles. Elk lijstcommando — loads list, demands list-own, contacts list, invoices list, teammates list, load-groups list, reservations list, drivers list, tenders list, products search, warehouses search — accepteert twee gedeelde parameters en geeft één gedeeld veld terug.
Waarom er geen offset is: op een live tabel verschuift een offset. Een rij die tussen twee pagina's wordt ingevoegd, laat je een record overslaan of dubbel tellen, zonder dat je het merkt. De cursor gaat alleen vooruit, dus een record dat halverwege wordt ingevoegd of bijgewerkt, belandt aan het eind van de lijst: er gaat niets verloren en niets wordt gedupliceerd.
Een volledige eerste import is hetzelfde mechanisme: begin met updated_since=1970-01-01T00:00:00Z en volg next_cursor totdat die null is. Er is geen apart “export”-endpoint, omdat dat niet nodig is.
Hetzelfde met lg: lg loads list --updated_since=2026-09-01T00:00:00Z --limit=100 --json, daarna lg loads list --cursor= --json.
Zet voor de volgende sync updated_since op de grootste updated_at die je hebt gezien. Tijdstempels hebben een precisie van één seconde, dus een record op de grens kan twee keer binnenkomen — onschuldig zolang je aan jouw kant upsert op external_ref of code. Zonder updated_since of cursor draait een commando in chatmodus: menselijke ordening, hoogstens 20 rijen, next_cursor null en truncated die zegt “er is meer”. Gebruik die modus niet voor sync.
Machineleesbare foutsleutels voor deze sectie: INVALID_CURSOR, INVALID_UPDATED_SINCE, DUPLICATE_EXTERNAL_REF, EXTERNAL_REF_TOO_LONG, EXTERNAL_REF_INVALID. Ze antwoorden allemaal met HTTP 422 met error_code: "failed" en result.error_key in de body. Vertak op de sleutel, nooit op de tekst.
updated_since — ISO-8601-tijdstempel (UTC aanbevolen, bijv. 2026-09-01T00:00:00Z). Rijen die op of na dit moment zijn bijgewerkt. Het zet het commando in syncmodus: vaste volgorde (updated_at, id) oplopend, limit begrensd op 100.
cursor — De next_cursor uit het vorige antwoord, letterlijk. Hij is ondoorzichtig en ondertekend: bouw of bewerk er nooit een, en hergebruik nooit de cursor van een ander bedrijf of een ander commando; al deze gevallen worden geweigerd met INVALID_CURSOR.
limit — Paginagrootte. 1-100 in syncmodus (standaard 10).
next_cursor (respons) — Cursor voor de volgende pagina. null betekent dat de lijst compleet is; het is het enige juiste antwoord op “is er meer”.
total (respons) — Rijen die aan de filters voldoen, onafhankelijk van de pagina — voor voortgangsrapportage.
Je eigen sleutel: external_ref
Maak onze auto-increment-id's (invoice_id, contact_id) niet de bedrijfssleutel in je ERP; ze zijn ondoorzichtig en privé voor je bedrijf. Ladingen, aanvragen, contacten, facturen, producten en magazijnen dragen in plaats daarvan jouw sleutel.
Zet hem bij het schrijven — loads create, demands create, contacts create en contacts update, invoices create accepteren een optionele external_ref (max. 120 tekens) en geven die ongewijzigd terug.
Gebruik hem bij het lezen — loads get --external_ref=ORD-2026-0917, invoices get --external_ref=..., contacts get --external_ref=..., demands get --external_ref=... werken allemaal; bij lijst- en zoekcommando's is --external_ref= een filter op exacte overeenkomst.
Uniek per bedrijf — Een tweede record met dezelfde sleutel wordt geweigerd met 422 en result.error_key = DUPLICATE_EXTERNAL_REF; de sleutel van een ander bedrijf geeft jou “niet gevonden”. Matching is niet hoofdlettergevoelig (ord-1 = ORD-1). Een gearchiveerd record behoudt zijn sleutel; herstel het voordat je de sleutel hergebruikt.
Stuur ook een idempotency_key mee — Een nieuwe poging na een netwerktimeout geeft het eerste resultaat terug in plaats van een duplicaat aan te maken. De twee zijn niet uitwisselbaar: external_ref is jouw bedrijfssleutel, idempotency_key identificeert één poging.
Uitgaande webhooks: wij sturen je een POST wanneer er iets gebeurt
Alles tot hier was pull: jij vraagt, wij antwoorden. Een ERP-koppeling moest elke minuut vragen om te weten te komen dat een lading van status was veranderd, een factuur was uitgegeven of een bod was binnengekomen. Nu niet meer: registreer een https-adres, kies de events die je belangrijk vindt, en er komt een ondertekende POST binnen wanneer ze gebeuren.
Push werd NAAST pull toegevoegd, niet in plaats ervan. Incrementele sync (updated_since + cursor) is onaangetast en nog steeds het juiste gereedschap: de eerste volledige import, het aanvullen van historie en het beantwoorden van "heb ik iets gemist" gebeuren daar allemaal. Webhooks brengen de latency terug van minuten naar seconden. Een gezonde koppeling gebruikt beide — de webhook als trigger, de sync als vangnet.
De payload is een SIGNAAL, geen kopie van het record. Hij bevat de identifiers (id, je eigen external_ref, status, tijd); de details haal je op met je eigen sleutel via GET, en die aanroep gaat al door je eigen autorisatiecontroles. Het blootstellingsoppervlak blijft dus op het niveau van identifiers. Twee velden ontbreken bewust: de identiteit van het bedrijf dat een bod heeft uitgebracht (blinde biedingen verschijnen in het paneel onder een alias; de identiteit in een webhook opnemen zou die privacy via een tweede kanaal doorbreken) en de contactgegevens van reserveringen (er is geen reden om persoonsgegevens via een extra kanaal te verplaatsen).
Eventnamen zijn BEVROREN. Verandert de betekenis van een naam, dan wordt er een nieuwe naam geopend en leeft de oude door tijdens een uitfaseringsperiode. Een nieuw veld aan de payload toevoegen verhoogt de contractversie NIET — een consument moet velden negeren die hij niet kent.
GET /api/common/integration-webhooks — Het logboek plus de eventcatalogus, de limieten en de headernamen. Elke rij bevat de reden van stillegging en een afleveringsoverzicht over 7 dagen.
POST /api/common/integration-webhooks — 201 + { webhook, secret, shown_once: true }. Het secret verschijnt alleen hier.
PATCH /api/common/integration-webhooks/{uuid} — Naam / adres / events / vlag active. Raakt het secret NIET.
DELETE /api/common/integration-webhooks/{uuid} — Verwijdert het: de rij wordt soft-deleted (de historie blijft opvraagbaar) en openstaande afleveringen worden geannuleerd.
POST /api/common/integration-webhooks/{uuid}/rotate-secret — 201 + een nieuw secret. De oude waarde werkt vanaf dat moment niet meer.
POST /api/common/integration-webhooks/{uuid}/test — Een ping-event — echte handtekening, echt pad, echt retryschema.
GET /api/common/integration-webhooks/{uuid}/deliveries — De meest recente afleveringen: status, pogingnummer, HTTP-code, duur, fouttag.
POST /api/common/integration-webhooks/deliveries/{uuid}/replay — Verstuurt één aflevering opnieuw: event_id BLIJFT BEHOUDEN, de aflever-id is nieuw, de payload wordt letterlijk gekopieerd.
Eventcatalogus
Elk van de 13 events hieronder wordt gedekt door een eventklasse die ECHT wordt verzonden. Er staan geen namen van het type "zou leuk zijn" in de catalogus: een event dat wordt aangekondigd maar nooit afgaat, is een event waar de integrator eeuwig op wacht, en die fout is stil. Ook deze tabel is niet met de hand geschreven — hij wordt bij elke paginaweergave uit de live catalogus opgebouwd.
invoice.payment_recorded ontbreekt BEWUST: die eventklasse bestaat in de code, maar wordt nergens vandaan verzonden. Het betalingsevent wordt toegevoegd op de dag dat de klasse echt wordt afgevuurd — niet eerder. Een event te vroeg aankondigen is erger dan het nooit toevoegen.
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)
De handtekening verifiëren
Elk verzoek bevat een header X-Logistivo-Signature: t=,v1=. De ondertekende string is "." en het algoritme is HMAC-SHA256. Het voorvoegsel v1 houdt het schema versioneerbaar: komt er ooit een tweede schema, dan bevat de header t=…,v1=…,v2=… en kies je degene die je kent.
We publiceren twee referentie-ontvangers zonder afhankelijkheden, één voor Node en één voor gewoon PHP. Beide passen de vier regels hierboven toe en testen zichzelf met --selftest: geldige handtekening, gemanipuleerde body, verkeerd secret, tijdstempel buiten het venster, misvormde header, de valkuil van het opnieuw serialiseren en beide soorten herhaling (dezelfde aflevering / hetzelfde feit). De verifier is de exacte tegenhanger van de code die we zelf gebruiken — we consumeren het contract dat we publiceren.
Verifieer de RUWE body — De handtekening wordt over bytes berekend. De body decoderen en opnieuw serialiseren (JSON.stringify(req.body), json_encode($request->all())) maakt van dezelfde DATA andere BYTES en dan klopt de handtekening niet meer. In Node zit de valkuil in de getalnotatie (1.50 op de lijn wordt 1.5; grote gehele getallen verliezen precisie), in PHP in het escapen van tekens (/ wordt \/, İ wordt \u0130). Gebruik express.raw in Express en $request->getContent() in Laravel. Dit is verreweg de meest gemaakte fout bij het schrijven van een ontvanger.
Controleer de tijdstempel — t zit BINNEN de handtekening. Alleen de handtekening verifiëren laat iedereen die een geldig verzoek heeft onderschept, het uren later opnieuw afspelen, en de ontvanger zou het als geverifieerd event tellen. Laat elk verzoek vallen waarbij |now − t| > tolerance, ook als de handtekening klopt. Het aanbevolen venster is 300 seconden.
Vergelijk in constante tijd — hash_equals / timingSafeEqual. Vergelijken met == laat een aanvaller de handtekening byte voor byte raden.
Ontdubbel op event_id, niet op id — event_id identificeert het FEIT: het is hetzelfde voor twee abonnees die hetzelfde event ontvangen, en het BLIJFT BEHOUDEN bij een replay. id (= X-Logistivo-Delivery) identificeert de AFLEVERING en verandert bij een replay. Beantwoord "heb ik dit al verwerkt" met event_id; als je het met id beantwoordt, voert een replay hetzelfde werk twee keer uit.
Aflevering, retries en stillegging
Je ontvanger zal niet altijd bereikbaar zijn. Het spoor gaat daarvan uit: een tijdelijke fout komt in het retryschema, een permanente fout legt het abonnement stil — en de REDEN van stillegging wordt altijd vastgelegd.
De reden van stillegging is machineleesbaar en stabiel (delivery_failures, endpoint_gone, unsafe_target, key_revoked, by_user) en verschijnt zowel in het paneel als in `lg webhooks list`. Stilleggen zonder reden zou de vraag "waarom komt er niets binnen" onbeantwoordbaar maken. Opnieuw inschakelen zet de teller en de stempel terug.
Jij schrijft het adres; ONZE server doet het verzoek. Zonder controle zou een tenant die een metadata-adres van een cloud invoert, ons verzoeken kunnen laten doen vanuit ons eigen netwerk. Daarom wordt het adres gecontroleerd bij registratie en bij ELKE aflevering:
Timeouts — 8 s in totaal, 4 s om te verbinden — een trage ontvanger mag geen worker bezet houden. Zet het werk in een wachtrij en geef meteen 2xx terug.
Retryschema — 60 · 300 · 1800 · 7200 · 21600 seconden → 6 pogingen, een venster van ongeveer 8,6 uur.
De enige permanente fout: 410 Gone — Het betekent "verwijder me": geen retry, het abonnement wordt meteen stilgelegd. Geef NOOIT 410 terug bij een mislukte handtekeningcontrole.
Elke andere fout — ALLE worden opnieuw geprobeerd, 4xx inbegrepen. Een zakelijk event verliezen kost meer dan een paar extra verzoeken: een ontvanger die 403 teruggeeft terwijl er een WAF-regel wordt bijgewerkt, zou op een spoor dat 4xx als permanent behandelt stilletjes een event "factuur uitgegeven" verliezen.
Retry-After — Gerespecteerd bij 429 en 503 (maximaal 6 uur).
Redirects — WORDEN NIET gevolgd. Via een 302 naar een intern adres springen zou de adrescontrole via een tweede route doorbreken.
Automatische stillegging — Na 10 opeenvolgende uitgeputte afleveringen. Een 410, een onveilig doel en het intrekken van de gekoppelde integratiesleutel leggen ONMIDDELLIJK stil.
alleen https, alleen poorten 443/8443, ingebedde inloggegevens (https://user:pass@…) worden geweigerd;
localhost, namen met één label en interne achtervoegsels zoals .internal / .local / .svc worden geweigerd — de intentie wordt geweigerd nog voordat naar het resolutieresultaat wordt gekeken, dus split-horizon-DNS kan de controle niet doorbreken;
IP-literals en ALLE records van de DNS-resolutie moeten publiek zijn. Resolveert een naam naar zowel een publiek als een privéadres, dan vraagt niemand ons welke we moeten kiezen → de naam wordt meteen geweigerd;
bij de aflevering wordt het adres één keer geresolved en wordt de verbinding vastgepind op het geverifieerde adres: het venster voor DNS-rebinding is gesloten;
de response-BODY van de ontvanger wordt nergens opgeslagen (alleen statuscode, duur en een korte fouttag) — dus het "lees"-pad, waaraan een gat in de adrescontrole in de praktijk zijn waarde ontleent, blijft dicht.
Er is bewust GEEN configuratieschakelaar om "privéadressen toe te staan": zo'n schakelaar blijft op een dag per ongeluk aan staan.
Slechts ÉÉN keer teruggegeven, alleen wanneer het abonnement wordt aangemaakt en bij rotate-secret. Het wordt versleuteld op de server opgeslagen en kan nooit worden teruggelezen; er is geen "opnieuw tonen".
lg drukt het af op het scherm en laat het daar — het schrijft het naar geen enkel configuratie- of cachebestand.
Ben je het kwijt, dan roteer je het; de oude waarde werkt OP DAT MOMENT niet meer. Voor een naadloze overgang moet je ontvanger tijdens de overgang beide secrets proberen.
Het adres wijzigen raakt het secret NIET: routineonderhoud zoals "de URL is verhuisd" mag de verificatie aan de ontvangende kant niet breken.
Gezondheid en status: niemand zou een stille koppeling eerder moeten opmerken dan jij
Een integratiekoppeling sterft zelden met veel lawaai. Meestal wordt ze stil in de kleine uurtjes: een token verloopt, de persoon namens wie de sleutel draait, verlaat het team, een scope wordt versmald, of het ontvangende endpoint begint 403 terug te geven. Wie het als eerste merkt, is bijna altijd de klant. lg status bestaat om die volgorde om te draaien.
Eén commando beantwoordt twee vragen tegelijk, omdat tijdens een storing beide op hetzelfde moment worden gesteld: is het platform in de lucht, en is mijn koppeling gezond. De platformregel werkt zonder token — tijdens een storing is het token zelf de eerste verdachte, en de statusvraag daaraan koppelen zou je zonder antwoord laten precies wanneer je er een nodig hebt.
De gezondheidssamenvatting houdt geen nieuw logboek bij; ze vat drie bestaande bronnen samen in één zin: de dagelijkse gebruiksteller (hoeveel je hebt aangeroepen en hoeveel er mislukte), het verzoekenlogboek (welk verzoek, wanneer, en waarom het werd geweigerd) en het afleveringslogboek van de uitgaande webhooks (heeft het event de ontvanger bereikt). Het foutpercentage wordt altijd uit de dagelijkse teller gelezen; het detaillogboek is begrensd en zegt dat duidelijk wanneer de grens is bereikt.
Dezelfde samenvatting verschijnt in het paneel: onder Settings › Integration › Keys heeft elke rij een badge met daaronder de reden. Drempels worden niet aan de clientkant berekend; welk niveau de server ook toekent, dat tonen zowel het paneel als lg status, zodat de twee schermen nooit verschillende dingen over dezelfde sleutel kunnen zeggen.
Je watchdog heeft geen token nodig. Het endpoint geeft alleen statuswoorden terug; het bevat geen versie, hostnaam, wachtrijnaam, aantal jobs, fouttekst of klantgegevens — en dat kan het ook niet.
De gezondheidssamenvatting wordt met een constant aantal queries per verzoek geproduceerd; het aantal queries groeit niet met het aantal sleutels. Lees voor details de recente verzoeken van die sleutel met lg logs en de uitgaande koppeling met lg webhooks list.
GEZOND — Geen gemeten fout en we hebben bewijs van succes: een geslaagde aanroep in het logboek, of verkeer dat in de teller foutloos bleef.
AANDACHT — Er begint iets te haperen: het foutpercentage of de reeks opeenvolgende mislukkingen heeft een drempel overschreden, verzoeken worden bij de controle geweigerd, de sleutel verloopt binnenkort, of een koppeling die regelmatig van zich liet horen, is stil geworden.
FALEND — De koppeling werkt op dit moment niet: het token werd onbedoeld ingetrokken, een gesloten sleutel wordt nog steeds aangeroepen, er zijn vijf mislukkingen op rij, het foutpercentage ligt boven vijftig procent, of een webhookabonnement werd stilgelegd.
GESLOTEN — De sleutel werd bewust gesloten en niemand roept hem aan. Dat is een beslissing, geen fout — en hij wordt niet rood gekleurd.
GEEN DATA — Er is geen meting: de sleutel is nooit aangeroepen, of de meting zelf is mislukt. Geen van beide is groen.
Geen vals groen. De badge Gezond vereist gemeten bewijs van succes; een sleutel die nooit is aangeroepen, wordt nooit groen, omdat geen enkele meting laat zien dat hij werkt.
Geen vals rood. Sleutels die je bewust hebt gesloten, worden getoond als Gesloten. Alles rood kleuren maakt rood betekenisloos; een gesloten sleutel wordt alleen rood als hij na het sluiten nog wordt aangeroepen — en dan is er echt een koppeling kapot.
Niet kunnen meten is niet hetzelfde als geen data. Mislukt een query aan de serverkant, dan toont de rij niet stilletjes nul; ze zegt dat de meting niet kon worden uitgevoerd.
Stilte wordt altijd gemeld, maar nooit blind omgezet in een waarschuwing. Een koppeling voor de maandafsluiting die dertig uur stil is, is normaal; een koppeling die op minstens vijf van de laatste zeven dagen van zich liet horen en stil wordt, is een fout. Het ritme wordt gemeten, niet aangenomen.
De statusquery zelf vervuilt de gezondheidscijfers niet. Aanroepen van lg status verschijnen in het verzoekenlogboek, maar worden buiten de gezondheidsberekening gehouden — anders zou je eigen geslaagde statusquery de reeks mislukkingen resetten en precies de fout verbergen die het scherm moet laten zien.
Elke regel wordt gemeten: er wordt een echte query op de database uitgevoerd, de commandocatalogus wordt echt opgebouwd, het live record van de queue worker wordt echt gelezen. Er wordt niets aangenomen.
Het antwoord zelf is ook een meting: als je de body kunt lezen, is de weblaag in de lucht.
Het hoogste niveau wordt alleen afgeleid van vereiste componenten. Stopt de wachtrij, dan is het antwoord degraded, niet down — een synchrone API-aanroep heeft de wachtrij niet nodig, en het platform down verklaren zou een vals alarm zijn.
Als de toestand van de wachtrij niet kan worden gemeten, blijft het hoogste niveau intact: iets niet weten is niet hetzelfde als meten dat er iets kapot is.
Ligt het platform plat, dan geeft het endpoint HTTP 503 terug. De body is envelopvrij, zodat monitoringtools kunnen alarmeren zonder hem te parseren, en het antwoord wordt nooit in een cache opgeslagen.
Fouten en exitcodes
Waar een machine op vertakt, is een stabiele string. De tekst in het veld error is bedoeld voor een mens, is gelokaliseerd en verandert zonder aankondiging — een integratie die op berichttekst vertakt, wordt niet ondersteund, en als ze breekt, is dat geen bug.
Twee taxonomieën, twee velden. error_code is de transportlaag (de tabel hierboven) en is waar je eerst op vertakt. error_key is de stabiele bedrijfsregelsleutel binnen failed — INSUFFICIENT_CREDITS, NOT_FOUND, DUPLICATE_CONTACT, INSUFFICIENT_STOCK — gepubliceerd als woordenboek in de catalogus (error_keys) en hieronder. Een commando dat nog geen sleutel afgeeft, geeft error_key: null terug; behandel een sleutel die niet in het woordenboek staat als een generieke fout.
ok — HTTP 200 · error_code — · CLI 0 · —
replayed — HTTP 200 · error_code — · CLI 0 · Idempotente replay; het werk is NIET opnieuw uitgevoerd.
failed — HTTP 422 · error_code failed · CLI 1 · Nee — een bedrijfsregel heeft het afgewezen (zie error_key). Zinloos zolang het argument niet verandert.
idempotency_conflict — HTTP 409 · error_code idempotency_conflict · CLI 2 · Nee — de sleutel werd eerst voor een ander commando gebruikt (conflicting_command). Maak een nieuwe sleutel aan.
forbidden — HTTP 403 · error_code forbidden · CLI 3 · Nee — rolcontrole, of een sleutel met leesscope bij een schrijvend commando.
(schema) — HTTP 422 · error_code invalid_request · CLI 2 · Nee — de request body of een argument is niet door de schemavalidatie gekomen (errors{}); geen bedrijfsregel.
server_error — HTTP 500 · error_code server_error · CLI 6 · Ja — exponential backoff met DEZELFDE idempotency key; de sleutel werd niet vergrendeld.
401 unauthenticated — Het token is verlopen of ingetrokken. Opnieuw proberen helpt niet; het token moet worden vervangen.
429 rate_limited — Rate limit bereikt voor dit token. Het antwoord bevat altijd Retry-After en een body met retry_after, limit en bucket; respecteer dat in plaats van een vaste vertraging te verzinnen. lg wacht en probeert het tot drie keer opnieuw, en stopt daarna met exitcode 5.
5xx server_error / netwerkfout — Probeer opnieuw met exponential backoff en DEZELFDE idempotency key. De sleutel wijzigen voert werk opnieuw uit dat de server misschien al heeft afgerond. lg probeert drie keer opnieuw (1 s, 2 s, 4 s) en stopt daarna met exitcode 6 en error_code network_error of server_error.
Stabiliteitsbelofte
De duurste vraag in een integratiecontract is “draait de code die ik vandaag schrijf morgen nog?” Eén getal beantwoordt die: contract_version in de catalogus, en de header X-Contract-Version bij elk antwoord. Het beantwoordt precies één vraag — draait eerder geschreven code nog ongewijzigd? Als het getal niet is gestegen: ja. Als het wel is gestegen: nee — iets waarop je vertrouwde, is verwijderd of versmald.
Omdat een aankondiging niets verwijdert: je bestaande code draait de dag erna precies zoals ervoor. Bij een aankondiging de versie verhogen zou twee signalen geven voor één wijziging en je leren het eerste te negeren — waardoor het signaal dat er echt toe doet, verzwakt. De aankondiging reist al mee met de aanroep die je doet: deprecated_at en replaced_by op de catalogusrij, een header X-Deprecated plus een blok deprecated in het antwoord van dat commando, en een stderr-waarschuwing van één regel als je lg gebruikt. Je hoeft niets te doen om te weten dat er iets verdwijnt; het staat al in je log.
Tussen aankondiging en verwijdering liggen minstens twee kalenderkwartalen. Gedurende het hele venster antwoordt het oude commando nog, en waarschuwt het bij elke aanroep. Wanneer een CLI-naam wordt uitgefaseerd, neemt zijn opvolger die naam over als alias: tijdens het venster bereikt de oude naam het oude commando, en op de dag dat het wordt verwijderd, komt dezelfde aanroep bij het nieuwe terecht — zonder dat jij een client-release hoeft uit te brengen.
preview_invoice → get_invoice (aangekondigd op 3 september 2026). get_invoice geeft hetzelfde previewblok terug en voegt de regelitems, de uitsplitsing van de belasting, geregistreerde betalingen, het resterende saldo en adressering via je eigen ERP-sleutel (external_ref) toe. preview_invoice blijft werken, net als lg invoices preview — ze waarschuwen allebei.
geen wijziging — Een nieuw commando · een nieuwe OPTIONELE parameter · een nieuw antwoordveld · een nieuwe foutsleutel · een nieuw endpoint — Niets doen. Je moet velden negeren die je niet kent; een parser die faalt op een onbekend veld, voldoet niet aan het contract.
geen wijziging — Een AANKONDIGING van uitfasering: melding dat een commando gaat verdwijnen — Je code blijft draaien. Zet een taak in je agenda — het venster is minstens 6 maanden.
stijgt — Een commando verwijderen · een oude CLI-naam uitfaseren · een antwoordveld laten vallen · een optionele parameter verplicht maken · een enum versmallen — Het betekent dat je het venster hebt gemist; de melding heeft je op drie verschillende plekken bereikt.
De API-naam van een commando (zoals list_loads) is voor altijd bevroren; dat is de naam die je in HTTP-aanroepen gebruikt.
error_code (transport) en error_key (bedrijfsregel) zijn stabiele strings. Er kunnen nieuwe verschijnen — behandel een sleutel die je niet in het woordenboek vindt als een generieke fout, niet als een breuk.
De koppeling tussen de HTTP-status en het veld status in de body ligt vast.
Het versienummer daalt nooit en is bij elk antwoord leesbaar — ook bij 304 en 429 zonder body.
De TEKST van fouten en beschrijvingen. Die is gelokaliseerd en verandert zonder aankondiging; vertakken op berichttekst wordt niet ondersteund.
De afwezigheid van velden die je niet kent. Een veld toevoegen verhoogt de versie niet.
Auto-increment-id's als bedrijfssleutels. Draag je eigen sleutel mee met external_ref.
Dynamische foutsleutels die zijn afgeleid van klassenamen; die maken geen deel uit van het contract.
Identiteitstabel van de commando's
De tabel hieronder is niet met de hand geschreven: hij wordt telkens wanneer deze pagina wordt geserveerd, gegenereerd uit het live commandoregister. Een commando dat op de server wordt toegevoegd, verschijnt hier vanzelf. De kolom "Poort" vertelt je of een commando om bevestiging vraagt en of het effect ongedaan kan worden gemaakt; de kolom "Rollen" vertelt je welke accounttypes het in hun catalogus zullen vinden. Badges markeren de commando's die een sleutel op managerniveau nodig hebben, de commando's die een bestand aannemen en de commando's die alleen vanuit lg draaien.
De API-naam (list_loads) is bevroren en zal niet veranderen; het is de naam die je in HTTP-aanroepen gebruikt. De CLI-identiteit (loads list) valt onder het versiebeleid: eenmaal aangekondigd verandert ze alleen met een versieverhoging en een migratievenster, waarin de catalogus het oude paar als alias serveert. De beschrijvingen hier komen uit het eigen record van elk commando en zijn ingekort — lees voor de volledige tekst, de parametertypes en de enum-waarden het catalogus-endpoint of voer lg help uit. Commando's die alleen voor affiliates zijn, staan hier niet; een affiliate-account ziet ze in zijn eigen catalogus.
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… (lezen · — · verlader · API: get_account_settings) [managersleutel]
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),… (schrijven · bevestigen · verlader · API: update_account_settings) [managersleutel]
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… (lezen · — · 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). (schrijven · bevestigen · 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… (schrijven · bevestigen · 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). (lezen · — · 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. (lezen · — · vervoerder · 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… (lezen · — · verlader · API: get_ai_settings) [managersleutel]
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… (schrijven · bevestigen · verlader · API: update_ai_settings) [managersleutel]
lg announcements list — Show the system announcements Logistivo sent to this user (new features, maintenance, policy changes) — newest first. (lezen · — · alle · API: list_announcements)
lg announcements mark-read — Mark system announcements as read for this user. (schrijven · — · 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). (lezen · — · alle · API: read_attachment) [neemt een bestand: 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 /… (lezen · — · 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). (schrijven · bevestigen + onomkeerbaar · alle · API: create_company_bank_account) [managersleutel]
lg bank-accounts delete — Delete one of OUR OWN company bank accounts (for example a closed account). (schrijven · bevestigen + onomkeerbaar · alle · API: delete_company_bank_account) [managersleutel]
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. (schrijven · bevestigen + onomkeerbaar · alle · API: extract_supplier_bank_accounts) [neemt een bestand: attachment_uuid]
lg bank-accounts list — List bank accounts. (lezen · — · 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). (lezen · — · 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. (schrijven · bevestigen + onomkeerbaar · alle · API: set_default_company_bank_account) [managersleutel]
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… (schrijven · bevestigen + onomkeerbaar · alle · API: decide_bank_account_verification) [managersleutel]
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. (schrijven · bevestigen + onomkeerbaar · alle · API: update_company_bank_account) [managersleutel]
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. (lezen · — · alle · API: list_banks)
lg bids accept — Accept a carrier's bid on one of this company's demands. (schrijven · bevestigen + onomkeerbaar · 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. (lezen · — · vervoerder · API: calculate_bid_earnings)
lg bids cancel — Withdraw (geri çek) one of THIS carrier company's PENDING bids. (schrijven · bevestigen + onomkeerbaar · vervoerder · 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. (schrijven · bevestigen + onomkeerbaar · vervoerder · 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,… (lezen · — · vervoerder · API: get_my_demand_bid)
lg bids list — List the bids (teklif) THIS carrier company has submitted, newest first, with their outcome. (lezen · — · vervoerder · 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). (schrijven · bevestigen + onomkeerbaar · vervoerder · 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,… (lezen · — · 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. (lezen · — · 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. (schrijven · bevestigen + onomkeerbaar · 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… (lezen · — · 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. (lezen · — · 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. (lezen · — · vervoerder · 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. (schrijven · bevestigen · vervoerder · API: set_carrier_routes) [managersleutel]
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. (lezen · — · 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). (schrijven · bevestigen + onomkeerbaar · alle · API: attach_check_to_invoices) [managersleutel]
lg checks bounce — Record that a cheque BOUNCED (came back unpaid). (schrijven · bevestigen + onomkeerbaar · 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. (schrijven · bevestigen + onomkeerbaar · alle · API: cancel_settlement_check) [managersleutel]
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. (schrijven · bevestigen + onomkeerbaar · alle · API: mark_check_collected)
lg checks create — Register a cheque in the cheque portfolio. (schrijven · bevestigen · alle · API: create_settlement_check) [managersleutel] [neemt een bestand: 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,… (lezen · — · 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… (lezen · — · 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. (schrijven · bevestigen · alle · API: detach_check_from_invoices) [managersleutel]
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… (schrijven · bevestigen + onomkeerbaar · alle · API: execute_settlement_check) [managersleutel]
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). (schrijven · bevestigen · alle · API: update_settlement_check) [managersleutel]
lg companies add-role — Add a role to this company (firmaya rol ekle): customer (shipper), carrier, customs (customs broker) or affiliate. (schrijven · bevestigen + onomkeerbaar · alle · API: add_company_role) [managersleutel]
lg companies delete-logo — Remove this company's logo (firma logosu) from the branded login portal, documents and the panel. (schrijven · bevestigen + onomkeerbaar · alle · API: delete_company_logo) [managersleutel]
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… (lezen · — · 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). (schrijven · bevestigen + onomkeerbaar · 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). (lezen · — · 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… (lezen · — · 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. (schrijven · bevestigen · vervoerder, douane-expediteur · API: set_company_brand_colors) [managersleutel]
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`. (schrijven · bevestigen + onomkeerbaar · alle · API: set_company_logo) [managersleutel] [neemt een bestand: 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… (schrijven · bevestigen · alle · API: update_company_profile) [managersleutel]
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),… (schrijven · bevestigen · alle · API: upload_company_document) [neemt een bestand: 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… (schrijven · bevestigen + onomkeerbaar · 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. (lezen · — · 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… (lezen · — · 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. (schrijven · bevestigen + onomkeerbaar · alle · API: create_company_domain) [managersleutel]
lg company-domains delete — Remove one of our UNVERIFIED company domains (e.g. added by mistake). (schrijven · bevestigen + onomkeerbaar · alle · API: delete_company_domain) [managersleutel]
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. (lezen · — · 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). (schrijven · bevestigen + onomkeerbaar · alle · API: resend_company_domain_code) [managersleutel]
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. (schrijven · bevestigen + onomkeerbaar · alle · API: verify_company_domain) [managersleutel]
lg company-relationships accept — Accept a connection proposal another company sent us (relationship_id from list_company_relationships direction=incoming). (schrijven · bevestigen + onomkeerbaar · alle · API: accept_company_relationship) [managersleutel]
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). (schrijven · bevestigen + onomkeerbaar · alle · API: create_company_relationship) [managersleutel]
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… (lezen · — · 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). (schrijven · bevestigen + onomkeerbaar · alle · API: reject_company_relationship) [managersleutel]
lg company-relationships revoke — End a company connection we are a party of (either side may end it), or withdraw a pending proposal. (schrijven · bevestigen + onomkeerbaar · alle · API: revoke_company_relationship) [managersleutel]
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. (schrijven · bevestigen · 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. (schrijven · bevestigen + onomkeerbaar · 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. (schrijven · bevestigen · 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… (schrijven · bevestigen · alle · API: archive_business_contact)
lg contacts create — Create a new business contact (cari) in the company directory. (schrijven · bevestigen · alle · API: create_business_contact)
lg contacts delete-address — Delete one of a business contact's addresses. (schrijven · bevestigen + onomkeerbaar · 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). (schrijven · bevestigen + onomkeerbaar · 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. (schrijven · bevestigen + onomkeerbaar · 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,… (lezen · — · alle · API: extract_business_contact_from_image) [neemt een bestand: 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. (lezen · — · 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. (lezen · — · alle · API: get_business_contact)
lg contacts invite — Invite a business contact to join Logistivo by e-mail. (schrijven · bevestigen + onomkeerbaar · 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. (lezen · — · 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. (lezen · — · 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… (lezen · — · 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. (lezen · — · 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. (lezen · — · 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. (schrijven · bevestigen + onomkeerbaar · alle · API: unlink_business_contact_company) [managersleutel]
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. (schrijven · bevestigen · 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. (lezen · — · 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. (schrijven · bevestigen + onomkeerbaar · 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). (schrijven · bevestigen · alle · API: set_business_contact_person_notifications)
lg contacts update — Update fields of an existing business contact. (schrijven · bevestigen · alle · API: update_business_contact)
lg contacts update-address — Correct one of a business contact's addresses. (schrijven · bevestigen · 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. (schrijven · bevestigen + onomkeerbaar · alle · API: update_business_contact_bank_account)
lg contacts update-person — Correct a contact person's details. (schrijven · bevestigen · 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… (lezen · — · 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). (schrijven · bevestigen + onomkeerbaar · alle · API: send_conversation_file) [neemt een bestand: attachment_uuid]
lg conversations add-invitation — Invite a person from ANOTHER company into a load chat by e-mail (sohbete dışarıdan davet). (schrijven · bevestigen + onomkeerbaar · alle · API: invite_to_conversation)
lg conversations add-message — Post a message into a load/bid conversation AS THIS USER (not as an assistant). (schrijven · bevestigen + onomkeerbaar · 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". (schrijven · bevestigen · 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. (schrijven · bevestigen + onomkeerbaar · 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. (lezen · — · 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. (lezen · — · 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. (lezen · — · alle · API: list_conversation_invitations)
lg conversations list-messages — Read the most recent messages of one conversation — give it a load code (e.g. (lezen · — · alle · API: list_conversation_messages)
lg conversations list-participants — Who is in this conversation — name and company of every participant. (lezen · — · 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. (schrijven · — · 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). (schrijven · bevestigen + onomkeerbaar · 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). (schrijven · bevestigen + onomkeerbaar · 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). (schrijven · bevestigen · 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. (lezen · — · 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. (lezen · — · 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. (lezen · — · 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. (lezen · — · 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. (lezen · — · 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. (lezen · — · verlader, vervoerder · 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. (lezen · — · verlader, vervoerder · 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). (lezen · — · vervoerder · API: get_demand_settings) [managersleutel]
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. (schrijven · bevestigen · vervoerder · API: update_demand_settings) [managersleutel]
lg demand-targets search — Resolve a pickup/delivery location for a demand to a target token ("5-" = district/postal area, "10-" = seaport address). (lezen · — · verlader · API: lookup_demand_target)
lg demands create — Open a freight demand (talep) so carriers can bid. (schrijven · bevestigen + onomkeerbaar · verlader · API: create_demand) [neemt een bestand: 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… (lezen · — · 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… (lezen · — · verlader · API: extract_demand_from_text)
lg demands get — Detail of ONE freight demand. (lezen · — · verlader, vervoerder · API: get_demand)
lg demands list — List freight demands (talep) this carrier is allowed to bid on, newest first. (lezen · — · vervoerder · 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. (lezen · — · 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… (lezen · — · verlader · API: get_demand_form_options)
lg demands set-status — Close (make passive) one of this company's ACTIVE demands so carriers stop bidding. (schrijven · bevestigen + onomkeerbaar · 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). (schrijven · bevestigen · verlader · API: update_demand) [neemt een bestand: 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… (schrijven · bevestigen + onomkeerbaar · alle · API: send_direct_message)
lg direct-conversations create — Start a direct chat. (schrijven · bevestigen + onomkeerbaar · 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. (lezen · — · 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). (lezen · — · 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. (lezen · — · 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… (lezen · — · 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). (schrijven · — · 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. (schrijven · bevestigen + onomkeerbaar · alle · API: delete_direct_message)
lg direct-conversations update — Rename a GROUP direct chat (private one-to-one chats have no title). (schrijven · bevestigen · 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). (schrijven · bevestigen · 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… (schrijven · — · alle · API: check_document_compliance) [neemt een bestand: 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. (lezen · — · 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). (lezen · — · 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… (lezen · — · vervoerder · 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… (lezen · — · vervoerder · 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". (lezen · — · verlader, vervoerder · 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. (lezen · — · verlader, vervoerder · 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. (schrijven · bevestigen + onomkeerbaar · verlader, vervoerder · 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. (schrijven · bevestigen · verlader, vervoerder · API: create_driver_advance) [neemt een bestand: attachment_uuid]
lg driver-advances delete — Delete a driver money movement that was entered by mistake (duplicate, wrong driver). (schrijven · bevestigen + onomkeerbaar · verlader, vervoerder · 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. (lezen · — · verlader, vervoerder · 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. (schrijven · bevestigen · verlader, vervoerder · 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". (schrijven · bevestigen · vervoerder · 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. (schrijven · bevestigen + onomkeerbaar · vervoerder · 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. (lezen · — · vervoerder · API: list_driver_availabilities)
lg driver-availabilities update — Correct one availability period (id from list_driver_availabilities): kind, dates, Schengen presence or note. (schrijven · bevestigen · vervoerder · 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… (lezen · — · verlader, vervoerder · API: get_driver_expense_settings)
lg driver-expense-settings update — Change this company's driver expense module settings — only the fields you pass change. (schrijven · bevestigen · verlader, vervoerder · API: update_driver_expense_settings) [managersleutel]
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. (schrijven · bevestigen + onomkeerbaar · verlader, vervoerder · API: process_receipt) [neemt een bestand: 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". (schrijven · bevestigen · verlader, vervoerder · API: create_driver_expense)
lg driver-expenses delete — Delete a driver expense entered by mistake (duplicate receipt, wrong driver, test entry). (schrijven · bevestigen + onomkeerbaar · verlader, vervoerder · 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. (lezen · — · verlader, vervoerder · 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. (lezen · — · verlader, vervoerder · 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. (lezen · — · verlader, vervoerder · API: get_driver_expense)
lg driver-expenses list — List driver expense receipts (fuel, toll, ferry, parking, food, repair…) with a converted total. (lezen · — · verlader, vervoerder · 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… (lezen · — · verlader, vervoerder · 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… (lezen · — · verlader, vervoerder · 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… (schrijven · bevestigen · verlader, vervoerder · 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). (schrijven · bevestigen · verlader, vervoerder · 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… (schrijven · bevestigen · verlader, vervoerder · 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). (schrijven · — · verlader, vervoerder · 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… (schrijven · bevestigen · vervoerder · 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… (schrijven · bevestigen · vervoerder · 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… (lezen · — · vervoerder · 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… (lezen · — · vervoerder · 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. (schrijven · — · vervoerder · API: dismiss_driver_schedule_suggestion)
lg driver-statements cancel — Cancel a statement that should not exist (opened by mistake, duplicated). (schrijven · bevestigen + onomkeerbaar · verlader, vervoerder · API: cancel_driver_account)
lg driver-statements create — Open a NEW draft settlement statement for a driver. (schrijven · bevestigen · verlader, vervoerder · 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… (lezen · — · verlader, vervoerder · 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. (schrijven · bevestigen + onomkeerbaar · verlader, vervoerder · API: finalize_driver_account) [managersleutel]
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… (lezen · — · verlader, vervoerder · 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… (lezen · — · verlader, vervoerder · 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). (schrijven · bevestigen · verlader, vervoerder · API: reopen_driver_account) [managersleutel]
lg driver-statements update — Change the note printed on a DRAFT driver settlement statement (e.g. "September trips, fuel excluded"). (schrijven · bevestigen · verlader, vervoerder · 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. (schrijven · bevestigen · verlader, vervoerder · 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 /… (lezen · — · verlader, vervoerder · 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. (schrijven · bevestigen · vervoerder · API: add_driver_document) [neemt een bestand: attachment_uuid]
lg drivers archive — Archive (deactivate) a driver: their account is disabled, open mobile sessions are revoked and the login link stops working. (schrijven · bevestigen + onomkeerbaar · vervoerder · 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,… (lezen · — · vervoerder · API: check_driver_for_trip)
lg drivers create — Create a new driver account for this carrier company. (schrijven · bevestigen · vervoerder · API: create_driver)
lg drivers delete-document — Remove a driver paper from the driver's file. (schrijven · bevestigen + onomkeerbaar · vervoerder · 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… (lezen · — · vervoerder · 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. (lezen · — · vervoerder · 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)… (lezen · — · vervoerder · 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. (lezen · — · vervoerder · 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. (lezen · — · vervoerder · API: list_driver_locations)
lg drivers login-link — Produce the driver's 48-hour mobile app login link (sensitive credential). (schrijven · bevestigen · vervoerder · 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"). (schrijven · — · vervoerder · API: request_driver_location)
lg drivers search — Resolve one of this company's drivers by name to its driver_id. (lezen · — · vervoerder · API: lookup_driver)
lg drivers update — Correct a driver's first/last name. (schrijven · bevestigen · vervoerder · 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. (schrijven · bevestigen · vervoerder · 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). (schrijven · bevestigen + onomkeerbaar · vervoerder · 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". (schrijven · bevestigen · alle · API: create_equipment_damage)
lg equipment-damages delete — Delete a damage record that was opened by mistake (a duplicate, the wrong vehicle). (schrijven · bevestigen + onomkeerbaar · 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". (lezen · — · 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… (lezen · — · 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. (schrijven · bevestigen · 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. (schrijven · bevestigen · 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".… (schrijven · bevestigen · alle · API: create_equipment_inspection) [neemt een bestand: photos[].attachment_uuid]
lg equipment-inspections delete — Delete an equipment inspection that was recorded by mistake (wrong vehicle, duplicate), together with its photos. (schrijven · bevestigen + onomkeerbaar · 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… (lezen · — · 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… (lezen · — · 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). (schrijven · bevestigen · 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… (lezen · — · 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". (schrijven · bevestigen · alle · API: update_equipment_settings) [managersleutel]
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. (lezen · — · alle · API: get_equipment_timeline)
lg export-documents add-item — Append a line item to an export document. (schrijven · — · alle · API: add_export_document_item)
lg export-documents create — Create a new export document draft. (schrijven · — · 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. (schrijven · — · alle · API: create_export_document_set) [neemt een bestand: attachment_uuid]
lg export-documents delete — Delete one export document of this company (draft or generated). (schrijven · bevestigen + onomkeerbaar · 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). (schrijven · — · 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. (schrijven · — · alle · API: extract_export_document_from_text) [neemt een bestand: 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. (schrijven · bevestigen + onomkeerbaar · 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. (schrijven · bevestigen + onomkeerbaar · 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. (lezen · — · 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). (lezen · — · alle · API: list_export_documents)
lg export-documents options — List the export document types and the ready-made document sets with their credit cost. (lezen · — · 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… (lezen · — · alle · API: plan_export_document_generation)
lg export-documents remove-item — Delete one line item by its 1-based position. (schrijven · — · alle · API: remove_export_document_item)
lg export-documents set — Set one or more fields on an export document draft. (schrijven · — · 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. (schrijven · — · 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. (lezen · — · 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. (lezen · — · 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). (lezen · — · verlader, vervoerder · 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. (schrijven · bevestigen + onomkeerbaar · alle · API: archive_freight_invoice)
lg freight-invoices create — Attach 1-20 freight invoices (navlun faturası) to a load. (schrijven · bevestigen · alle · API: upload_freight_invoices) [neemt een bestand: 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. (lezen · — · 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". (schrijven · bevestigen · 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… (lezen · — · verlader, vervoerder · 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. (schrijven · bevestigen · verlader, vervoerder · API: create_fuel_card)
lg fuel-cards delete — Delete a fuel / toll card (DKV, UTA, Shell…) that was entered BY MISTAKE. (schrijven · bevestigen + onomkeerbaar · verlader, vervoerder · 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. (lezen · — · verlader, vervoerder · 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. (schrijven · bevestigen · verlader, vervoerder · 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… (lezen · — · 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. (lezen · — · 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),… (lezen · — · alle · API: list_integration_keys) [managersleutel]
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). (schrijven · bevestigen + onomkeerbaar · alle · API: revoke_integration_key) [managersleutel]
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). (schrijven · bevestigen + onomkeerbaar · alle · API: invite_teammate) [managersleutel]
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. (lezen · — · alle · API: list_pending_invitations)
lg invitations resend — Re-send a pending teammate invitation e-mail and extend its expiry by 14 days. (schrijven · bevestigen + onomkeerbaar · alle · API: resend_invitation) [managersleutel]
lg invitations revoke — Cancel a pending teammate invitation so its link stops working (it can later be re-sent). (schrijven · bevestigen · alle · API: revoke_invitation) [managersleutel]
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,… (lezen · — · 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). (schrijven · bevestigen + onomkeerbaar · alle · API: create_invoice_template) [managersleutel] [neemt een bestand: logo_attachment_uuid, signature_image_attachment_uuid]
lg invoice-templates delete — Delete one of your invoice template configurations. (schrijven · bevestigen + onomkeerbaar · alle · API: delete_invoice_template) [managersleutel]
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… (lezen · — · 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. (schrijven · bevestigen · alle · API: set_default_invoice_template) [managersleutel]
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… (schrijven · bevestigen + onomkeerbaar · alle · API: update_invoice_template) [managersleutel] [neemt een bestand: 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). (schrijven · — · 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. (schrijven · bevestigen + onomkeerbaar · 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. (schrijven · bevestigen + onomkeerbaar · alle · API: cancel_invoice)
lg invoices create — Create a DRAFT invoice (reversible) issued by the current company to a recipient business contact. (schrijven · — · alle · API: create_invoice_draft)
lg invoices delete-draft — Delete a DRAFT invoice of this company together with its lines and taxes. (schrijven · bevestigen + onomkeerbaar · 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). (lezen · — · 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. (lezen · — · alle · API: get_invoice)
lg invoices issue — Issue (finalize) a DRAFT invoice: assigns a number and posts accounting entries. (schrijven · bevestigen + onomkeerbaar · 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). (lezen · — · 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. (lezen · — · alle · API: preview_invoice · verouderd: 2026-09-03 · gebruik get_invoice)
lg invoices remove-line — Remove one line from a DRAFT invoice your company issued; the totals are recalculated. (schrijven · bevestigen · 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. (schrijven · bevestigen + onomkeerbaar · 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. (schrijven · — · 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). (schrijven · — · 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. (schrijven · bevestigen + onomkeerbaar · alle · API: approve_join_request) [managersleutel]
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). (lezen · — · alle · API: list_join_requests) [managersleutel]
lg join-requests reject — Reject a pending join request: the applicant does not join our company and is e-mailed the decision. (schrijven · bevestigen + onomkeerbaar · alle · API: reject_join_request) [managersleutel]
lg journal-entries create — Post a manual double-entry journal entry (yevmiye fişi). (schrijven · bevestigen + onomkeerbaar · alle · API: create_journal_entry)
lg journal-entries get — Read one journal entry with its lines (account code/name, debit, credit, counterparty) and totals. (lezen · — · alle · API: get_journal_entry)
lg journal-entries list — List journal entries (yevmiye fişleri) of the company, newest first, with optional date window. (lezen · — · alle · API: list_journal_entries)
lg language-settings get — Read the signed-in user's own language settings (dil ayarları). (lezen · — · 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". (schrijven · — · 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:… (lezen · — · 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,… (schrijven · bevestigen · alle · API: update_load_ai_settings) [managersleutel]
lg load-containers create — Add a sea container number to a load (yüke konteyner ekle) — "add MSC container MSCU1234565 to FKZ8515". (schrijven · bevestigen · verlader, vervoerder · 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). (schrijven · bevestigen + onomkeerbaar · 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. (lezen · — · 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. (lezen · — · 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… (schrijven · bevestigen · 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… (schrijven · bevestigen + onomkeerbaar · alle · API: attach_chat_file_to_load) [neemt een bestand: 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. (lezen · — · 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). (schrijven · bevestigen · verlader, vervoerder · 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. (schrijven · bevestigen + onomkeerbaar · verlader, vervoerder · 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… (schrijven · — · verlader, vervoerder · 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. (lezen · — · verlader, vervoerder · 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. (lezen · — · verlader, vervoerder · 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… (schrijven · — · verlader, vervoerder · API: optimize_trip_route)
lg load-groups remove-load — Take one consignment out of a groupage trip you own. (schrijven · bevestigen · verlader, vervoerder · 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. (schrijven · bevestigen + onomkeerbaar · 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. (lezen · — · 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". (schrijven · bevestigen + onomkeerbaar · vervoerder · 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". (lezen · — · 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… (lezen · — · 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). (lezen · — · 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". (schrijven · bevestigen + onomkeerbaar · 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". (schrijven · bevestigen + onomkeerbaar · 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). (schrijven · bevestigen · 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. (schrijven · bevestigen · 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… (lezen · — · 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). (schrijven · bevestigen · 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. (schrijven · bevestigen · 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… (schrijven · bevestigen · 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). (schrijven · bevestigen · 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. (lezen · — · 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". (schrijven · — · 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… (lezen · — · 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. (lezen · — · alle · API: get_load_report_options)
lg load-types search — Resolve a load/transport type (e.g. (lezen · — · 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. (schrijven · bevestigen · 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. (lezen · — · 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). (schrijven · bevestigen · 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. (schrijven · bevestigen + onomkeerbaar · 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. (schrijven · — · 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". (schrijven · bevestigen + onomkeerbaar · 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. (schrijven · bevestigen · vervoerder · 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. (lezen · — · 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… (schrijven · bevestigen · alle · API: resolve_load_problem_flag)
lg loads create — Open a freight load (yük). (schrijven · bevestigen + onomkeerbaar · 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". (lezen · — · 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… (lezen · — · 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… (lezen · — · alle · API: get_load)
lg loads list — List the freight loads (yük) this company can see, newest first. (lezen · — · 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. (lezen · — · 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… (lezen · — · 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). (lezen · — · 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). (lezen · — · 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… (lezen · — · 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". (schrijven · — · 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?". (lezen · — · 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… (lezen · — · 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. (schrijven · bevestigen · vervoerder · 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… (lezen · — · 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). (schrijven · bevestigen + onomkeerbaar · vervoerder · 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". (schrijven · bevestigen · vervoerder · 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". (schrijven · bevestigen · vervoerder · 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. (schrijven · bevestigen + onomkeerbaar · 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. (lezen · — · 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… (lezen · — · verlader · API: get_notification_settings) [managersleutel]
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… (schrijven · bevestigen · verlader · API: update_notification_settings) [managersleutel]
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. (lezen · — · alle · API: list_notifications)
lg notifications mark-read — Mark ALL of the signed-in user's unread notifications as read (empty the bell). (schrijven · — · 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… (lezen · — · 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… (lezen · — · 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). (schrijven · bevestigen · 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). (schrijven · — · alle · API: add_pallet_proof) [neemt een bestand: 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… (lezen · — · 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. (schrijven · bevestigen · alle · API: create_pallet)
lg pallets delete — Delete one of this company's pallet records. (schrijven · bevestigen + onomkeerbaar · alle · API: delete_pallet)
lg pallets delete-proof — Remove one proof photo from one of this company's pallets. (schrijven · bevestigen + onomkeerbaar · 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. (schrijven · — · alle · API: extract_pallet_from_photos) [neemt een bestand: 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… (lezen · — · 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. (lezen · — · 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. (schrijven · bevestigen · alle · API: update_pallet)
lg parasut-contacts create — Create a new customer or supplier contact IN PARAŞÜT and keep its local copy. (schrijven · bevestigen + onomkeerbaar · 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,… (lezen · — · 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… (schrijven · bevestigen + onomkeerbaar · 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,… (lezen · — · 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… (lezen · — · 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,… (schrijven · bevestigen + onomkeerbaar · alle · API: disconnect_parasut) [managersleutel]
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… (lezen · — · alle · API: get_parasut_settings) [managersleutel]
lg parasut-settings update — Connect this company's Paraşüt account or renew its credentials (replaces an existing connection). (schrijven · bevestigen · alle · API: connect_parasut) [managersleutel] [alleen 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. (lezen · — · alle · API: list_payables)
lg payment-cards delete — Remove a saved payment card (card_id from list_payment_cards). (schrijven · bevestigen + onomkeerbaar · alle · API: delete_payment_card) [managersleutel]
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. (lezen · — · 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. (schrijven · bevestigen + onomkeerbaar · alle · API: set_default_payment_card) [managersleutel]
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". (schrijven · bevestigen + onomkeerbaar · alle · API: cancel_settlement_instruction)
lg payment-instructions download — Get the bank payment instruction document (PDF) with a short-lived download link. (lezen · — · 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… (lezen · — · 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. (lezen · — · 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… (schrijven · bevestigen + onomkeerbaar · 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… (lezen · — · vervoerder · API: get_planning_board)
lg plans archive — Close a plan because the user says the work is finished or abandoned. (schrijven · — · 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"). (schrijven · bevestigen · 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. (lezen · — · alle · API: get_plan)
lg plans list — List this company's plans, newest first. (lezen · — · alle · API: list_plans)
lg ports search — Find a seaport by name or UN/LOCODE (liman ara) — "Mersin", "TRMER", "Trieste". (lezen · — · 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"). (schrijven · — · alle · API: remember_preference)
lg preferences delete — Forget one stored preference of this user. (schrijven · — · alle · API: forget_preference)
lg preferences list — List what you have been asked to remember about THIS user, with the labels. (lezen · — · alle · API: list_preferences)
lg product-brands create — Create a new product brand for this company (the panel's "new brand"). (schrijven · bevestigen · verlader · API: create_product_brand)
lg product-brands list — List this company's product brands (id, name, code, active flag, number of products). (lezen · — · verlader · API: list_product_brands)
lg product-categories create — Create a new product category for this company (the panel's "new category"). (schrijven · bevestigen · verlader · API: create_product_category)
lg product-categories list — List this company's product categories (id, name, code, active flag, number of products). (lezen · — · verlader · API: list_product_categories)
lg products add-image — Add a photo to a product's gallery. (schrijven · — · verlader · API: add_product_image) [neemt een bestand: 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. (schrijven · bevestigen · verlader · API: create_product)
lg products delete — Delete a product from this company's catalogue. (schrijven · bevestigen + onomkeerbaar · verlader · API: delete_product)
lg products delete-image — Remove one photo from a product's gallery (image_id from get_product). (schrijven · bevestigen + onomkeerbaar · 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. (schrijven · — · verlader · API: extract_product_from_photos) [neemt een bestand: 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 /… (lezen · — · 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. (lezen · — · 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. (lezen · — · 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). (lezen · — · verlader · API: get_product_options)
lg products search — Resolve a product to its product_id + on-hand quantity. (lezen · — · verlader · API: lookup_product)
lg products set-primary-image — Make one of a product's photos its cover image (image_id from get_product). (schrijven · — · 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. (schrijven · bevestigen · 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). (lezen · — · 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. (lezen · — · 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. (lezen · — · 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… (lezen · — · alle · API: get_accounting_report)
lg reservations approve — As the warehouse owner, approve a pending reservation received at your warehouse (the booker is notified). (schrijven · bevestigen · 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. (schrijven · bevestigen + onomkeerbaar · 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). (schrijven · bevestigen + onomkeerbaar · verlader · API: complete_reservation)
lg reservations create — Book a warehouse dock time slot. (schrijven · bevestigen · 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. (lezen · — · 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… (lezen · — · alle · API: list_reservations)
lg reservations list-slots — Available dock time slots of one day with remaining capacity. (lezen · — · 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. (schrijven · bevestigen + onomkeerbaar · 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. (schrijven · bevestigen · 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. (lezen · — · vervoerder · API: list_nearby_roro_routes)
lg roro-routes select — Select the Ro-Ro (ferry) line a load you are carrying will use. (schrijven · bevestigen · vervoerder · API: select_roro_route)
lg roro-routes set-required — Mark whether a load you are carrying will travel by Ro-Ro (ferry) or not. (schrijven · bevestigen · vervoerder · 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). (schrijven · bevestigen · vervoerder · 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… (schrijven · bevestigen · vervoerder · 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). (schrijven · bevestigen · vervoerder · API: create_route_plan)
lg route-plans delete — Cancel and delete a route plan (route_plan_id or route_plan_code). (schrijven · bevestigen + onomkeerbaar · vervoerder · 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… (lezen · — · vervoerder · 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. (lezen · — · vervoerder · 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 /… (schrijven · bevestigen · vervoerder · 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. (schrijven · bevestigen · vervoerder · 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. (schrijven · bevestigen · vervoerder · 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. (schrijven · bevestigen · vervoerder · 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 /… (lezen · — · vervoerder · 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). (schrijven · bevestigen · vervoerder · API: import_driver_schengen_periods) [neemt een bestand: 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). (lezen · — · vervoerder · 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… (lezen · — · vervoerder · 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… (lezen · — · vervoerder · 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. (lezen · — · vervoerder · 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). (schrijven · bevestigen + onomkeerbaar · vervoerder · 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"… (schrijven · bevestigen · vervoerder · 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. (schrijven · bevestigen · vervoerder · API: set_driver_schengen_exemption)
lg settlements cancel — CANCEL a bulk collection / payment (settlement batch). (schrijven · bevestigen + onomkeerbaar · alle · API: cancel_settlement_batch) [managersleutel]
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… (schrijven · bevestigen + onomkeerbaar · 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,… (lezen · — · alle · API: get_settlement_batch)
lg settlements list — List bulk collection/payment batches (code, direction, instrument, contact, currency, total, value date, status), newest first. (lezen · — · 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… (lezen · — · 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… (lezen · — · 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… (lezen · — · 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". (schrijven · bevestigen · verlader, vervoerder · API: track_ship_for_load)
lg ship-trackings delete — Stop tracking a ship on a load (gemi takibini durdur). (schrijven · bevestigen · verlader, vervoerder · 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". (lezen · — · 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". (lezen · — · 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. (schrijven · bevestigen + onomkeerbaar · verlader · API: create_stock_adjustment)
lg stock list — Read current on-hand stock levels. (lezen · — · 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. (lezen · — · verlader · API: list_stock_movements)
lg stock move — Record a stock movement: inbound (giriş), outbound (çıkış), or transfer between locations. (schrijven · bevestigen + onomkeerbaar · 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. (lezen · — · 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. (schrijven · bevestigen · verlader · API: create_sub_company) [managersleutel]
lg sub-companies delete — Delete one of this customer company's group / sub companies (alt firma) by sub_company_id from list_sub_companies. (schrijven · bevestigen + onomkeerbaar · verlader · API: delete_sub_company) [managersleutel]
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. (lezen · — · 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?". (lezen · — · alle · API: get_tariff_chapter)
lg tariff-matrices get — FREE. (lezen · — · alle · API: get_tariff_matrix)
lg tariff-matrices list — FREE. (lezen · — · alle · API: list_tariff_matrix_runs)
lg tariff-matrices preview — FREE. (lezen · — · 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. (schrijven · bevestigen + onomkeerbaar · alle · API: run_tariff_matrix)
lg tariffs coverage — FREE. (lezen · — · 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. (schrijven · — · alle · API: extract_tariff_codes_from_invoice) [neemt een bestand: 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. (lezen · — · 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). (schrijven · bevestigen + onomkeerbaar · 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. (lezen · — · 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. (lezen · — · alle · API: lookup_tariff_code)
lg teammates delete — Remove a person from the company team. (schrijven · bevestigen + onomkeerbaar · alle · API: remove_teammate) [managersleutel]
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… (lezen · — · 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). (schrijven · bevestigen · alle · API: update_teammate_role) [managersleutel]
lg teammates set-status — Activate or deactivate a team member. (schrijven · bevestigen · alle · API: set_teammate_status) [managersleutel]
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). (schrijven · bevestigen + onomkeerbaar · vervoerder · API: submit_tender_bid) [neemt een bestand: 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. (lezen · — · vervoerder · 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. (schrijven · bevestigen + onomkeerbaar · 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). (schrijven · bevestigen · verlader · API: add_tender_document) [neemt een bestand: 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). (schrijven · bevestigen · verlader · API: create_tender) [neemt een bestand: attachment_uuid]
lg tenders delete-document — Remove a specification file from one of YOUR tenders (document_id from get_tender → documents[]). (schrijven · bevestigen + onomkeerbaar · 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). (lezen · — · verlader · API: extract_tender_specification) [neemt een bestand: 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. (schrijven · bevestigen · 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. (lezen · — · verlader, vervoerder · API: get_tender)
lg tenders list — List document-based freight tenders. (lezen · — · verlader, vervoerder · 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. (schrijven · bevestigen · 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. (lezen · — · 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… (lezen · — · 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… (lezen · — · alle · API: preview_account_closure)
lg users get — Who am I? (lezen · — · 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. (schrijven · bevestigen · verlader, vervoerder · API: assign_vehicle_to_driver)
lg vehicle-assignments list — List which driver currently holds which vehicle (tractor unit / trailer). (lezen · — · verlader, vervoerder · API: list_vehicle_assignments)
lg vehicle-assignments revoke — Close an open vehicle assignment: the driver hands the vehicle back. (schrijven · bevestigen · verlader, vervoerder · 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. (schrijven · bevestigen · verlader, vervoerder · API: create_vehicle_expense) [neemt een bestand: attachment_uuid]
lg vehicle-expenses delete — Delete a vehicle cost entered by mistake (duplicate, wrong plate, test entry). (schrijven · bevestigen + onomkeerbaar · verlader, vervoerder · 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. (lezen · — · verlader, vervoerder · 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". (schrijven · bevestigen · verlader, vervoerder · 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… (schrijven · bevestigen · verlader, vervoerder · API: add_vehicle_document) [neemt een bestand: attachment_uuid]
lg vehicles archive — Take a vehicle out of service (archive it) or put an archived one back into service. (schrijven · bevestigen · verlader, vervoerder · 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. (schrijven · bevestigen · verlader, vervoerder · API: create_vehicle) [neemt een bestand: attachment_uuid]
lg vehicles delete — Delete a vehicle record that was created BY MISTAKE (wrong plate, duplicate). (schrijven · bevestigen + onomkeerbaar · verlader, vervoerder · 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). (schrijven · bevestigen + onomkeerbaar · verlader, vervoerder · 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… (lezen · — · verlader, vervoerder · 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… (lezen · — · verlader, vervoerder · 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. (lezen · — · verlader, vervoerder · API: lookup_vehicle)
lg vehicles update — Correct a fleet vehicle's fields: plate, kind, brand, model, model year, VIN or note. (schrijven · bevestigen · verlader, vervoerder · 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… (schrijven · bevestigen · verlader, vervoerder · API: update_vehicle_document)
lg wallets get — Read this company's Logistivo WALLET balance — the prepaid MONEY balance (amount + currency). (lezen · — · 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. (lezen · — · 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). (schrijven · bevestigen · verlader · API: create_warehouse_area)
lg warehouse-areas delete — Delete one area/ramp of a warehouse. (schrijven · bevestigen + onomkeerbaar · 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. (schrijven · bevestigen · 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). (schrijven · bevestigen · 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. (lezen · — · 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). (schrijven · bevestigen + onomkeerbaar · verlader · API: revoke_warehouse_link)
lg warehouse-links set-status — Turn a warehouse booking link off (nobody can book through it) or back on. (schrijven · bevestigen · 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. (schrijven · bevestigen · verlader · API: create_warehouse)
lg warehouses delete — Delete one of this company's warehouses. (schrijven · bevestigen + onomkeerbaar · 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… (lezen · — · 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. (lezen · — · verlader · API: list_warehouses)
lg warehouses search — Resolve a warehouse by name to its warehouse_id, with its areas. (lezen · — · 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). (schrijven · bevestigen · 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. (schrijven · bevestigen · verlader · API: update_warehouse)
ERP- en CRM-integratie — Identiteit: geen serviceaccounts, maar een echte gebruiker
Een ERP of CRM maakt verbinding met Logistivo als een echte bedrijfsgebruiker met een persoonlijk access token dat in het paneel is aangemaakt. Een synthetisch serviceaccount — zonder bedrijf, vrijgesteld van scoping, zonder iemand die ervoor verantwoordelijk is — wordt nooit aangemaakt.
Dit is architectuur, geen voorkeur. Multi-tenant-isolatie rust volledig op het bedrijf van de gebruiker; voor een identiteit zonder bedrijf wordt de isolatiescope inert, en één verkeerde query met dat token leest gegevens die er niet bij horen. De tweede reden is audit: de gebruikerskolom in het logboek koppelt "wie heeft dit uitgevoerd" aan een persoon; een serviceaccount maakt die kolom betekenisloos en laat een integratie die facturen uitgeeft zonder eigenaar achter. De derde is intrekking: als een token bij een persoon hoort, valt de integratie stil wanneer die persoon vertrekt. Een koppeling zonder eigenaar is de koppeling die jarenlang stilletjes blijft schrijven.
In de praktijk: het bedrijf maakt in het paneel een normale gebruiker aan (bijvoorbeeld "ERP-koppeling", in eigendom van een met naam genoemde medewerker), geeft die een beperkte rol, maakt een token aan vanuit de sessie van die gebruiker en zet het in het ERP.
Die gebruiker is zichtbaar in het rechtensysteem, zijn rechten kunnen worden ingeperkt en zijn token kan afzonderlijk worden ingetrokken. Wat verboden is, is niet een account aanmaken — het is een account aanmaken dat niet aan een tenant gebonden is.
Eén integratie per token. Delen twee systemen een token, dan is de granulariteit van intrekking weg: het CRM afsluiten betekent ook het ERP afsluiten.
ERP- en CRM-integratie — Versiebeheer en uitfasering
Het catalogusantwoord bevat een integer contract_version; commandorijen bevatten since, deprecated_at en replaced_by. De contractversie stijgt alleen bij brekende wijzigingen.
De versie stijgt NIET bij: een nieuw commando, een nieuwe optionele parameter, een nieuw veld in een antwoord. Een consument moet velden negeren die hij niet kent; een client die een fout geeft op een onbekend veld, voldoet niet aan het contract.
De versie stijgt WEL bij: een commando verwijderen of hernoemen, een antwoordveld verwijderen, een optionele parameter verplicht maken, een enum versmallen. De oude vorm blijft minstens twee kalenderkwartalen (6 maanden) in leven met deprecated_at en replaced_by.
Uitfasering wordt aangekondigd in de catalogus, niet alleen in een changelog. Omdat de client zichzelf uit de catalogus opbouwt, drukt een commando met een ingestelde deprecated_at een waarschuwing af zonder enige client-release, en de integrator ziet die in zijn logs.
De API-naam is voor altijd bevroren. De CLI-identiteit (domain/verb) kon vóór de aankondiging vrij opnieuw worden ingedeeld; na de aankondiging verandert ze alleen met een versieverhoging en een migratievenster, waarin het oude paar als alias wordt geserveerd.
In de praktijk: het catalogusantwoord en de header X-Contract-Version dragen de versie; elke commandorij draagt since, deprecated_at, replaced_by en aliases (oude domain/verb-paren). Een verouderd commando aanroepen werkt nog steeds en antwoordt met een header X-Deprecated: name; deprecated_at=…; replaced_by=… plus een object deprecated in de body. ?domain= op de catalogus zet een oud aliasdomein om naar het huidige commando.
Een client die versie 1 begrijpt en een hoger getal tegenkomt, moet een waarschuwing loggen en doorgaan; lg doet precies dat. De uitfaseringen die van kracht zijn, staan in de stabiliteitsbelofte hierboven.
ERP- en CRM-integratie — Stabiele identifiers: geef je ERP nooit een auto-increment-id als sleutel
Interne auto-increment-id's zijn ondoorzichtig en gebonden aan de tenant: de geldige id van een ander bedrijf geeft jou "niet gevonden", geen data. Maar ondoorzichtig zijn maakt ze nog geen bedrijfssleutels. Wat een ERP in zijn eigen record opslaat, moet een bedrijfssleutel zijn.
Lading: code (de klantcode, bijv. FSK2158). loads get werkt al op code.
Land: ISO 3166-1 alpha-2. countries search geeft de code terug.
HS / tarief: de code zelf — de nomenclatuur is al universeel.
Factuur: het factuurnummer, zodra de factuur is uitgegeven. Een concept heeft alleen een surface-id, en een concept-id is GEEN bedrijfssleutel — het ERP moet zijn eigen referentie meedragen en nooit een concept-id opslaan.
Product, magazijn, contact: vandaag alleen een surface-id. De regel voor nieuwe commando's is expliciet: elk commando dat een surface-id teruggeeft, geeft ook de eigen bedrijfssleutel van de tenant terug (SKU, code, belastingnummer), zodat het ERP aan zijn kant kan matchen.
ERP- en CRM-integratie — Paginering, filtering en incrementele sync
Lijstcommando's nemen limit aan en geven count terug. Voor een nachtelijke sync verbindt het contract zich aan het volgende; een lijstcommando dat het heeft overgenomen, kondigt cursor en updated_since aan in zijn JSON Schema, en zolang dat niet zo is, behandel je het als een klein venster (maximaal 20 rijen, geen cursor).
Verzoek: limit (1..het maximum per commando) plus cursor (ondoorzichtig, alleen vooruit, ondertekend door de server). offset wordt NIET gebruikt — in een live tabel verschuift een offset; een record dat tussen twee pagina's wordt ingevoegd, laat het ERP een rij overslaan of dubbel tellen, en dat gebeurt stilzwijgend.
Antwoord: { count, total?, next_cursor|null }. count is het aantal rijen in dit antwoord; wanneer next_cursor null is, is de lijst compleet. Geef next_cursor ongewijzigd terug — het is geen paginanummer en het is niet aan jou om het op te bouwen.
Een gemanipuleerde of vreemde cursor wordt geweigerd met 422 invalid_request; een cursor is gebonden aan het bedrijf dat hem ontving en kan geen gegevens van een andere tenant pagineren.
Filteren: de benoemde parameters in het JSON Schema, gecombineerd met AND. Er is geen vrije querytaal — een DSL zou een tweede queryoppervlak zijn dat we zouden moeten verdedigen.
Incrementele sync: updated_since (ISO-8601, UTC) plus de cursor. Sla de nieuwste updated_at op die je hebt gezien en geef die bij de volgende run terug; zonder dat haalt elk ERP elk uur alles opnieuw op.
Externe referentie: schrijvende commando's accepteren external_ref (je eigen documentsleutel), uniek per bedrijf; een tweede create met dezelfde external_ref wordt geweigerd in plaats van gedupliceerd, en list/get geven hem terug, zodat je records aan jouw kant kunt matchen.
ERP- en CRM-integratie — Rate limits
De sleutel voor de limiet is het token, niet het IP-adres: een ERP komt van achter één NAT, en een limiet op IP zou een heel bedrijf als één gebruiker tellen. Twee integraties met twee sleutels eten nooit elkaars quota op — de tweede reden voor "één integratie per sleutel".
Discovery zonder authenticatie (public/cli/catalog): 30 per minuut. Het is een woordenboek, geen databron; lees het één keer tijdens het schrijven van je koppeling, nooit in een productielus.
Catalogus-endpoints (GET common/commands, GET common/commands/{name}): 120 per minuut per token. De catalogus verandert zelden en antwoordt 304 op If-None-Match; haal hem niet vóór elk commando opnieuw op — lg cachet hem een uur.
Leescommando's (POST common/commands/{name} met read_only: true): 120 per minuut per token.
Schrijvende commando's (POST common/commands/{name} met read_only: false; ook een onbekende naam telt hier mee): 30 per minuut per token. Schrijfacties hebben bijwerkingen; een op hol geslagen lus wordt in rekening gebracht.
Commando's die credits verbruiken (credit_cost in de catalogusrij is niet nul — bijvoorbeeld tariffs inquiry en export-documents generate): de echte limiet zijn de CREDITS, niet het aantal verzoeken. Een antwoord 200 kan een credit hebben gekost.
Dagelijkse maxima per bedrijf, gedeeld met het paneel: commando's die e-mail of push sturen naar mensen buiten je bedrijf putten uit 300 uitgaande meldingen per dag, en het starten van betaalde container- of scheepstracking uit 100 per dag. Boven het maximum antwoordt een commando met DAILY_LIMIT_REACHED en retry_after; bestandsuploads hebben hun eigen maxima (zie Commando's die bestanden aannemen).
429 bevat altijd Retry-After en een body { error_code: "rate_limited", retry_after, limit, bucket }; respecteer dat in plaats van een vaste vertraging te verzinnen. De catalogus publiceert de actuele getallen onder rate_limits.
ERP- en CRM-integratie — Wat we niet zullen doen
Dit is vaak het nuttigste deel van een contract: als je weet wat er nooit komt, kun je eromheen ontwerpen.
Geen serviceaccount en geen principal die niet aan een tenant gebonden is.
Geen betaling, kaartnummer of juridische toestemming via de API of een chat. Die stappen blijven in de browser van de persoon; een commando geeft je de link.
Geen tweede pad: er is geen directe databasetoegang, geen shelltoegang en geen bulk-endpoint dat het enige handhavingspunt omzeilt. De rolcontrole, de bevestigingspoort, idempotency en het auditlogboek worden alleen daar gehandhaafd.
Vertakken op de tekst van foutmeldingen wordt niet ondersteund; de tekst is gelokaliseerd en verandert zonder aankondiging.
Geen offset-paginering.
Een surface-id als bedrijfssleutel in je ERP gebruiken wordt niet ondersteund.
Uitgaande webhooks worden niet in dit contract geperst — maar ze BESTAAN nu en zijn op deze pagina gedocumenteerd (de webhooksectie hierboven). De catalogus is een PULL-oppervlak en de eventstroom is een APART contract: eventnamen en het payloadschema worden volgens hun eigen regels geversioneerd en zijn niet gekoppeld aan de contractversie van de commandocatalogus.
De machineleesbare catalogus
Deze pagina is geschreven voor mensen. Voor een AI-assistent of een geautomatiseerde client bestaat dezelfde informatie als een gestructureerde kopie zonder authenticatie.
GET /api/public/cli/catalog vereist geen authenticatie en geeft de publieke identiteit van de commando's terug: de bevroren API-naam, de CLI-identiteit domain/verb, de beschrijving, de JSON Schema-parameters, de vlaggen read_only, confirmation_needed en irreversible, de credit_cost, en de toegangsvelden key_level, permission, file_params, secret_parameters en cli_only. Het geeft geen persoonsgegevens, geen tenantgegevens en geen voorbeeldrecords terug — alleen wat het oppervlak is.
De juiste manier waarop een externe agent het gebruikt: lees de catalogus, leg in JE EIGEN woorden uit welke taken mogelijk zijn, en verwijs de gebruiker, wanneer uitvoering nodig is, naar het uitvoeren in zijn eigen omgeving met zijn eigen token. De agent vraagt nooit om het token van een gebruiker, genereert het niet en geeft het niet door.
Logistivo koppelen aan een AI-assistent voor aanmelding en vrachtaanvragen is een apart kanaal met een eigen pagina:
De catalogus is zonder authenticatie; uitvoering niet. Er is geen manier om een commando namens een agent uit te voeren — wat er draait, is altijd de eigen identiteit van de gebruiker.
Een Logistivo-wachtwoord, verificatiecode of access token gaat nooit door een chat. Bouw geen flow die erom vraagt, er een genereert of er een doorgeeft.
Of een commando onomkeerbaar is, staat in de catalogus. Stel nooit "laten we het proberen" voor bij een commando met irreversible: true.
Commando's waarvan de credit_cost niet nul is (bijvoorbeeld tariffs inquiry en export-documents generate), hebben een monetair resultaat; roep ze niet aan in een geautomatiseerde lus.
Betalingen, kaartnummers en juridische toestemming gaan nooit via een chat of een agent. Bied in plaats daarvan de link van handoff-links generate aan; de persoon rondt de stap af in zijn eigen browser.
Een agent die met de sleutel van een gebruiker handelt, moet eerst users get aanroepen: dat geeft de rol, het toegangsniveau van de sleutel, de effectieve rechten en of een openstaande toestemming of telefoonverificatie schrijfacties blokkeert — voorspel weigeringen in plaats van ze te verzamelen.
Een platte-teksttweeling van deze pagina staat op /cli.md; gebruik die als je markdown betrouwbaarder parseert dan HTML.
De machineleesbare definitie: OpenAPI 3.1 en Postman
De catalogus hierboven is het eigen formaat van Logistivo. Dezelfde informatie wordt ook gepubliceerd in twee industriestandaarden die je tools al begrijpen: een OpenAPI 3.1-definitie en een Postman-collectie. Geen van beide is met de hand geschreven — beide worden bij elk verzoek gegenereerd uit het live commandoregister, dus ze kunnen niet verouderen.
De definitie IS de catalogus, geen tweede werkelijkheid. Elk commando verschijnt als een operatie POST /api/common/commands/; het body-schema is het eigen JSON Schema van het commando (byte voor byte wat de assistent ziet), het antwoordschema is de gedeelde envelop, de poortvlaggen (read_only, confirmation_needed, irreversible en de creditbadge) staan in de extensie x-logistivo, en de zakelijke foutsleutels staan onder x-error-keys. Een uitgefaseerd commando wordt gemarkeerd met deprecated: true en blijft gedurende zijn venster van zes maanden aanroepbaar.
Naast het commando-oppervlak staan ook de REST-endpoints die het integratiecontract dragen in de definitie: 10 lijst-endpoints met incrementele sync (updated_since + cursor + limit) en 7 schrijf-endpoints die je eigen sleutel accepteren (external_ref). Het REST-oppervlak van Logistivo is veel groter dan dat; de rest is MET OPZET weggelaten. Die payloads zijn het eigen contract van het product, en een schema dat op gissingen is gebaseerd, zou je gegenereerde client bij de eerste aanroep breken — en je zou de bug in jouw code zoeken, niet in de onze.
De definitie wordt gegenereerd voor de ROL van degene die erom vraagt: het commando van een andere rol komt nooit in het document, omdat een definitie een contract is en geen woordenboek, en alles erin met dat token aanroepbaar moet zijn. De versie zonder authenticatie is de vereniging van de drie rollen, en daar vermeldt elke operatie onder x-logistivo.roles welke rollen haar zien.
Geloof ons niet op ons woord — controleer het zelf: npx @redocly/cli lint logistivo-openapi.json slaagt met nul waarschuwingen.
GET /api/common/spec/openapi.json — De OpenAPI 3.1-definitie voor de rol van je token. Bevat een ETag; If-None-Match geeft je een 304, zodat je hem niet bij elke build opnieuw downloadt.
GET /api/common/spec/postman.json — Dezelfde scope als een Postman v2.1-collectie, met de variabelen base_url en token en mappen die al per commandodomein zijn gegroepeerd.
GET /api/public/cli/openapi.json — De versie zonder authenticatie — de vereniging van de drie rollen. Om de koppeling te ontwerpen en de kosten in te schatten voordat je een token hebt.
GET /api/public/cli/postman.json — De Postman-collectie zonder authenticatie: één bestand dat je aan je team kunt geven.
559 operaties — 519 commando's + 36 REST- en control-plane-operaties + 4 catalogus- en identiteitsendpoints. De getallen op deze pagina worden niet met de hand getypt; ze worden bij elk verzoek uit het live document geteld, dus op de dag dat een commando live gaat, stijgen ze hier ook — en de optelling klopt.
Het beveiligingsschema — bearerAuth: een Passport-token dat voor een echte gebruiker is uitgegeven. Een sleutel met leesscope mag alleen operaties aanroepen die gemarkeerd zijn met x-logistivo.read_only: true; een schrijfpoging geeft 403 VÓÓR de bevestigingspoort, dus een alleen-lezen-sleutel ziet nooit een 409.
Elke foutvertakking is uitgeschreven — Elke operatie beschrijft 401/403/404/409/422/429/500 afzonderlijk. De twee betekenissen van 409 (bevestiging vereist / idempotency-conflict) en de twee betekenissen van 422 (schemafout / zakelijke afwijzing) zijn in het document gescheiden, zodat je generator ze niet samenvoegt in één vertakking.
Geen tijdstempel — Het document bevat geen generatietijd. Dezelfde catalogus levert dezelfde bytes op, en daarom werkt de ETag echt en ziet een definitie die je in versiebeheer commit er niet bij elke download 'gewijzigd' uit.
We hebben geen productpayloads verzonnen — Bij REST-schrijf-endpoints wordt alleen het contractveld (external_ref) beschreven; de rest van de body blijft open als additionalProperties: true en de lezer wordt naar de productdocumentatie verwezen. Een definitie die onvolledig maar waar is, wint het van een die volledig maar verzonnen is.
De lijst met foutsleutels per operatie is NIET uitputtend — x-error-keys noemt alleen de sleutels die met zekerheid volgen uit het eigen record van het commando, en zegt dat met x-error-keys-exhaustive: false. Het volledige woordenboek staat in de root van het document; behandel elke sleutel die je niet herkent als een generieke fout. Een verzonnen 'volledige lijst' zou je ertoe hebben gebracht nooit de standaardvertakking te schrijven.
Discovery-tools zitten niet in de definitie — search_commands, run_command en list_capabilities bestaan alleen binnen de chatlus en kunnen niet via HTTP worden aangeroepen. Als ze waren opgenomen, zou je generator drie methoden hebben geschreven die nooit zouden kunnen werken.
Codegeneratie: een getypeerde client uit de definitie
Je hebt de definitie; genereer er nu werkende code uit. `lg codegen` leest het OpenAPI-document en schrijft een client van één bestand zonder afhankelijkheden — TypeScript (typedeclaraties plus een dunne wrapper voor aanroepen) of PHP (een clientklasse met PHPDoc-array shapes). Geen `npm install`, geen composer: `fetch` aan de TypeScript-kant, `ext-curl` aan de PHP-kant.
De generatie gebeurt op JOUW machine, niet op onze server. Dat is geen voorkeur: pin de definitie één keer vast in je repository (`lg spec --out=...`) en hetzelfde commando draait bij elke build zonder netwerk en zonder token, zodat je CI nooit afhankelijk is van onze uptime. En omdat de gegenereerde code code is die in je ERP DRAAIT, zorgt het bewaren ervan in je repository, in plaats van het ophalen via een API, ervoor dat elke wijziging zichtbaar wordt in `git diff`.
De gegenereerde client behandelt alle drie Logistivo-sporen correct, en hij leert welk spoor welk is uit het document in plaats van te gokken: elke operatie declareert haar spoor in `x-logistivo.surface`. Het commandospoor pakt de envelop `{success, data:{…}}` uit; een REST-synclijst heeft GEEN envelop en wordt teruggegeven zoals hij is (uitpakken zou `next_cursor` laten wegvallen); een REST-schrijfactie geeft de eigen productbody van het endpoint terug. Een generator voor algemeen gebruik kent dit onderscheid niet — de onze wel.
De types zijn geen giswerk: de argumentinterface van elk commando wordt gegenereerd uit precies het JSON Schema dat de assistent ziet. Verplicht blijft verplicht, enums worden union types, geneste objecten worden geneste types. In de praktijk: als de server een veld vereist, faalt de aanroep die het vergeet niet met een 422 in productie — hij faalt bij het compileren.
Er wordt geen generatietijdstempel in het bestand geschreven: dezelfde definitie met dezelfde vlaggen levert dezelfde bytes op. Opnieuw genereren maakt daardoor geen ruis in `git diff`, en het enige dat echt veranderd is — het contract — blijft zichtbaar.
1. Pin de definitie vast — De definitie wordt voor je rol gegenereerd; elke operatie erin is met dat token aanroepbaar. Commit het bestand. lg login --api-key= lg spec --out=logistivo-openapi.json
2. Genereer de client — Er komt één bestand uit, met ELKE operatie uit de definitie die je hebt vastgepind als methode: de commando's die je rol kan aanroepen, de REST-endpoints die het integratiecontract dragen, en de discovery-endpoints. Het aantal is dat van JOUW rol, niet het platformtotaal — vandaag levert een verladerssleutel 448 commandomethoden op, een vervoerder 452, een douane-expediteur 312. Genereer vanuit de publieke definitie zonder authenticatie en het maximum is 559 operaties. 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. Controleren, daarna gebruiken — Als de gegenereerde code niet compileert, ligt de fout bij ons, niet bij jou: de integriteit van de definitie wordt bewaakt door een uitvoerbare controle op de server. npx tsc --noEmit --strict --target ES2022 --module ESNext --moduleResolution bundler logistivo-client.ts php -l LogistivoClient.php
Eén methode per operatie — Elk commando in het document, elk REST-endpoint dat het integratiecontract draagt, en de discovery-endpoints. Genereer vanuit de definitie van je rol en je krijgt alleen wat je kunt aanroepen (448 commando's voor een verlader); genereer vanuit de publieke definitie en je krijgt alle 559 operaties. Op de dag dat er op de server een commando wordt toegevoegd, haalt opnieuw genereren het binnen; er is geen client-release om op te wachten.
Argumenttypes — Het `args`-schema van elk commando wordt een interface (een array shape in PHP). Verplichte velden blijven verplicht, enums worden unions. In TypeScript is een vergeten verplicht veld een compileerfout; in PHP zien je IDE en PHPStan dezelfde vorm.
Foutklassen — De transporttaxonomie (`error_code`) en de zakelijke taxonomie (`error_key`) zijn aparte velden; de bevestigingspoort en de rate limit zijn aparte fouttypes. De union van foutsleutels blijft open voor onbekende waarden — wanneer de server een nieuwe sleutel declareert, stopt je code niet met compileren, maar valt die sleutel in de vertakking `default`.
Een correct retrybeleid — Automatische retries gelden alleen voor veilige aanroepen: leesacties, en schrijfacties met een idempotency key. Een schrijfactie zonder sleutel die een timeout krijgt, betekent niet 'er is niets geschreven', dus de client herhaalt haar nooit blind. Bij een 429 wacht hij de `Retry-After` van de server af in plaats van een vertraging te verzinnen.
Resultaatbodies zijn niet getypeerd — Commandoresultaten komen terug als `unknown` (`mixed` in PHP), om dezelfde reden als in de definitie zelf: resultaatvormen zijn de zakelijke uitvoer van het commando, geen deel van het contract. Een gegokt resultaattype zou beginnen te liegen zodra er voor het eerst een veld verschuift.
Het gegenereerde bestand wordt niet met de hand bewerkt — Het is uitvoer, geen bron. Heb je extra gedrag nodig, wikkel dan de gegenereerde klasse in; alles wat je erin schrijft, gaat bij de volgende generatie verloren.
Discovery-tools worden niet gegenereerd — `search_commands`, `run_command` en `list_capabilities` leven alleen binnen de chatlus en kunnen niet via HTTP worden aangeroepen; ze ontbreken in de definitie en daarom ook in de client. Ze opnemen zou hebben betekend dat er drie methoden werden geschreven die nooit werken.
Eerlijke afbakening
We breiden deze sectie liever uit dan dat we haar inkrimpen. De waarde van een integratiecontract zit minder in wat het belooft dan in hoe duidelijk het zegt wat het niet doet.
De CLI draait in de context van een tenantgebruiker — Elk commando draait onder het bedrijf en de rol van de gebruiker wiens token wordt aangeboden. Een modus voor de platformbeheerder — een administratieve modus die over bedrijven heen leest — valt buiten dit oppervlak en wordt van hieruit niet opengesteld.
Je commandolijst hangt af van je rol — Een verladersaccount ziet 448 commando's, een vervoerder 452, een douane-expediteur 312, een affiliate 55. Ontbreekt er een commando in je catalogus, controleer dan eerst de rol; staat het erin maar wordt het geweigerd, controleer dan de scope en het toegangsniveau van de sleutel. Chauffeursaccounts hebben helemaal geen toegang tot dit oppervlak.
Sommige commando's verbruiken credits — Tariefaanvragen, documentgeneratie en een paar andere AI-gestuurde commando's putten uit het creditsaldo van je abonnement. Elke catalogusrij bevat credit_cost {mode, credits}: fixed is het exacte bedrag per aanroep, read_only kost nooit iets, en computed betekent dat de kosten van de aanroep afhangen — credits is dan null en het echte bedrag verschijnt op de bevestigingskaart. Een preflight (dry_run) vertelt je wat één aanroep zou kosten en of je saldo dat dekt.
Integratiesleutels kunnen de dashboardchat niet aansturen — De AI-assistent in het dashboard is voor mensen. Een run van de assistent starten of voortzetten met een integratiesleutel wordt geweigerd met 403; agents gebruiken de commando-endpoints, lg of het MCP-kanaal, waar elk commando op het toegangsniveau van de sleutel draait en de schrijfacties als integratieschrijfacties worden vastgelegd.
De catalogus vervangt de bestaande REST API niet — Het REST-oppervlak dat de web- en mobiele apps van Logistivo aandrijft, blijft waar het is en valt nog steeds onder de regel van achterwaartse compatibiliteit. De commandocatalogus vervangt resource-CRUD niet; hij is de laag van de WERKWOORDEN — de enige, geauditeerde manier om iets te doen.
Lijstcommando's geven vandaag kleine vensters terug — Zolang een lijstcommando cursor en updated_since niet in zijn schema aankondigt, is het maximum 20 rijen zonder cursor. Het is niet ontworpen om een volledige kopie van je gegevens te extraheren; incrementele sync wordt commando voor commando uitgerold.
Veelgestelde vragen
Waarvoor wordt de Logistivo CLI gebruikt?
Hij voert het werk in je Logistivo-account uit vanuit een terminal, een script of je eigen AI-agent: ladingen en ritten, aanvragen, biedingen en tenders, wagenpark, chauffeurs en hun onkosten, documenten, contacten en rekeningen-courant, facturen en boekhouding, magazijn en voorraad, teamleden, HS-tarieven en antidumpingrechten. Elke schrijfactie in het paneel heeft een commando; betalingen, juridische toestemming en het sluiten van een account blijven bewust in de browser. Dezelfde commando's zijn via HTTP aan te roepen voor ERP/CRM-integraties en via het MCP-kanaal.
Hoe worden commando's in de Logistivo CLI benoemd?
De vorm is lg --parameter=value. Het domein is een entiteit in het meervoud (loads, demands, invoices, export-documents) en het werkwoord komt uit een gesloten woordenschat die alleen door een bewuste beslissing groeit (list, get, create, update, search, set-status, generate enzovoort). Alle werkwoorden van één entiteit wonen in één domein, en het paar (domein, werkwoord) is uniek in de hele catalogus.
Hoe authenticeer ik me bij de CLI?
Interactief toont lg login een goedkeuringscode die je in je browser bevestigt nadat je bij Logistivo bent ingelogd — er wordt geen wachtwoord of sleutel in de terminal getypt, en de sessie blijft ingelogd en vernieuwt zichzelf totdat je lg logout uitvoert. lg login --password (e-mailadres en wachtwoord) blijft beschikbaar als terugvaloptie. Gebruik op servers en in CI een integratiesleutel die is uitgegeven in het paneel of met lg keys create: lg login --api-key slaat hem op in een lokaal profiel, of je zet hem in de omgevingsvariabele LOGISTIVO_TOKEN. Via HTTP reist het token mee in de header Authorization: Bearer.
Kan ik een serviceaccount aanmaken voor mijn ERP-integratie?
Nee. Een integratie maakt verbinding met het token van een echte bedrijfsgebruiker die in het paneel is aangemaakt. Een synthetische identiteit zonder bedrijf maakt multi-tenant-isolatie inert, maakt de kolom "wie heeft dit uitgevoerd" in het auditlogboek betekenisloos en laat een koppeling achter die niet stilvalt wanneer haar eigenaar vertrekt. Het juiste patroon is een speciale gebruiker met een beperkte rol en een met naam genoemde eigenaar.
Heeft Logistivo een testomgeving (sandbox)?
Ja, en die is selfservice: er wordt een aparte sandbox-tenant voor je bedrijf geopend — dezelfde code, dezelfde commandocatalogus, een eigen creditadministratie. De omgeving wordt afgeleid van het bedrijf van de sleutel en kan niet met het verzoek worden meegegeven; een aanroep met het verkeerde profiel stopt aan de serverkant met 403 ENVIRONMENT_MISMATCH. Een aanvraag die je in de sandbox opent, bereikt nooit echte vervoerders, een sandbox-event wordt nooit aan je live webhookabonnement afgeleverd, en je live saldo beweegt niet. Endpoints: POST /api/common/integration-sandbox (openen), POST /api/common/integration-sandbox/keys (sleutel), GET /api/common/integration-sandbox/go-live (go-live-checklist). Aan de kant van lg zijn lg --sandbox en lg --live profielkiezers voor één run.
Hoe lees ik de uitvoer van lg --json in een script?
De uitvoer is de hele HTTP-envelop: { "success": bool, "data": { "contract_version", "command", "status", "result" }, "code", "message" }. De zakelijke payload staat onder .data.result; bij lijstcommando's zijn de rijen .data.result., is het aantal .data.result.count en is de volgende pagina .data.result.next_cursor. Het juiste jq-pad ziet er dus uit als lg loads list --json | jq -r '.data.result.loads[].load_code'. Een pad dat de envelop overslaat, geeft geen fout, het geeft stilzwijgend null terug — in een watchdog-script wordt dat een alarm dat nooit ophoudt af te gaan. De enige uitzondering is /api/public/status, waarvan de body bewust envelopvrij is.
Als ik hetzelfde verzoek twee keer stuur, krijg ik dan dubbele records?
Niet als je een idempotency_key hebt meegestuurd. Een tweede aanroep met dezelfde sleutel voert het commando niet opnieuw uit; hij geeft het eerste resultaat terug met status replayed. De sleutel moet een UUID zijn en bij retries DEZELFDE blijven — per poging een nieuwe sleutel genereren is hetzelfde als geen idempotency gebruiken.
Wat doet --yes?
Het passeert de bevestigingspoort. Wanneer een bevestigingsplichtig commando zonder --yes wordt aangeroepen, verandert er niets: de server vat in één zin samen wat hij gaat doen, zegt of het onomkeerbaar is, en stopt (HTTP 409, CLI-exitcode 4). Het commando herhalen met --yes voert het werk uit.
Hoe detecteer ik een mislukt commando in een script?
Lees de exitcode, nooit de berichttekst: 0 succes, 1 afwijzing door een bedrijfsregel, 2 commando- of argumentfout, 3 authenticatie- of rolfout, 4 bevestiging vereist. Via HTTP zijn de equivalenten 200, 422, 404, 403 en 409, en het veld error_code in de body is stabiel. Het fout-BERICHT is gelokaliseerd en verandert zonder aankondiging.
Hoe ontdek ik de beschikbare commando's programmatisch?
GET /api/public/cli/catalog voor discovery zonder authenticatie, en GET /api/common/commands voor de lijst die je account daadwerkelijk kan zien. Beide geven per commando de JSON Schema-parameters terug; bouw je client daaruit op in plaats van een commandolijst hard te coderen.
Moet ik mijn client bijwerken wanneer er een nieuw commando wordt toegevoegd?
Nee. De client haalt zijn commandolijst uit de catalogus, dus een commando dat op de server wordt toegevoegd, verschijnt zonder nieuwe client-release. Een update is alleen nodig bij een brekende wijziging die de contractversie verhoogt, en in dat geval blijft de oude vorm minstens zes maanden in leven.
Vervangt de CLI de bestaande REST API?
Nee. Het REST-oppervlak dat de web- en mobiele apps aandrijft, blijft bestaan. De commandocatalogus vervangt resource-CRUD niet; hij is de laag van de werkwoorden — de enige manier om een actie uit te voeren met rolcontrole, bevestigingspoort en audit.
Hoe krijg ik een Logistivo-API-sleutel en wat kan die?
Een manager met het recht voor teambeheer geeft hem uit in het paneel onder Settings › Integration keys, of vanuit een terminal met lg keys create. De sleutel handelt namens een echt teamlid en heeft drie onafhankelijke instellingen: scope (read opent de catalogus en niet-schrijvende commando's, write opent elk commando — de bevestigingspoort blijft zoals ze is), optionele domeinrechten, en een toegangsniveau — employee, de standaard, voor dagelijkse operaties, of manager voor team, instellingen, sleutels en geld. Hij wordt één keer getoond en niet op de server opgeslagen; hij kan worden geroteerd, overgedragen en ingetrokken. Wanneer het lid namens wie hij handelt vertrekt, wordt ook de sleutel gesloten. Er is geen serviceaccount.
Wat gebeurt er als ik een idempotency key hergebruik voor een ander commando?
De server antwoordt 409 idempotency_conflict en noemt het commando waarvoor de sleutel eerst werd gebruikt; er draait niets en er wordt niets herhaald. Sleutels zijn beperkt tot je bedrijf, gebonden aan één commando en 24 uur vergrendeld — daarna start dezelfde sleutel een nieuwe uitvoering.
Hoe worden rate limits op mijn integratie toegepast?
Per token, per minuut, in drie buckets: catalogus lezen 120, leescommando's 120, schrijvende commando's 30. Een 429 bevat altijd Retry-After en een body met retry_after, limit en bucket; wacht zo lang en probeer het opnieuw. De catalogus publiceert de actuele getallen onder rate_limits.
Hoe onderscheid ik een zakelijke afwijzing van een transportfout?
Vertak eerst op error_code: failed (422) is een zakelijke afwijzing en bevat een stabiele error_key zoals INSUFFICIENT_CREDITS of NOT_FOUND; server_error (5xx) en netwerkfouten worden opnieuw geprobeerd met dezelfde idempotency key; rate_limited (429) wacht je af. Vertak nooit op de fouttekst.
Verstuurt Logistivo webhooks? Voor welke events?
Ja. Je registreert een https-adres en kiest de events die je belangrijk vindt; er komt een ondertekende POST binnen wanneer ze gebeuren. Vandaag kun je je op 13 events abonneren: lading aangemaakt/status gewijzigd/chauffeur toegewezen, aanvraag aangemaakt en status gewijzigd, bod uitgebracht/herzien/geaccepteerd, factuur concept/uitgegeven/geannuleerd, en magazijnreservering aangemaakt/status gewijzigd. Elke naam wordt gedekt door een eventklasse die daadwerkelijk wordt verzonden — niets wordt aangekondigd en daarna nooit afgevuurd, want zo'n event is een stille fout waar de integrator eeuwig op wacht. Abonnementen worden aangemaakt onder Settings › Integration › Webhooks, of vanuit een terminal met lg webhooks create.
Hoe verifieer ik de handtekening van een Logistivo-webhook?
Elk verzoek bevat een header X-Logistivo-Signature: t=,v1=. De ondertekende string is ".", het algoritme is HMAC-SHA256 en de sleutel is het secret van het abonnement. Vier regels: (1) verifieer de RUWE bytes — de body decoderen en opnieuw serialiseren (JSON.stringify / json_encode) maakt van dezelfde data andere bytes en dan klopt de handtekening niet meer; dit is verreweg de meest gemaakte fout; (2) controleer de tijdstempel en laat alles vallen waarbij |now − t| > 300 s, ook als de handtekening klopt; (3) vergelijk in constante tijd met hash_equals / timingSafeEqual; (4) ontdubbel op event_id, niet op de aflever-id — event_id blijft behouden bij een replay, terwijl de aflever-id verandert. Werkende ontvangers voor Node en PHP staan in examples/webhook-receiver/ in de repository en testen zichzelf met --selftest.
Wat gebeurt er als een webhook niet kan worden afgeleverd? Verlies ik het event?
Nee. Als je ontvanger geen 2xx teruggeeft, komt de aflevering in het retryschema: 60 · 300 · 1800 · 7200 · 21600 seconden, 6 pogingen in totaal, een venster van ongeveer 8,6 uur. ELKE fout behalve 410 Gone wordt opnieuw geprobeerd, 4xx inbegrepen — een zakelijk event verliezen kost meer dan een paar extra verzoeken. Na 10 opeenvolgende uitgeputte afleveringen wordt het abonnement stilgelegd en wordt de reden vastgelegd, zodat "waarom komt er niets binnen" beantwoordbaar blijft. Het afleveringslogboek bewaart elke poging (statuscode, duur, fout) en je kunt één aflevering opnieuw versturen vanuit het paneel of met lg webhooks replay. Incrementele sync (updated_since + cursor) is er nog steeds als vangnet.
Kan mijn AI-agent alles doen wat een gebruiker in het paneel kan doen?
Bijna alles. Elke schrijfactie in het paneel heeft een commando — gemeten tegen de schrijf-endpoints van het paneel is 100% van de endpoints binnen de scope gedekt — en dezelfde commando's staan open voor lg, voor HTTP en voor het MCP-kanaal. De bewuste uitzonderingen zijn stappen rond identiteit en geld: inloggen, een pakket kopen, een kaart toevoegen met 3D Secure, juridische teksten goedkeuren en een account sluiten blijven in de browser van de persoon, en lg handoff-links generate geeft daarvoor de link terug. Integratiesleutels, webhooks en de sandbox worden beheerd met ingebouwde lg-commando's, omdat ze geheimen één keer teruggeven.
Kan ik bestanden zoals pdf's of foto's vanuit de CLI of de API aan commando's doorgeven?
Ja. Zet bij lg een @ voor een lokaal pad (--attachment_uuid=@./cmr.pdf) en lg uploadt het bestand eerst; --file is een snelkoppeling wanneer een commando één bestandsveld heeft, en lg upload uploadt alleen. Via HTTP stuur je het bestand als multipart naar POST /api/common/commands:upload en geef je de teruggegeven attachment_uuid door aan het commando; MCP-clients gebruiken de tool upload_attachment. Het type wordt uit de inhoud bepaald, uploads horen bij de gebruiker en blijven 24 uur bruikbaar, en hetzelfde bestand opnieuw uploaden geeft dezelfde id terug.
Wat is het verschil tussen een integratiesleutel op employee- en op managerniveau?
Het toegangsniveau bepaalt hoe zwaar het werk mag zijn dat een sleutel doet. Een employee-sleutel, de standaard voor nieuwe sleutels, voert dagelijkse operaties uit: ladingen, aanvragen, biedingen, ritten, wagenpark, documenten en contacten. Een managersleutel mag ook beheerwerk doen — teamleden en rollen, bedrijfsinstellingen, integratiesleutels, bankrekeningen, opgeslagen kaarten, affiliate-uitbetalingen. Een sleutel heeft nooit meer rechten dan de persoon namens wie hij handelt, en een employee-sleutel die een managercommando aanroept, krijgt INSUFFICIENT_KEY_LEVEL. Wijzig het niveau in het paneel of met lg keys update --access-level=manager.
Kan een affiliate (doorverwijspartner) de CLI gebruiken?
Ja. Een affiliate-account krijgt een eigen catalogus — 55 commando's voor doorverwijzingen, leads, CRM-notities en -taken, salespresentaties, verdiensten en uitbetalingen — en gebruikt die vanuit lg, HTTP of MCP, net als elke andere rol. Een uitbetaling aanvragen of annuleren en de bankrekening voor uitbetalingen wijzigen vereisen een sleutel op managerniveau en een bevestiging. Een bedrijf dat ook verlader, vervoerder of douane-expediteur is, ziet beide catalogi.
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.