Logistivo CLI : pilotez votre activité logistique depuis un terminal et depuis votre ERP
Un seul catalogue de commandes alimente trois surfaces : le client terminal lg, l’assistant IA intégré au tableau de bord et le canal auquel se connectent les assistants IA externes. Une fonctionnalité est écrite une seule fois et apparaît dans les trois — et chaque action d’écriture de l’interface web dispose désormais d’une commande, si bien que vos scripts et vos propres agents IA peuvent accomplir le travail que votre équipe fait à l’écran. Les paiements, le consentement juridique et la clôture du compte restent volontairement dans le navigateur. Cette page est un contrat. Le tableau des commandes ci-dessous n’est pas rédigé à la main ; il est généré à partir du registre de commandes en direct, à chaque requête.
Qu’est-ce que la CLI Logistivo ?
La CLI Logistivo (lg) est un client en ligne de commande qui exécute le travail de votre compte Logistivo — chargements et voyages, demandes, offres et appels d’offres, flotte et conducteurs, documents, contacts et comptes courants, factures et comptabilité, entrepôt et stock, membres de l’équipe et tarifs douaniers — depuis un terminal, un script ou votre propre agent IA. Les commandes ne sont pas figées dans le client : celui-ci récupère le catalogue de commandes auprès du serveur et se construit à partir de lui. Les mêmes commandes peuvent être appelées en HTTP sans rien installer — c’est la voie qu’empruntent les intégrations ERP et CRM — ainsi que via le canal MCP auquel se connectent les assistants IA externes.
Une seule forme de commande : lg --parameter=value. Le catalogue compte aujourd’hui 519 commandes réparties sur 125 domaines ; la liste la plus large que voit un même rôle compte 452 commandes sur 112 domaines.
Chaque action d’écriture de l’interface web dispose d’une commande — mesuré par rapport aux endpoints d’écriture de l’interface web, 100 % de ceux qui entrent dans le périmètre sont couverts. Les paiements (3D Secure), le consentement juridique et la clôture du compte restent volontairement dans le navigateur ; pour ceux-là, une commande renvoie un lien à la place.
Les commandes qui prennent un document ou une photo fonctionnent aussi hors du navigateur : écrivez --attachment_uuid=@./cmr.pdf et lg envoie d’abord le fichier ; en HTTP, vous l’envoyez vers /api/common/commands:upload et transmettez l’attachment_uuid renvoyé.
Les clés d’intégration portent un niveau d’accès : employee (la valeur par défaut pour les nouvelles clés) pour les opérations courantes, manager pour l’équipe, les paramètres, les clés et l’argent. Une clé n’a jamais plus de droits que la personne au nom de laquelle elle agit.
Les options ne sont jamais inventées : chaque option est un nom de paramètre issu du JSON Schema de la commande elle-même, tout comme son type et son caractère obligatoire ou non.
Les commandes d’écriture demandent une confirmation ; les commandes irréversibles ne s’exécutent jamais sans elle (HTTP 409, code de sortie CLI 4).
Une nouvelle tentative ne crée pas de doublon : un appel porteur d’une idempotency_key s’exécute au plus une fois.
Chaque exécution aboutit dans un registre d’audit unique — qu’elle vienne d’un terminal, du chat ou d’un assistant, c’est consigné.
Ce qui est disponible aujourd’hui, et ce qui arrive
Cette section se trouve en haut de la page à dessein. L’erreur la plus coûteuse que puisse commettre un document d’intégration est de décrire un endpoint qui n’est pas encore ouvert comme s’il l’était : l’intégrateur écrit le code, l’endpoint renvoie 404, et la confiance ne revient pas.
Comme le contrat est gelé, le code d’intégration que vous écrivez aujourd’hui continue de fonctionner à mesure que les éléments restants s’ouvrent. Les champs que vous ne connaissez pas doivent être ignorés ; c’est cette règle qui nous permet d’ajouter sans rien casser.
Catalogue de commandes et table d’identité — L’identité publique domaine/verbe de chaque commande est gelée et la version du contrat est publiée avec la valeur 1 dans chaque réponse du catalogue et dans l’en-tête X-Contract-Version. Le tableau de cette page est généré à partir du registre en direct : une commande ajoutée sur le serveur y apparaît d’elle-même, et une commande retirée disparaît.
Endpoint de découverte sans authentification — GET /api/public/cli/catalog — noms des commandes, identité domaine/verbe, description, paramètres JSON Schema, indicateurs de barrière et champs de versionnage (since, deprecated_at, replaced_by, aliases). Aucune authentification : créer un token est une étape qui vient APRÈS la décision d’intégration, pas avant. La réponse ne contient absolument aucune donnée de tenant.
Endpoints authentifiés de catalogue et d’exécution — GET /api/common/commands, GET /api/common/commands/{name} et POST /api/common/commands/{name}. La barrière de rôle, la barrière de confirmation, l’idempotence et le registre d’audit résident en un point de contrôle unique par lequel passent aussi le chat et le terminal.
Couverture de l’interface web : chaque action d’écriture a sa commande — 519 commandes sur 125 domaines, vérifiées par rapport aux endpoints d’écriture de l’interface web : chaque endpoint du périmètre est adossé à une commande (un miroir de l’endpoint ou le même service partagé), et aucun ne reste sans preuve. Volontairement hors périmètre : les paiements avec 3D Secure, le consentement juridique, la clôture du compte et la connexion, qui restent dans le navigateur ; la gestion des clés, des webhooks et de la sandbox, assurée par des commandes intégrées de lg ; et les endpoints propres à l’application conducteur.
Preflight (dry_run) : voir sans exécuter — Avec dry_run: true dans le corps de la requête, la commande ne s’exécute pas : la validation, la barrière de rôle/portée, la résolution de la cible et le calcul des crédits s’exécutent tous et un aperçu est renvoyé ; rien n’est écrit, aucun crédit n’est dépensé et la clé d’idempotence n’est pas consommée. L’endpoint batch l’accepte aussi, par lot. Un preflight n’entre jamais dans le handler de la commande ; lors de sa mise en service, 178 preflights couvrant toutes les commandes d’écriture alors présentes dans le catalogue n’ont produit aucune instruction d’écriture.
Clés d’intégration — Des clés API qui agissent au nom d’un véritable membre de l’équipe, émises dans l’interface web ou avec lg keys create : portée lecture/écriture, niveau d’accès (employee par défaut, ou manager), durée de vie, dernière utilisation, rotation, transfert et révocation. lg login --api-key, lg whoami et un lg logout qui révoque côté serveur reposent sur elles.
Sandbox — répéter les écritures sans toucher à la production — Un tenant sandbox distinct par entreprise, avec le même catalogue de commandes ; il s’ouvre en libre-service et émet sa propre clé. Les crédits, la place de marché et le routage des webhooks sont séparés entre les deux environnements ; l’environnement est déduit de l’entreprise de la clé et ne peut pas être fourni avec la requête.
Versionnage, taxonomie des erreurs, idempotence et limites de débit — Les commandes portent since / deprecated_at / replaced_by / aliases et une commande dépréciée répond avec un en-tête X-Deprecated. Les échecs métier portent une error_key stable à côté de l’error_code de niveau transport, et le dictionnaire des clés est publié dans le catalogue. Les clés d’idempotence sont limitées à votre entreprise, liées à une seule commande et verrouillées pendant 24 heures. Les limites de débit (rate limits) s’appliquent par token, en trois compartiments, et chaque 429 porte Retry-After.
Webhooks sortants : un POST quand quelque chose se produit — Le push signé est disponible pour 13 événements. Les abonnements se gèrent depuis l’interface web ou avec lg webhooks ; la signature porte son propre horodatage, le calendrier des nouvelles tentatives est de 60 · 300 · 1800 · 7200 · 21600 secondes et le motif de mise en sourdine est toujours enregistré. Chaque nom d’événement est adossé à une classe d’événement réellement émise — rien n’est annoncé pour n’être jamais envoyé. Le rail pull (updated_since + cursor) n’a pas été supprimé : le push a été ajouté à côté, pas à sa place.
Commandes qui prennent des fichiers — 33 commandes prennent un document ou une photo — une CMR, une facture, un certificat d’immatriculation, des photos de palettes. Envoyez le fichier une fois vers POST /api/common/commands:upload, ou laissez lg le faire avec --attachment_uuid=@./file.pdf, et transmettez l’attachment_uuid renvoyé ; les clients MCP utilisent l’outil upload_attachment. Le type de fichier est détecté à partir du contenu, et un envoi reste utilisable pendant 24 heures.
Le client terminal lg — Publié sur npm sous licence MIT : installez-le avec `npm install -g @lgstv/lg`, ou exécutez-le sans installation via `npx @lgstv/lg`. C’est un fichier unique sans dépendance et, comme la surface HTTP est ouverte, vous pouvez intégrer sans lui. Il se connecte avec un code d’approbation que vous confirmez dans le navigateur, puis reste connecté en renouvelant sa session de lui-même ; il envoie vos fichiers locaux pour vous (@path, --file, lg upload), gère les clés d’intégration (lg keys), n’accepte jamais de secret sur la ligne de commande, respecte Retry-After, relance les 5xx avec la même clé d’idempotence et avertit en cas de commande dépréciée ou de version de contrat plus récente.
Synchronisation incrémentale : pagination par curseur et updated_since — Le contrat ci-dessous (limit + cursor opaque et signé, next_cursor, updated_since) est figé et en cours de déploiement sur les commandes de liste. Tant qu’une commande de liste donnée n’annonce pas cursor et updated_since dans son JSON Schema, traitez-la comme une petite fenêtre : plafond de 20 lignes, pas de curseur.
Ce qui fait la différence : le client ne connaît aucune commande, il les tire du serveur
C’est l’unique décision qui donne son sens au reste de la page. Dans une CLI ordinaire, les commandes vivent dans le client ; chez Logistivo, elles vivent sur le serveur.
Dans l’organisation classique, quand le serveur gagne une fonctionnalité, le client a besoin d’une nouvelle version et l’utilisateur doit l’installer. Entre-temps, les deux côtés savent des choses différentes — et c’est le mode de défaillance le plus silencieux des intégrations : le script tourne, le code de sortie vaut 0, et la commande ne décrit tout simplement pas ce que le serveur sait faire.
Chez Logistivo, la définition d’une commande est un enregistrement unique : son nom, ce qu’elle fait, ses paramètres JSON Schema, les rôles autorisés à la voir, si elle exige une confirmation et si son effet est réversible. Au démarrage, lg récupère ce catalogue et en génère son texte d’aide, ses options et la validation de ses entrées. Dès qu’une commande est ajoutée sur le serveur, lg la connaît — sans mise à jour du client.
Le même catalogue alimente l’assistant IA du tableau de bord et le canal auquel se connectent les assistants IA externes. Une fonctionnalité est écrite une seule fois et apparaît à trois endroits — et tous trois passent par la même barrière de rôle, la même barrière de confirmation et le même registre d’audit. Il n’existe pas d’inventaire distinct des commandes CLI ; s’il en existait un, les trois surfaces divergeraient en silence en moins de six mois.
Aucune dérive de version — La liste de commandes que connaît le client est, par construction, celle dont dispose le serveur. « Quelle version de lg contient cette commande ? » est une question qui n’existe pas.
Les noms d’options ne sont jamais devinés — Les options d’une commande sont exactement les noms de paramètres de son JSON Schema. Pour savoir ce qu’une commande accepte, il ne faut pas lire un document mais le catalogue — et le catalogue est toujours à jour.
Votre CLI a la taille de votre compte — Le catalogue est filtré par rôle : une commande que votre rôle ne peut pas voir n’apparaît jamais dans votre liste. Un compte transporteur voit 452 commandes, un chargeur 448, un commissionnaire en douane 312, et un compte affilié (apporteur d’affaires) un ensemble qui lui est propre, de 55 commandes.
La documentation ne peut pas prendre de retard — Le tableau des commandes de cette page provient du même registre. Il n’existe nulle part de liste qu’un humain devrait maintenir en phase avec la réalité.
La règle de nommage — comment les noms de commandes évoluent
Le catalogue va s’agrandir. Les nouvelles commandes ne sont pas nommées au cas par cas ; six règles s’appliquent. Nous les publions ici parce que ce sont les noms que votre intégration écrira pendant des années, et que leur prévisibilité a de la valeur pour vous.
Un domaine est une entité au pluriel — loads, demands, invoices, export-documents. Les domaines de deux mots s’écrivent en kebab-case. La seule exception est un nom indénombrable : stock n’est jamais mis au pluriel, car « stocks » signifie autre chose en anglais.
Tous les verbes d’une entité vivent dans un seul domaine — loads porte tous les verbes qui agissent sur un chargement : create, list, get, update, set-status, assign-driver, list-problems, archive et d’autres encore. Ouvrir un nouveau domaine par verbe (load-statuses, load-drivers) obligerait l’utilisateur à chercher la même entité à trois endroits.
Le verbe ne déborde jamais sur le domaine ; le domaine est ce qui CHANGE — Affecter un conducteur modifie le chargement, pas le conducteur : c’est donc lg loads assign-driver. Le complément indirect (-driver) est rattaché au verbe, jamais au domaine.
Une sous-ressource n’a jamais son propre domaine — Une ligne de facture et un article de document ne peuvent pas être listés seuls ; on les adresse via leur propriétaire — lg invoices add-line, lg export-documents add-item. Un seul test tranche : si vous ne pouvez pas lister ou obtenir l’élément de façon indépendante, ce n’est pas un domaine.
Restreindre est une option, pas un nouveau verbe — lg fleet-documents list --days=30 est correct ; il n’existe pas de verbe « list-expiring » distinct, car la fenêtre est déjà un paramètre. Un verbe qualifié n’est utilisé que lorsque les lignes renvoyées ne sont pas l’entité du domaine : loads list-problems renvoie des signalements de problèmes, pas des chargements.
La paire (domaine, verbe) est unique dans tout le catalogue — Même pour deux commandes dont les rôles ne se recoupent jamais. Si la même paire était attribuée à deux commandes, votre code d’intégration verrait un seul nom tandis que la CLI exécuterait des choses différentes selon la personne qui l’invoque.
Couverture : tout ce que fait l’interface web, par une commande
De nombreuses équipes branchent Logistivo sur leur propre agent IA ou leur propre harnais d’automatisation, et un agent n’est utile que s’il peut aller au bout du travail. La règle est donc simple : tout ce qu’un utilisateur de bureau peut modifier dans l’interface web, une commande peut le modifier aussi — derrière la même barrière de rôle, la même barrière de confirmation et le même registre d’audit.
C’est mesuré, pas affirmé. Chaque endpoint d’écriture derrière l’interface web est confronté au registre de commandes, et un endpoint n’est compté comme couvert que lorsqu’une commande le déclare comme son miroir HTTP ou appelle le même service partagé. Parmi les endpoints d’écriture du périmètre, 100 % sont couverts et aucun ne reste sans preuve. Chaque endpoint laissé de côté porte un motif écrit — étapes d’identité et de paiement, plan de contrôle de l’intégration, endpoints propres à l’application conducteur, télémétrie client, copies mortes sans appelant — et ceux qui comptent pour un intégrateur sont listés ci-dessous.
Les commandes qui prennent un fichier relèvent de la même règle : 33 commandes du tableau prennent un document ou une photo, et toutes fonctionnent depuis lg, en HTTP et via MCP (voir Commandes qui prennent des fichiers).
Les tâches de gestion sont couvertes elles aussi, derrière une clé plus puissante : 62 commandes du tableau — membres de l’équipe et rôles, paramètres de l’entreprise, comptes bancaires, cartes enregistrées, clés d’intégration — exigent une clé d’intégration de niveau manager. Une clé de niveau employee, la valeur par défaut, exécute les opérations courantes et se voit refuser ces commandes avec INSUFFICIENT_KEY_LEVEL.
Les comptes affiliés (apporteurs d’affaires) disposent de leur propre catalogue : 55 commandes réparties sur 20 domaines — recommandations, prospects, notes et tâches CRM, présentations commerciales, gains et versements, ainsi que les commandes de compte et d’équipe dont dispose chaque rôle. Les commandes réservées aux affiliés ne figurent pas dans le tableau public ci-dessous, qui liste les trois rôles de l’interface web ; un compte affilié les voit dans GET /api/common/commands et dans lg commands. Une entreprise qui est à la fois affiliée et chargeur, transporteur ou commissionnaire en douane voit les deux ensembles.
Un agent devrait commencer par lg users get (nom d’API get_current_user) : cette commande renvoie le rôle, le niveau d’accès de la clé utilisée, les permissions effectives, et indique si une approbation juridique en attente ou un numéro de téléphone non vérifié bloque actuellement les écritures — l’agent peut ainsi anticiper un refus au lieu de le subir.
La couverture est mesurée par un rapport qui compare le registre de commandes aux endpoints d’écriture de l’interface web ; un endpoint de l’interface web ajouté sans commande y apparaît comme non prouvé. Si vous trouvez une action de l’interface web que vous ne pouvez pas atteindre par une commande, signalez-la au support.
1. Demander le lien — Le travail qui doit se faire dans la propre session de navigateur de la personne n’est pas une commande, mais la surface de commandes en a connaissance. lg handoff-links generate (nom d’API get_browser_handoff_link) renvoie un lien logistivo.com pour les finalités que votre rôle autorise : package_purchase, payment_cards, legal_documents, integration_keys, affiliate_demo_accounts et account_close. C’est gratuit, rien n’est écrit, et le lien ne porte aucun secret — la personne se connecte comme d’habitude.
2. Le remettre à la personne — Montrez le lien à l’utilisateur ou envoyez-le par votre propre canal. Il termine l’étape là-bas : l’approbation du contrat et le paiement 3D Secure d’un forfait, l’ajout d’une carte, l’approbation des textes juridiques en attente, l’émission d’une clé API dont le secret n’est affiché qu’une fois, ou la clôture de son propre compte.
3. Lire le résultat avec une commande — Une fois l’étape terminée, son résultat redevient visible pour les commandes : le forfait et le solde de crédits, la carte enregistrée (masquée, seuls les quatre derniers chiffres), la nouvelle clé dans la liste des clés. Un agent ne prend jamais de numéro de carte, de paiement ou de consentement dans un chat.
Paiements et 3D Secure — Acheter ou faire évoluer un forfait et ajouter une carte nécessitent 3D Secure dans le navigateur. Les commandes listent les forfaits et les prix, lisent le solde et son historique, listent les cartes enregistrées (masquées), définissent la carte par défaut et en suppriment une ; l’achat lui-même passe par le lien de transfert vers le navigateur.
Consentement juridique — L’approbation des textes juridiques est faite par la personne, dans le navigateur. lg users get vous indique qu’une approbation est en attente ; aucune commande ne peut la donner.
Clôture du compte, connexion et mot de passe — Clôturer son propre compte, se connecter et changer de mot de passe sont des étapes d’identité et restent dans le navigateur. lg user-accounts preview montre ce que signifierait la clôture du compte, sans l’effectuer.
Clés d’intégration, webhooks et sandbox — Leur gestion renvoie des secrets qui doivent être affichés une seule fois, dans votre terminal ; ce sont donc des commandes intégrées de lg (lg keys, lg webhooks, lg sandbox) reposant sur leurs propres endpoints HTTP plutôt que des commandes du catalogue. Le catalogue ne porte que les deux commandes de clés sans secret : integration-keys list et integration-keys revoke.
Le chat de l’assistant du tableau de bord — Les clés d’intégration ne peuvent pas piloter le chat de l’assistant IA du tableau de bord ; démarrer ou poursuivre une exécution avec une clé répond 403. Un agent se connecte plutôt via les endpoints de commandes, lg ou le canal MCP — là, chaque commande s’exécute au niveau d’accès de la clé et ses écritures sont enregistrées comme écritures d’intégration.
L’application conducteur — Les comptes conducteurs n’ont pas de catalogue de commandes, et l’application conducteur conserve ses propres endpoints. Les utilisateurs de bureau gèrent les conducteurs, leurs documents, leurs dépenses et leurs voyages au moyen de commandes.
Installation et identité
lg est un script Node en un seul fichier, sans dépendance (Node 18+), publié sur npm sous le nom @lgstv/lg. Le paquet installe deux commandes identiques, lg et logistivo — utilisez logistivo si lg est déjà un alias sur votre machine. Comme il s’agit d’un seul fichier, copier lg.mjs sur le serveur ERP d’un client fonctionne aussi. Vous n’avez pas besoin du client pour construire une intégration ERP/CRM — les mêmes commandes sont disponibles en HTTP.
1. Installer — Node 18 ou plus récent est tout ce qu’il vous faut ; il n’y a aucune autre dépendance. Installez-le globalement ou exécutez-le sans installation via npx.
2. Se connecter avec un code d’approbation — lg login affiche un court code d’approbation et ouvre logistivo.com/connect dans votre navigateur ; via SSH, en CI ou avec --no-browser, il affiche seulement l’adresse, que vous pouvez ouvrir sur n’importe quel appareil, y compris votre téléphone. Connectez-vous-y comme d’habitude, vérifiez que le code affiché sur la page est bien celui de votre terminal, choisissez un accès en lecture seule ou en lecture et action, puis approuvez. Rien de secret n’est saisi dans le terminal : ni mot de passe, ni clé, ni code à usage unique. La session reste ensuite ouverte sur cet ordinateur — fermer le terminal ne vous déconnecte pas, et lg renouvelle le token d’accès de lui-même avant son expiration. lg logout met aussi fin à la session sur le serveur, et vous pouvez la supprimer dans l’interface web sous Settings › Integration keys › AI and CLI connections. lg login --password (e-mail et mot de passe) reste disponible comme solution de repli. Nécessite lg 0.11 ou une version ultérieure.
3. Pour les serveurs et la CI : une clé, pas un code d’approbation — Sur un serveur ou dans un job CI, personne n’est là pour approuver un code dans un navigateur. Émettez une clé dans l’interface web (Settings › Integration keys) ou avec lg keys create — éventuellement au nom d’un membre de l’équipe dédié, aux droits strictement limités — et placez-la dans LOGISTIVO_TOKEN, ou enregistrez-la avec lg login --api-key. Tant que la variable est définie, le fichier de configuration n’est jamais lu. Détails : la section « Se connecter avec une clé API ».
4. Vérifier et explorer le catalogue — lg commands liste toutes les commandes que votre rôle peut voir, regroupées par domaine ; lg help affiche les verbes de ce domaine, et lg help affiche la liste complète des paramètres d’une commande avec leurs types et ceux qui sont obligatoires. Aucun de ces textes ne vit dans le client — tout provient du catalogue. N’oubliez pas que la liste dépend de votre rôle : les verbes d’un même domaine ne sont pas les mêmes pour un transporteur et pour un chargeur (loads set-status, par exemple, ne figure que dans le catalogue transporteur). S’il manque un verbe, vérifiez votre rôle avant de vérifier votre installation.
Ne mettez jamais la clé dans le contrôle de version, dans un journal CI ou dans une fenêtre de chat. Si vous vous êtes connecté avec un code d’approbation ou une clé d’intégration, lg logout met aussi fin à la connexion sur le serveur ; dans une session par mot de passe (lg login --password), il supprime uniquement la copie LOCALE et le dit explicitement. Le registre d’audit enregistre vos arguments mais masque en *** tout champ dont le nom contient token, password, IBAN, card ou OTP, ainsi que tout paramètre qu’une commande déclare secret.
LOGISTIVO_TOKEN — Token d’accès personnel. Tant qu’il est défini, le fichier de configuration n’est jamais lu — c’est la voie recommandée en CI et sur les serveurs.
LOGISTIVO_BASE_URL — Racine du serveur. Par défaut https://logistivo.com. Ne la modifiez que si vous pointez vers votre propre environnement ; l’option --base-url fait de même pour une seule commande.
LOGISTIVO_HOME — Répertoire du fichier de configuration et du cache du catalogue. Par défaut ~/.logistivo. Séparez-le si vous travaillez avec deux comptes sur une même machine.
LOGISTIVO_PROFILE — Le profil sous lequel exécuter. `lg profile use` est le choix persistant ; cette variable vaut pour une seule exécution et c’est le moyen le plus court de basculer entre un profil de production et un profil sandbox en CI. Un nom de profil inconnu n’est pas ignoré en silence — il provoque une erreur.
NO_COLOR — Lorsqu’elle est définie, aucune couleur ANSI n’est affichée (la forme permanente de l’option `--no-color`). Activez-la pour une passerelle qui écrit dans un fichier journal ou dans une sortie CI ; les séquences d’échappement de couleur cassent les outils qui lisent ces journaux plus tard.
Ergonomie du client
Ces fonctionnalités facilitent l’usage quotidien du client `lg`. Aucune ne modifie le contrat HTTP — ignorez cette section si vous intégrez directement en HTTP.
Plusieurs environnements et plusieurs clés — Gardez la préproduction et la production, ou vos passerelles côté chargeur et côté transporteur, dans des profils séparés. La liste des profils n’affiche jamais de token ; chaque ligne montre l’empreinte sha256 du token. Le catalogue de commandes est mis en cache par profil, par hôte et par token, de sorte que deux rôles ne peuvent jamais voir la liste de commandes l’un de l’autre.
Synchronisation incrémentale : lg sync — Exécute en une seule commande la boucle de synchronisation des recettes (cookbook) : un watermark par entité, updated_since avec un curseur, une sortie JSONL et une marge de sécurité de cinq minutes. Utilisez --full pour le premier chargement complet (backfill). La commande est en lecture seule ; il n’y a pas d’option --write. lg sync --list déduit du catalogue les entités synchronisables pour votre rôle.
Retour d’erreur et complétion du shell — Sur un 422, le client désigne le champ rejeté sous la forme de l’option que vous avez saisie, avec l’error_key stable et l’explication qu’en donne le catalogue lui-même. Sur un 409, il affiche la ligne de commande --yes prête à l’emploi ; sur un 429, il attend la durée indiquée par Retry-After. La complétion du shell couvre les domaines, les verbes, les options et les valeurs enum, et fonctionne hors ligne.
Les paramètres secrets ne passent jamais par la ligne de commande — Quelques commandes prennent un secret — connecter l’intégration comptable Paraşüt, par exemple, exige les identifiants client et le mot de passe de ce système. lg n’accepte jamais une telle valeur comme option, car elle finirait dans l’historique de votre shell et dans la sortie de ps : il la demande sans écho, ou la lit depuis ---file=PATH ou depuis stdin (---file=-), et ne la garde qu’en mémoire. Une commande dont un paramètre obligatoire est secret ne s’exécute que depuis lg : appelée depuis le chat, via MCP ou au sein de lg batch, elle est refusée avec SECRET_REQUIRES_CLI. Le registre d’audit enregistre toujours la valeur sous la forme ***.
Se connecter avec une clé API
Un ERP, un CRM, un script ou un agent IA se connecte à Logistivo avec une clé d’intégration émise dans l’interface web ou avec lg keys create. La clé agit au nom d’un véritable membre de l’équipe : le rôle de cette personne détermine la liste des commandes, le niveau d’accès de la clé détermine l’importance du travail autorisé, et lorsque cette personne quitte l’équipe, la clé disparaît avec elle. Il n’existe pas de « compte de service » synthétique et il n’y en aura pas — l’isolation multi-tenant est liée à l’utilisateur, et une passerelle sans propriétaire est de celles qui continuent d’écrire en silence pendant des années.
1. Émettre une clé dans l’interface web — Settings › Integration keys › New key. Donnez-lui un nom (« ERP nightly sync »), choisissez la portée et le niveau d’accès, et raccourcissez éventuellement sa durée de vie. La clé n’est affichée qu’une seule fois, sur cet écran uniquement ; le serveur ne la stocke pas. Si vous la perdez, « Rotate » en émet une nouvelle — l’ancienne devient immédiatement invalide.
2. Se connecter depuis le terminal — lg login --api-key valide la clé, affiche l’identité et la portée, et télécharge le catalogue de commandes. lg whoami demande au serveur sous quel utilisateur, quelle entreprise, quel rôle et quelle portée vous vous exécutez. lg logout révoque aussi la clé sur le serveur, tout comme il y met fin à une session ouverte par code d’approbation (seul le lg logout d’une session par mot de passe ne peut pas le faire).
3. Ou en HTTP pur — La clé est un token d’accès transmis dans l’en-tête Authorization: Bearer et fonctionne directement avec les trois endpoints de commandes. Sur un serveur ou en CI, placez-la dans LOGISTIVO_TOKEN ; tant que cette variable est définie, le fichier de configuration n’est jamais lu.
4. Ou gérer les clés depuis le terminal : lg keys — lg keys est le jumeau en terminal de l’écran de l’interface web : mêmes endpoints, même barrière (la permission de gestion d’équipe, et une clé de niveau manager lorsque vous l’appelez avec une clé). create, rotate et transfer renvoient un nouveau token une seule fois : avec --save-profile=NAME, il va directement dans un profil local et n’est jamais affiché ; sinon, lg l’affiche une fois. En mode --json, le token n’est inclus que si vous ajoutez --show-secret, et un appel --json sans aucune de ces deux options est refusé avant l’envoi de la requête, afin que le token ne puisse pas atterrir en silence dans la sortie d’un script. rotate, transfer et revoke demandent une confirmation (--yes) ; une clé est désignée par son nom exact ou par son uuid, jamais par approximation. Le niveau d’accès est conservé tel quel sur une clé renouvelée ou transférée.
La portée s’applique à toute la surface de l’API, pas seulement au catalogue de commandes : une clé en lecture seule laisse passer les requêtes de lecture (GET/HEAD/OPTIONS), et toute autre requête d’écriture répond 403 forbidden. Il existe deux exceptions délibérées, toutes deux protégées par une barrière plus fine : l’endpoint d’exécution des commandes (la décision vient de l’indicateur read_only propre à la commande, car les commandes qui n’écrivent pas sont elles aussi appelées en POST) et une clé qui se révoque elle-même (lg logout, autorisé aussi sur une clé en lecture seule). La portée, les autorisations par domaine et le niveau d’accès sont trois axes indépendants qui doivent tous être satisfaits : une clé de lecture ne peut pas écrire, même au niveau manager, une clé d’écriture employee ne peut pas gérer l’équipe, et une autorisation de domaine loads:write n’ouvre pas les tâches de gestion. Émettez la clé au nom du membre le moins privilégié qui couvre vos besoins : c’est le rôle qui décide quels enregistrements vous pouvez voir, tout simplement.
read — Le catalogue de commandes et les commandes qui n’écrivent pas (list, search, preview). Une commande d’écriture renvoie 403 forbidden — avant la barrière de confirmation ; une clé en lecture seule ne voit même jamais de 409. Le bon choix pour la synchronisation nocturne et le reporting.
write — Toutes les commandes. Les commandes qui exigent une confirmation la demandent toujours avec 409 ; confirm: true (--yes dans la CLI) fonctionne exactement comme avant. La portée n’assouplit jamais la barrière de confirmation.
employee — La valeur par défaut de toute nouvelle clé. Opérations courantes : chargements, demandes, offres, voyages, flotte et documents de flotte, documents, contacts — toutes les commandes qui n’exigent aucune permission de gestion, plus les permissions de flotte. Une commande qui exige davantage répond 422 avec l’error_key INSUFFICIENT_KEY_LEVEL et required_key_level: manager ; l’endpoint REST correspondant répond 403 avec la même clé. Le bon niveau pour une synchronisation ERP nocturne, une passerelle télématique ou un script d’exploitation.
manager — Tout ce que la personne au nom de laquelle la clé agit est autorisée à faire, gestion comprise : membres de l’équipe et rôles, paramètres de l’entreprise, clés d’intégration, comptes bancaires et leur vérification, cartes enregistrées, relations entre entreprises, versements aux affiliés. Une clé manager n’ajoute jamais un droit que la personne n’a pas — sans la permission de gestion d’équipe, elle ne peut toujours pas gérer l’équipe. Les clés qui existaient avant l’introduction des niveaux d’accès sont des clés manager, elles se comportent donc exactement comme avant.
Une clé par intégration — Si le CRM et l’ERP partagent une clé, couper l’un revient à couper l’autre. Donnez à chaque passerelle sa propre clé ; la liste les affiche de toute façon par nom.
Rotation — Émet un nouveau token et révoque immédiatement l’ancien ; la durée de vie restante est conservée. Utilisez-la en cas de soupçon de fuite et à intervalles réguliers. L’intégration reçoit 401 jusqu’à ce qu’elle soit mise à jour avec le nouveau token.
Révocation — La clé est fermée définitivement ; c’est irréversible, émettez une nouvelle clé si nécessaire. Si le membre au nom duquel la clé agit est retiré de l’équipe ou désactivé, la clé tombe d’elle-même.
Durée de vie et limite — La validité par défaut est de 180 jours ; vous pouvez la raccourcir à la création, jamais la prolonger. Un utilisateur peut détenir au maximum 10 clés actives. La date de dernière utilisation est visible dans la liste ; une clé jamais utilisée l’indique explicitement.
Qui gère — L’émission, la rotation, le transfert et la révocation sont ouverts aux managers disposant de la permission de gestion d’équipe — la même barrière que pour ajouter ou retirer des membres de l’équipe — et, lorsqu’ils sont effectués avec une clé d’intégration, cette clé doit être de niveau manager. Un manager peut émettre une clé au nom d’un autre membre ; un membre dédié, aux droits strictement limités, est recommandé pour une passerelle.
Les dix premières minutes : de l’interface web à votre premier appel
Les minutes les plus coûteuses d’une intégration sont les dix premières. Les quatre étapes ci-dessous tracent ce chemin dans l’ordre ; le même ordre existe dans l’interface web sous forme d’assistant (Settings › Integration › Setup wizard), et l’assistant appelle exactement les endpoints décrits ici. Un développeur qui n’a pas accès à l’assistant arrive au même point en lisant cette section.
Aucune des quatre étapes ne se termine par « je l’ai envoyé ». Savoir si la clé fonctionne vraiment, c’est le registre des requêtes qui le dit ; savoir si le webhook arrive vraiment, c’est le registre des livraisons. Les deux sont accessibles dans l’interface web et dans lg. Une configuration jamais mesurée est une configuration dont on croit seulement qu’elle fonctionne.
1. Décidez ce que vous allez faire — fixez d’abord la portée — On ne décide pas après coup de ce qu’une clé peut voir : vous choisissez la portée au moment de l’émettre. Il y a deux axes. La portée grossière (read / write) répond seulement à la question « peut-elle écrire ». La portée fine (autorisations par domaine : loads:read, invoices:write) indique quels domaines elle peut toucher, et dès qu’elle est définie, la clé passe en mode fail-closed (fermée par défaut) — chaque domaine que vous n’avez pas sélectionné, et chaque endpoint qui ne correspond à aucun domaine, renvoie 403. La liste des domaines dans l’interface web n’est pas une liste rédigée à la main ; elle est dérivée du catalogue de commandes en direct de votre rôle et indique combien de commandes et d’endpoints REST chaque domaine ouvre. Les endpoints du catalogue de commandes, « qui suis-je » (current) et « déconnexion » sont toujours exemptés de portée : une clé doit toujours pouvoir se décrire et se fermer elle-même. Le troisième axe est le niveau d’accès : employee (la valeur par défaut) exécute les opérations courantes, manager effectue aussi les tâches liées à l’équipe, aux paramètres, aux clés et à l’argent. Choisissez employee, sauf si la passerelle effectue des tâches de gestion.
2. Émettez la clé — le token n’est affiché qu’une fois — Settings › Integration › New key. Donnez-lui un nom (« ERP nightly sync »), choisissez l’utilisateur au nom duquel elle s’exécute ainsi que le niveau d’accès, et raccourcissez sa durée de vie si vous le souhaitez. Le token brut n’est renvoyé que dans cette réponse ; le serveur ne le stocke pas et il n’y a pas de « réafficher » dans l’interface web. Si vous le perdez, faites une rotation pour en obtenir un nouveau, et l’ancien meurt instantanément. Ne mettez jamais le token dans le contrôle de version, dans un journal CI ou dans une fenêtre de chat ; placez-le dans le coffre à secrets du système cible.
3. Faites le premier appel — et vérifiez qu’il est RÉELLEMENT arrivé — Deux requêtes suffisent. La première prouve votre identité (elle est exemptée de portée et fonctionne avec toutes les clés) : la portée est-elle celle que vous attendiez, le statut est-il actif, expires_at approche-t-il ? La seconde lit de vraies données dans le domaine que vous avez choisi. Si elle passe, l’identité, la portée, la barrière e-mail et le chemin réseau sont tous corrects. Sinon, ne devinez pas : le registre des requêtes propre à la clé montre, ligne par ligne, quel endpoint a été rejeté, avec quel code et quelle clé d’erreur stable (INSUFFICIENT_SCOPE, IP_NOT_ALLOWED, KEY_ACTOR_BLOCKED …). Dans l’interface web, ce registre est la fenêtre « Recent requests » ; dans le terminal, c’est lg logs. L’assistant surveille exactement ce registre et refuse de passer l’étape au vert tant qu’il n’a pas vu un véritable appel réussi.
4. Configurez le webhook — et vérifiez la signature avant toute chose — Attendre les événements coûte moins cher que de demander chaque minute. Enregistrez une adresse https, choisissez les événements qui vous intéressent et liez l’abonnement à votre clé : si la clé est révoquée, la livraison s’arrête aussi. Le secret n’est affiché qu’une seule fois, à la création. Votre endpoint récepteur doit d’abord vérifier la signature : la chaîne signée est "{t}.{corps brut}" et l’algorithme est HMAC-SHA256 ; l’horodatage se trouve À L’INTÉRIEUR de la signature, rejetez donc toute requête de plus de 300 secondes, même si la signature est valide. Comparez en temps constant et ne resérialisez jamais le corps — dès que vous analysez le JSON et le réécrivez, la signature ne correspond plus. Depuis l’interface web, « Send test » déclenche un vrai ping signé et vous pouvez suivre la livraison tentative par tentative.
Sandbox : s’entraîner à écrire sans toucher à la production
Le preflight (dry_run) vous dit ce qu’une commande FERAIT ; mais savoir si l’idempotence rejoue vraiment, si le webhook est vraiment livré, à quoi ressemblent les branches d’erreur et d’où vient le crédit, cela ne se voit que dans une VRAIE écriture. C’est à cela que sert la sandbox : un tenant distinct qui reflète votre entreprise — même code, même catalogue de commandes — et qui ne touche jamais votre registre de production.
La sandbox n’est pas un indicateur de requête, c’est un TENANT. Une entreprise Logistivo distincte ouverte pour la vôtre : son propre utilisateur, son propre forfait, son propre registre de crédits, ses propres abonnements webhook. L’environnement est DÉDUIT de l’entreprise de la clé et ne peut pas être fourni par l’appelant, si bien que même si vous choisissez le mauvais profil, la requête s’arrête côté serveur avec 403 ENVIRONMENT_MISMATCH. « Je croyais écrire dans la sandbox et j’ai écrit en production » est structurellement impossible.
La surface est identique — et c’est mesuré : le catalogue que récupère une clé sandbox est le même que celui de votre clé de production (sur une clé de chargeur, 448 commandes des deux côtés). Une passerelle qui fonctionne dans la sandbox fonctionne en production ; rien de ce que vous apprenez n’est à réapprendre.
La sandbox ne s’ouvre pas vide : elle contient des données d’amorçage générées (et NON copiées) — contacts, chargements dans les deux sens et demandes. Les noms sont ouvertement inventés et les adresses e-mail se trouvent dans le domaine @sandbox.invalid ; aucune ligne d’un vrai tenant n’est jamais lue, clonée ni utilisée comme modèle.
Il n’existe volontairement AUCUN bouton de réinitialisation, et aucun enregistrement, fichier ou document n’est jamais supprimé. Si vous voulez repartir de zéro, le renouvellement ouvre une nouvelle génération et l’ancienne reste, retirée. Quelques centaines de lignes de répétition accumulées ne coûtent rien à côté d’une routine de suppression branchée sur le mauvais tenant.
1. Ouvrir la sandbox — Une sandbox par entreprise. L’endpoint exige la permission de gestion d’équipe (team.manage), c’est donc un administrateur de votre entreprise qui s’en charge. Si elle existe déjà, le même endpoint répond en GET avec son état : id de l’entreprise, crédit restant, nombre de clés actives, abonnements, historique des générations et plafonds.
2. Émettre une clé sandbox et la conserver comme second profil — La clé est émise au nom de l’utilisateur passerelle propre à la sandbox et revient marquée environment: sandbox ; le token brut n’apparaît que dans cette unique réponse. Côté lg, ne remplacez pas votre clé de production — conservez LES DEUX dans des profils séparés ; --sandbox et --live sont des sélecteurs pour une seule exécution.
3. Écrire pour de vrai — Pas de --dry-run ici ; écrire est tout l’intérêt. Envoyez deux fois la même clé d’idempotence et regardez la seconde réponse revenir avec status: replayed — c’est le résultat mesuré dans la sandbox. Appelez volontairement une commande soumise à la barrière sans confirmation et lisez le corps du 409 ; essayez une commande hors de votre portée et lisez le refus. Rien de tout cela ne laisse de trace dans votre registre de production : votre solde de production reste inchangé sur la même exécution.
4. Lire la liste de contrôle avant la mise en production — L’endpoint go-live répond à partir de ce que vous avez RÉELLEMENT fait dans la sandbox : avez-vous écrit, avez-vous vu les branches d’erreur, un webhook a-t-il été livré, avez-vous déplacé le récepteur hors de l’adresse de répétition, avez-vous mis une date d’expiration sur la clé ? Chaque élément revient sous la forme pass / todo / unknown. La même réponse porte aussi une PROPOSITION DE PORTÉE dérivée des commandes que vous avez réellement appelées — utilisez-la pour émettre votre clé de production sans plus de droits que nécessaire.
Crédits et facturation — La sandbox a son propre registre de crédits et votre solde de production ne bouge pas. C’est une structure, pas un contrôle : le crédit est compté par entreprise et la sandbox est une entreprise distincte. Elle s’ouvre sur l’offre gratuite, n’a aucun moyen de paiement et se trouve hors de la fenêtre d’encaissement mensuelle — elle ne peut aboutir à une facture par aucun chemin.
Place de marché — Une demande que vous ouvrez dans la sandbox n’apparaît PAS sur les écrans des vrais transporteurs et n’atteint PAS leur boîte e-mail ni leurs notifications push ; et vous ne voyez pas non plus les vraies demandes. La séparation est symétrique et appliquée dans deux requêtes distinctes : à qui une demande est VISIBLE et à qui elle est ENVOYÉE sont deux questions différentes.
Webhooks — Les abonnements portent eux aussi le marquage d’environnement. Un événement sandbox n’est jamais livré à un abonnement de production et un événement de production n’atteint jamais un abonnement sandbox ; pour un abonnement dont le marquage a dérivé, aucune livraison n’est même ouverte. Comme le plafond d’abonnements est par entreprise, vos abonnements de répétition n’entament pas votre quota de production.
Données d’amorçage — Les enregistrements d’exemple de la sandbox sont GÉNÉRÉS, jamais copiés depuis de vrais tenants. L’amorçage est idempotent : un second appel ne dépose pas un second jeu de données par-dessus vos propres enregistrements.
Le même catalogue — Votre rôle reste votre rôle dans la sandbox, et la liste des commandes est identique — c’est mesuré, 448 commandes des deux côtés. La sandbox n’est pas une démo au rabais ; c’est un jumeau de votre entreprise.
Limite actuelle : les abonnements webhook ne peuvent pas être gérés avec une clé sandbox — Les endpoints d’abonnement exigent la permission de gestion d’équipe (team.manage), et l’utilisateur passerelle de la sandbox n’a aucun rôle d’équipe : `lg --sandbox webhooks …` répond donc 403 aujourd’hui. Toute la surface de commandes fonctionne — la restriction ne porte que sur le registre des abonnements. Si vous souhaitez répéter les webhooks dans la sandbox, contactez le support ; c’est mesuré et consigné comme une lacune ouverte.
GET /api/common/integration-sandbox — État : si elle existe, quelle entreprise, crédit restant, nombre de clés actives et d’abonnements, historique des générations, plafonds, et un guide des déclencheurs indiquant quelle commande lève quel événement.
POST /api/common/integration-sandbox — Ouvre la sandbox (une par entreprise, idempotent). Exige la permission team.manage.
POST /api/common/integration-sandbox/keys — 201 + la clé et le token brut (uniquement ici, une seule fois). Le marquage environment: sandbox est déduit de l’entreprise ; l’appelant ne peut pas le fournir.
GET /api/common/integration-sandbox/go-live — La liste de contrôle de mise en production et une proposition de portée — calculées à partir de votre trafic réel dans la sandbox.
POST /api/common/integration-sandbox/renew — Ouvre une nouvelle GÉNÉRATION de sandbox et retire la précédente.
Le modèle de commande
Il n’y a qu’une seule grammaire, et elle ne connaît pas d’exception. Pour savoir comment appeler une commande, il vous suffit de ce que le catalogue en dit.
lg loads list --status=in_transport --limit=20 --json
Les noms d’options sont les noms de paramètres du schéma, et lg accepte les deux graphies : --load_code et --load-code atteignent le même champ (lg help affiche la forme kebab-case). Voir une option vous indique donc dans quel champ JSON elle aboutit, et passer de la CLI au HTTP ne demande aucune traduction de noms. Un paramètre booléen écrit sans valeur vaut true (--only_open) ; l’inverse est --no-only_open. Écrivez un argument dont la valeur commence par un tiret sous la forme --flag=value, sinon une option oubliée avale silencieusement la suivante comme valeur. Sur une commande qui prend un fichier, placez @ devant un chemin local (--attachment_uuid=@./cmr.pdf) — voir Commandes qui prennent des fichiers.
lg — Le client.
loads — Le domaine — l’entité sur laquelle vous travaillez, au pluriel.
list — Le verbe — ce que vous faites à cette entité, tiré d’un vocabulaire fermé qui ne s’enrichit que par décision délibérée : des verbes simples (list, get, create, update, delete, search, preview, generate, extract …) et des verbes composés qui nomment ce qui est rattaché ou modifié (add-document, set-status, assign-driver). lg help liste les verbes d’un domaine.
--status=in_transport — Un paramètre — son nom est exactement le nom du paramètre dans le JSON Schema et sa valeur doit correspondre au type du schéma. Une valeur invalide sur un champ enum n’atteint jamais le serveur.
--limit=20 — Nombre de lignes pour les commandes de liste. Le plafond est indiqué dans la description des paramètres de chaque commande — en général 20 pour un simple appel de liste et jusqu’à 100 en mode synchronisation (avec cursor ou updated_since).
--json — Sortie JSON brute.
--json — Affiche du JSON brut. C’est la seule forme correcte pour les scripts : le tableau aligné par défaut est destiné aux humains, choisit ses colonnes d’après les données et peut changer de mise en page sans préavis. N’écrivez jamais de script qui analyse la sortie en tableau.
--yes, -y — Franchit la barrière de confirmation (confirm: true en HTTP). Ne l’utilisez que dans un script qui sait ce qu’il s’apprête à faire ; sur une commande irréversible, cette option est un raccourci pour « il n’y a pas de retour en arrière ».
--idempotency-key= — Rend sûre la nouvelle tentative d’une commande d’écriture. Un second appel avec la même clé ne réexécute pas la commande ; il renvoie le premier résultat. Si vous construisez une boucle de nouvelles tentatives, générez la clé VOUS-MÊME et envoyez la même à chaque tentative.
--dry-run — Exécute un preflight au lieu de la commande : la validation, les barrières et le calcul des crédits s’exécutent, rien n’est écrit (voir la section sur le preflight). Valable sur toutes les commandes et sur lg batch.
--refresh — Force le rafraîchissement du catalogue. lg met le catalogue en cache pendant une heure ; si vous savez qu’une commande vient d’être ajoutée sur le serveur, utilisez ceci plutôt que d’attendre.
--help, -h — Affiche la description de la commande issue du catalogue, chaque paramètre, son type, ses valeurs enum et s’il est obligatoire. Il n’y a pas de fichier d’aide dans le client.
--profile=, --sandbox, --live — Le profil sous lequel exécuter cet appel précis. --sandbox et --live choisissent le profil qui détient une clé sandbox ou une clé de production ; l’environnement est déduit de la clé côté serveur, si bien qu’une incohérence s’arrête avec 403 ENVIRONMENT_MISMATCH au lieu d’écrire au mauvais endroit.
--base-url, --timeout, --verbose, --no-color, --version — Respectivement : diriger une commande vers un autre serveur, un délai d’expiration en secondes, le détail requête/réponse, la désactivation des couleurs ANSI, et la version du client.
Exemples réels
Chaque commande ci-dessous existe aujourd’hui dans le catalogue ; aucun nom ni paramètre n’est inventé ici. Les sorties sont abrégées. Elles montrent le niveau `data.result` ; en HTTP, le même objet arrive à l’intérieur de l’enveloppe `{success, data:{…}}` (voir l’API de commandes HTTP).
Chargements actuellement sur la route — lg loads list --status=in_transport --limit=20
Un chargement complet, en JSON brut — lg loads get --load_code=FSK2158 --json
Signalements de cohérence documentaire ouverts — lg loads list-problems --only_open=true --limit=10
Résoudre le pays — lg countries search --query=Germany --json
Filtrer avec l’identifiant résolu — lg loads list --receiving_country_id=57 --date_from=2026-09-01 --limit=20
Trouver un code HS à partir d’un nom de produit — lg tariffs search --query="aluminium profile"
Faire avancer un chargement (rôle transporteur uniquement) — lg loads set-status --load_code=FSK2158 --status=transit --date=2026-08-21 --yes
Brouillon — lg export-documents create --doc_type=proforma-invoice --currency_code=EUR --json
Le générer (soumis à la barrière) — lg export-documents generate --document_id=8412 --yes
Sans le client : l’API de commandes HTTP
lg est une commodité, pas la porte d’entrée. Le catalogue et l’exécution passent tous deux par trois endpoints HTTP (les fichiers en ont un quatrième, l’endpoint d’envoi — voir Commandes qui prennent des fichiers) ; une intégration ERP ou CRM s’y connecte directement. L’identité est un token d’accès personnel transmis dans Authorization: Bearer. CHAQUE réponse revient dans la même enveloppe : `{ "success": bool, "data": { … }, "code": "…", "message": { … } }`. Tout le contrat vit dans `data` — `contract_version`, `command`, `status` et, comme sortie de la commande, `result` ; en cas d’échec, `error_code`, `error_key` et `error`. Les exemples de réponses de cette page montrent l’objet `data` plutôt que l’enveloppe, pour gagner de la place ; n’oubliez pas de déballer `data` dans votre propre code. `lg --json` affiche lui aussi l’enveloppe ENTIÈRE, c’est pourquoi les chemins jq commencent par `.data.result…`. La seule exception est `/api/public/status` : cet endpoint est sans enveloppe, afin que les outils de surveillance puissent alerter sans l’analyser.
Demander une confirmation avec 200 + ok:false est interdit et n’arrivera jamais. La raison est simple : les clients traitent 200 comme un succès, donc une demande de confirmation renvoyée en 200 tuerait le flux en silence et personne ne le remarquerait. La confirmation est toujours un 409.
GET /api/common/commands — Tout le catalogue que votre rôle peut voir : contract_version ; par commande, name, domain, verb, description, JSON Schema, read_only, confirmation_needed, irreversible, credit_cost, since, deprecated_at, replaced_by, aliases et les champs d’accès key_level, permission, file_params, secret_parameters et cli_only ; au niveau supérieur, le dictionnaire error_keys, rate_limits, idempotency_ttl_hours, les rôles de votre catalogue, le contrat attachments (envoi de fichiers) et le niveau d’accès de la clé avec laquelle vous appelez. Envoie un ETag ; If-None-Match répond 304. ?domain= correspond aussi à un ancien domaine (alias). Construisez votre client à partir de cela ; ne codez pas en dur une liste de commandes.
GET /api/common/commands/{name} — Une commande en détail. name est le nom de commande gelé issu du catalogue (list_loads), pas l’identité CLI. Une commande dépréciée répond avec un en-tête X-Deprecated.
POST /api/common/commands/{name} — Exécution. Corps : { args, confirm?, idempotency_key? }. Le statut HTTP de la réponse est le résultat lui-même — tout ce qui n’est pas 200 est une information, pas du bruit. Les erreurs portent error_code (transport) et, pour les refus métier, error_key.
Commandes qui prennent des fichiers
33 commandes du tableau prennent un document ou une photo : joindre une CMR à un chargement, lire les codes HS d’une facture, créer un véhicule à partir de son certificat d’immatriculation, estimer une palette à partir de photos, envoyer un document d’entreprise, rapprocher une facture d’une liste de colisage. Dans le navigateur, vous déposez le fichier dans un formulaire ; partout ailleurs, cela se fait en deux étapes — envoyer le fichier, puis transmettre son identifiant à la commande.
Un paramètre prend un fichier lorsque son nom se termine par attachment_uuid ou attachment_uuids — photos[].attachment_uuid dans une liste, front_attachment_uuid sur un chèque. Vous n’avez pas à vous en souvenir : chaque ligne du catalogue porte file_params avec les chemins exacts, le schéma marque ces champs (format: uuid, x-logistivo-file: true), et la réponse du catalogue porte un bloc attachments avec l’adresse d’envoi, les types acceptés, les limites de taille et la durée de vie. lg help les affiche aussi.
Envoyer un fichier est une écriture : une clé à portée lecture ne peut donc pas en envoyer ; toute clé à portée écriture le peut, quel que soit son niveau d’accès. Les envois appartiennent à l’utilisateur, pas à la clé : deux clés du même utilisateur voient les mêmes envois, et personne ne peut utiliser ceux de quelqu’un d’autre. Un identifiant inconnu, expiré ou qui ne vous appartient pas est simplement introuvable, et le motif n’est pas divulgué.
Les pièces jointes du chat du tableau de bord et les envois des commandes sont des espaces séparés : un fichier joint dans le chat de l’assistant ne peut pas être transmis à une commande par son identifiant, et un envoi de commande n’apparaît jamais dans un fil de discussion.
Un envoi n’est pas une commande et n’a aucun effet métier en soi : rien n’arrive à vos données tant qu’une commande n’utilise pas l’identifiant. C’est aussi pourquoi un envoi ne demande jamais de confirmation — c’est la commande qui consomme le fichier qui porte la barrière.
1. lg : placez @ devant un chemin local — lg envoie d’abord le fichier, puis exécute la commande avec l’identifiant renvoyé ; une valeur sans @ est l’identifiant d’un fichier que vous avez envoyé auparavant. Les listes prennent des chemins séparés par des virgules ou une option répétée, les champs imbriqués prennent du JSON, et --file est un raccourci lorsque la commande a exactement un champ de fichier de premier niveau. lg vérifie chaque fichier localement (existence, taille, type) avant tout envoi, et lg batch envoie une fois chaque fichier distinct avant l’exécution du batch.
2. HTTP : envoyer, puis transmettre attachment_uuid — Envoyez le fichier en multipart/form-data dans un champ nommé file. Un nouvel envoi répond 201 ; le même fichier envoyé à nouveau par le même utilisateur répond 200 avec le statut replayed et le même identifiant, et rien n’est écrit. Comme partout sur cette page, l’exemple montre l’objet data à l’intérieur de l’enveloppe.
3. MCP : l’outil upload_attachment — Un client MCP ne peut pas envoyer de multipart ; le canal propose donc un outil supplémentaire qui ne figure pas dans le catalogue : upload_attachment prend un nom de fichier et le contenu en base64, et renvoie le même attachment_uuid. Il appelle le même service que l’envoi HTTP, selon les mêmes règles.
Le type vient du contenu — Le nom du fichier et le type déclaré sont ignorés ; l’extension stockée est celle qui a été détectée. Acceptés à l’envoi : jpg, jpeg, png, webp, heic, heif, pdf, xlsx, xls, csv, txt, doc, docx, xml, zip. Chaque commande applique ensuite sa propre liste, plus restreinte, avant toute exécution et répond UNSUPPORTED_FILE_TYPE avec les types acceptés, ou FILE_TOO_LARGE.
Durée de vie — Un envoi peut être utilisé pendant 24 heures. Passé ce délai, il n’est plus résolu (ATTACHMENT_NOT_FOUND) — il n’est pas supprimé. Envoyez-le à nouveau si une commande échoue pour cette raison.
Même fichier, même identifiant — Envoyer à nouveau le même fichier (même nom, même taille et même contenu) renvoie l’identifiant existant au lieu d’en écrire un nouveau, tant qu’il lui reste au moins une heure, et cela n’entame pas votre plafond quotidien.
Plafonds quotidiens — 300 envois par utilisateur et par jour (TOO_MANY_FILES) et 2 Go par entreprise et par jour (DAILY_LIMIT_REACHED) ; les deux répondent 429 avec retry_after.
POST /api/common/commands:upload — Envoi multipart dans le champ file. 201 pour un nouvel envoi, 200 avec le statut replayed pour le même fichier. Renvoie data.attachment : attachment_uuid, filename, mime_type, size_bytes, sha256, extraction_status, expires_at et reused.
La barrière de confirmation et les commandes irréversibles
Chaque commande du catalogue porte deux indicateurs : confirmation_needed (exige-t-elle une approbation explicite avant de s’exécuter) et irreversible (son effet peut-il être annulé). Ce sont deux questions distinctes, et toutes deux sont appliquées sur le serveur plutôt que laissées aux bonnes manières du client.
La barrière est une affaire de responsabilité, pas de règles métier. Déposer une offre est le premier pas vers un contrat de fret ; émettre une facture crée une écriture comptable ; un mouvement de stock modifie un registre. Rien de tout cela ne devrait jamais pouvoir être exécuté deux fois par accident.
La barrière est lue sur la commande EFFECTIVE. Lorsqu’une commande en enveloppe une autre — comme le fait l’exécuteur générique du chat —, la barrière provient des indicateurs de la commande qui s’exécutera réellement, pas de l’enveloppe. Avec un indicateur fixe, l’un de deux échecs serait inévitable : soit la commande de facturation s’exécuterait sans confirmation, soit chaque recherche de pays ferait apparaître une carte de confirmation.
read_only et « sans barrière » ne sont pas la même chose. Il existe trois états distincts : invoices preview est sans barrière et n’écrit rien ; loads create est soumis à la barrière et écrit ; invoices create est sans barrière mais écrit — un brouillon voit le jour. Un seul test tranche : au retour de la commande, une ligne de la base de données a-t-elle changé ?
Certaines actions ne sont pas derrière cette barrière parce que ce ne sont pas du tout des commandes : acheter un forfait, ajouter une carte avec 3D Secure, approuver des textes juridiques et clôturer un compte se font dans le navigateur de la personne elle-même. Pour celles-ci, lg handoff-links generate renvoie un lien logistivo.com — gratuit, sans aucune écriture, ne portant aucun secret — et la personne termine l’étape là-bas. Aucun indicateur, quelle que soit sa valeur, ne transforme un paiement ou un consentement en appel d’API.
Il est techniquement possible pour une intégration de franchir automatiquement la barrière à chaque appel, mais ce n’est pas recommandé. Le bon modèle consiste à automatiser la barrière uniquement pour les commandes que vous savez réversibles, et à acheminer les commandes irréversibles vers la file d’attente d’un humain.
1. L’appeler — Appelez la commande soumise à la barrière sans confirm. Rien ne change.
2. Lire le résumé — Vous obtenez un 409 ; confirmation.summary dans le corps est une phrase écrite pour un humain (« Émission d’une facture : X Ltd, 1 200,00 TRY »), pas un vidage des arguments bruts. Les commandes monétaires portent aussi un aperçu structuré : lignes, totaux, avertissements.
3. Confirmer — Répétez le même appel avec confirm: true (--yes dans la CLI). Les commandes irréversibles sont marquées de façon à s’exécuter au plus une fois.
Preflight : voir ce que ferait une commande d’écriture, sans l’exécuter
L’étape la plus coûteuse du câblage d’une passerelle ERP consiste à vérifier que votre corps de requête est correct en exécutant RÉELLEMENT la commande : un brouillon de facture dans le registre de production, un crédit brûlé, un nettoyage manuel. dry_run (exécution à blanc) met fin à cela — vous ajoutez un champ à la requête, la commande ne s’exécute pas, et vous lisez ce qui se passerait.
Le registre contient aujourd’hui 519 commandes ; 233 d’entre elles ne font que lire et n’écrivent rien. Sur les 286 commandes d’écriture restantes, 251 sont soumises à la barrière : appelées sans confirm, elles répondent déjà 409 et décrivent ce qu’elles feraient. La lacune concernait les 35 autres — brouillons de factures, brouillons de documents d’exportation, lignes : exactement la chaîne qu’une passerelle câble en premier. Pour celles-là, appeler revenait à faire.
Il existait une seconde lacune, même sur les commandes soumises à la barrière : la validation du schéma s’exécute APRÈS la barrière. Un appel auquel il manquait un argument recevait donc d’abord la carte de confirmation, la confirmait, et n’apprenait qu’ensuite que « ce champ est manquant ». Un preflight répond aux deux questions en un seul aller-retour.
Et le bug de passerelle le plus courant — et le plus tardivement découvert — est le suivant : vous envoyez un champ qui ne figure pas dans le schéma (customer_id là où recipient_contact_id est attendu), le serveur l’ignore en silence, la commande renvoie 200 et l’enregistrement atterrit au mauvais endroit. La réponse du preflight liste ces champs par leur nom sous arguments.ignored ; aucun message d’erreur ne le fera jamais.
Un preflight n’écrit rien, et c’est structurel avant d’être une mesure : le chemin du preflight n’entre jamais dans le handler de la commande, donc cela vaut pour toutes les commandes, y compris celles ajoutées plus tard. Cela a aussi été mesuré lors de la mise en service : chaque instruction SQL émise pendant le preflight de toutes les commandes d’écriture alors présentes dans le catalogue (deux jeux d’arguments, deux rôles, 178 preflights) a été capturée. Pas un seul INSERT/UPDATE/DELETE, pas un seul job mis en file, pas un seul e-mail ; le nombre de lignes de 31 tables et le solde de crédits sont restés inchangés.
Le code de sortie est celui que produirait l’appel réel — s’exécuterait 0, barrière de confirmation 4, conflit d’idempotence 2, tout le reste 1 — si bien que « lg … --dry-run || exit » est une barrière pertinente dans une étape de CI.
1. L’appeler avec dry_run — Ajoutez "dry_run": true au corps de la requête. La validation, la barrière de rôle et de portée, la résolution de la cible et le calcul des crédits s’exécutent tous ; la commande, elle, ne s’exécute pas.
2. Lire would_execute — C’est le seul indicateur sur lequel brancher. Lorsqu’il vaut false, would_stop.at indique où un appel réel s’arrêterait : idempotency, target_precheck, confirmation_gate ou arguments.
3. Corriger votre corps de requête — arguments.ignored nomme les champs qui seraient ignorés en silence, missing_required les champs obligatoires que vous avez omis, et would_charge le nombre de crédits qui seraient consommés et si le solde les couvre.
4. Retirer dry_run — Répétez jusqu’à ce que would_execute vaille true, puis retirez l’indicateur et effectuez l’appel réel. La clé d’idempotence envoyée pendant le preflight n’a pas été consommée, l’appel réel s’exécute donc normalement.
Le HTTP est toujours 200 — « La commande échouerait » n’arrive jamais sous forme de 4xx — le preflight lui-même a réussi et la prédiction se trouve dans le corps. L’exception est un refus au niveau transport, et là il se comporte exactement comme un appel réel : 404 commande inconnue, 403 rôle/portée, 429 limite de débit.
Une clé à portée lecture ne peut pas faire de dry run sur une commande d’écriture — Elle reçoit un 403. Un preflight répond à la question « que se passe-t-il si j’appelle ceci AVEC CETTE CLÉ, maintenant » ; donner le feu vert à une clé de lecture puis un 403 sur l’appel réel serait précisément la surprise que le preflight existe pour éviter.
La clé d’idempotence n’est pas consommée — Une clé envoyée pendant un preflight n’ouvre aucune ligne dans le registre, et un verrou expiré n’est pas libéré. Envoyez donc la clé que vous comptez utiliser pour de vrai : le preflight vous dit si elle est encore libre, si elle rejouerait une exécution antérieure ou si elle entre en conflit avec une autre commande.
Il se combine avec confirm — Envoyez dry_run et confirm ensemble, et la question devient « si je confirme, que se passe-t-il ? ». Rien ne s’exécute pour autant.
Le preflight d’un batch se fait par batch — commands:batch accepte aussi dry_run, mais l’indicateur appartient au batch, pas à un élément (l’envoyer sur un élément donne un 422). Vous obtenez un rapport par élément ainsi que le coût total en crédits du batch ; un solde insuffisant est signalé, pas refusé.
Ce n’est pas gratuit — Chaque preflight exécute de vraies requêtes (aperçu, solde) et compte dans la limite de débit. Ne faites pas de preflight sur tout le catalogue à chaque déploiement ; faites-le sur les commandes que vous avez modifiées.
Idempotence : pourquoi une nouvelle tentative ne crée pas de doublon
Un ERP ne lit pas votre message d’erreur, ne voit pas votre écran et renverra la même requête après un délai d’expiration. Cette section existe précisément pour ce comportement.
Un appel porteur d’une idempotency_key (clé d’idempotence) s’exécute au plus une fois. Le second appel ne réexécute pas la commande ; il renvoie le résultat enregistré avec le statut replayed. Quand le réseau tombe, quand une requête expire ou quand une file d’attente prend deux fois le même job, vous obtenez le premier résultat au lieu d’une facture en double.
Utilisez une clé sur chaque commande d’écriture. Le champ read_only du catalogue vous donne gratuitement cette distinction : toute commande avec read_only: false mérite une clé d’idempotence.
Votre stratégie de nouvelles tentatives doit utiliser un backoff exponentiel et porter la MÊME clé à chaque tentative. Générer une nouvelle clé à chaque tentative revient à ne pas utiliser l’idempotence du tout. N’envoyez pas la même clé en parallèle : l’exécution au plus une fois est garantie pour des nouvelles tentatives séquentielles, pas pour deux requêtes qui se font la course.
Piège 1 — l’échec aussi est verrouillé — Si la première exécution a été rejetée par une règle métier (failed), un second appel avec la même clé renvoie la même erreur et la même error_key, sans réessayer. Corriger l’argument et réessayer exige une NOUVELLE clé. Une clé représente une tentative, pas une intention.
Piège 2 — un résultat volumineux est rejoué sans corps — Le registre ne stocke un résultat que s’il fait moins de 64 Ko. Un résultat plus volumineux est rejoué avec le statut replayed mais un corps vide. Votre intégration doit s’appuyer sur le signal « replayed » plutôt que sur le corps, et récupérer les données avec la commande get correspondante.
Piège 3 — une clé appartient à une seule commande — Envoyer la même clé avec une autre commande renvoie 409 idempotency_conflict avec le conflicting_command ; rien ne s’exécute et rien n’est rejoué. Un client qui partage une clé entre deux verbes est défectueux, et il l’apprend par une erreur, non par un rejeu silencieux.
Piège 4 — le verrou dure 24 heures, pas éternellement — Au bout de 24 heures, la même clé correspond à une nouvelle exécution. Les nouvelles tentatives réseau arrivent en quelques minutes ; les numéros de documents récurrents d’un ERP, qui reviennent chaque année, ne doivent pas rester « replayed » pour toujours. Le catalogue publie cette fenêtre sous idempotency_ttl_hours.
Piège 5 — une erreur serveur ne verrouille pas la clé — Un 5xx server_error n’est pas un rejet métier : la clé n’est pas liée, donc une nouvelle tentative avec la même clé exécute réellement la commande. Seul failed verrouille (piège 1).
Portée et format — votre entreprise, n’importe quelle chaîne, de préférence un UUID — L’unicité est imposée sur (votre entreprise, clé) : l’INV-1001 d’un autre tenant n’entre jamais en collision avec le vôtre et ne peut jamais rejouer votre résultat. Utilisez un simple UUID ou une valeur composée unique par construction, comme {ERP-document-no}:{verb}.
Synchronisation incrémentale et pagination
Une passerelle ERP/CRM doit récupérer ce qui a changé, pas tout, toutes les heures. Chaque commande de liste — loads list, demands list-own, contacts list, invoices list, teammates list, load-groups list, reservations list, drivers list, tenders list, products search, warehouses search — accepte deux paramètres communs et renvoie un champ commun.
Pourquoi il n’y a pas d’offset : sur une table vivante, un offset dérive. Une ligne insérée entre deux pages vous fait sauter ou compter deux fois un enregistrement, en silence. Le curseur n’avance que vers l’avant, donc un enregistrement inséré ou mis à jour en cours de parcours arrive en fin de liste : rien n’est perdu, rien n’est dupliqué.
Un chargement initial complet utilise le même mécanisme : commencez avec updated_since=1970-01-01T00:00:00Z et suivez next_cursor jusqu’à ce qu’il vaille null. Il n’existe pas d’endpoint « export » séparé, car aucun n’est nécessaire.
Même chose avec lg : lg loads list --updated_since=2026-09-01T00:00:00Z --limit=100 --json, puis lg loads list --cursor= --json.
Pour la synchronisation suivante, réglez updated_since sur le plus grand updated_at que vous avez vu. Les horodatages ont une précision d’une seconde, donc un enregistrement situé à la limite peut arriver deux fois — sans conséquence tant que vous faites un upsert par external_ref ou par code de votre côté. Sans updated_since ni cursor, une commande s’exécute en mode chat : ordre pensé pour un humain, 20 lignes au maximum, next_cursor à null et truncated indiquant « il y en a d’autres ». N’utilisez pas ce mode pour la synchronisation.
Clés d’erreur lisibles par machine pour cette section : INVALID_CURSOR, INVALID_UPDATED_SINCE, DUPLICATE_EXTERNAL_REF, EXTERNAL_REF_TOO_LONG, EXTERNAL_REF_INVALID. Toutes répondent HTTP 422 avec error_code: "failed" et result.error_key dans le corps. Branchez sur la clé, jamais sur le texte.
updated_since — Horodatage ISO-8601 (UTC recommandé, p. ex. 2026-09-01T00:00:00Z). Lignes mises à jour à cet instant ou après. Il fait passer la commande en mode synchronisation : ordre fixe (updated_at, id) croissant, limit plafonné à 100.
cursor — Le next_cursor de la réponse précédente, tel quel. Il est opaque et signé : n’en construisez ni n’en modifiez jamais un, ne réutilisez jamais le curseur d’une autre entreprise ou d’une autre commande ; tous ces cas sont rejetés avec INVALID_CURSOR.
limit — Taille de page. De 1 à 100 en mode synchronisation (10 par défaut).
next_cursor (réponse) — Curseur de la page suivante. null signifie que la liste est complète ; c’est la seule réponse correcte à la question « y en a-t-il d’autres ».
total (réponse) — Lignes correspondant aux filtres, indépendamment de la page — pour le suivi de progression.
Votre propre clé : external_ref
Ne faites pas de nos identifiants auto-incrémentés (invoice_id, contact_id) la clé métier de votre ERP ; ils sont opaques et propres à votre entreprise. Les chargements, demandes, contacts, factures, produits et entrepôts portent votre clé à la place.
Définissez-la à l’écriture — loads create, demands create, contacts create et contacts update, invoices create acceptent un external_ref facultatif (120 caractères maximum) et le renvoient inchangé.
Utilisez-la à la lecture — loads get --external_ref=ORD-2026-0917, invoices get --external_ref=..., contacts get --external_ref=..., demands get --external_ref=... fonctionnent tous ; sur les commandes de liste et de recherche, --external_ref= est un filtre de correspondance exacte.
Unique par entreprise — Un second enregistrement avec la même clé est refusé avec 422 et result.error_key = DUPLICATE_EXTERNAL_REF ; la clé d’une autre entreprise vous répond « introuvable ». La correspondance ne tient pas compte de la casse (ord-1 = ORD-1). Un enregistrement archivé conserve sa clé ; restaurez-le avant de réutiliser la clé.
Envoyez aussi une idempotency_key — Une nouvelle tentative après un délai d’expiration réseau renvoie le premier résultat au lieu de créer un doublon. Les deux ne sont pas interchangeables : external_ref est votre clé métier, idempotency_key identifie une tentative.
Webhooks sortants : nous vous envoyons un POST quand quelque chose se produit
Tout ce qui précède relevait du pull : vous demandez, nous répondons. Une passerelle ERP devait interroger le serveur une fois par minute pour apprendre qu’un chargement avait changé de statut, qu’une facture avait été émise ou qu’une offre était arrivée. Ce n’est plus le cas : enregistrez une adresse https, choisissez les événements qui vous intéressent, et un POST signé arrive quand ils se produisent.
Le push a été ajouté À CÔTÉ du pull, pas à sa place. La synchronisation incrémentale (updated_since + cursor) reste intacte et demeure le bon outil : le premier chargement complet, le rattrapage de l’historique et la réponse à « ai-je manqué quelque chose » s’y trouvent. Les webhooks réduisent la latence de quelques minutes à quelques secondes. Une passerelle saine utilise les deux — le webhook comme déclencheur, la synchronisation comme filet de sécurité.
Le payload est un SIGNAL, pas une copie de l’enregistrement. Il porte les identifiants (id, votre propre external_ref, statut, heure) ; vous récupérez le détail avec votre propre clé via GET, et cet appel passe déjà par vos propres barrières d’autorisation. La surface d’exposition reste donc au niveau des identifiants. Deux champs sont volontairement absents : l’identité de l’entreprise qui a déposé une offre (les offres à l’aveugle apparaissent sous un alias dans l’interface web ; mettre l’identité dans un webhook percerait cette confidentialité par un second canal) et les coordonnées de contact des réservations (inutile de faire transiter des données personnelles par un canal supplémentaire).
Les noms d’événements sont GELÉS. Si le sens d’un nom change, un nouveau nom est ouvert et l’ancien vit pendant une période de dépréciation. L’ajout d’un nouveau champ au payload n’incrémente PAS la version du contrat — un consommateur doit ignorer les champs qu’il ne connaît pas.
GET /api/common/integration-webhooks — Le registre, ainsi que le catalogue des événements, les limites et les noms d’en-têtes. Chaque ligne porte son motif de mise en sourdine et un résumé des livraisons sur 7 jours.
POST /api/common/integration-webhooks — 201 + { webhook, secret, shown_once: true }. Le secret n’apparaît qu’ici.
PATCH /api/common/integration-webhooks/{uuid} — Nom / adresse / événements / indicateur d’activation. Ne touche PAS au secret.
DELETE /api/common/integration-webhooks/{uuid} — Le supprime : la ligne fait l’objet d’une suppression logique (l’historique reste consultable) et les livraisons en attente sont annulées.
POST /api/common/integration-webhooks/{uuid}/rotate-secret — 201 + un nouveau secret. L’ancienne valeur cesse de fonctionner à ce moment-là.
POST /api/common/integration-webhooks/{uuid}/test — Un événement ping — vraie signature, vrai chemin, vrai calendrier de nouvelles tentatives.
GET /api/common/integration-webhooks/{uuid}/deliveries — Les livraisons les plus récentes : statut, numéro de tentative, code HTTP, durée, étiquette d’erreur.
POST /api/common/integration-webhooks/deliveries/{uuid}/replay — Renvoie une seule livraison : event_id est CONSERVÉ, l’id de livraison est nouveau, le payload est copié tel quel.
Catalogue des événements
Chacun des 13 événements ci-dessous est adossé à une classe d’événement RÉELLEMENT émise. Il n’y a pas de noms « ce serait bien » dans le catalogue : un événement annoncé mais jamais déclenché est un événement que l’intégrateur attend pour toujours, et cet échec est silencieux. Ce tableau n’est pas non plus rédigé à la main — il est tiré du catalogue en direct à chaque chargement de la page.
invoice.payment_recorded est volontairement ABSENT : cette classe d’événement existe dans le code mais n’est émise nulle part. L’événement de paiement sera ajouté le jour où la classe sera réellement déclenchée — pas avant. Annoncer un événement trop tôt est pire que de ne jamais l’ajouter.
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)
Vérifier la signature
Chaque requête porte un en-tête X-Logistivo-Signature : t=,v1=. La chaîne signée est "." et l’algorithme est HMAC-SHA256. Le préfixe v1 rend le schéma versionnable : si un second schéma apparaît un jour, l’en-tête portera t=…,v1=…,v2=… et vous choisirez celui que vous connaissez.
Nous publions deux récepteurs de référence sans dépendance, l’un pour Node et l’autre pour PHP pur. Tous deux appliquent les quatre règles ci-dessus et se testent eux-mêmes avec --selftest : signature valide, corps altéré, mauvais secret, horodatage hors fenêtre, en-tête malformé, piège de la resérialisation et les deux types de répétition (même livraison / même fait). Le vérificateur est l’exact pendant du code que nous utilisons nous-mêmes — nous consommons le contrat que nous publions.
Vérifiez le corps BRUT — La signature est calculée sur des octets. Décoder puis resérialiser le corps (JSON.stringify(req.body), json_encode($request->all())) transforme les mêmes DONNÉES en OCTETS différents et la signature ne correspond plus. En Node, le piège est le formatage des nombres (1.50 sur le fil devient 1.5 ; les grands entiers perdent en précision), en PHP c’est l’échappement des caractères (/ devient \/, İ devient \u0130). Utilisez express.raw dans Express et $request->getContent() dans Laravel. C’est de loin l’erreur la plus fréquente lors de l’écriture d’un récepteur.
Vérifiez l’horodatage — t se trouve À L’INTÉRIEUR de la signature. Ne vérifier que la signature permet à quiconque a capturé une requête valide de la rejouer des heures plus tard, et le récepteur la compterait comme un événement vérifié. Rejetez toute requête pour laquelle |now − t| > tolérance, même si la signature est correcte. La fenêtre recommandée est de 300 secondes.
Comparez en temps constant — hash_equals / timingSafeEqual. Comparer avec == permet à un attaquant de deviner la signature octet par octet.
Dédupliquez sur event_id, pas sur id — event_id identifie le FAIT : il est identique pour deux abonnés qui reçoivent le même événement, et il est CONSERVÉ lors d’un rejeu. id (= X-Logistivo-Delivery) identifie la LIVRAISON et change lors d’un rejeu. Répondez à « l’ai-je déjà traité » avec event_id ; y répondre avec id ferait exécuter deux fois le même travail lors d’un rejeu.
Livraison, nouvelles tentatives et mise en sourdine
Votre récepteur ne sera pas toujours disponible. Le rail part de ce principe : un échec transitoire entre dans le calendrier des nouvelles tentatives, un échec permanent met l’abonnement en sourdine — et le MOTIF de la mise en sourdine est toujours enregistré.
Le motif de mise en sourdine est lisible par machine et stable (delivery_failures, endpoint_gone, unsafe_target, key_revoked, by_user) et apparaît à la fois dans l’interface web et dans `lg webhooks list`. Une mise en sourdine sans motif laisserait la question « pourquoi rien n’arrive » sans réponse. La réactivation remet à zéro le compteur et l’horodatage.
C’est vous qui écrivez l’adresse ; c’est NOTRE serveur qui fait la requête. Sans barrière, un tenant qui saisirait une adresse de métadonnées cloud pourrait nous faire émettre des requêtes depuis l’intérieur de notre propre réseau. L’adresse est donc vérifiée à l’enregistrement et à CHAQUE livraison :
Délais d’expiration — 8 s au total, 4 s pour se connecter — un récepteur lent ne doit pas monopoliser un worker. Mettez le travail en file d’attente et renvoyez immédiatement un 2xx.
Calendrier des nouvelles tentatives — 60 · 300 · 1800 · 7200 · 21600 secondes → 6 tentatives, soit une fenêtre d’environ 8,6 heures.
Le seul échec permanent : 410 Gone — Il signifie « supprimez-moi » : aucune nouvelle tentative, l’abonnement est mis en sourdine sur-le-champ. Ne renvoyez JAMAIS 410 pour un échec de signature.
Tous les autres échecs — TOUS font l’objet de nouvelles tentatives, 4xx compris. Perdre un événement métier coûte plus cher que quelques requêtes supplémentaires : un récepteur qui renvoie 403 pendant la mise à jour d’une règle WAF perdrait en silence un événement « facture émise » sur un rail qui traite les 4xx comme permanents.
Retry-After — Respecté sur 429 et 503 (plafonné à 6 heures).
Redirections — Elles ne sont PAS suivies. Sauter vers une adresse interne via un 302 percerait la barrière d’adresse par une seconde voie.
Mise en sourdine automatique — Après 10 livraisons consécutives épuisées. Un 410, une cible non sûre et la révocation de la clé d’intégration liée mettent en sourdine IMMÉDIATEMENT.
localhost, les noms à un seul label et les suffixes internes tels que .internal / .local / .svc sont rejetés — l’intention est rejetée avant même d’examiner le résultat de la résolution, si bien qu’un DNS split-horizon ne peut pas percer la barrière ;
les adresses IP littérales et TOUS les enregistrements de la résolution DNS doivent être publics. Si un nom se résout à la fois vers une adresse publique et une adresse privée, personne ne nous demande laquelle choisir → le nom est purement et simplement rejeté ;
au moment de la livraison, l’adresse est résolue une seule fois et la connexion est épinglée sur l’adresse vérifiée : la fenêtre de DNS rebinding est fermée ;
le CORPS de la réponse du récepteur n’est jamais stocké nulle part (seulement le code de statut, la durée et une courte étiquette d’erreur) — ainsi le chemin de « lecture », qui est ce que vaut réellement une faille dans la barrière d’adresse, reste fermé.
Il n’existe volontairement AUCUN réglage de configuration pour « autoriser les adresses privées » : un tel réglage finit un jour par rester activé par accident.
Renvoyé UNE SEULE FOIS, uniquement à la création de l’abonnement et lors d’un rotate-secret. Il est stocké chiffré sur le serveur et ne peut jamais être relu ; il n’y a pas de « réafficher ».
lg l’affiche à l’écran et s’en tient là — il ne l’écrit dans aucun fichier de configuration ni de cache.
S’il est perdu, vous le renouvelez ; l’ancienne valeur cesse de fonctionner À CE MOMENT-LÀ. Pour une bascule sans interruption, votre récepteur doit essayer les deux secrets pendant la transition.
Modifier l’adresse ne touche PAS au secret : une maintenance de routine comme « l’URL a changé » ne doit pas casser la vérification côté récepteur.
Santé et statut : personne ne devrait remarquer une passerelle muette avant vous
Une passerelle d’intégration meurt rarement avec fracas. En général, elle se tait au petit matin : un token expire, la personne au nom de laquelle la clé s’exécute quitte l’équipe, une portée est restreinte, ou l’endpoint récepteur se met à renvoyer 403. Le premier à s’en apercevoir est presque toujours le client. lg status existe pour inverser cet ordre.
Une seule commande répond à deux questions à la fois, car pendant une panne les deux se posent au même moment : la plateforme est-elle en service, et ma passerelle est-elle en bonne santé ? La ligne plateforme fonctionne sans token — lors d’une défaillance, le token lui-même est le premier suspect, et lier la question du statut à ce token vous laisserait sans réponse précisément au moment où vous en avez besoin.
Le résumé de santé ne tient aucun nouveau registre ; il réunit trois sources existantes en une seule phrase : le compteur d’utilisation quotidien (combien vous avez appelé et combien a échoué), le registre des requêtes (quelle requête, quand, et pourquoi elle a été rejetée) et le registre des livraisons de webhooks sortants (l’événement a-t-il atteint le récepteur). Le taux d’erreur est toujours lu sur le compteur quotidien ; le registre détaillé est plafonné et le dit clairement lorsque le plafond est atteint.
Le même résumé apparaît dans l’interface web : sous Settings › Integration › Keys, chaque ligne porte un badge et, en dessous, le motif. Les seuils ne sont pas calculés côté client ; le niveau attribué par le serveur est celui qu’affichent à la fois l’interface web et lg status, si bien que les deux écrans ne peuvent jamais dire des choses différentes sur la même clé.
Votre outil de surveillance n’a besoin d’aucun token. L’endpoint ne renvoie que des mots de statut ; il ne porte ni version, ni nom d’hôte, ni nom de file d’attente, ni nombre de jobs, ni texte d’erreur, ni donnée client — et il ne le peut pas.
Le résumé de santé est produit avec un nombre constant de requêtes par appel ; ce nombre n’augmente pas avec le nombre de clés. Pour le détail, consultez les requêtes récentes de la clé concernée avec lg logs et la passerelle sortante avec lg webhooks list.
SAINE — Aucune anomalie mesurée et nous disposons d’une preuve de succès : un appel réussi dans le registre, ou un trafic resté sans erreur dans le compteur.
ATTENTION — Quelque chose a commencé à se dégrader : le taux d’erreur ou la série d’échecs consécutifs a franchi un seuil, des requêtes sont rejetées à la barrière, la clé approche de son expiration, ou une passerelle qui communiquait régulièrement s’est tue.
EN ÉCHEC — La passerelle ne fonctionne pas en ce moment : le token a été révoqué involontairement, une clé fermée est encore appelée, il y a cinq échecs d’affilée, le taux d’erreur dépasse cinquante pour cent, ou un abonnement webhook a été mis en sourdine.
FERMÉE — La clé a été fermée délibérément et personne ne l’appelle. C’est une décision, pas une anomalie — et elle n’est pas affichée en rouge.
AUCUNE DONNÉE — Il n’y a aucune mesure : la clé n’a jamais été appelée, ou la mesure elle-même a échoué. Ni l’un ni l’autre n’est vert.
Pas de faux vert. Le badge « saine » exige une preuve de succès mesurée ; une clé qui n’a jamais été appelée ne passe jamais au vert, car aucune mesure ne montre qu’elle fonctionne.
Pas de faux rouge. Les clés que vous avez fermées volontairement s’affichent comme Fermées. Tout peindre en rouge vide le rouge de son sens ; une clé fermée ne passe au rouge que si elle est encore appelée après sa fermeture — et là, une passerelle est réellement cassée.
« Impossible de mesurer » n’est pas la même chose que « aucune donnée ». Si une requête échoue côté serveur, la ligne n’affiche pas zéro en silence ; elle indique que la mesure n’a pas pu être effectuée.
Le silence est toujours signalé, mais jamais transformé aveuglément en avertissement. Une passerelle de fin de mois qui se tait pendant trente heures, c’est normal ; une passerelle qui a communiqué au moins cinq des sept derniers jours et qui se tait, c’est une anomalie. Le rythme est mesuré, pas supposé.
La requête de statut elle-même ne pollue pas les chiffres de santé. Les appels effectués par lg status apparaissent dans le registre des requêtes mais sont exclus du calcul de santé — sinon votre propre requête de statut réussie remettrait à zéro la série d’échecs et masquerait précisément l’anomalie que l’écran existe pour montrer.
Chaque ligne est mesurée : une vraie requête est exécutée sur la base de données, le catalogue de commandes est réellement construit, l’enregistrement en direct du worker de file d’attente est réellement lu. Rien n’est supposé.
La réponse elle-même est aussi une mesure : si vous pouvez lire le corps, la couche web est en service.
Le niveau global ne dépend que des composants requis. Lorsque la file d’attente s’arrête, la réponse est degraded, pas down — un appel d’API synchrone n’a pas besoin de la file d’attente, et déclarer la plateforme hors service serait une fausse alerte.
Lorsque l’état de la file d’attente ne peut pas être mesuré, le niveau global reste intact : ne pas savoir n’est pas la même chose que mesurer que quelque chose est cassé.
Si la plateforme est hors service, l’endpoint renvoie HTTP 503. Le corps est sans enveloppe afin que les outils de supervision puissent alerter sans l’analyser, et la réponse n’est jamais stockée dans un cache.
Erreurs et codes de sortie
Ce sur quoi une machine se branche, c’est une chaîne stable. Le texte du champ error s’adresse à un humain, est localisé et change sans préavis — une intégration qui se branche sur le texte d’un message n’est pas prise en charge, et le fait qu’elle casse n’est pas un bug.
Deux taxonomies, deux champs. error_code est la couche transport (le tableau ci-dessus) et c’est sur lui que vous vous branchez en premier. error_key est la clé stable de règle métier à l’intérieur de failed — INSUFFICIENT_CREDITS, NOT_FOUND, DUPLICATE_CONTACT, INSUFFICIENT_STOCK — publiée sous forme de dictionnaire dans le catalogue (error_keys) et ci-dessous. Une commande qui n’émet pas encore de clé renvoie error_key: null ; traitez une clé absente du dictionnaire comme un échec générique.
ok — HTTP 200 · error_code — · CLI 0 · —
replayed — HTTP 200 · error_code — · CLI 0 · Rejeu idempotent ; le travail ne s’est PAS exécuté à nouveau.
failed — HTTP 422 · error_code failed · CLI 1 · Non — une règle métier l’a rejeté (voir error_key). Inutile tant que l’argument ne change pas.
idempotency_conflict — HTTP 409 · error_code idempotency_conflict · CLI 2 · Non — la clé a d’abord été utilisée pour une autre commande (conflicting_command). Créez une nouvelle clé.
forbidden — HTTP 403 · error_code forbidden · CLI 3 · Non — barrière de rôle, ou clé à portée lecture sur une commande d’écriture.
not_found — HTTP 404 · error_code not_found · CLI 2 · Non — nom de commande erroné ou supprimé.
(schéma) — HTTP 422 · error_code invalid_request · CLI 2 · Non — le corps de la requête ou un argument n’a pas passé la validation du schéma (errors{}) ; ce n’est pas une règle métier.
server_error — HTTP 500 · error_code server_error · CLI 6 · Oui — backoff exponentiel avec la MÊME clé d’idempotence ; la clé n’a pas été verrouillée.
401 unauthenticated — Le token a expiré ou a été révoqué. Réessayer n’y changera rien ; le token doit être remplacé.
429 rate_limited — Limite de débit atteinte pour ce token. La réponse porte toujours Retry-After et un corps avec retry_after, limit et bucket ; respectez-le au lieu d’inventer un délai fixe. lg attend et réessaie jusqu’à trois fois, puis se termine avec le code 5.
5xx server_error / erreur réseau — Réessayez avec un backoff exponentiel et la MÊME clé d’idempotence. Changer de clé réexécute un travail que le serveur a peut-être déjà terminé. lg réessaie trois fois (1 s, 2 s, 4 s), puis se termine avec le code 6 et l’error_code network_error ou server_error.
Engagement de stabilité
La question la plus coûteuse d’un contrat d’intégration est : « le code que j’écris aujourd’hui fonctionnera-t-il encore demain ? » Un seul nombre y répond : contract_version dans le catalogue, et l’en-tête X-Contract-Version sur chaque réponse. Il répond à une seule question — du code écrit auparavant fonctionne-t-il encore sans modification ? Si le nombre n’a pas augmenté, oui. S’il a augmenté, non : quelque chose sur quoi vous vous appuyiez a été retiré ou restreint.
Parce qu’une annonce ne retire rien : votre code existant fonctionne exactement comme avant, le lendemain de l’annonce. Incrémenter à l’annonce émettrait deux signaux pour un seul changement et vous habituerait à ignorer le premier — affaiblissant le signal qui compte vraiment. L’annonce voyage déjà avec l’appel que vous effectuez : deprecated_at et replaced_by sur la ligne du catalogue, un en-tête X-Deprecated et un bloc deprecated dans la réponse de cette commande, et un avertissement d’une ligne sur stderr si vous utilisez lg. Vous n’avez rien à faire pour apprendre que quelque chose va disparaître ; c’est déjà dans votre journal.
Au moins deux trimestres civils s’écoulent entre l’annonce et le retrait. Pendant toute la fenêtre, l’ancienne commande répond encore et avertit à chaque appel. Lorsqu’un nom CLI est abandonné, son successeur reprend ce nom comme alias : pendant la fenêtre, l’ancien nom atteint l’ancienne commande, et le jour où celle-ci est retirée, le même appel aboutit sur la nouvelle — sans que vous ayez à livrer une nouvelle version du client.
preview_invoice → get_invoice (annoncé le 3 septembre 2026). get_invoice renvoie le même bloc d’aperçu et y ajoute les lignes, la ventilation des taxes, les paiements enregistrés, le solde restant et l’adressage par votre propre clé ERP (external_ref). preview_invoice continue de fonctionner, tout comme lg invoices preview — les deux avertissent.
aucun changement — Une nouvelle commande · un nouveau paramètre FACULTATIF · un nouveau champ de réponse · une nouvelle clé d’erreur · un nouvel endpoint — Ne faites rien. Vous devez ignorer les champs que vous ne connaissez pas ; un analyseur qui échoue sur un champ inconnu n’est pas conforme.
aucun changement — Une ANNONCE de dépréciation : l’avis qu’une commande va disparaître — Votre code continue de fonctionner. Inscrivez une tâche dans votre agenda — la fenêtre est d’au moins 6 mois.
augmente — Retrait d’une commande · abandon d’un ancien nom CLI · suppression d’un champ de réponse · passage d’un paramètre facultatif à obligatoire · restriction d’un enum — Cela signifie que vous avez manqué la fenêtre ; l’avis vous est parvenu à trois endroits distincts.
Le nom d’API d’une commande (comme list_loads) est gelé pour toujours ; c’est le nom que vous utilisez dans les appels HTTP.
error_code (transport) et error_key (règle métier) sont des chaînes stables. De nouvelles valeurs peuvent apparaître — traitez une clé introuvable dans le dictionnaire comme un échec générique, pas comme une rupture.
La correspondance entre le statut HTTP et le champ status du corps est fixe.
Le numéro de version ne diminue jamais et se lit sur chaque réponse — y compris les 304 et 429 sans corps.
Le TEXTE des erreurs et des descriptions. Il est localisé et change sans préavis ; se brancher sur le texte d’un message n’est pas pris en charge.
L’absence de champs que vous ne connaissez pas. L’ajout d’un champ n’incrémente pas la version.
Les identifiants auto-incrémentés comme clés métier. Portez votre propre clé avec external_ref.
Les clés d’erreur dynamiques dérivées de noms de classes ; elles ne font pas partie du contrat.
Table d’identité des commandes
Le tableau ci-dessous n’est pas rédigé à la main : il est généré à partir du registre de commandes en direct à chaque fois que cette page est servie. Une commande ajoutée sur le serveur y apparaît d’elle-même. La colonne « Barrière » vous indique si une commande demande une confirmation et si son effet peut être annulé ; la colonne « Rôles » vous indique quels types de comptes la trouveront dans leur catalogue. Des badges signalent les commandes qui exigent une clé de niveau manager, celles qui prennent un fichier et celles qui ne s’exécutent que depuis lg.
Le nom d’API (list_loads) est gelé et ne changera pas ; c’est le nom que vous utilisez dans les appels HTTP. L’identité CLI (loads list) relève de la politique de versionnage : une fois annoncée, elle ne change qu’avec une incrémentation de version et une fenêtre de migration, pendant laquelle le catalogue sert l’ancienne paire comme alias. Les descriptions proviennent de l’enregistrement propre à chaque commande et sont abrégées — pour le texte complet, les types de paramètres et les valeurs enum, consultez l’endpoint du catalogue ou exécutez lg help . Les commandes réservées aux affiliés ne sont pas listées ici ; un compte affilié les voit dans son propre catalogue.
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… (lecture · — · chargeur · API: get_account_settings) [clé manager]
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),… (écriture · confirmation · chargeur · API: update_account_settings) [clé manager]
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… (lecture · — · tous · API: get_accounting_settings)
lg accounting-settings set-status — Turn the company's accounting module on or off (muhasebe modülünü aç/kapa). (écriture · confirmation · tous · 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… (écriture · confirmation · tous · 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). (lecture · — · tous · 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. (lecture · — · transporteur · 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… (lecture · — · chargeur · API: get_ai_settings) [clé manager]
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… (écriture · confirmation · chargeur · API: update_ai_settings) [clé manager]
lg announcements list — Show the system announcements Logistivo sent to this user (new features, maintenance, policy changes) — newest first. (lecture · — · tous · API: list_announcements)
lg announcements mark-read — Mark system announcements as read for this user. (écriture · — · tous · 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). (lecture · — · tous · API: read_attachment) [prend un fichier: 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 /… (lecture · — · tous · 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). (écriture · confirmation + irréversible · tous · API: create_company_bank_account) [clé manager]
lg bank-accounts delete — Delete one of OUR OWN company bank accounts (for example a closed account). (écriture · confirmation + irréversible · tous · API: delete_company_bank_account) [clé manager]
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. (écriture · confirmation + irréversible · tous · API: extract_supplier_bank_accounts) [prend un fichier: attachment_uuid]
lg bank-accounts list — List bank accounts. (lecture · — · tous · 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). (lecture · — · tous · 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. (écriture · confirmation + irréversible · tous · API: set_default_company_bank_account) [clé manager]
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… (écriture · confirmation + irréversible · tous · API: decide_bank_account_verification) [clé manager]
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. (écriture · confirmation + irréversible · tous · API: update_company_bank_account) [clé manager]
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. (lecture · — · tous · API: list_banks)
lg bids accept — Accept a carrier's bid on one of this company's demands. (écriture · confirmation + irréversible · chargeur · 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. (lecture · — · transporteur · API: calculate_bid_earnings)
lg bids cancel — Withdraw (geri çek) one of THIS carrier company's PENDING bids. (écriture · confirmation + irréversible · transporteur · 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. (écriture · confirmation + irréversible · transporteur · 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,… (lecture · — · transporteur · API: get_my_demand_bid)
lg bids list — List the bids (teklif) THIS carrier company has submitted, newest first, with their outcome. (lecture · — · transporteur · 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). (écriture · confirmation + irréversible · transporteur · 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,… (lecture · — · tous · 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. (lecture · — · tous · 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. (écriture · confirmation + irréversible · tous · 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… (lecture · — · tous · 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. (lecture · — · tous · 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. (lecture · — · transporteur · 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. (écriture · confirmation · transporteur · API: set_carrier_routes) [clé manager]
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. (lecture · — · tous · 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). (écriture · confirmation + irréversible · tous · API: attach_check_to_invoices) [clé manager]
lg checks bounce — Record that a cheque BOUNCED (came back unpaid). (écriture · confirmation + irréversible · tous · 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. (écriture · confirmation + irréversible · tous · API: cancel_settlement_check) [clé manager]
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. (écriture · confirmation + irréversible · tous · API: mark_check_collected)
lg checks create — Register a cheque in the cheque portfolio. (écriture · confirmation · tous · API: create_settlement_check) [clé manager] [prend un fichier: 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,… (lecture · — · tous · 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… (lecture · — · tous · 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. (écriture · confirmation · tous · API: detach_check_from_invoices) [clé manager]
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… (écriture · confirmation + irréversible · tous · API: execute_settlement_check) [clé manager]
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). (écriture · confirmation · tous · API: update_settlement_check) [clé manager]
lg companies add-role — Add a role to this company (firmaya rol ekle): customer (shipper), carrier, customs (customs broker) or affiliate. (écriture · confirmation + irréversible · tous · API: add_company_role) [clé manager]
lg companies delete-logo — Remove this company's logo (firma logosu) from the branded login portal, documents and the panel. (écriture · confirmation + irréversible · tous · API: delete_company_logo) [clé manager]
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… (lecture · — · tous · 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). (écriture · confirmation + irréversible · tous · 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). (lecture · — · tous · 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… (lecture · — · tous · 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. (écriture · confirmation · transporteur, commissionnaire en douane · API: set_company_brand_colors) [clé manager]
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`. (écriture · confirmation + irréversible · tous · API: set_company_logo) [clé manager] [prend un fichier: 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… (écriture · confirmation · tous · API: update_company_profile) [clé manager]
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),… (écriture · confirmation · tous · API: upload_company_document) [prend un fichier: 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… (écriture · confirmation + irréversible · tous · 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. (lecture · — · tous · 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… (lecture · — · tous · 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. (écriture · confirmation + irréversible · tous · API: create_company_domain) [clé manager]
lg company-domains delete — Remove one of our UNVERIFIED company domains (e.g. added by mistake). (écriture · confirmation + irréversible · tous · API: delete_company_domain) [clé manager]
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. (lecture · — · tous · 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). (écriture · confirmation + irréversible · tous · API: resend_company_domain_code) [clé manager]
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. (écriture · confirmation + irréversible · tous · API: verify_company_domain) [clé manager]
lg company-relationships accept — Accept a connection proposal another company sent us (relationship_id from list_company_relationships direction=incoming). (écriture · confirmation + irréversible · tous · API: accept_company_relationship) [clé manager]
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). (écriture · confirmation + irréversible · tous · API: create_company_relationship) [clé manager]
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… (lecture · — · tous · API: list_company_relationships)
lg company-relationships reject — Reject a connection proposal another company sent us (relationship_id from list_company_relationships direction=incoming). (écriture · confirmation + irréversible · tous · API: reject_company_relationship) [clé manager]
lg company-relationships revoke — End a company connection we are a party of (either side may end it), or withdraw a pending proposal. (écriture · confirmation + irréversible · tous · API: revoke_company_relationship) [clé manager]
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. (écriture · confirmation · tous · 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. (écriture · confirmation + irréversible · tous · 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. (écriture · confirmation · tous · 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… (écriture · confirmation · tous · API: archive_business_contact)
lg contacts create — Create a new business contact (cari) in the company directory. (écriture · confirmation · tous · API: create_business_contact)
lg contacts delete-address — Delete one of a business contact's addresses. (écriture · confirmation + irréversible · tous · 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). (écriture · confirmation + irréversible · tous · API: delete_business_contact_bank_account)
lg contacts delete-person — Delete a person from a business contact, together with that person's notification preferences. (écriture · confirmation + irréversible · tous · 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,… (lecture · — · tous · API: extract_business_contact_from_image) [prend un fichier: 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. (lecture · — · tous · 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. (lecture · — · tous · API: get_business_contact)
lg contacts invite — Invite a business contact to join Logistivo by e-mail. (écriture · confirmation + irréversible · tous · 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. (lecture · — · tous · 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. (lecture · — · tous · 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… (lecture · — · tous · 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. (lecture · — · tous · 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. (lecture · — · tous · API: list_business_contact_routes)
lg contacts remove-company-link — Remove the link between a business contact and its company on the Logistivo platform. (écriture · confirmation + irréversible · tous · API: unlink_business_contact_company) [clé manager]
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. (écriture · confirmation · tous · 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. (lecture · — · tous · 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. (écriture · confirmation + irréversible · tous · 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). (écriture · confirmation · tous · API: set_business_contact_person_notifications)
lg contacts update — Update fields of an existing business contact. (écriture · confirmation · tous · API: update_business_contact)
lg contacts update-address — Correct one of a business contact's addresses. (écriture · confirmation · tous · 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. (écriture · confirmation + irréversible · tous · API: update_business_contact_bank_account)
lg contacts update-person — Correct a contact person's details. (écriture · confirmation · tous · 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… (lecture · — · tous · 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). (écriture · confirmation + irréversible · tous · API: send_conversation_file) [prend un fichier: attachment_uuid]
lg conversations add-invitation — Invite a person from ANOTHER company into a load chat by e-mail (sohbete dışarıdan davet). (écriture · confirmation + irréversible · tous · API: invite_to_conversation)
lg conversations add-message — Post a message into a load/bid conversation AS THIS USER (not as an assistant). (écriture · confirmation + irréversible · tous · 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". (écriture · confirmation · tous · 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. (écriture · confirmation + irréversible · chargeur · 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. (lecture · — · tous · 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. (lecture · — · tous · 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. (lecture · — · tous · API: list_conversation_invitations)
lg conversations list-messages — Read the most recent messages of one conversation — give it a load code (e.g. (lecture · — · tous · API: list_conversation_messages)
lg conversations list-participants — Who is in this conversation — name and company of every participant. (lecture · — · tous · 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. (écriture · — · tous · 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). (écriture · confirmation + irréversible · tous · 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). (écriture · confirmation + irréversible · tous · 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). (écriture · confirmation · tous · 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. (lecture · — · tous · 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. (lecture · — · tous · 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. (lecture · — · tous · 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. (lecture · — · chargeur · 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. (lecture · — · tous · 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. (lecture · — · chargeur, transporteur · 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. (lecture · — · chargeur, transporteur · 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). (lecture · — · transporteur · API: get_demand_settings) [clé manager]
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. (écriture · confirmation · transporteur · API: update_demand_settings) [clé manager]
lg demand-targets search — Resolve a pickup/delivery location for a demand to a target token ("5-" = district/postal area, "10-" = seaport address). (lecture · — · chargeur · API: lookup_demand_target)
lg demands create — Open a freight demand (talep) so carriers can bid. (écriture · confirmation + irréversible · chargeur · API: create_demand) [prend un fichier: 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… (lecture · — · chargeur · 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… (lecture · — · chargeur · API: extract_demand_from_text)
lg demands get — Detail of ONE freight demand. (lecture · — · chargeur, transporteur · API: get_demand)
lg demands list — List freight demands (talep) this carrier is allowed to bid on, newest first. (lecture · — · transporteur · 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. (lecture · — · chargeur · 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… (lecture · — · chargeur · API: get_demand_form_options)
lg demands set-status — Close (make passive) one of this company's ACTIVE demands so carriers stop bidding. (écriture · confirmation + irréversible · chargeur · 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). (écriture · confirmation · chargeur · API: update_demand) [prend un fichier: 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… (écriture · confirmation + irréversible · tous · API: send_direct_message)
lg direct-conversations create — Start a direct chat. (écriture · confirmation + irréversible · tous · 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. (lecture · — · tous · 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). (lecture · — · tous · 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. (lecture · — · tous · 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… (lecture · — · tous · 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). (écriture · — · tous · 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. (écriture · confirmation + irréversible · tous · API: delete_direct_message)
lg direct-conversations update — Rename a GROUP direct chat (private one-to-one chats have no title). (écriture · confirmation · tous · 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). (écriture · confirmation · tous · 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… (écriture · — · tous · API: check_document_compliance) [prend un fichier: 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. (lecture · — · tous · 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). (lecture · — · tous · 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… (lecture · — · transporteur · 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… (lecture · — · transporteur · 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". (lecture · — · chargeur, transporteur · 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. (lecture · — · chargeur, transporteur · 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. (écriture · confirmation + irréversible · chargeur, transporteur · 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. (écriture · confirmation · chargeur, transporteur · API: create_driver_advance) [prend un fichier: attachment_uuid]
lg driver-advances delete — Delete a driver money movement that was entered by mistake (duplicate, wrong driver). (écriture · confirmation + irréversible · chargeur, transporteur · 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. (lecture · — · chargeur, transporteur · 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. (écriture · confirmation · chargeur, transporteur · 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". (écriture · confirmation · transporteur · 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. (écriture · confirmation + irréversible · transporteur · 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. (lecture · — · transporteur · API: list_driver_availabilities)
lg driver-availabilities update — Correct one availability period (id from list_driver_availabilities): kind, dates, Schengen presence or note. (écriture · confirmation · transporteur · 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… (lecture · — · chargeur, transporteur · API: get_driver_expense_settings)
lg driver-expense-settings update — Change this company's driver expense module settings — only the fields you pass change. (écriture · confirmation · chargeur, transporteur · API: update_driver_expense_settings) [clé manager]
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. (écriture · confirmation + irréversible · chargeur, transporteur · API: process_receipt) [prend un fichier: 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". (écriture · confirmation · chargeur, transporteur · API: create_driver_expense)
lg driver-expenses delete — Delete a driver expense entered by mistake (duplicate receipt, wrong driver, test entry). (écriture · confirmation + irréversible · chargeur, transporteur · 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. (lecture · — · chargeur, transporteur · 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. (lecture · — · chargeur, transporteur · 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. (lecture · — · chargeur, transporteur · API: get_driver_expense)
lg driver-expenses list — List driver expense receipts (fuel, toll, ferry, parking, food, repair…) with a converted total. (lecture · — · chargeur, transporteur · 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… (lecture · — · chargeur, transporteur · 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… (lecture · — · chargeur, transporteur · 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… (écriture · confirmation · chargeur, transporteur · 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). (écriture · confirmation · chargeur, transporteur · 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… (écriture · confirmation · chargeur, transporteur · 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). (écriture · — · chargeur, transporteur · 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… (écriture · confirmation · transporteur · 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… (écriture · confirmation · transporteur · 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… (lecture · — · transporteur · 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… (lecture · — · transporteur · 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. (écriture · — · transporteur · API: dismiss_driver_schedule_suggestion)
lg driver-statements cancel — Cancel a statement that should not exist (opened by mistake, duplicated). (écriture · confirmation + irréversible · chargeur, transporteur · API: cancel_driver_account)
lg driver-statements create — Open a NEW draft settlement statement for a driver. (écriture · confirmation · chargeur, transporteur · 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… (lecture · — · chargeur, transporteur · 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. (écriture · confirmation + irréversible · chargeur, transporteur · API: finalize_driver_account) [clé manager]
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… (lecture · — · chargeur, transporteur · 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… (lecture · — · chargeur, transporteur · 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). (écriture · confirmation · chargeur, transporteur · API: reopen_driver_account) [clé manager]
lg driver-statements update — Change the note printed on a DRAFT driver settlement statement (e.g. "September trips, fuel excluded"). (écriture · confirmation · chargeur, transporteur · 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. (écriture · confirmation · chargeur, transporteur · 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 /… (lecture · — · chargeur, transporteur · 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. (écriture · confirmation · transporteur · API: add_driver_document) [prend un fichier: attachment_uuid]
lg drivers archive — Archive (deactivate) a driver: their account is disabled, open mobile sessions are revoked and the login link stops working. (écriture · confirmation + irréversible · transporteur · 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,… (lecture · — · transporteur · API: check_driver_for_trip)
lg drivers create — Create a new driver account for this carrier company. (écriture · confirmation · transporteur · API: create_driver)
lg drivers delete-document — Remove a driver paper from the driver's file. (écriture · confirmation + irréversible · transporteur · 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… (lecture · — · transporteur · 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. (lecture · — · transporteur · 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)… (lecture · — · transporteur · 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. (lecture · — · transporteur · 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. (lecture · — · transporteur · API: list_driver_locations)
lg drivers login-link — Produce the driver's 48-hour mobile app login link (sensitive credential). (écriture · confirmation · transporteur · 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"). (écriture · — · transporteur · API: request_driver_location)
lg drivers search — Resolve one of this company's drivers by name to its driver_id. (lecture · — · transporteur · API: lookup_driver)
lg drivers update — Correct a driver's first/last name. (écriture · confirmation · transporteur · 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. (écriture · confirmation · transporteur · 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). (écriture · confirmation + irréversible · transporteur · 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". (écriture · confirmation · tous · API: create_equipment_damage)
lg equipment-damages delete — Delete a damage record that was opened by mistake (a duplicate, the wrong vehicle). (écriture · confirmation + irréversible · tous · 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". (lecture · — · tous · 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… (lecture · — · tous · 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. (écriture · confirmation · tous · 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. (écriture · confirmation · tous · 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".… (écriture · confirmation · tous · API: create_equipment_inspection) [prend un fichier: photos[].attachment_uuid]
lg equipment-inspections delete — Delete an equipment inspection that was recorded by mistake (wrong vehicle, duplicate), together with its photos. (écriture · confirmation + irréversible · tous · 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… (lecture · — · tous · 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… (lecture · — · tous · 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). (écriture · confirmation · tous · 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… (lecture · — · tous · 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". (écriture · confirmation · tous · API: update_equipment_settings) [clé manager]
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. (lecture · — · tous · API: get_equipment_timeline)
lg export-documents add-item — Append a line item to an export document. (écriture · — · tous · API: add_export_document_item)
lg export-documents create — Create a new export document draft. (écriture · — · tous · 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. (écriture · — · tous · API: create_export_document_set) [prend un fichier: attachment_uuid]
lg export-documents delete — Delete one export document of this company (draft or generated). (écriture · confirmation + irréversible · tous · 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). (écriture · — · tous · 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. (écriture · — · tous · API: extract_export_document_from_text) [prend un fichier: 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. (écriture · confirmation + irréversible · tous · 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. (écriture · confirmation + irréversible · tous · 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. (lecture · — · tous · 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). (lecture · — · tous · API: list_export_documents)
lg export-documents options — List the export document types and the ready-made document sets with their credit cost. (lecture · — · tous · 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… (lecture · — · tous · API: plan_export_document_generation)
lg export-documents remove-item — Delete one line item by its 1-based position. (écriture · — · tous · API: remove_export_document_item)
lg export-documents set — Set one or more fields on an export document draft. (écriture · — · tous · 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. (écriture · — · tous · 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. (lecture · — · tous · 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. (lecture · — · tous · 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). (lecture · — · chargeur, transporteur · 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. (écriture · confirmation + irréversible · tous · API: archive_freight_invoice)
lg freight-invoices create — Attach 1-20 freight invoices (navlun faturası) to a load. (écriture · confirmation · tous · API: upload_freight_invoices) [prend un fichier: 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. (lecture · — · tous · 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". (écriture · confirmation · tous · 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… (lecture · — · chargeur, transporteur · 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. (écriture · confirmation · chargeur, transporteur · API: create_fuel_card)
lg fuel-cards delete — Delete a fuel / toll card (DKV, UTA, Shell…) that was entered BY MISTAKE. (écriture · confirmation + irréversible · chargeur, transporteur · 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. (lecture · — · chargeur, transporteur · 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. (écriture · confirmation · chargeur, transporteur · 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… (lecture · — · tous · 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. (lecture · — · tous · 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),… (lecture · — · tous · API: list_integration_keys) [clé manager]
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). (écriture · confirmation + irréversible · tous · API: revoke_integration_key) [clé manager]
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). (écriture · confirmation + irréversible · tous · API: invite_teammate) [clé manager]
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. (lecture · — · tous · API: list_pending_invitations)
lg invitations resend — Re-send a pending teammate invitation e-mail and extend its expiry by 14 days. (écriture · confirmation + irréversible · tous · API: resend_invitation) [clé manager]
lg invitations revoke — Cancel a pending teammate invitation so its link stops working (it can later be re-sent). (écriture · confirmation · tous · API: revoke_invitation) [clé manager]
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,… (lecture · — · tous · 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). (écriture · confirmation + irréversible · tous · API: create_invoice_template) [clé manager] [prend un fichier: logo_attachment_uuid, signature_image_attachment_uuid]
lg invoice-templates delete — Delete one of your invoice template configurations. (écriture · confirmation + irréversible · tous · API: delete_invoice_template) [clé manager]
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… (lecture · — · tous · 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. (écriture · confirmation · tous · API: set_default_invoice_template) [clé manager]
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… (écriture · confirmation + irréversible · tous · API: update_invoice_template) [clé manager] [prend un fichier: 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). (écriture · — · tous · 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. (écriture · confirmation + irréversible · tous · API: record_invoice_payment)
lg invoices cancel — Cancel an ISSUED invoice this company issued: posts the reversing journal entry and marks the invoice cancelled. (écriture · confirmation + irréversible · tous · API: cancel_invoice)
lg invoices create — Create a DRAFT invoice (reversible) issued by the current company to a recipient business contact. (écriture · — · tous · API: create_invoice_draft)
lg invoices delete-draft — Delete a DRAFT invoice of this company together with its lines and taxes. (écriture · confirmation + irréversible · tous · 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). (lecture · — · tous · 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. (lecture · — · tous · API: get_invoice)
lg invoices issue — Issue (finalize) a DRAFT invoice: assigns a number and posts accounting entries. (écriture · confirmation + irréversible · tous · 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). (lecture · — · tous · 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. (lecture · — · tous · API: preview_invoice · dépréciée: 2026-09-03 · utiliser get_invoice)
lg invoices remove-line — Remove one line from a DRAFT invoice your company issued; the totals are recalculated. (écriture · confirmation · tous · 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. (écriture · confirmation + irréversible · tous · 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. (écriture · — · tous · 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). (écriture · — · tous · 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. (écriture · confirmation + irréversible · tous · API: approve_join_request) [clé manager]
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). (lecture · — · tous · API: list_join_requests) [clé manager]
lg join-requests reject — Reject a pending join request: the applicant does not join our company and is e-mailed the decision. (écriture · confirmation + irréversible · tous · API: reject_join_request) [clé manager]
lg journal-entries create — Post a manual double-entry journal entry (yevmiye fişi). (écriture · confirmation + irréversible · tous · API: create_journal_entry)
lg journal-entries get — Read one journal entry with its lines (account code/name, debit, credit, counterparty) and totals. (lecture · — · tous · API: get_journal_entry)
lg journal-entries list — List journal entries (yevmiye fişleri) of the company, newest first, with optional date window. (lecture · — · tous · API: list_journal_entries)
lg language-settings get — Read the signed-in user's own language settings (dil ayarları). (lecture · — · tous · 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". (écriture · — · tous · 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:… (lecture · — · tous · 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,… (écriture · confirmation · tous · API: update_load_ai_settings) [clé manager]
lg load-containers create — Add a sea container number to a load (yüke konteyner ekle) — "add MSC container MSCU1234565 to FKZ8515". (écriture · confirmation · chargeur, transporteur · 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). (écriture · confirmation + irréversible · tous · 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. (lecture · — · tous · 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. (lecture · — · tous · 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… (écriture · confirmation · tous · 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… (écriture · confirmation + irréversible · tous · API: attach_chat_file_to_load) [prend un fichier: 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. (lecture · — · tous · 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). (écriture · confirmation · chargeur, transporteur · 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. (écriture · confirmation + irréversible · chargeur, transporteur · 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… (écriture · — · chargeur, transporteur · 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. (lecture · — · chargeur, transporteur · 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. (lecture · — · chargeur, transporteur · 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… (écriture · — · chargeur, transporteur · API: optimize_trip_route)
lg load-groups remove-load — Take one consignment out of a groupage trip you own. (écriture · confirmation · chargeur, transporteur · 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. (écriture · confirmation + irréversible · tous · 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. (lecture · — · tous · 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". (écriture · confirmation + irréversible · transporteur · 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". (lecture · — · tous · 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… (lecture · — · tous · 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). (lecture · — · tous · 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". (écriture · confirmation + irréversible · tous · 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". (écriture · confirmation + irréversible · tous · 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). (écriture · confirmation · tous · 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. (écriture · confirmation · tous · 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… (lecture · — · tous · 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). (écriture · confirmation · tous · 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. (écriture · confirmation · tous · 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… (écriture · confirmation · tous · 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). (écriture · confirmation · tous · 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. (lecture · — · tous · 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". (écriture · — · tous · 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… (lecture · — · tous · 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. (lecture · — · tous · API: get_load_report_options)
lg load-types search — Resolve a load/transport type (e.g. (lecture · — · tous · 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. (écriture · confirmation · tous · 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. (lecture · — · tous · 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). (écriture · confirmation · tous · 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. (écriture · confirmation + irréversible · tous · 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. (écriture · — · tous · API: reanalyze_load_documents)
lg loads archive — Archive one of the company's OWN loads (yükü arşivle) — "FKZ8515'i arşive al". (écriture · confirmation + irréversible · tous · 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. (écriture · confirmation · transporteur · 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. (lecture · — · tous · 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… (écriture · confirmation · tous · API: resolve_load_problem_flag)
lg loads create — Open a freight load (yük). (écriture · confirmation + irréversible · tous · 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". (lecture · — · tous · 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… (lecture · — · chargeur · 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… (lecture · — · tous · API: get_load)
lg loads list — List the freight loads (yük) this company can see, newest first. (lecture · — · tous · 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. (lecture · — · tous · 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… (lecture · — · tous · 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). (lecture · — · tous · 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). (lecture · — · tous · 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… (lecture · — · tous · 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". (écriture · — · tous · 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?". (lecture · — · tous · 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… (lecture · — · tous · 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. (écriture · confirmation · transporteur · 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… (lecture · — · tous · 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). (écriture · confirmation + irréversible · transporteur · 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". (écriture · confirmation · transporteur · 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". (écriture · confirmation · transporteur · 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. (écriture · confirmation + irréversible · tous · 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. (lecture · — · tous · 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… (lecture · — · chargeur · API: get_notification_settings) [clé manager]
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… (écriture · confirmation · chargeur · API: update_notification_settings) [clé manager]
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. (lecture · — · tous · API: list_notifications)
lg notifications mark-read — Mark ALL of the signed-in user's unread notifications as read (empty the bell). (écriture · — · tous · 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… (lecture · — · tous · 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… (lecture · — · tous · API: list_packages)
lg pallets add-measurement — Record a NEW measurement for an existing pallet (dimensions in centimetres and/or gross weight in kilograms). (écriture · confirmation · tous · 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). (écriture · — · tous · API: add_pallet_proof) [prend un fichier: 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… (lecture · — · tous · 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. (écriture · confirmation · tous · API: create_pallet)
lg pallets delete — Delete one of this company's pallet records. (écriture · confirmation + irréversible · tous · API: delete_pallet)
lg pallets delete-proof — Remove one proof photo from one of this company's pallets. (écriture · confirmation + irréversible · tous · 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. (écriture · — · tous · API: extract_pallet_from_photos) [prend un fichier: 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… (lecture · — · tous · 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. (lecture · — · tous · 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. (écriture · confirmation · tous · API: update_pallet)
lg parasut-contacts create — Create a new customer or supplier contact IN PARAŞÜT and keep its local copy. (écriture · confirmation + irréversible · tous · 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,… (lecture · — · tous · 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… (écriture · confirmation + irréversible · tous · 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,… (lecture · — · tous · 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… (lecture · — · tous · 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,… (écriture · confirmation + irréversible · tous · API: disconnect_parasut) [clé manager]
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… (lecture · — · tous · API: get_parasut_settings) [clé manager]
lg parasut-settings update — Connect this company's Paraşüt account or renew its credentials (replaces an existing connection). (écriture · confirmation · tous · API: connect_parasut) [clé manager] [CLI uniquement]
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. (lecture · — · tous · API: list_payables)
lg payment-cards delete — Remove a saved payment card (card_id from list_payment_cards). (écriture · confirmation + irréversible · tous · API: delete_payment_card) [clé manager]
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. (lecture · — · tous · 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. (écriture · confirmation + irréversible · tous · API: set_default_payment_card) [clé manager]
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". (écriture · confirmation + irréversible · tous · API: cancel_settlement_instruction)
lg payment-instructions download — Get the bank payment instruction document (PDF) with a short-lived download link. (lecture · — · tous · 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… (lecture · — · tous · 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. (lecture · — · tous · 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… (écriture · confirmation + irréversible · tous · 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… (lecture · — · transporteur · API: get_planning_board)
lg plans archive — Close a plan because the user says the work is finished or abandoned. (écriture · — · tous · 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"). (écriture · confirmation · tous · API: create_plan)
lg plans get — Read one plan: the steps that were agreed AND the commands that actually ran while it was active. (lecture · — · tous · API: get_plan)
lg plans list — List this company's plans, newest first. (lecture · — · tous · API: list_plans)
lg ports search — Find a seaport by name or UN/LOCODE (liman ara) — "Mersin", "TRMER", "Trieste". (lecture · — · tous · 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"). (écriture · — · tous · API: remember_preference)
lg preferences delete — Forget one stored preference of this user. (écriture · — · tous · API: forget_preference)
lg preferences list — List what you have been asked to remember about THIS user, with the labels. (lecture · — · tous · API: list_preferences)
lg product-brands create — Create a new product brand for this company (the panel's "new brand"). (écriture · confirmation · chargeur · API: create_product_brand)
lg product-brands list — List this company's product brands (id, name, code, active flag, number of products). (lecture · — · chargeur · API: list_product_brands)
lg product-categories create — Create a new product category for this company (the panel's "new category"). (écriture · confirmation · chargeur · API: create_product_category)
lg product-categories list — List this company's product categories (id, name, code, active flag, number of products). (lecture · — · chargeur · API: list_product_categories)
lg products add-image — Add a photo to a product's gallery. (écriture · — · chargeur · API: add_product_image) [prend un fichier: 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. (écriture · confirmation · chargeur · API: create_product)
lg products delete — Delete a product from this company's catalogue. (écriture · confirmation + irréversible · chargeur · API: delete_product)
lg products delete-image — Remove one photo from a product's gallery (image_id from get_product). (écriture · confirmation + irréversible · chargeur · 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. (écriture · — · chargeur · API: extract_product_from_photos) [prend un fichier: 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 /… (lecture · — · chargeur · 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. (lecture · — · chargeur · 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. (lecture · — · chargeur · 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). (lecture · — · chargeur · API: get_product_options)
lg products search — Resolve a product to its product_id + on-hand quantity. (lecture · — · chargeur · API: lookup_product)
lg products set-primary-image — Make one of a product's photos its cover image (image_id from get_product). (écriture · — · chargeur · 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. (écriture · confirmation · chargeur · 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). (lecture · — · tous · 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. (lecture · — · tous · 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. (lecture · — · tous · 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… (lecture · — · tous · API: get_accounting_report)
lg reservations approve — As the warehouse owner, approve a pending reservation received at your warehouse (the booker is notified). (écriture · confirmation · chargeur · 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. (écriture · confirmation + irréversible · tous · 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). (écriture · confirmation + irréversible · chargeur · API: complete_reservation)
lg reservations create — Book a warehouse dock time slot. (écriture · confirmation · tous · 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. (lecture · — · tous · 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… (lecture · — · tous · API: list_reservations)
lg reservations list-slots — Available dock time slots of one day with remaining capacity. (lecture · — · tous · 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. (écriture · confirmation + irréversible · chargeur · 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. (écriture · confirmation · chargeur · 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. (lecture · — · transporteur · API: list_nearby_roro_routes)
lg roro-routes select — Select the Ro-Ro (ferry) line a load you are carrying will use. (écriture · confirmation · transporteur · API: select_roro_route)
lg roro-routes set-required — Mark whether a load you are carrying will travel by Ro-Ro (ferry) or not. (écriture · confirmation · transporteur · 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). (écriture · confirmation · transporteur · 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… (écriture · confirmation · transporteur · 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). (écriture · confirmation · transporteur · API: create_route_plan)
lg route-plans delete — Cancel and delete a route plan (route_plan_id or route_plan_code). (écriture · confirmation + irréversible · transporteur · 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… (lecture · — · transporteur · 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. (lecture · — · transporteur · 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 /… (écriture · confirmation · transporteur · 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. (écriture · confirmation · transporteur · 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. (écriture · confirmation · transporteur · 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. (écriture · confirmation · transporteur · 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 /… (lecture · — · transporteur · 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). (écriture · confirmation · transporteur · API: import_driver_schengen_periods) [prend un fichier: 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). (lecture · — · transporteur · 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… (lecture · — · transporteur · 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… (lecture · — · transporteur · 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. (lecture · — · transporteur · 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). (écriture · confirmation + irréversible · transporteur · 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"… (écriture · confirmation · transporteur · 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. (écriture · confirmation · transporteur · API: set_driver_schengen_exemption)
lg settlements cancel — CANCEL a bulk collection / payment (settlement batch). (écriture · confirmation + irréversible · tous · API: cancel_settlement_batch) [clé manager]
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… (écriture · confirmation + irréversible · tous · 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,… (lecture · — · tous · API: get_settlement_batch)
lg settlements list — List bulk collection/payment batches (code, direction, instrument, contact, currency, total, value date, status), newest first. (lecture · — · tous · 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… (lecture · — · tous · 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… (lecture · — · tous · 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… (lecture · — · tous · 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". (écriture · confirmation · chargeur, transporteur · API: track_ship_for_load)
lg ship-trackings delete — Stop tracking a ship on a load (gemi takibini durdur). (écriture · confirmation · chargeur, transporteur · 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". (lecture · — · tous · 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". (lecture · — · tous · 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. (écriture · confirmation + irréversible · chargeur · API: create_stock_adjustment)
lg stock list — Read current on-hand stock levels. (lecture · — · chargeur · 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. (lecture · — · chargeur · API: list_stock_movements)
lg stock move — Record a stock movement: inbound (giriş), outbound (çıkış), or transfer between locations. (écriture · confirmation + irréversible · chargeur · 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. (lecture · — · chargeur · 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. (écriture · confirmation · chargeur · API: create_sub_company) [clé manager]
lg sub-companies delete — Delete one of this customer company's group / sub companies (alt firma) by sub_company_id from list_sub_companies. (écriture · confirmation + irréversible · chargeur · API: delete_sub_company) [clé manager]
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. (lecture · — · chargeur · 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?". (lecture · — · tous · API: get_tariff_chapter)
lg tariff-matrices get — FREE. (lecture · — · tous · API: get_tariff_matrix)
lg tariff-matrices list — FREE. (lecture · — · tous · API: list_tariff_matrix_runs)
lg tariff-matrices preview — FREE. (lecture · — · tous · 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. (écriture · confirmation + irréversible · tous · API: run_tariff_matrix)
lg tariffs coverage — FREE. (lecture · — · tous · 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. (écriture · — · tous · API: extract_tariff_codes_from_invoice) [prend un fichier: 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. (lecture · — · tous · 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). (écriture · confirmation + irréversible · tous · 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. (lecture · — · tous · 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. (lecture · — · tous · API: lookup_tariff_code)
lg teammates delete — Remove a person from the company team. (écriture · confirmation + irréversible · tous · API: remove_teammate) [clé manager]
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… (lecture · — · tous · 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). (écriture · confirmation · tous · API: update_teammate_role) [clé manager]
lg teammates set-status — Activate or deactivate a team member. (écriture · confirmation · tous · API: set_teammate_status) [clé manager]
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). (écriture · confirmation + irréversible · transporteur · API: submit_tender_bid) [prend un fichier: 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. (lecture · — · transporteur · 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. (écriture · confirmation + irréversible · chargeur · 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). (écriture · confirmation · chargeur · API: add_tender_document) [prend un fichier: 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). (écriture · confirmation · chargeur · API: create_tender) [prend un fichier: attachment_uuid]
lg tenders delete-document — Remove a specification file from one of YOUR tenders (document_id from get_tender → documents[]). (écriture · confirmation + irréversible · chargeur · 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). (lecture · — · chargeur · API: extract_tender_specification) [prend un fichier: 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. (écriture · confirmation · chargeur · 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. (lecture · — · chargeur, transporteur · API: get_tender)
lg tenders list — List document-based freight tenders. (lecture · — · chargeur, transporteur · 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. (écriture · confirmation · chargeur · 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. (lecture · — · tous · 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… (lecture · — · tous · 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… (lecture · — · tous · API: preview_account_closure)
lg users get — Who am I? (lecture · — · tous · 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. (écriture · confirmation · chargeur, transporteur · API: assign_vehicle_to_driver)
lg vehicle-assignments list — List which driver currently holds which vehicle (tractor unit / trailer). (lecture · — · chargeur, transporteur · API: list_vehicle_assignments)
lg vehicle-assignments revoke — Close an open vehicle assignment: the driver hands the vehicle back. (écriture · confirmation · chargeur, transporteur · 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. (écriture · confirmation · chargeur, transporteur · API: create_vehicle_expense) [prend un fichier: attachment_uuid]
lg vehicle-expenses delete — Delete a vehicle cost entered by mistake (duplicate, wrong plate, test entry). (écriture · confirmation + irréversible · chargeur, transporteur · 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. (lecture · — · chargeur, transporteur · 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". (écriture · confirmation · chargeur, transporteur · 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… (écriture · confirmation · chargeur, transporteur · API: add_vehicle_document) [prend un fichier: attachment_uuid]
lg vehicles archive — Take a vehicle out of service (archive it) or put an archived one back into service. (écriture · confirmation · chargeur, transporteur · 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. (écriture · confirmation · chargeur, transporteur · API: create_vehicle) [prend un fichier: attachment_uuid]
lg vehicles delete — Delete a vehicle record that was created BY MISTAKE (wrong plate, duplicate). (écriture · confirmation + irréversible · chargeur, transporteur · 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). (écriture · confirmation + irréversible · chargeur, transporteur · 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… (lecture · — · chargeur, transporteur · 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… (lecture · — · chargeur, transporteur · 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. (lecture · — · chargeur, transporteur · API: lookup_vehicle)
lg vehicles update — Correct a fleet vehicle's fields: plate, kind, brand, model, model year, VIN or note. (écriture · confirmation · chargeur, transporteur · 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… (écriture · confirmation · chargeur, transporteur · API: update_vehicle_document)
lg wallets get — Read this company's Logistivo WALLET balance — the prepaid MONEY balance (amount + currency). (lecture · — · tous · 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. (lecture · — · tous · 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). (écriture · confirmation · chargeur · API: create_warehouse_area)
lg warehouse-areas delete — Delete one area/ramp of a warehouse. (écriture · confirmation + irréversible · chargeur · 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. (écriture · confirmation · chargeur · 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). (écriture · confirmation · chargeur · 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. (lecture · — · chargeur · 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). (écriture · confirmation + irréversible · chargeur · API: revoke_warehouse_link)
lg warehouse-links set-status — Turn a warehouse booking link off (nobody can book through it) or back on. (écriture · confirmation · chargeur · 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. (écriture · confirmation · chargeur · API: create_warehouse)
lg warehouses delete — Delete one of this company's warehouses. (écriture · confirmation + irréversible · chargeur · 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… (lecture · — · chargeur · 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. (lecture · — · chargeur · API: list_warehouses)
lg warehouses search — Resolve a warehouse by name to its warehouse_id, with its areas. (lecture · — · chargeur · 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). (écriture · confirmation · chargeur · 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. (écriture · confirmation · chargeur · API: update_warehouse)
Intégration ERP et CRM — Identité : pas de comptes de service, un véritable utilisateur à la place
Un ERP ou un CRM se connecte à Logistivo en tant que véritable utilisateur de l’entreprise, détenteur d’un token d’accès personnel créé depuis l’interface web. Un compte de service synthétique — sans entreprise, exempté du cloisonnement, dont personne n’est responsable — n’est jamais créé.
C’est une question d’architecture, pas de préférence. L’isolation multi-tenant repose entièrement sur l’entreprise de l’utilisateur ; pour une identité sans entreprise, le périmètre d’isolation devient inopérant, et une seule requête erronée avec ce token lit des données qui ne lui appartiennent pas. La deuxième raison est l’audit : la colonne utilisateur du registre relie « qui a exécuté ceci » à une personne ; un compte de service vide cette colonne de son sens et laisse une intégration qui émet des factures sans propriétaire. La troisième est la révocation : si un token appartient à une personne, l’intégration se tait quand cette personne s’en va. Une passerelle sans propriétaire est la passerelle qui continue d’écrire discrètement pendant des années.
En pratique : l’entreprise crée un utilisateur normal dans l’interface web (par exemple « ERP Bridge », dont un employé nommément désigné est propriétaire), lui attribue un rôle restreint, crée un token depuis la session de cet utilisateur et le place dans l’ERP.
Cet utilisateur est visible dans le système de permissions, ses droits peuvent être réduits et son token peut être révoqué indépendamment. Ce qui est interdit, ce n’est pas de créer un compte — c’est de créer un compte qui n’est pas rattaché à un tenant.
Une intégration par token. Si deux systèmes partagent un token, la granularité de révocation disparaît : couper le CRM revient à couper aussi l’ERP.
Intégration ERP et CRM — Versionnage et dépréciation
La réponse du catalogue porte un entier contract_version ; les lignes de commande portent since, deprecated_at et replaced_by. La version du contrat n’augmente qu’en cas de changement cassant.
La version n’augmente PAS pour : une nouvelle commande, un nouveau paramètre facultatif, un nouveau champ dans une réponse. Un consommateur doit ignorer les champs qu’il ne connaît pas ; un client qui produit une erreur sur un champ inconnu n’est pas conforme.
La version AUGMENTE pour : le retrait ou le renommage d’une commande, la suppression d’un champ de réponse, le passage d’un paramètre facultatif à obligatoire, la restriction d’un enum. L’ancienne forme reste active pendant au moins deux trimestres civils (6 mois) avec deprecated_at et replaced_by.
La dépréciation est annoncée dans le catalogue, pas seulement dans un journal des modifications. Comme le client se construit à partir du catalogue, une commande dont deprecated_at est renseigné affiche un avertissement sans aucune nouvelle version du client, et l’intégrateur le voit dans ses journaux.
Le nom d’API est gelé pour toujours. L’identité CLI (domaine/verbe) pouvait être redécoupée librement avant d’être annoncée ; après l’annonce, elle ne change qu’avec une incrémentation de version et une fenêtre de migration, pendant laquelle l’ancienne paire est servie comme alias.
En pratique : la réponse du catalogue et l’en-tête X-Contract-Version portent la version ; chaque ligne de commande porte since, deprecated_at, replaced_by et aliases (anciennes paires domaine/verbe). Appeler une commande dépréciée fonctionne toujours et répond avec un en-tête X-Deprecated: name; deprecated_at=…; replaced_by=… ainsi qu’un objet deprecated dans le corps. ?domain= sur le catalogue résout un ancien domaine alias vers la commande actuelle.
Un client qui comprend la version 1 et rencontre un nombre plus grand doit journaliser un avertissement et continuer ; c’est exactement ce que fait lg. Les abandons en vigueur sont listés dans l’engagement de stabilité ci-dessus.
Intégration ERP et CRM — Identifiants stables : ne confiez jamais un identifiant auto-incrémenté à votre ERP comme clé
Les identifiants internes auto-incrémentés sont opaques et cloisonnés par tenant : l’identifiant valide d’une autre entreprise vous renvoie « introuvable », pas des données. Mais être opaque n’en fait pas des clés métier. Ce qu’un ERP stocke dans son propre enregistrement doit être une clé métier.
Chargement : code (le code client, p. ex. FSK2158). loads get fonctionne déjà par code.
Pays : ISO 3166-1 alpha-2. countries search renvoie le code.
HS / tarif : le code lui-même — la nomenclature est déjà universelle.
Facture : le numéro de facture, une fois émise. Un brouillon n’a qu’un identifiant de surface, et un identifiant de brouillon n’est PAS une clé métier — l’ERP doit porter sa propre référence et ne jamais persister un identifiant de brouillon.
Produit, entrepôt, contact : uniquement un identifiant de surface aujourd’hui. La règle pour les nouvelles commandes est explicite : toute commande qui renvoie un identifiant de surface renvoie aussi la clé métier propre au tenant (SKU, code, numéro fiscal), afin que l’ERP puisse faire la correspondance de son côté.
Intégration ERP et CRM — Pagination, filtrage et synchronisation incrémentale
Les commandes de liste prennent limit et renvoient count. Pour une synchronisation nocturne, le contrat s’engage sur ce qui suit ; une commande de liste qui l’a adopté annonce cursor et updated_since dans son JSON Schema, et tant que ce n’est pas le cas, traitez-la comme une petite fenêtre (plafond de 20 lignes, pas de curseur).
Requête : limit (de 1 jusqu’au plafond propre à la commande) plus cursor (opaque, uniquement vers l’avant, signé par le serveur). offset n’est PAS utilisé — sur une table vivante, un offset se décale ; un enregistrement inséré entre deux pages fait sauter une ligne à l’ERP ou la lui fait compter deux fois, et ce en silence.
Réponse : { count, total?, next_cursor|null }. count est le nombre de lignes de cette réponse ; lorsque next_cursor vaut null, la liste est complète. Renvoyez next_cursor sans le modifier — ce n’est pas un numéro de page et ce n’est pas à vous de le construire.
Un curseur altéré ou étranger est rejeté avec 422 invalid_request ; un curseur est lié à l’entreprise qui l’a reçu et ne peut pas paginer les données d’un autre tenant.
Filtrage : les paramètres nommés du JSON Schema, combinés par ET. Il n’y a pas de langage de requête libre — un DSL serait une seconde surface de requête que nous devrions défendre.
Synchronisation incrémentale : updated_since (ISO-8601, UTC) plus le curseur. Stockez le updated_at le plus récent que vous avez vu et renvoyez-le à l’exécution suivante ; sans cela, chaque ERP récupère tout, toutes les heures.
Référence externe : les commandes d’écriture acceptent external_ref (votre propre clé de document), unique par entreprise ; une seconde création avec le même external_ref est rejetée au lieu d’être dupliquée, et list/get la renvoient pour que vous puissiez faire correspondre les enregistrements de votre côté.
Intégration ERP et CRM — Limites de débit
La clé de limitation est le token, pas l’IP : un ERP arrive derrière un seul NAT, et une limite basée sur l’IP compterait toute une entreprise comme un seul utilisateur. Deux intégrations avec deux clés ne consomment jamais le quota l’une de l’autre — la seconde raison du principe « une intégration par clé ».
Découverte sans authentification (public/cli/catalog) : 30 par minute. C’est un dictionnaire, pas une source de données ; lisez-le une fois pendant l’écriture de votre passerelle, jamais dans une boucle de production.
Endpoints du catalogue (GET common/commands, GET common/commands/{name}) : 120 par minute et par token. Le catalogue change rarement et répond 304 à If-None-Match ; ne le récupérez pas avant chaque commande — lg le met en cache pendant une heure.
Commandes de lecture (POST common/commands/{name} avec read_only: true) : 120 par minute et par token.
Commandes d’écriture (POST common/commands/{name} avec read_only: false ; un nom inconnu compte ici aussi) : 30 par minute et par token. Les écritures ont des effets de bord ; une boucle qui s’emballe est facturée.
Commandes qui consomment des crédits (credit_cost dans la ligne du catalogue n’est pas nul — tariffs inquiry et export-documents generate, par exemple) : la vraie limite, ce sont les CRÉDITS, pas le nombre de requêtes. Une réponse 200 peut avoir consommé un crédit.
Plafonds quotidiens par entreprise, partagés avec l’interface web : les commandes qui envoient un e-mail ou une notification push à des personnes extérieures à votre entreprise puisent dans 300 notifications sortantes par jour, et le lancement d’un suivi payant de conteneur ou de navire dans 100 par jour. Au-delà du plafond, une commande répond DAILY_LIMIT_REACHED avec retry_after ; les envois de fichiers ont leurs propres plafonds (voir Commandes qui prennent des fichiers).
Un 429 porte toujours Retry-After et un corps { error_code: "rate_limited", retry_after, limit, bucket } ; respectez-le au lieu d’inventer un délai fixe. Le catalogue publie les valeurs actuelles sous rate_limits.
Intégration ERP et CRM — Ce que nous ne ferons pas
C’est souvent la partie la plus utile d’un contrat : savoir ce qui n’arrivera jamais vous permet de concevoir en conséquence.
Pas de compte de service, ni d’entité principale qui ne soit pas rattachée à un tenant.
Pas de paiement, de numéro de carte ou de consentement juridique via l’API ou un chat. Ces étapes restent dans le navigateur de la personne ; une commande vous remet le lien.
Pas de second chemin : il n’y a ni accès direct à la base de données, ni accès shell, ni endpoint de masse qui contourne le point de contrôle unique. La barrière de rôle, la barrière de confirmation, l’idempotence et le registre d’audit ne sont appliqués qu’à cet endroit.
Se brancher sur le texte des messages d’erreur n’est pas pris en charge ; le texte est localisé et change sans préavis.
Pas de pagination par offset.
Utiliser un identifiant de surface comme clé métier dans votre ERP n’est pas pris en charge.
Les webhooks sortants ne sont pas casés de force dans ce contrat — mais ils EXISTENT désormais et sont documentés sur cette page (la section webhooks ci-dessus). Le catalogue est une surface PULL et le flux d’événements est un contrat DISTINCT : les noms d’événements et le schéma du payload sont versionnés selon leurs propres règles et ne sont pas liés à la version du contrat du catalogue de commandes.
Le catalogue lisible par machine
Cette page a été écrite pour des personnes. Pour un assistant IA ou un client automatisé, la même information existe sous forme de copie structurée, sans authentification.
GET /api/public/cli/catalog ne requiert aucune authentification et renvoie l’identité publique des commandes : le nom d’API gelé, l’identité CLI domaine/verbe, la description, les paramètres JSON Schema, les indicateurs read_only, confirmation_needed et irreversible, le credit_cost, ainsi que les champs d’accès key_level, permission, file_params, secret_parameters et cli_only. Il ne renvoie aucune donnée personnelle, aucune donnée de tenant et aucun enregistrement d’exemple — uniquement ce qu’est la surface.
La bonne manière pour un agent externe de l’utiliser : lire le catalogue, expliquer AVEC SES PROPRES MOTS quelles tâches sont possibles et, lorsqu’une exécution est nécessaire, inviter l’utilisateur à l’exécuter dans son propre environnement avec son propre token. L’agent ne demande, ne génère ni ne relaie jamais le token d’un utilisateur.
Connecter Logistivo à un assistant IA pour l’inscription et les demandes de fret est un canal distinct, avec sa propre page :
Le catalogue est sans authentification ; l’exécution ne l’est pas. Il n’existe aucun moyen d’exécuter une commande au nom d’un agent — ce qui s’exécute, c’est toujours l’identité propre de l’utilisateur.
Un mot de passe Logistivo, un code de vérification ou un token d’accès ne passe jamais par un chat. Ne construisez pas de flux qui en demande, en génère ou en relaie un.
Le caractère irréversible d’une commande est écrit dans le catalogue. Ne proposez jamais « essayons » sur une commande avec irreversible: true.
Les commandes dont le credit_cost n’est pas nul (tariffs inquiry et export-documents generate, par exemple) ont un résultat monétaire ; ne les appelez pas dans une boucle automatisée.
Les paiements, numéros de carte et consentements juridiques ne passent jamais par un chat ni par un agent. Proposez plutôt le lien fourni par handoff-links generate ; la personne termine l’étape dans son propre navigateur.
Un agent qui agit avec la clé d’un utilisateur doit d’abord appeler users get : cette commande renvoie le rôle, le niveau d’accès de la clé, les permissions effectives et indique si un consentement en attente ou une vérification de téléphone bloque les écritures — anticipez les refus au lieu de les collectionner.
Un jumeau en texte brut de cette page se trouve à /cli.md ; utilisez-le si vous analysez le markdown de façon plus fiable que le HTML.
La définition lisible par machine : OpenAPI 3.1 et Postman
Le catalogue ci-dessus est le format propre à Logistivo. La même information est aussi publiée dans deux formats standard du secteur que vos outils comprennent déjà : une définition OpenAPI 3.1 et une collection Postman. Aucune des deux n’est rédigée à la main — toutes deux sont générées à partir du registre de commandes en direct à chaque requête, elles ne peuvent donc pas devenir obsolètes.
La définition EST le catalogue, pas une seconde réalité. Chaque commande apparaît comme une opération POST /api/common/commands/ ; le schéma du corps est le JSON Schema propre à la commande (octet pour octet ce que voit l’assistant), le schéma de réponse est l’enveloppe commune, les indicateurs de barrière (read_only, confirmation_needed, irreversible et le badge de crédit) se trouvent dans l’extension x-logistivo, et les clés d’erreur métier sous x-error-keys. Une commande abandonnée est marquée deprecated: true et reste appelable pendant sa fenêtre de six mois.
À côté de la surface de commandes, les endpoints REST qui portent le contrat d’intégration figurent aussi dans la définition : 10 endpoints de liste avec synchronisation incrémentale (updated_since + cursor + limit) et 7 endpoints d’écriture qui acceptent votre propre clé (external_ref). La surface REST de Logistivo est bien plus vaste que cela ; le reste est laissé de côté À DESSEIN. Ces payloads relèvent du contrat propre au produit, et un schéma écrit au jugé casserait votre client généré dès le premier appel — et vous chercheriez le bug dans votre code, pas dans le nôtre.
La définition est générée pour le RÔLE de la personne qui la demande : la commande d’un autre rôle n’entre jamais dans le document, car une définition est un contrat plutôt qu’un dictionnaire, et tout ce qu’elle contient doit pouvoir être appelé avec ce token. La version sans authentification est l’union des trois rôles, et chaque opération y indique sous x-logistivo.roles quels rôles la voient.
Ne nous croyez pas sur parole — vérifiez : npx @redocly/cli lint logistivo-openapi.json passe sans aucun avertissement.
GET /api/common/spec/openapi.json — La définition OpenAPI 3.1 pour le rôle de votre token. Porte un ETag ; If-None-Match vous renvoie un 304, vous ne la retéléchargez donc pas à chaque build.
GET /api/common/spec/postman.json — Le même périmètre sous forme de collection Postman v2.1, avec les variables base_url et token et des dossiers déjà regroupés par domaine de commande.
GET /api/public/cli/openapi.json — La version sans authentification — l’union des trois rôles. Pour concevoir et chiffrer la passerelle avant même d’avoir un token.
GET /api/public/cli/postman.json — La collection Postman sans authentification : un seul fichier que vous pouvez remettre à votre équipe.
559 opérations — 519 commandes + 36 opérations REST et de plan de contrôle + 4 endpoints de catalogue et d’identité. Les chiffres de cette page ne sont pas saisis à la main ; ils sont comptés à partir du document en direct à chaque requête, donc le jour où une commande est livrée, ils augmentent ici aussi — et leur somme est juste.
Le schéma de sécurité — bearerAuth : un token Passport émis pour un véritable utilisateur. Une clé à portée lecture ne peut appeler que les opérations marquées x-logistivo.read_only: true ; une tentative d’écriture renvoie 403 AVANT la barrière de confirmation, si bien qu’une clé en lecture seule ne voit jamais de 409.
Chaque branche d’erreur est décrite — Chaque opération décrit séparément 401/403/404/409/422/429/500. Les deux sens de 409 (confirmation requise / conflit d’idempotence) et les deux sens de 422 (erreur de schéma / rejet métier) sont distincts dans le document, afin que votre générateur ne les fusionne pas en une seule branche.
Pas d’horodatage — Le document ne porte aucune date de génération. Le même catalogue produit les mêmes octets, c’est pourquoi l’ETag fonctionne réellement et qu’une définition que vous versionnez dans votre dépôt n’apparaît pas comme « modifiée » à chaque téléchargement.
Nous n’avons pas inventé les payloads du produit — Sur les endpoints REST d’écriture, seul le champ du contrat (external_ref) est décrit ; le reste du corps reste ouvert avec additionalProperties: true et le lecteur est renvoyé à la documentation du produit. Une définition incomplète mais vraie vaut mieux qu’une définition complète mais inventée.
La liste des clés d’erreur par opération n’est PAS exhaustive — x-error-keys ne liste que les clés qui découlent avec certitude de l’enregistrement propre à la commande, et le signale avec x-error-keys-exhaustive: false. Le dictionnaire complet se trouve à la racine du document ; traitez toute clé que vous ne reconnaissez pas comme un échec générique. Une « liste complète » fabriquée vous aurait poussé à ne jamais écrire la branche par défaut.
Les outils de découverte ne figurent pas dans la définition — search_commands, run_command et list_capabilities n’existent qu’à l’intérieur de la boucle du chat et ne peuvent pas être appelés en HTTP. S’ils avaient été inclus, votre générateur aurait écrit trois méthodes qui n’auraient jamais pu fonctionner.
Génération de code : un client typé à partir de la définition
Vous avez la définition ; générez maintenant du code fonctionnel à partir d’elle. `lg codegen` lit le document OpenAPI et écrit un client en un seul fichier, sans dépendance — TypeScript (déclarations de types et une fine couche d’appel) ou PHP (une classe cliente avec des array shapes PHPDoc). Pas de `npm install`, pas de composer : `fetch` côté TypeScript, `ext-curl` côté PHP.
La génération se fait sur VOTRE machine, pas sur notre serveur. Ce n’est pas une préférence : épinglez une fois la définition dans votre dépôt (`lg spec --out=...`) et la même commande s’exécute à chaque build, sans réseau ni token, si bien que votre CI ne dépend jamais de notre disponibilité. Et comme le code généré est du code qui S’EXÉCUTE dans votre ERP, le garder dans votre dépôt plutôt que de le récupérer depuis une API signifie que chaque modification apparaît dans `git diff`.
Le client généré gère correctement les trois rails de Logistivo, et il apprend lequel est lequel à partir du document plutôt qu’en devinant : chaque opération déclare son rail dans `x-logistivo.surface`. Le rail des commandes déballe l’enveloppe `{success, data:{…}}` ; une liste de synchronisation REST n’est PAS enveloppée et est renvoyée telle quelle (la déballer ferait perdre `next_cursor`) ; une écriture REST renvoie le corps produit propre à l’endpoint. Un générateur généraliste ne connaît pas cette distinction — le nôtre, si.
Les types ne sont pas devinés : l’interface d’arguments de chaque commande est générée à partir du JSON Schema même que voit l’assistant. Ce qui est obligatoire le reste, les enums deviennent des types union, les objets imbriqués deviennent des types imbriqués. En pratique : si le serveur exige un champ, l’appel qui l’oublie n’échoue pas avec un 422 en production — il échoue à la compilation.
Aucun horodatage de génération n’est écrit dans le fichier : la même définition avec les mêmes options produit les mêmes octets. Une nouvelle génération ne fait donc aucun bruit dans `git diff`, et la seule chose qui a réellement changé — le contrat — reste visible.
1. Épingler la définition — La définition est générée pour votre rôle ; chaque opération qu’elle contient peut être appelée avec ce token. Commitez le fichier. lg login --api-key= lg spec --out=logistivo-openapi.json
2. Générer le client — Un seul fichier en sort, qui porte comme méthode CHAQUE opération de la définition que vous avez épinglée : les commandes que votre rôle peut appeler, les endpoints REST qui portent le contrat d’intégration et les endpoints de découverte. Le nombre est celui de VOTRE rôle, pas le total de la plateforme — aujourd’hui, une clé de chargeur produit 448 méthodes de commande, une clé de transporteur 452, une clé de commissionnaire en douane 312. Générez à partir de la définition publique sans authentification et le plafond est de 559 opérations. 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. Vérifier, puis utiliser — Si le code généré ne compile pas, la faute est la nôtre, pas la vôtre : l’intégrité de la définition est protégée par une vérification exécutable sur le serveur. npx tsc --noEmit --strict --target ES2022 --module ESNext --moduleResolution bundler logistivo-client.ts php -l LogistivoClient.php
Une méthode par opération — Chaque commande du document, chaque endpoint REST qui porte le contrat d’intégration et les endpoints de découverte. Générez à partir de la définition de votre rôle et vous n’obtenez que ce que vous pouvez appeler (448 commandes pour un chargeur) ; générez à partir de la définition publique et vous obtenez les 559 opérations. Le jour où une commande est ajoutée sur le serveur, une nouvelle génération l’intègre ; il n’y a pas de version du client à attendre.
Types d’arguments — Le schéma `args` de chaque commande devient une interface (un array shape en PHP). Les champs obligatoires le restent, les enums deviennent des unions. En TypeScript, oublier un champ obligatoire est une erreur de compilation ; en PHP, votre IDE et PHPStan voient la même forme.
Classes d’erreurs — La taxonomie transport (`error_code`) et la taxonomie métier (`error_key`) sont des champs distincts ; la barrière de confirmation et la limite de débit sont des types d’erreur distincts. L’union des clés d’erreur reste ouverte aux valeurs inconnues — lorsque le serveur déclare une nouvelle clé, votre code ne cesse pas de compiler, il tombe dans la branche `default`.
Une politique de nouvelles tentatives correcte — Les nouvelles tentatives automatiques ne s’appliquent qu’aux appels sûrs : les lectures, et les écritures qui portent une clé d’idempotence. Une écriture sans clé qui expire ne signifie pas « rien n’a été écrit », donc le client ne la répète jamais aveuglément. Sur un 429, il attend le `Retry-After` du serveur au lieu d’inventer un délai.
Les corps de résultat ne sont pas typés — Les résultats des commandes reviennent en `unknown` (`mixed` en PHP), pour la même raison que dans la définition elle-même : la forme des résultats est la sortie métier de la commande, pas une partie du contrat. Un type de résultat deviné commencerait à mentir la première fois qu’un champ bougerait.
Le fichier généré ne se modifie pas à la main — C’est une sortie, pas une source. Si vous avez besoin d’un comportement supplémentaire, enveloppez la classe générée ; tout ce que vous écrivez à l’intérieur est perdu à la génération suivante.
Les outils de découverte ne sont pas générés — `search_commands`, `run_command` et `list_capabilities` n’existent qu’à l’intérieur de la boucle du chat et ne peuvent pas être appelés en HTTP ; ils sont absents de la définition et donc du client. Les inclure aurait signifié écrire trois méthodes qui ne fonctionnent jamais.
Périmètre en toute franchise
Nous préférons agrandir cette section plutôt que la réduire. La valeur d’un contrat d’intégration tient moins à ce qu’il promet qu’à la clarté avec laquelle il dit ce qu’il ne fait pas.
La CLI s’exécute dans le contexte d’un utilisateur du tenant — Chaque commande s’exécute sous l’entreprise et le rôle de l’utilisateur dont le token est présenté. Un mode opérateur de plateforme — un mode administratif qui lit à travers les entreprises — est en dehors de cette surface et ne sera pas ouvert d’ici.
Votre liste de commandes dépend de votre rôle — Un compte chargeur voit 448 commandes, un transporteur 452, un commissionnaire en douane 312, un affilié 55. S’il manque une commande dans votre catalogue, vérifiez d’abord le rôle ; si elle est listée mais refusée, vérifiez la portée et le niveau d’accès de la clé. Les comptes conducteurs n’ont aucun accès à cette surface.
Certaines commandes consomment des crédits — Les recherches tarifaires, la génération de documents et quelques autres commandes reposant sur l’IA puisent dans le solde de crédits de votre forfait. Chaque ligne du catalogue porte credit_cost {mode, credits} : fixed correspond au montant exact débité par appel, read_only ne débite jamais rien, et computed signifie que le débit dépend de l’appel — credits vaut alors null et le chiffre réel apparaît sur la carte de confirmation. Un preflight (dry_run) vous indique ce qu’un appel débiterait et si votre solde le couvre.
Les clés d’intégration ne peuvent pas piloter le chat du tableau de bord — L’assistant IA du tableau de bord est destiné aux personnes. Démarrer ou poursuivre une exécution de l’assistant avec une clé d’intégration est refusé avec 403 ; les agents utilisent les endpoints de commandes, lg ou le canal MCP, où chaque commande s’exécute au niveau d’accès de la clé et où ses écritures sont enregistrées comme écritures d’intégration.
Le catalogue ne remplace pas l’API REST existante — La surface REST qui fait fonctionner les applications web et mobiles de Logistivo reste en place et demeure soumise à la règle de rétrocompatibilité. Le catalogue de commandes ne remplace pas le CRUD des ressources ; c’est la couche des VERBES — la manière unique et auditée de faire une chose.
Les commandes de liste renvoient aujourd’hui de petites fenêtres — Tant qu’une commande de liste n’annonce pas cursor et updated_since dans son schéma, son plafond est de 20 lignes, sans curseur. Elle n’est pas conçue pour extraire une copie complète de vos données ; la synchronisation incrémentale est déployée commande par commande.
Questions fréquentes
À quoi sert la CLI Logistivo ?
Elle exécute le travail de votre compte Logistivo depuis un terminal, un script ou votre propre agent IA : chargements et voyages, demandes, offres et appels d’offres, flotte, conducteurs et leurs dépenses, documents, contacts et comptes courants, factures et comptabilité, entrepôt et stock, membres de l’équipe, tarifs HS et droits antidumping. Chaque action d’écriture de l’interface web a sa commande ; les paiements, le consentement juridique et la clôture du compte restent volontairement dans le navigateur. Les mêmes commandes peuvent être appelées en HTTP pour les intégrations ERP/CRM et via le canal MCP.
Comment les commandes sont-elles nommées dans la CLI Logistivo ?
La forme est lg --parameter=value. Le domaine est une entité au pluriel (loads, demands, invoices, export-documents) et le verbe provient d’un vocabulaire fermé qui ne s’enrichit que par décision délibérée (list, get, create, update, search, set-status, generate, etc.). Tous les verbes d’une entité vivent dans un seul domaine, et la paire (domaine, verbe) est unique dans tout le catalogue.
Comment m’authentifier auprès de la CLI ?
En mode interactif, lg login affiche un code d’approbation que vous confirmez dans votre navigateur après vous être connecté à Logistivo — aucun mot de passe ni aucune clé n’est saisi dans le terminal, et la session reste ouverte et se renouvelle d’elle-même jusqu’à ce que vous exécutiez lg logout. lg login --password (e-mail et mot de passe) reste disponible comme solution de repli. Sur les serveurs et en CI, utilisez une clé d’intégration émise dans l’interface web ou avec lg keys create : lg login --api-key l’enregistre dans un profil local, ou placez-la dans la variable d’environnement LOGISTIVO_TOKEN. En HTTP, le token transite dans l’en-tête Authorization: Bearer.
Puis-je créer un compte de service pour mon intégration ERP ?
Non. Une intégration se connecte avec le token d’un véritable utilisateur de l’entreprise créé dans l’interface web. Une identité synthétique sans entreprise rend l’isolation multi-tenant inopérante, vide de son sens la colonne « qui a exécuté ceci » du registre d’audit, et laisse une passerelle qui ne se tait pas lorsque son propriétaire s’en va. Le bon modèle est un utilisateur dédié, avec un rôle restreint et un propriétaire nommément désigné.
Logistivo dispose-t-il d’un environnement de test (sandbox) ?
Oui, et en libre-service : un tenant sandbox distinct est ouvert pour votre entreprise — même code, même catalogue de commandes, son propre registre de crédits. L’environnement est déduit de l’entreprise de la clé et ne peut pas être fourni avec la requête ; un appel effectué avec le mauvais profil s’arrête côté serveur avec 403 ENVIRONMENT_MISMATCH. Une demande ouverte dans la sandbox n’atteint jamais de vrais transporteurs, un événement sandbox n’est jamais livré à votre abonnement webhook de production, et votre solde de production ne bouge pas. Endpoints : POST /api/common/integration-sandbox (ouverture), POST /api/common/integration-sandbox/keys (clé), GET /api/common/integration-sandbox/go-live (liste de contrôle de mise en production). Côté lg, lg --sandbox et lg --live sélectionnent un profil pour une seule exécution.
Comment lire la sortie lg --json dans un script ?
La sortie est l’enveloppe HTTP complète : { "success": bool, "data": { "contract_version", "command", "status", "result" }, "code", "message" }. Le payload métier se trouve sous .data.result ; sur les commandes de liste, les lignes sont dans .data.result., le nombre dans .data.result.count et la page suivante dans .data.result.next_cursor. Le chemin jq correct ressemble donc à lg loads list --json | jq -r '.data.result.loads[].load_code'. Un chemin qui saute l’enveloppe ne produit pas d’erreur, il renvoie silencieusement null — dans un script de surveillance, cela devient une alarme qui ne cesse jamais de sonner. La seule exception est /api/public/status, dont le corps est volontairement sans enveloppe.
Si j’envoie deux fois la même requête, est-ce que j’obtiens des enregistrements en double ?
Pas si vous avez envoyé une idempotency_key. Un second appel avec la même clé ne réexécute pas la commande ; il renvoie le premier résultat avec le statut replayed. La clé doit être un UUID et rester la MÊME d’une tentative à l’autre — générer une nouvelle clé à chaque tentative revient à ne pas utiliser l’idempotence.
À quoi sert --yes ?
Elle franchit la barrière de confirmation. Lorsqu’une commande soumise à la barrière est appelée sans --yes, rien ne change : le serveur résume en une phrase ce qu’il s’apprête à faire, indique si c’est irréversible, et s’arrête (HTTP 409, code de sortie CLI 4). Répéter la commande avec --yes effectue le travail.
Comment détecter l’échec d’une commande dans un script ?
Lisez le code de sortie, jamais le texte du message : 0 succès, 1 rejet par une règle métier, 2 erreur de commande ou d’argument, 3 erreur d’authentification ou de rôle, 4 confirmation requise. En HTTP, les équivalents sont 200, 422, 404, 403 et 409, et le champ error_code du corps est stable. Le MESSAGE d’erreur est localisé et change sans préavis.
Comment découvrir les commandes disponibles par programmation ?
GET /api/public/cli/catalog pour la découverte sans authentification, et GET /api/common/commands pour la liste que votre compte peut réellement voir. Les deux renvoient les paramètres JSON Schema de chaque commande ; construisez votre client à partir d’eux plutôt que de coder en dur une liste de commandes.
Dois-je mettre à jour mon client lorsqu’une nouvelle commande est ajoutée ?
Non. Le client récupère sa liste de commandes dans le catalogue, donc une commande ajoutée sur le serveur apparaît sans nouvelle version du client. Une mise à jour n’est nécessaire que pour un changement cassant qui fait augmenter la version du contrat, et dans ce cas l’ancienne forme reste active pendant au moins six mois.
La CLI remplace-t-elle l’API REST existante ?
Non. La surface REST qui fait fonctionner les applications web et mobiles reste en place. Le catalogue de commandes ne remplace pas le CRUD des ressources ; c’est la couche des verbes — la manière unique, contrôlée par rôle, soumise à confirmation et auditée d’effectuer une action.
Comment obtenir une clé API Logistivo et que peut-elle faire ?
Un manager disposant de la permission de gestion d’équipe l’émet dans l’interface web, sous Settings › Integration keys, ou depuis un terminal avec lg keys create. La clé agit au nom d’un véritable membre de l’équipe et possède trois réglages indépendants : la portée (read ouvre le catalogue et les commandes qui n’écrivent pas, write ouvre toutes les commandes — la barrière de confirmation reste inchangée), des autorisations facultatives par domaine, et un niveau d’accès — employee, la valeur par défaut, pour les opérations courantes, ou manager pour l’équipe, les paramètres, les clés et l’argent. Elle n’est affichée qu’une seule fois et n’est pas stockée sur le serveur ; elle peut faire l’objet d’une rotation, d’un transfert et d’une révocation. Lorsque le membre pour lequel elle agit s’en va, la clé est fermée elle aussi. Il n’existe pas de compte de service.
Que se passe-t-il si je réutilise une clé d’idempotence pour une autre commande ?
Le serveur répond 409 idempotency_conflict et nomme la commande pour laquelle la clé a d’abord été utilisée ; rien ne s’exécute et rien n’est rejoué. Les clés sont limitées à votre entreprise, liées à une seule commande et verrouillées pendant 24 heures — passé ce délai, la même clé lance une nouvelle exécution.
Comment les limites de débit s’appliquent-elles à mon intégration ?
Par token, par minute, en trois compartiments : lectures du catalogue 120, commandes de lecture 120, commandes d’écriture 30. Un 429 porte toujours Retry-After et un corps avec retry_after, limit et bucket ; attendez ce délai et réessayez. Le catalogue publie les valeurs actuelles sous rate_limits.
Comment distinguer un rejet métier d’une erreur de transport ?
Branchez-vous d’abord sur error_code : failed (422) est un rejet métier et porte une error_key stable comme INSUFFICIENT_CREDITS ou NOT_FOUND ; server_error (5xx) et les erreurs réseau se réessaient avec la même clé d’idempotence ; pour rate_limited (429), on attend. Ne vous branchez jamais sur le texte de l’erreur.
Logistivo envoie-t-il des webhooks ? Pour quels événements ?
Oui. Vous enregistrez une adresse https et choisissez les événements qui vous intéressent ; un POST signé arrive quand ils se produisent. 13 événements sont disponibles à l’abonnement aujourd’hui : chargement créé / statut modifié / conducteur affecté, demande créée et statut modifié, offre déposée / révisée / acceptée, facture brouillon / émise / annulée, et réservation d’entrepôt créée / statut modifié. Chaque nom est adossé à une classe d’événement réellement émise — rien n’est annoncé pour n’être jamais déclenché, car un tel événement est un échec silencieux que l’intégrateur attend pour toujours. Les abonnements se créent sous Settings › Integration › Webhooks, ou depuis un terminal avec lg webhooks create.
Comment vérifier la signature d’un webhook Logistivo ?
Chaque requête porte un en-tête X-Logistivo-Signature : t=,v1=. La chaîne signée est ".", l’algorithme est HMAC-SHA256 et la clé est le secret de l’abonnement. Quatre règles : (1) vérifiez les octets BRUTS — décoder puis resérialiser le corps (JSON.stringify / json_encode) transforme les mêmes données en octets différents et la signature ne correspond plus ; c’est de loin l’erreur la plus fréquente ; (2) vérifiez l’horodatage et rejetez tout ce pour quoi |now − t| > 300 s, même si la signature est correcte ; (3) comparez en temps constant avec hash_equals / timingSafeEqual ; (4) dédupliquez sur event_id, pas sur l’id de livraison — event_id est conservé lors d’un rejeu, tandis que l’id de livraison change. Des récepteurs Node et PHP fonctionnels se trouvent dans examples/webhook-receiver/ du dépôt et se testent eux-mêmes avec --selftest.
Que se passe-t-il si un webhook ne peut pas être livré ? Est-ce que je perds l’événement ?
Non. Si votre récepteur ne renvoie pas de 2xx, la livraison entre dans le calendrier des nouvelles tentatives : 60 · 300 · 1800 · 7200 · 21600 secondes, 6 tentatives au total, soit une fenêtre d’environ 8,6 heures. TOUS les échecs, sauf 410 Gone, font l’objet de nouvelles tentatives, 4xx compris — perdre un événement métier coûte plus cher que quelques requêtes supplémentaires. Après 10 livraisons consécutives épuisées, l’abonnement est mis en sourdine et le motif est enregistré, si bien que la question « pourquoi rien n’arrive » garde une réponse. Le registre des livraisons conserve chaque tentative (code de statut, durée, erreur) et vous pouvez renvoyer une livraison individuelle depuis l’interface web ou avec lg webhooks replay. La synchronisation incrémentale (updated_since + cursor) reste là comme filet de sécurité.
Mon agent IA peut-il faire tout ce qu’un utilisateur peut faire dans l’interface web ?
Presque tout. Chaque action d’écriture de l’interface web a sa commande — mesuré par rapport aux endpoints d’écriture de l’interface web, 100 % de ceux qui entrent dans le périmètre sont couverts — et les mêmes commandes sont ouvertes à lg, au HTTP et au canal MCP. Les exceptions délibérées sont les étapes d’identité et d’argent : la connexion, l’achat d’un forfait, l’ajout d’une carte avec 3D Secure, l’approbation des textes juridiques et la clôture d’un compte restent dans le navigateur de la personne, et lg handoff-links generate renvoie le lien correspondant. Les clés d’intégration, les webhooks et la sandbox se gèrent avec des commandes intégrées de lg, car ils renvoient des secrets une seule fois.
Puis-je transmettre des fichiers, comme des PDF ou des photos, aux commandes depuis la CLI ou l’API ?
Oui. Avec lg, placez @ devant un chemin local (--attachment_uuid=@./cmr.pdf) et lg envoie d’abord le fichier ; --file est un raccourci lorsqu’une commande a un seul champ de fichier, et lg upload se contente d’envoyer. En HTTP, envoyez le fichier en multipart vers POST /api/common/commands:upload et transmettez l’attachment_uuid renvoyé à la commande ; les clients MCP utilisent l’outil upload_attachment. Le type est détecté à partir du contenu, les envois appartiennent à l’utilisateur et restent utilisables pendant 24 heures, et renvoyer le même fichier renvoie le même identifiant.
Quelle est la différence entre une clé d’intégration employee et une clé manager ?
Le niveau d’accès détermine l’importance du travail qu’une clé peut effectuer. Une clé employee, la valeur par défaut pour les nouvelles clés, exécute les opérations courantes : chargements, demandes, offres, voyages, flotte, documents et contacts. Une clé manager peut en plus effectuer des tâches de gestion — membres de l’équipe et rôles, paramètres de l’entreprise, clés d’intégration, comptes bancaires, cartes enregistrées, versements aux affiliés. Une clé n’a jamais plus de droits que la personne pour laquelle elle agit, et une clé employee qui appelle une commande manager reçoit INSUFFICIENT_KEY_LEVEL. Modifiez le niveau dans l’interface web ou avec lg keys update --access-level=manager.
Un affilié (apporteur d’affaires) peut-il utiliser la CLI ?
Oui. Un compte affilié dispose de son propre catalogue — 55 commandes pour les recommandations, les prospects, les notes et tâches CRM, les présentations commerciales, les gains et les versements — et l’utilise depuis lg, en HTTP ou via MCP comme n’importe quel autre rôle. Demander ou annuler un versement et modifier le compte bancaire de versement exigent une clé de niveau manager et une confirmation. Une entreprise qui est aussi chargeur, transporteur ou commissionnaire en douane voit les deux catalogues.
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.