Logistivo CLI: conduceți operațiunile logistice din terminal și din ERP-ul dumneavoastră
Un singur catalog de comenzi alimentează trei interfețe: clientul de terminal lg, asistentul AI din panoul de control și canalul la care se conectează asistenții AI externi. O capabilitate se scrie o singură dată și apare în toate trei — iar acum fiecare acțiune de scriere din panou are o comandă, astfel încât scripturile și propriii dumneavoastră agenți AI pot face munca pe care echipa o face pe ecran. Plățile, consimțământul legal și închiderea contului rămân în mod deliberat în browser. Această pagină este un contract. Tabelul de comenzi de mai jos nu este scris de mână; este generat la fiecare cerere din registrul live de comenzi.
Ce este Logistivo CLI?
Logistivo CLI (lg) este un client de linie de comandă care execută munca din contul dumneavoastră Logistivo — încărcături și curse, cereri de transport, oferte și licitații, flotă și șoferi, documente, contacte și conturi curente, facturi și contabilitate, depozit și stoc, membri ai echipei și tarife vamale — dintr-un terminal, dintr-un script sau din propriul dumneavoastră agent AI. Comenzile nu sunt încorporate în client: clientul preia catalogul de comenzi de pe server și se construiește pe baza lui. Aceleași comenzi pot fi apelate prin HTTP fără a instala nimic — aceasta este calea folosită de integrările ERP și CRM — precum și prin canalul MCP la care se conectează asistenții AI externi.
O singură formă de comandă: lg --parameter=value. Catalogul conține astăzi 519 de comenzi în 125 de domenii; cea mai largă listă pe care o vede un singur rol are 452 de comenzi în 112 de domenii.
Fiecare acțiune de scriere din panou are o comandă — măsurat față de endpoint-urile de scriere ale panoului, 100% dintre cele aflate în perimetru sunt acoperite. Plățile (3D Secure), consimțământul legal și închiderea contului rămân în mod deliberat în browser; pentru acestea, o comandă returnează în schimb un link.
Comenzile care primesc un document sau o fotografie funcționează și în afara browserului: scrieți --attachment_uuid=@./cmr.pdf, iar lg încarcă mai întâi fișierul; prin HTTP încărcați fișierul la /api/common/commands:upload și transmiteți attachment_uuid returnat.
Cheile de integrare au un nivel de acces: employee (implicit pentru cheile noi) pentru operațiunile de zi cu zi, manager pentru echipă, setări, chei și bani. O cheie nu are niciodată mai multe drepturi decât persoana în numele căreia acționează.
Flag-urile nu sunt niciodată inventate: fiecare flag este un nume de parametru din propria JSON Schema a comenzii, de unde provin și tipul său și faptul că este sau nu obligatoriu.
Comenzile de scriere cer confirmare; cele ireversibile nu rulează niciodată fără ea (HTTP 409, cod de ieșire CLI 4).
Reîncercarea nu creează duplicate: un apel care poartă un idempotency_key rulează cel mult o dată.
Fiecare execuție ajunge într-un singur registru de audit — se consemnează dacă a venit dintr-un terminal, din chat sau de la un asistent.
Ce este live astăzi și ce urmează
Această secțiune se află intenționat în partea de sus a paginii. Cea mai costisitoare greșeală pe care o poate face un document de integrare este să descrie un endpoint care nu este încă deschis ca și cum ar fi: integratorul scrie codul, endpoint-ul returnează 404, iar încrederea nu se mai întoarce.
Deoarece contractul este înghețat, codul de integrare pe care îl scrieți astăzi continuă să funcționeze pe măsură ce restul pieselor se deschid. Câmpurile pe care nu le cunoașteți trebuie ignorate; această regulă ne permite să adăugăm fără a strica nimic.
Catalogul de comenzi și tabelul de identitate — Identitatea publică domeniu/verb a fiecărei comenzi este înghețată, iar versiunea contractului este publicată ca 1 în fiecare răspuns al catalogului și în antetul X-Contract-Version. Tabelul de pe această pagină este generat din registrul live: o comandă adăugată pe server apare aici de la sine, iar o comandă eliminată dispare.
Endpoint de descoperire fără autentificare — GET /api/public/cli/catalog — numele comenzilor, identitatea domeniu/verb, descrierea, parametrii JSON Schema, flag-urile de poartă și câmpurile de versionare (since, deprecated_at, replaced_by, aliases). Fără autentificare: emiterea unui token este un pas care vine DUPĂ decizia de integrare, nu înaintea ei. Răspunsul nu conține deloc date ale vreunui tenant.
Endpoint-uri autentificate de catalog și de execuție — GET /api/common/commands, GET /api/common/commands/{name} și POST /api/common/commands/{name}. Poarta de rol, poarta de confirmare, idempotența și registrul de audit se află într-un singur punct de aplicare, prin care trec și chatul și terminalul.
Acoperirea panoului: fiecare acțiune de scriere are o comandă — 519 de comenzi în 125 de domenii, verificate față de endpoint-urile de scriere ale panoului: fiecare endpoint din perimetru este acoperit de o comandă (o oglindă a endpoint-ului sau același serviciu partajat) și niciunul nu rămâne nedovedit. În mod deliberat în afara perimetrului: plățile cu 3D Secure, consimțământul legal, închiderea contului și autentificarea, care rămân în browser; gestionarea cheilor, a webhook-urilor și a sandbox-ului, care sunt comenzi încorporate în lg; și endpoint-urile proprii ale aplicației pentru șoferi.
Preflight (dry_run): vedeți efectul fără a rula comanda — Cu dry_run: true în corpul cererii, comanda nu rulează: validarea, poarta de rol/scope, rezolvarea țintelor și calculul creditelor se execută toate și se întoarce o previzualizare; nu se scrie nimic, nu se consumă credit, iar cheia de idempotență nu este consumată. Îl acceptă și endpoint-ul batch, per lot. Un preflight nu intră niciodată în handler-ul comenzii; la lansare, 178 de preflight-uri pe toate comenzile de scriere existente atunci în catalog nu au produs nicio instrucțiune de scriere.
Chei de integrare — Chei API care acționează în numele unui membru real al echipei, emise în panou sau cu lg keys create: scope de citire/scriere, un nivel de acces (employee implicit, sau manager), durată de viață, ultima utilizare, rotire, transfer și revocare. lg login --api-key, lg whoami și un lg logout care revocă cheia și pe server sunt construite pe ele.
Sandbox — exersați scrierile fără a atinge producția — Un tenant sandbox separat pentru fiecare companie, cu același catalog de comenzi; se deschide în regim self-service și își emite propria cheie. Creditele, marketplace-ul și rutarea webhook-urilor sunt separate între cele două medii; mediul este dedus din compania cheii și nu poate fi transmis odată cu cererea.
Versionare, taxonomia erorilor, idempotență și limite de rată — Comenzile poartă since / deprecated_at / replaced_by / aliases, iar o comandă depreciată răspunde cu un antet X-Deprecated. Eșecurile de business poartă un error_key stabil alături de error_code de nivel de transport, iar dicționarul cheilor este publicat în catalog. Cheile de idempotență sunt limitate la compania dumneavoastră, legate de o singură comandă și blocate timp de 24 de ore. Limitele de rată (rate limits) sunt per token, în trei categorii, iar fiecare 429 poartă Retry-After.
Webhook-uri de ieșire: un POST atunci când se întâmplă ceva — Notificarea push semnată este live pentru 13 evenimente. Abonamentele se gestionează din panou sau cu lg webhooks; semnătura își poartă propriul timestamp, programul de reîncercări, în secunde, este 60 · 300 · 1800 · 7200 · 21600, iar motivul dezactivării este întotdeauna înregistrat. Fiecare nume de eveniment este susținut de o clasă de eveniment care este efectiv emisă — nimic nu este anunțat și apoi niciodată trimis. Calea pull (updated_since + cursor) nu a fost eliminată: push-ul a fost adăugat lângă ea, nu în locul ei.
Comenzi care primesc fișiere — 33 de comenzi primesc un document sau o fotografie — un CMR, o factură, un certificat de înmatriculare, fotografii de paleți. Încărcați o singură dată la POST /api/common/commands:upload, sau lăsați lg să o facă cu --attachment_uuid=@./file.pdf, și transmiteți attachment_uuid returnat; clienții MCP folosesc instrumentul upload_attachment. Tipul fișierului este detectat din conținut, iar o încărcare rămâne utilizabilă 24 de ore.
Clientul de terminal lg — Publicat pe npm sub licența MIT: instalați cu `npm install -g @lgstv/lg` sau rulați-l fără instalare prin `npx @lgstv/lg`. Este un singur fișier fără dependențe și, deoarece interfața HTTP este deschisă, vă puteți integra și fără el. Se autentifică printr-un cod de aprobare pe care îl confirmați în browser și apoi rămâne autentificat, reînnoindu-și singur sesiunea; încarcă fișierele locale în locul dumneavoastră (@path, --file, lg upload), gestionează cheile de integrare (lg keys), nu primește niciodată un secret în linia de comandă, respectă Retry-After, reîncearcă erorile 5xx cu aceeași cheie de idempotență și avertizează la comenzile depreciate și la versiunile mai noi ale contractului.
Sincronizare incrementală: paginare cu cursor și updated_since — Contractul de mai jos (limit + cursor opac semnat, next_cursor, updated_since) este fix și este implementat treptat pe comenzile de listare. Până când o anumită comandă de listare nu declară cursor și updated_since în JSON Schema sa, tratați-o ca pe o fereastră mică: plafon de 20 de rânduri, fără cursor.
Ce face diferența: clientul nu cunoaște nicio comandă, ci le extrage
Aceasta este singura decizie care dă sens restului paginii. Într-un CLI obișnuit, comenzile trăiesc în interiorul clientului; în Logistivo ele trăiesc pe server.
În aranjamentul clasic, când serverul capătă o capabilitate, clientul are nevoie de o versiune nouă, iar utilizatorul trebuie să o instaleze. Între timp, cele două părți știu lucruri diferite — și acesta este cel mai discret mod de eșec al integrărilor: scriptul rulează, codul de ieșire este 0, iar comanda pur și simplu nu descrie ceea ce poate face serverul.
În Logistivo, definiția unei comenzi este o singură înregistrare: numele ei, ce face, parametrii JSON Schema, ce roluri o pot vedea, dacă are nevoie de confirmare și dacă efectul ei este reversibil. Când lg pornește, preia acest catalog și generează din el textul de ajutor, flag-urile și validarea intrărilor. În momentul în care o comandă este adăugată pe server, lg o cunoaște — fără nicio actualizare a clientului.
Același catalog alimentează asistentul AI din panoul de control și canalul la care se conectează asistenții AI externi. O capabilitate se scrie o singură dată și apare în trei locuri — iar toate trei trec prin aceeași poartă de rol, aceeași poartă de confirmare și același registru de audit. Nu există un inventar separat de comenzi CLI; dacă ar exista, cele trei interfețe s-ar despărți pe nesimțite în șase luni.
Nicio divergență de versiuni — Lista de comenzi pe care o cunoaște clientul este, prin construcție, lista pe care o are serverul. Întrebarea „Ce versiune de lg are această comandă?” pur și simplu nu există.
Numele flag-urilor nu se ghicesc niciodată — Flag-urile unei comenzi sunt exact numele parametrilor din JSON Schema sa. Ca să aflați ce acceptă o comandă, nu citiți un document, ci catalogul — iar catalogul este mereu actual.
CLI-ul dumneavoastră este cât contul dumneavoastră — Catalogul este filtrat pe rol: o comandă pe care rolul dumneavoastră nu o poate vedea nu apare niciodată în listă. Un cont de transportator vede 452 de comenzi, un expeditor 448, un comisionar vamal 312, iar un cont de afiliat (partener de recomandare) are un set propriu: 55 de comenzi.
Documentația nu poate rămâne în urmă — Tabelul de comenzi de pe această pagină provine din același registru. Nu există nicăieri o listă pe care un om să trebuiască să o țină sincronizată cu realitatea.
Regula de denumire — cum cresc numele comenzilor
Catalogul va crește. Comenzile noi nu sunt denumite ad-hoc; se aplică șase reguli. Le publicăm aici pentru că acestea sunt numele pe care integrarea dumneavoastră le va scrie ani de zile, iar predictibilitatea lor are valoare pentru dumneavoastră.
Un domeniu este o entitate la plural — loads, demands, invoices, export-documents. Domeniile din două cuvinte sunt în kebab-case. Singura excepție este un substantiv nenumărabil: stock nu se pune niciodată la plural, pentru că „stocks” înseamnă altceva.
Toate verbele unei entități stau într-un singur domeniu — loads conține fiecare verb care acționează asupra unei încărcături: create, list, get, update, set-status, assign-driver, list-problems, archive și altele. Deschiderea unui domeniu nou pentru fiecare verb (load-statuses, load-drivers) l-ar obliga pe utilizator să caute aceeași entitate în trei locuri.
Verbul nu se scurge niciodată în domeniu; domeniul este ceea ce SE SCHIMBĂ — Alocarea unui șofer modifică încărcătura, nu șoferul, deci comanda este lg loads assign-driver. Complementul indirect (-driver) se atașează verbului, niciodată domeniului.
O sub-resursă nu primește niciodată propriul domeniu — O linie de factură și un articol de document nu pot fi listate separat; ele sunt adresate prin proprietarul lor — lg invoices add-line, lg export-documents add-item. Un singur test decide: dacă nu puteți lista sau obține lucrul respectiv independent, nu este un domeniu.
Restrângerea este un flag, nu un verb nou — lg fleet-documents list --days=30 este corect; nu există un verb separat „list-expiring”, pentru că fereastra este deja un parametru. Un verb calificat se folosește doar atunci când rândurile returnate nu sunt entitatea domeniului: loads list-problems returnează semnalări de probleme, nu încărcături.
Perechea (domeniu, verb) este unică în întregul catalog — Chiar și pentru două comenzi ale căror roluri nu se suprapun niciodată. Dacă aceeași pereche ar fi dată la două comenzi, codul de integrare s-ar uita la un singur nume, în timp ce CLI-ul ar rula lucruri diferite în funcție de cine l-a apelat.
Acoperire: tot ce este în panou, printr-o comandă
Multe echipe conectează Logistivo la propriul agent AI sau la propriul sistem de automatizare, iar un agent este util doar dacă poate duce treaba la capăt. Așa că regula este simplă: orice poate modifica un utilizator de birou în panou, poate modifica și o comandă — în spatele aceleiași porți de rol, aceleiași porți de confirmare și aceluiași registru de audit.
Acest lucru este măsurat, nu afirmat. Fiecare endpoint de scriere din spatele panoului este verificat față de registrul de comenzi, iar un endpoint se consideră acoperit doar atunci când o comandă îl declară drept oglinda sa HTTP sau apelează același serviciu partajat. Dintre endpoint-urile de scriere aflate în perimetru, 100% sunt acoperite și niciunul nu rămâne nedovedit. Fiecare endpoint lăsat deoparte are un motiv scris — pași de identitate și de plată, planul de control al integrării, endpoint-urile proprii ale aplicației pentru șoferi, telemetria clientului, copii moarte fără apelant — iar cele care contează pentru un integrator sunt listate mai jos.
Comenzile care primesc un fișier se supun aceleiași reguli: 33 de comenzi din tabel primesc un document sau o fotografie și toate funcționează din lg, prin HTTP și prin MCP (vedeți Comenzi care primesc fișiere).
Și munca de management este acoperită, în spatele unei chei mai puternice: 62 de comenzi din tabel — membri ai echipei și roluri, setările companiei, conturi bancare, carduri salvate, chei de integrare — necesită o cheie de integrare de nivel manager. O cheie de nivel employee, cea implicită, rulează operațiunile de zi cu zi și este refuzată pentru acestea cu INSUFFICIENT_KEY_LEVEL.
Conturile de afiliat (partener de recomandare) au un catalog propriu: 55 de comenzi în 20 domenii — recomandări, lead-uri, note și sarcini CRM, prezentări de vânzare, câștiguri și plăți, plus comenzile de cont și de echipă pe care le are fiecare rol. Comenzile exclusive afiliaților nu se află în tabelul public de mai jos, care listează cele trei roluri ale panoului; un cont de afiliat le vede în GET /api/common/commands și în lg commands. O companie care este atât afiliat, cât și expeditor, transportator sau comisionar vamal vede ambele seturi.
Un agent ar trebui să înceapă cu lg users get (nume API get_current_user): returnează rolul, nivelul de acces al cheii folosite, permisiunile efective și dacă o aprobare legală în așteptare sau un număr de telefon neverificat blochează în acest moment scrierile — astfel încât agentul să poată anticipa un refuz în loc să-l colecționeze.
Acoperirea este măsurată printr-un raport care compară registrul de comenzi cu endpoint-urile de scriere ale panoului; un endpoint de panou adăugat fără o comandă apare în acest raport ca nedovedit. Dacă găsiți o acțiune din panou pe care nu o puteți atinge printr-o comandă, raportați-o suportului.
1. Cereți linkul — Munca ce trebuie să aibă loc în sesiunea de browser proprie a persoanei nu este o comandă, dar suprafața de comenzi știe de ea. lg handoff-links generate (nume API get_browser_handoff_link) returnează un link logistivo.com pentru scopurile pe care le permite rolul dumneavoastră: package_purchase, payment_cards, legal_documents, integration_keys, affiliate_demo_accounts și account_close. Este gratuit, nu scrie nimic, iar linkul nu poartă niciun secret — persoana se autentifică în mod obișnuit.
2. Predați-l persoanei — Arătați linkul utilizatorului sau trimiteți-l prin propriul dumneavoastră canal. Persoana finalizează pasul acolo: aprobarea contractului și plata 3D Secure pentru un pachet, adăugarea unui card, aprobarea textelor legale în așteptare, emiterea unei chei API al cărei secret este afișat o singură dată sau închiderea propriului cont.
3. Citiți rezultatul cu o comandă — Odată ce pasul este finalizat, rezultatul său este din nou vizibil pentru comenzi: pachetul și soldul de credite, cardul salvat (mascat, doar ultimele patru cifre), cheia nouă în lista de chei. Un agent nu primește niciodată într-un chat un număr de card, o plată sau un consimțământ.
Plăți și 3D Secure — Cumpărarea sau upgrade-ul unui pachet și adăugarea unui card necesită 3D Secure în browser. Comenzile listează pachetele și prețurile, citesc soldul și istoricul acestuia, listează cardurile salvate (mascate), setează cardul implicit și elimină un card; cumpărarea propriu-zisă trece prin linkul de predare.
Consimțământ legal — Aprobarea textelor legale o face persoana, în browser. lg users get vă spune că o aprobare este în așteptare; nicio comandă nu o poate da.
Închiderea contului, autentificarea și parola — Închiderea propriului cont, autentificarea și schimbarea parolei sunt pași de identitate și rămân în browser. lg user-accounts preview arată ce ar însemna închiderea contului, fără a o efectua.
Chei de integrare, webhook-uri și sandbox — Gestionarea lor returnează secrete care trebuie afișate o singură dată, în terminalul dumneavoastră, de aceea sunt comenzi încorporate în lg (lg keys, lg webhooks, lg sandbox) peste propriile endpoint-uri HTTP, nu comenzi de catalog. Catalogul conține doar cele două comenzi de chei fără secrete: integration-keys list și integration-keys revoke.
Chatul asistentului din panoul de control — Cheile de integrare nu pot conduce chatul asistentului AI din panoul de control; pornirea sau continuarea unei rulări cu o cheie răspunde cu 403. Un agent se conectează în schimb prin endpoint-urile de comenzi, lg sau canalul MCP — acolo fiecare comandă rulează la nivelul de acces al cheii, iar scrierile ei sunt înregistrate ca scrieri de integrare.
Aplicația pentru șoferi — Conturile de șofer nu au catalog de comenzi, iar aplicația pentru șoferi își păstrează propriile endpoint-uri. Utilizatorii de birou gestionează șoferii, documentele, cheltuielile și cursele lor prin comenzi.
Instalare și identitate
lg este un script Node într-un singur fișier, fără dependențe (Node 18+), publicat pe npm ca @lgstv/lg. Pachetul instalează două comenzi identice, lg și logistivo — folosiți logistivo dacă lg este deja un alias pe mașina dumneavoastră. Fiind un singur fișier, funcționează și copierea lui lg.mjs pe serverul ERP al unui client. Nu aveți nevoie de client pentru a construi o integrare ERP/CRM — aceleași comenzi sunt disponibile prin HTTP.
1. Instalare — Aveți nevoie doar de Node 18 sau mai nou; nu există alte dependențe. Instalați-l global sau rulați-l fără instalare prin npx.
2. Autentificare cu un cod de aprobare — lg login afișează un cod de aprobare scurt și deschide logistivo.com/connect în browser; prin SSH, în CI sau cu --no-browser doar afișează adresa, pe care o puteți deschide pe orice dispozitiv, inclusiv pe telefon. Autentificați-vă acolo ca de obicei, verificați că codul de pe pagină este același cu cel din terminal, alegeți accesul doar de citire sau de citire și acțiune și aprobați. În terminal nu se tastează nimic secret: nicio parolă, nicio cheie, niciun cod de unică folosință. Sesiunea rămâne apoi autentificată pe acel computer — închiderea terminalului nu vă deconectează, iar lg reînnoiește singur token-ul de acces înainte să expire. lg logout închide sesiunea și pe server, iar o puteți elimina și din panou, la Settings › Integration keys › AI and CLI connections (Setări › Chei de integrare › Conexiuni AI și CLI). lg login --password (e-mail și parolă) rămâne ca variantă de rezervă. Necesită lg 0.11 sau o versiune mai nouă.
3. Pentru servere și CI: o cheie, nu un cod de aprobare — Pe un server sau într-un job de CI nu există nimeni care să aprobe un cod în browser. Emiteți o cheie în panou (Settings › Integration keys, adică Setări › Chei de integrare) sau cu lg keys create — opțional în numele unui membru al echipei dedicat, cu drepturi restrânse — și puneți-o în LOGISTIVO_TOKEN, sau salvați-o cu lg login --api-key. Cât timp variabila este setată, fișierul de configurare nu este citit niciodată. Detalii: secțiunea „Conectarea cu o cheie API”.
4. Verificați și explorați catalogul — lg commands listează fiecare comandă pe care o poate vedea rolul dumneavoastră, grupată pe domenii; lg help afișează verbele acelui domeniu, iar lg help afișează lista completă de parametri ai unei comenzi, cu tipurile lor și cu cei obligatorii. Niciunul dintre aceste texte nu trăiește în client — toate vin din catalog. Rețineți că lista depinde de rolul dumneavoastră: verbele unui domeniu nu sunt aceleași pentru un transportator și pentru un expeditor (loads set-status, de exemplu, există doar în catalogul transportatorului). Dacă lipsește un verb, verificați-vă rolul înainte de a verifica instalarea.
Nu puneți niciodată cheia în sistemul de control al versiunilor, într-un log de CI sau într-o fereastră de chat. Dacă v-ați autentificat cu un cod de aprobare sau cu o cheie de integrare, lg logout închide accesul și pe server; într-o sesiune cu parolă (lg login --password) șterge doar copia LOCALĂ și spune acest lucru explicit. Registrul de audit stochează argumentele dumneavoastră, dar maschează ca *** orice câmp al cărui nume conține token, password, IBAN, card sau OTP, precum și fiecare parametru pe care o comandă îl declară secret.
LOGISTIVO_TOKEN — Token de acces personal. Cât timp este setat, fișierul de configurare nu este citit niciodată — aceasta este calea preferată în CI și pe servere.
LOGISTIVO_BASE_URL — Rădăcina serverului. Implicit https://logistivo.com. Schimbați-o doar dacă indicați spre propriul dumneavoastră mediu; flag-ul --base-url face același lucru pentru o singură comandă.
LOGISTIVO_HOME — Directorul pentru fișierul de configurare și pentru cache-ul catalogului. Implicit ~/.logistivo. Separați-l dacă lucrați cu două conturi pe aceeași mașină.
LOGISTIVO_PROFILE — Profilul cu care se rulează. `lg profile use` este alegerea persistentă; această variabilă este pentru o singură rulare și este cel mai scurt mod de a comuta între un profil live și unul sandbox în CI. Un nume de profil necunoscut nu este ignorat în tăcere — produce o eroare.
NO_COLOR — Când este setată, nu se afișează nicio culoare ANSI (forma permanentă a flag-ului `--no-color`). Activați-o pentru un bridge care scrie într-un fișier de log sau în output-ul CI; secvențele escape de culoare strică instrumentele care citesc ulterior acele loguri.
Ergonomia clientului
Aceste funcționalități ușurează utilizarea de zi cu zi a clientului `lg`. Niciuna nu schimbă contractul HTTP — săriți peste această secțiune dacă vă integrați direct prin HTTP.
Medii și chei multiple — Țineți staging-ul și producția, sau bridge-urile pentru client și pentru transportator, în profiluri separate. Lista de profiluri nu afișează niciodată un token; fiecare rând arată amprenta sha256 a token-ului. Catalogul de comenzi este păstrat în cache per profil, gazdă și token, astfel încât două roluri nu pot vedea niciodată una lista de comenzi a celeilalte.
Sincronizare incrementală: lg sync — Rulează bucla de sincronizare din ghidul practic într-o singură comandă: un watermark per entitate, updated_since cu un cursor, output JSONL și o marjă de siguranță de cinci minute. Folosiți --full pentru prima umplere inițială (backfill). Comanda este doar de citire; nu există flag-ul --write. lg sync --list deduce din catalog entitățile sincronizabile pentru rolul dumneavoastră.
Experiența erorilor și completarea în shell — La 422, clientul numește câmpul respins sub forma flag-ului pe care l-ați tastat, împreună cu error_key stabil și explicația acestuia din catalog. La 409 afișează linia de comandă gata pregătită cu --yes; la 429 așteaptă cât indică Retry-After. Completarea în shell acoperă domeniile, verbele, flag-urile și valorile enum și funcționează offline.
Parametrii secreți nu ajung niciodată în linia de comandă — Câteva comenzi primesc un secret — conectarea integrării contabile Paraşüt, de exemplu, necesită credențialele de client și parola acelui sistem. lg nu acceptă niciodată o astfel de valoare ca flag, pentru că ar ajunge în istoricul shell-ului și în output-ul ps: o cere fără ecou sau o citește din ---file=PATH ori din stdin (---file=-) și o păstrează doar în memorie. O comandă al cărei parametru obligatoriu este secret rulează doar din lg: apelată din chat, prin MCP sau în interiorul lg batch, este refuzată cu SECRET_REQUIRES_CLI. Registrul de audit consemnează întotdeauna valoarea ca ***.
Conectarea cu o cheie API
Un ERP, un CRM, un script sau un agent AI se conectează la Logistivo cu o cheie de integrare emisă în panou sau cu lg keys create. Cheia acționează în numele unui membru real al echipei: rolul acelei persoane decide lista de comenzi, nivelul de acces al cheii decide cât de grea poate fi munca, iar când acea persoană pleacă din echipă, cheia dispare odată cu ea. Nu există un „cont de serviciu” sintetic și nici nu va exista — izolarea multi-tenant este legată de utilizator, iar un bridge fără proprietar este genul care continuă să scrie în tăcere ani de zile.
1. Emiteți o cheie în panou — Settings › Integration keys › New key. Dați-i un nume („Sincronizare nocturnă ERP”), alegeți scope-ul și nivelul de acces și, opțional, scurtați durata de viață. Cheia este afișată o singură dată, doar pe acel ecran; serverul nu o stochează. Dacă o pierdeți, Rotate emite una nouă — cea veche devine imediat invalidă.
2. Conectați-vă din terminal — lg login --api-key validează cheia, afișează identitatea și scope-ul și descarcă catalogul de comenzi. lg whoami întreabă serverul cu ce utilizator, companie, rol și scope rulați. lg logout revocă și cheia pe server, la fel cum închide acolo și o sesiune deschisă cu un cod de aprobare (doar lg logout dintr-o sesiune cu parolă nu poate face asta).
3. Sau HTTP simplu — Cheia este un token de acces transmis în antetul Authorization: Bearer și funcționează direct cu cele trei endpoint-uri de comenzi. Pe un server sau în CI, puneți-o în LOGISTIVO_TOKEN; cât timp această variabilă este setată, fișierul de configurare nu este citit niciodată.
4. Sau gestionați cheile din terminal: lg keys — lg keys este geamănul de terminal al ecranului din panou: aceleași endpoint-uri, aceeași poartă (permisiunea de gestionare a echipei și o cheie de nivel manager atunci când o apelați cu o cheie). create, rotate și transfer returnează o singură dată un token nou: cu --save-profile=NAME acesta ajunge direct într-un profil local și nu este afișat niciodată; altfel, lg îl afișează o singură dată. În modul --json, token-ul este inclus doar dacă adăugați --show-secret, iar un apel --json fără niciunul dintre aceste flag-uri este refuzat înainte ca cererea să fie trimisă, astfel încât token-ul nu poate ajunge pe nesimțite în output-ul unui script. rotate, transfer și revoke cer confirmare (--yes); o cheie este adresată prin numele ei exact sau prin uuid, niciodată prin ghicire. Nivelul de acces se transmite neschimbat unei chei rotite sau transferate.
Scope-ul este aplicat pe întreaga suprafață API, nu doar pe catalogul de comenzi: o cheie doar de citire trece de cererile de citire (GET/HEAD/OPTIONS), iar orice altă cerere de scriere răspunde cu 403 forbidden. Există două excepții deliberate și ambele sunt păzite de o poartă mai fină: endpoint-ul de execuție a comenzilor (decizia vine din flag-ul read_only propriu al comenzii, pentru că și comenzile care nu scriu sunt apelate cu POST) și o cheie care se revocă singură (lg logout, permis și pe o cheie doar de citire). Scope-ul, permisiunile pe domenii și nivelul de acces sunt trei axe independente și toate trebuie trecute: o cheie de citire nu poate scrie nici la nivel manager, o cheie de scriere employee nu poate gestiona echipa, iar o permisiune pe domeniul loads:write nu deschide munca de management. Emiteți cheia în numele membrului cu cele mai puține privilegii care vă acoperă nevoile: rolul decide ce înregistrări puteți vedea în primul rând.
read — Catalogul de comenzi și comenzile care nu scriu (list, search, preview). O comandă de scriere returnează 403 forbidden — înaintea porții de confirmare; o cheie doar de citire nici nu vede vreodată un 409. Alegerea potrivită pentru sincronizarea nocturnă și raportare.
write — Orice comandă. Comenzile care necesită confirmare o cer în continuare cu 409; confirm: true (--yes în CLI) funcționează exact ca înainte. Scope-ul nu relaxează niciodată poarta de confirmare.
employee — Implicit pentru orice cheie nouă. Operațiunile de zi cu zi: încărcături, cereri de transport, oferte, curse, flotă și documente de flotă, documente, contacte — orice comandă care nu necesită permisiune de management, plus permisiunile de flotă. O comandă care necesită mai mult răspunde cu 422, cu error_key INSUFFICIENT_KEY_LEVEL și required_key_level: manager; endpoint-ul REST corespunzător răspunde cu 403 și aceeași cheie. Nivelul potrivit pentru o sincronizare nocturnă ERP, un bridge de telematică sau un script de operațiuni.
manager — Tot ce poate face persoana în numele căreia acționează cheia, inclusiv managementul: membri ai echipei și roluri, setările companiei, chei de integrare, conturi bancare și verificarea lor, carduri salvate, relațiile dintre companii, plăți către afiliați. O cheie manager nu adaugă niciodată un drept pe care persoana nu îl are — fără permisiunea de gestionare a echipei, tot nu poate gestiona echipa. Cheile care existau înainte de introducerea nivelurilor de acces sunt chei manager, așa că se comportă exact ca înainte.
O cheie per integrare — Dacă CRM-ul și ERP-ul partajează o cheie, a tăia accesul unuia înseamnă a-l tăia și pe al celuilalt. Dați fiecărui bridge propria cheie; lista le afișează oricum după nume.
Rotire — Emite un token nou și îl revocă imediat pe cel vechi; durata de viață rămasă se păstrează. Folosiți-o la suspiciunea unei scurgeri și la intervale regulate. Integrarea primește 401 până când este actualizată cu noul token.
Revocare — Cheia este închisă definitiv; acțiunea nu poate fi anulată, emiteți o cheie nouă dacă este nevoie. Dacă membrul în numele căruia acționează cheia este eliminat din echipă sau dezactivat, cheia cade de la sine.
Durată de viață și limită — Valabilitatea implicită este de 180 de zile; o puteți scurta la creare, dar niciodată prelungi. Un utilizator poate deține cel mult 10 chei active. Momentul ultimei utilizări este vizibil în listă; o cheie nefolosită niciodată afișează explicit acest lucru.
Cine gestionează — Emiterea, rotirea, transferul și revocarea sunt deschise managerilor cu permisiunea de gestionare a echipei — aceeași poartă ca la adăugarea sau eliminarea membrilor echipei — iar, când se fac cu o cheie de integrare, acea cheie trebuie să fie de nivel manager. Un manager poate emite o cheie în numele altui membru; pentru un bridge se recomandă un membru dedicat, cu drepturi restrânse.
Primele zece minute: de la panou la primul apel
Cele mai costisitoare minute ale unei integrări sunt primele zece. Cei patru pași de mai jos parcurg acest drum în ordine; aceeași ordine există în panou sub forma unui asistent de configurare (Settings › Integration › Setup wizard), iar asistentul apelează exact endpoint-urile descrise aici. Un dezvoltator fără acces la asistent ajunge în același loc citind această secțiune.
Niciunul dintre cei patru pași nu se încheie cu „l-am trimis”. Dacă cheia funcționează cu adevărat aflați din registrul de cereri; dacă webhook-ul ajunge cu adevărat aflați din registrul de livrări. Ambele sunt deschise în panou și în lg. O configurare care nu este măsurată niciodată este o configurare despre care doar se crede că funcționează.
1. Decideți ce veți face — setați mai întâi scope-ul — Nu se poate decide ulterior ce poate vedea o cheie: alegeți scope-ul atunci când o emiteți. Există două axe. Scope-ul grosier (read / write) răspunde doar la întrebarea „poate scrie”. Scope-ul fin (permisiuni pe domenii: loads:read, invoices:write) spune ce domenii poate atinge, iar din momentul în care este setat, cheia devine fail-closed — fiecare domeniu pe care nu l-ați selectat și fiecare endpoint care nu corespunde niciunui domeniu returnează 403. Lista de domenii din panou nu este o listă scrisă de mână; este derivată din catalogul live de comenzi al rolului dumneavoastră și arată câte comenzi și endpoint-uri REST deschide fiecare domeniu. Catalogul de comenzi și endpoint-urile „cine sunt” (current) și „deconectare” sunt întotdeauna exceptate de la scope: o cheie trebuie să se poată descrie și închide întotdeauna singură. A treia axă este nivelul de acces: employee (implicit) rulează operațiunile de zi cu zi, manager face și muncă de echipă, setări, chei și bani. Alegeți employee, cu excepția cazului în care bridge-ul face muncă de management.
2. Emiteți cheia — token-ul este afișat o singură dată — Settings › Integration › New key. Dați-i un nume („Sincronizare nocturnă ERP”), alegeți utilizatorul în numele căruia rulează și nivelul de acces și, dacă doriți, scurtați durata de viață. Token-ul brut este returnat doar în acel răspuns; serverul nu îl stochează și în panou nu există „afișează din nou”. Dacă îl pierdeți, faceți o rotire pentru a obține unul nou, iar cel vechi încetează instantaneu să funcționeze. Nu puneți niciodată token-ul în sistemul de control al versiunilor, într-un log de CI sau într-o fereastră de chat; puneți-l în depozitul de secrete al sistemului țintă.
3. Faceți primul apel — și vedeți că a sosit CU ADEVĂRAT — Două cereri sunt suficiente. Prima vă dovedește identitatea (este exceptată de la scope și funcționează cu orice cheie): scope-ul este cel așteptat, statusul este activ, se apropie expires_at? A doua citește date reale din domeniul pe care l-ați ales. Dacă trece, identitatea, scope-ul, poarta de e-mail și calea de rețea sunt toate corecte. Dacă nu, nu ghiciți: registrul propriu de cereri al cheii arată, rând cu rând, ce endpoint a fost respins, cu ce cod și cu ce cheie de eroare stabilă (INSUFFICIENT_SCOPE, IP_NOT_ALLOWED, KEY_ACTOR_BLOCKED …). În panou, acel registru este fereastra „Recent requests”; în terminal este lg logs. Asistentul de configurare urmărește exact acest registru și refuză să coloreze pasul în verde până când nu vede un apel reușit real.
4. Configurați webhook-ul — și verificați semnătura înainte de orice — Așteptarea evenimentelor este mai ieftină decât întrebarea în fiecare minut. Înregistrați o adresă https, alegeți evenimentele care vă interesează și legați abonamentul de cheia dumneavoastră: dacă cheia este revocată, livrarea se oprește și ea. Secretul este afișat o singură dată, la creare. Endpoint-ul receptor trebuie să verifice mai întâi semnătura: șirul semnat este "{t}.{corp brut}", iar algoritmul este HMAC-SHA256; timestamp-ul se află ÎN semnătură, așa că respingeți orice cerere mai veche de 300 de secunde, chiar și atunci când semnătura este validă. Comparați în timp constant și nu reserializați niciodată corpul — în momentul în care parsați JSON-ul și îl afișați din nou, semnătura nu se mai potrivește. Din panou, „Send test” declanșează un ping semnat real și puteți urmări livrarea încercare cu încercare.
Sandbox: exersați scrierea fără a atinge producția
Preflight-ul (dry_run) vă spune ce AR face o comandă; dar dacă idempotența chiar reia, dacă webhook-ul chiar este livrat, cum arată ramurile de eroare și de unde provine creditul se poate vedea doar la o scriere REALĂ. La asta folosește sandbox-ul: un tenant separat care oglindește compania dumneavoastră — același cod, același catalog de comenzi — și care nu atinge niciodată registrul live.
Sandbox-ul nu este un flag al cererii, este un TENANT. O companie Logistivo separată, deschisă pentru a dumneavoastră: propriul utilizator, propriul pachet, propriul registru de credite, propriile abonamente webhook. Mediul este DEDUS din compania cheii și nu poate fi furnizat de apelant, așa că, chiar dacă alegeți profilul greșit, cererea se oprește pe server cu 403 ENVIRONMENT_MISMATCH. „Credeam că scriu în sandbox și am scris în producție” este imposibil prin structură.
Suprafața este identică — măsurat: catalogul pe care îl obține o cheie sandbox este același cu cel pe care îl obține cheia live (pe o cheie de expeditor, 448 de comenzi de ambele părți). Un bridge care funcționează în sandbox funcționează și în producție; nimic din ce învățați nu trebuie învățat de două ori.
Sandbox-ul nu se deschide gol: conține date inițiale generate (NU copiate) — contacte, încărcături în ambele direcții și cereri de transport. Numele sunt în mod vădit inventate, iar adresele de e-mail se află în domeniul @sandbox.invalid; niciun rând al vreunui tenant real nu este citit, clonat sau folosit vreodată ca șablon.
În mod deliberat NU există un buton de resetare și nicio înregistrare, niciun fișier și niciun document nu este șters vreodată. Dacă doriți un nou început curat, reînnoirea deschide o generație nouă, iar cea veche rămâne, retrasă. Câteva sute de rânduri de repetiție acumulate nu costă nimic pe lângă o rutină de ștergere legată de tenant-ul greșit.
1. Deschideți sandbox-ul — Un sandbox per companie. Endpoint-ul necesită permisiunea de gestionare a echipei (team.manage), așa că acest pas îl face un administrator din compania dumneavoastră. Dacă sandbox-ul există deja, același endpoint răspunde prin GET cu starea lui: id-ul companiei, creditul rămas, numărul de chei active, abonamentele, istoricul generațiilor și plafoanele.
2. Emiteți o cheie sandbox și păstrați-o ca al doilea profil — Cheia este emisă în numele utilizatorului bridge propriu al sandbox-ului și revine marcată environment: sandbox; token-ul brut apare doar în acel unic răspuns. Pe partea lg, nu vă înlocuiți cheia live — păstrați-le pe AMÂNDOUĂ ca profiluri separate; --sandbox și --live sunt selectoare pentru o singură rulare.
3. Scrieți efectiv — Fără --dry-run aici; scrierea este tocmai scopul. Trimiteți de două ori aceeași cheie de idempotență și urmăriți cum al doilea răspuns revine ca status: replayed — acesta este rezultatul măsurat în sandbox. Apelați intenționat o comandă supusă confirmării fără confirmare și citiți corpul 409; încercați o comandă din afara scope-ului și citiți refuzul. Nimic din toate acestea nu lasă urme în registrul live: soldul live rămâne neschimbat pe parcursul aceleiași rulări.
4. Citiți lista de verificare înainte de go-live — Endpoint-ul go-live răspunde pe baza a ceea ce ați făcut EFECTIV în sandbox: ați scris, ați văzut ramurile de eroare, a fost livrat un webhook, ați mutat receptorul de pe adresa de repetiție, ați pus o dată de expirare pe cheie. Fiecare element revine ca pass / todo / unknown. Același răspuns conține și o PROPUNERE DE SCOPE derivată din comenzile pe care le-ați apelat efectiv — folosiți-o pentru a emite cheia live nu mai largă decât aveți nevoie.
Credit și facturare — Sandbox-ul are propriul registru de credite, iar soldul live nu se modifică. Aceasta este o structură, nu o verificare: creditul este contabilizat per companie, iar sandbox-ul este o companie separată. Se deschide pe nivelul gratuit, nu are metodă de plată și se află în afara ferestrei lunare de încasare — nu poate ajunge la o factură pe nicio cale.
Marketplace — O cerere de transport deschisă în sandbox NU apare pe ecranele transportatorilor reali și NU ajunge în căsuța lor de e-mail sau de notificări push; nici dumneavoastră nu vedeți cereri reale. Separarea este simetrică și aplicată în două interogări distincte: cui îi este VIZIBILĂ o cerere și cui îi este TRIMISĂ sunt întrebări diferite.
Webhook-uri — Și abonamentele poartă marcajul de mediu. Un eveniment din sandbox nu este livrat niciodată unui abonament live, iar un eveniment live nu ajunge niciodată la unul din sandbox; pentru un abonament al cărui marcaj a deviat, nu se deschide nicio livrare. Deoarece plafonul de abonamente este per companie, abonamentele de repetiție nu vă consumă din cota live.
Date inițiale — Înregistrările de exemplu din sandbox sunt GENERATE, niciodată copiate de la tenanți reali. Popularea este idempotentă: un al doilea apel nu așază un al doilea set de date inițiale peste propriile dumneavoastră înregistrări.
Același catalog — Rolul dumneavoastră rămâne același și în sandbox, iar lista de comenzi este identică — măsurat, 448 de comenzi de ambele părți. Sandbox-ul nu este un demo redus; este un geamăn al companiei dumneavoastră.
Limita de astăzi: abonamentele webhook nu pot fi gestionate cu o cheie sandbox — Endpoint-urile de abonament necesită permisiunea de gestionare a echipei (team.manage), iar utilizatorul bridge al sandbox-ului nu are niciun rol în echipă, așa că `lg --sandbox webhooks …` răspunde astăzi cu 403. Întreaga suprafață de comenzi funcționează — restricția privește doar registrul de abonamente. Dacă doriți să repetați webhook-urile în sandbox, contactați suportul; acest gol este măsurat și înregistrat ca problemă deschisă.
GET /api/common/integration-sandbox — Starea: dacă există, ce companie, creditul rămas, numărul de chei active și de abonamente, istoricul generațiilor, plafoanele și un ghid de declanșare care arată ce comandă generează ce eveniment.
POST /api/common/integration-sandbox — Deschide sandbox-ul (unul per companie, idempotent). Necesită permisiunea team.manage.
POST /api/common/integration-sandbox/keys — 201 + cheia și token-ul brut (doar aici, o singură dată). Marcajul environment: sandbox este derivat din companie; apelantul nu îl poate furniza.
GET /api/common/integration-sandbox/go-live — Lista de verificare go-live și o propunere de scope — calculate din traficul dumneavoastră real în sandbox.
POST /api/common/integration-sandbox/renew — Deschide o GENERAȚIE nouă de sandbox și o retrage pe cea anterioară.
Modelul de comandă
Există o singură gramatică și nu are excepții. Pentru a ști cum să apelați o comandă, tot ce vă trebuie este ce spune catalogul despre ea.
lg loads list --status=in_transport --limit=20 --json
Numele flag-urilor sunt numele parametrilor din schemă, iar lg acceptă ambele grafii: --load_code și --load-code ajung în același câmp (lg help afișează forma kebab-case). Văzând un flag, știți deci în ce câmp JSON ajunge, iar trecerea de la CLI la HTTP nu necesită nicio traducere de nume. Un parametru boolean scris fără valoare este true (--only_open); opusul este --no-only_open. Scrieți un argument a cărui valoare începe cu o liniuță sub forma --flag=value, altfel un flag uitat înghite în tăcere următorul argument ca valoare. Pe o comandă care primește un fișier, puneți @ în fața unei căi locale (--attachment_uuid=@./cmr.pdf) — vedeți Comenzi care primesc fișiere.
lg — Clientul.
loads — Domeniul — entitatea asupra căreia lucrați, la plural.
list — Verbul — ce faceți cu acea entitate, ales dintr-un vocabular închis care crește doar prin decizie deliberată: verbe simple (list, get, create, update, delete, search, preview, generate, extract …) și verbe compuse care numesc ce se atașează sau ce se schimbă (add-document, set-status, assign-driver). lg help listează verbele unui domeniu.
--status=in_transport — Un parametru — numele lui este exact numele parametrului din JSON Schema, iar valoarea trebuie să corespundă tipului din schemă. O valoare invalidă pe un câmp enum nu ajunge niciodată la server.
--limit=20 — Numărul de rânduri la comenzile de listare. Plafonul este indicat în descrierea parametrului fiecărei comenzi — de regulă 20 la un apel simplu de listare și până la 100 în modul de sincronizare (cu cursor sau updated_since).
--json — Output JSON brut.
--json — Afișează JSON brut. Aceasta este singura formă corectă pentru scripturi: tabelul aliniat implicit este pentru oameni, își alege coloanele din date și își poate schimba aspectul fără preaviz. Nu scrieți niciodată un script care parsează output-ul tabelar.
--yes, -y — Trece de poarta de confirmare (confirm: true prin HTTP). Folosiți-l doar într-un script care știe ce urmează să facă; pe o comandă ireversibilă, acest flag este o prescurtare pentru „nu există cale de întoarcere”.
--idempotency-key= — Face sigură reîncercarea unei comenzi de scriere. Un al doilea apel cu aceeași cheie nu rulează din nou comanda; returnează primul rezultat. Dacă construiți o buclă de reîncercare, generați cheia DUMNEAVOASTRĂ și trimiteți-o pe aceeași la fiecare încercare.
--dry-run — Rulează un preflight în locul comenzii: validarea, porțile și calculul creditelor rulează, nu se scrie nimic (vedeți secțiunea despre preflight). Valabil pentru orice comandă și pentru lg batch.
--refresh — Forțează reîmprospătarea catalogului. lg păstrează catalogul în cache timp de o oră; dacă știți că o comandă tocmai a fost adăugată pe server, folosiți acest flag în loc să așteptați.
--help, -h — Afișează descrierea comenzii din catalog, fiecare parametru, tipul lui, valorile enum și dacă este obligatoriu. În client nu există niciun fișier de ajutor.
--profile=, --sandbox, --live — Profilul cu care se rulează acest singur apel. --sandbox și --live aleg profilul care deține o cheie sandbox, respectiv una live; mediul este dedus din cheie pe server, așa că o nepotrivire se oprește cu 403 ENVIRONMENT_MISMATCH în loc să scrie în locul greșit.
--base-url, --timeout, --verbose, --no-color, --version — În ordine: direcționează o comandă spre alt server, un timeout în secunde, detaliile cererii/răspunsului, dezactivează culoarea ANSI și versiunea clientului.
Exemple reale
Fiecare comandă de mai jos există astăzi în catalog; niciun nume și niciun parametru de aici nu este inventat. Output-urile sunt prescurtate. Output-urile arată nivelul `data.result`; prin HTTP, același obiect sosește în interiorul plicului `{success, data:{…}}` (vedeți Command API prin HTTP).
Încărcături aflate acum pe drum — lg loads list --status=in_transport --limit=20
O încărcătură completă, JSON brut — lg loads get --load_code=FSK2158 --json
Semnalări deschise de consistență a documentelor — lg loads list-problems --only_open=true --limit=10
Rezolvați țara — lg countries search --query=Germany --json
Filtrați cu id-ul rezolvat — lg loads list --receiving_country_id=57 --date_from=2026-09-01 --limit=20
Găsiți un cod HS pornind de la numele unui produs — lg tariffs search --query="aluminium profile"
Avansați o încărcătură (doar rolul de transportator) — lg loads set-status --load_code=FSK2158 --status=transit --date=2026-08-21 --yes
Ciornă — lg export-documents create --doc_type=proforma-invoice --currency_code=EUR --json
Generați documentul (cu confirmare) — lg export-documents generate --document_id=8412 --yes
Fără client: Command API prin HTTP
lg este o comoditate, nu ușa de intrare. Atât catalogul, cât și execuția trec prin trei endpoint-uri HTTP (fișierele au un al patrulea, endpoint-ul de încărcare — vedeți Comenzi care primesc fișiere); o integrare ERP sau CRM se conectează direct aici. Identitatea este un token de acces personal transmis în Authorization: Bearer. FIECARE răspuns vine în același plic: `{ "success": bool, "data": { … }, "code": "…", "message": { … } }`. Întregul contract se află în `data` — `contract_version`, `command`, `status` și, ca output al comenzii, `result`; la eșec `error_code`, `error_key` și `error`. Exemplele de răspuns de pe această pagină arată obiectul `data` în locul plicului, pentru a economisi spațiu; nu uitați să despachetați `data` în propriul cod. `lg --json` afișează și el ÎNTREGUL plic, de aceea căile jq încep cu `.data.result…`. Singura excepție este `/api/public/status`: acest endpoint nu are plic, astfel încât scripturile de supraveghere pot trimite alerte fără să-l parseze.
Cererea de confirmare prin 200 + ok:false este interzisă și nu se va întâmpla niciodată. Motivul este simplu: clienții tratează 200 drept succes, așa că o cerere de confirmare returnată ca 200 ar opri fluxul în tăcere și nimeni nu ar observa. Confirmarea este întotdeauna 409.
GET /api/common/commands — Întregul catalog pe care îl poate vedea rolul dumneavoastră: contract_version; pentru fiecare comandă name, domain, verb, descrierea, JSON Schema, read_only, confirmation_needed, irreversible, credit_cost, since, deprecated_at, replaced_by, aliases și câmpurile de acces key_level, permission, file_params, secret_parameters și cli_only; la nivelul superior dicționarul error_keys, rate_limits, idempotency_ttl_hours, rolurile de catalog ale dumneavoastră, contractul attachments (încărcare) și nivelul de acces al cheii cu care apelați. Trimite un ETag; If-None-Match răspunde cu 304. ?domain= se potrivește și cu un domeniu vechi (alias). Construiți-vă clientul pe baza acestuia; nu scrieți în cod o listă fixă de comenzi.
GET /api/common/commands/{name} — O singură comandă, complet. name este numele înghețat al comenzii din catalog (list_loads), nu identitatea CLI. O comandă depreciată răspunde cu un antet X-Deprecated.
POST /api/common/commands/{name} — Execuția. Corp: { args, confirm?, idempotency_key? }. Statusul HTTP al răspunsului este chiar rezultatul — orice altceva decât 200 este informație, nu zgomot. Erorile poartă error_code (transport) și, pentru respingerile de business, error_key.
Comenzi care primesc fișiere
33 de comenzi din tabel primesc un document sau o fotografie: atașarea unui CMR la o încărcătură, citirea codurilor HS dintr-o factură, crearea unui vehicul din certificatul său de înmatriculare, estimarea unui palet din fotografii, încărcarea unui document al companiei, verificarea încrucișată a unei facturi cu o listă de colisaj. În browser trageți fișierul într-un formular; oriunde altundeva sunt necesari doi pași — încărcați fișierul, apoi transmiteți id-ul lui comenzii.
Un parametru primește un fișier atunci când numele lui se termină în attachment_uuid sau attachment_uuids — photos[].attachment_uuid în interiorul unei liste, front_attachment_uuid pe un cec. Nu trebuie să rețineți asta: fiecare rând din catalog poartă file_params cu căile exacte, schema marchează acele câmpuri (format: uuid, x-logistivo-file: true), iar răspunsul catalogului conține un bloc attachments cu adresa de încărcare, tipurile acceptate, limitele de dimensiune și durata de valabilitate. lg help le afișează și el.
Încărcarea este o scriere, așa că o cheie cu scope de citire nu poate încărca; orice cheie cu scope de scriere poate, la oricare nivel de acces. Încărcările aparțin utilizatorului, nu cheii: două chei ale aceluiași utilizator văd aceleași încărcări și nimeni nu le poate folosi pe ale altcuiva. Un id necunoscut, expirat sau care nu vă aparține pur și simplu nu este găsit, iar motivul nu este dezvăluit.
Atașamentele din chatul panoului de control și încărcările pentru comenzi sunt spații separate: un fișier atașat în chatul asistentului nu poate fi transmis unei comenzi prin id, iar o încărcare pentru comenzi nu apare niciodată într-un fir de chat.
O încărcare nu este o comandă și nu are de una singură niciun efect de business: datelor dumneavoastră nu li se întâmplă nimic până când o comandă nu folosește id-ul. Tot de aceea încărcarea nu cere niciodată confirmare — comanda care consumă fișierul poartă poarta.
1. lg: puneți @ în fața unei căi locale — lg încarcă mai întâi fișierul, apoi rulează comanda cu id-ul returnat; o valoare fără @ este id-ul unui fișier pe care l-ați încărcat anterior. Listele primesc căi separate prin virgulă sau un flag repetat, câmpurile imbricate primesc JSON, iar --file este o scurtătură atunci când comanda are exact un câmp de fișier de nivel superior. lg verifică local fiecare fișier (existență, dimensiune, tip) înainte de a trimite ceva, iar lg batch încarcă o singură dată fiecare fișier distinct înainte de rularea lotului.
2. HTTP: încărcați, apoi transmiteți attachment_uuid — Trimiteți fișierul ca multipart/form-data într-un câmp numit file. O încărcare nouă răspunde cu 201; același fișier încărcat din nou de același utilizator răspunde cu 200, cu statusul replayed și același id, și nu se scrie nimic. Ca peste tot pe această pagină, exemplul arată obiectul data din interiorul plicului.
3. MCP: instrumentul upload_attachment — Un client MCP nu poate trimite multipart, așa că acest canal oferă un instrument suplimentar care nu se află în catalog: upload_attachment primește un nume de fișier și conținutul în base64 și returnează același attachment_uuid. Apelează același serviciu ca încărcarea prin HTTP, după aceleași reguli.
Tipul provine din conținut — Numele fișierului și tipul declarat sunt ignorate; extensia stocată este cea detectată. Acceptate la încărcare: jpg, jpeg, png, webp, heic, heif, pdf, xlsx, xls, csv, txt, doc, docx, xml, zip. Fiecare comandă aplică apoi propria listă, mai restrânsă, înainte de a rula ceva și răspunde cu UNSUPPORTED_FILE_TYPE împreună cu tipurile acceptate, sau cu FILE_TOO_LARGE.
Dimensiune — Imagini de până la 10 MB, alte fișiere de până la 15 MB.
Durată de valabilitate — O încărcare poate fi folosită 24 de ore. După aceea nu mai este rezolvată (ATTACHMENT_NOT_FOUND) — nu este ștearsă. Încărcați din nou dacă o comandă eșuează din acest motiv.
Același fișier, același id — Încărcarea din nou a aceluiași fișier (același nume, aceeași dimensiune și același conținut) returnează id-ul existent în loc să scrie unul nou, atâta timp cât mai are cel puțin o oră de valabilitate, și nu consumă din plafonul zilnic.
Plafoane zilnice — 300 de încărcări per utilizator pe zi (TOO_MANY_FILES) și 2 GB per companie pe zi (DAILY_LIMIT_REACHED); ambele răspund cu 429 și retry_after.
POST /api/common/commands:upload — Încărcare multipart în câmpul file. 201 pentru o încărcare nouă, 200 cu statusul replayed pentru același fișier. Returnează data.attachment: attachment_uuid, filename, mime_type, size_bytes, sha256, extraction_status, expires_at și reused.
Poarta de confirmare și comenzile ireversibile
Fiecare comandă din catalog poartă două flag-uri: confirmation_needed (necesită aprobare explicită înainte de rulare) și irreversible (efectul ei poate fi anulat sau nu). Sunt întrebări separate și ambele sunt aplicate pe server, nu lăsate la bunele maniere ale clientului.
Poarta ține de responsabilitate, nu de regulile de business. Plasarea unei oferte este primul pas spre un contract de transport; emiterea unei facturi creează o înregistrare contabilă; o mișcare de stoc modifică un registru. Niciuna dintre acestea nu ar trebui să fie vreodată ceva ce puteți rula de două ori din greșeală.
Poarta se citește din comanda EFECTIVĂ. Când o comandă o înglobează pe alta — așa cum face executorul generic din chat — poarta provine din flag-urile comenzii care va rula efectiv, nu din cea care o înglobează. Cu un flag fix, unul dintre două eșecuri ar fi inevitabil: fie comanda de facturare ar rula neconfirmată, fie fiecare căutare de țară ar afișa un card de confirmare.
read_only și fără poartă de confirmare nu sunt același lucru. Există trei stări distincte: invoices preview nu e supusă confirmării și nu scrie nimic; loads create e supusă confirmării și scrie; invoices create nu e supusă confirmării, dar scrie — ia naștere o ciornă. Un singur test lămurește: când comanda se întoarce, s-a schimbat vreun rând în baza de date?
Unele acțiuni nu se află în spatele acestei porți pentru că nu sunt deloc comenzi: cumpărarea unui pachet, adăugarea unui card cu 3D Secure, aprobarea textelor legale și închiderea unui cont au loc în browserul propriu al persoanei. Pentru acestea, lg handoff-links generate returnează un link logistivo.com — gratuit, fără să scrie nimic, fără să poarte vreun secret — iar persoana finalizează pasul acolo. Niciun flag, oricum ar fi setat, nu transformă o plată sau un consimțământ într-un apel API.
Tehnic, este posibil ca o integrare să treacă automat de poartă la fiecare apel, dar nu este recomandabil. Modelul corect este să automatizați poarta doar pentru comenzile despre care știți că sunt reversibile și să direcționați comenzile ireversibile spre coada unui om.
1. Apelați — Apelați comanda supusă confirmării fără confirm. Nu se schimbă nimic.
2. Citiți rezumatul — Primiți un 409; confirmation.summary din corp este o propoziție scrisă pentru un om („Urmează emiterea unei facturi: X Ltd, 1.200,00 TRY”), nu o descărcare de argumente brute. Comenzile monetare poartă și o previzualizare structurată: linii, totaluri, avertismente.
3. Confirmați — Repetați același apel cu confirm: true (--yes în CLI). Comenzile ireversibile sunt marcate astfel încât să ruleze cel mult o dată.
Preflight: vedeți ce ar face o comandă de scriere, fără să o rulați
Cel mai costisitor pas în conectarea unui bridge ERP este să aflați dacă un corp de cerere este corect rulând EFECTIV comanda: o ciornă de factură în registrul live, un credit consumat, curățenie manuală. dry_run pune capăt acestui lucru — adăugați un singur câmp la cerere, comanda nu rulează, iar dumneavoastră citiți ce s-ar întâmpla.
Registrul conține astăzi 519 de comenzi; 233 dintre ele doar citesc și nu scriu nimic. Dintre cele 286 de comenzi de scriere rămase, 251 sunt supuse confirmării: apelate fără confirm, ele răspund deja cu 409 și descriu ce ar face. Golul era la celelalte 35 — ciorne de factură, ciorne de documente de export, linii de articole: exact lanțul pe care un bridge îl conectează primul. Pentru acestea, a apela însemna a executa.
Exista un al doilea gol chiar și la comenzile supuse confirmării: validarea schemei rulează DUPĂ poartă. Astfel, un apel cu un argument lipsă primea mai întâi cardul de confirmare, îl confirma și abia apoi afla „acest câmp lipsește”. Un preflight răspunde la ambele într-un singur dus-întors.
Iar cel mai frecvent — și cel mai târziu descoperit — bug de bridge este acesta: trimiteți un câmp care nu se află în schemă (customer_id acolo unde se așteaptă recipient_contact_id), serverul îl elimină în tăcere, comanda returnează 200, iar înregistrarea ajunge în locul greșit. Răspunsul preflight listează aceste câmpuri după nume sub arguments.ignored; niciun mesaj de eroare nu o va face vreodată.
Un preflight nu scrie nimic, iar acest lucru ține de structură înainte de a fi o măsurătoare: calea de preflight nu intră niciodată în handler-ul comenzii, deci regula este valabilă pentru orice comandă, inclusiv pentru cele adăugate ulterior. A fost și măsurat la lansare: fiecare instrucțiune SQL emisă în timpul preflight-ului tuturor comenzilor de scriere existente atunci în catalog (două seturi de argumente, două roluri, 178 de preflight-uri) a fost capturată. Niciun INSERT/UPDATE/DELETE, niciun job pus în coadă, niciun e-mail; numărul de rânduri din 31 de tabele și soldul de credit au rămas neschimbate.
Codul de ieșire este același pe care l-ar produce apelul real — comanda ar rula: 0, poarta de confirmare 4, conflict de idempotență 2, orice altceva 1 — așa că „lg … --dry-run || exit” este o poartă cu sens într-un pas de CI.
1. Apelați cu dry_run — Adăugați "dry_run": true în corpul cererii. Validarea, poarta de rol și de scope, rezolvarea țintelor și calculul creditelor rulează toate; comanda nu.
2. Citiți would_execute — Acesta este singurul flag după care să ramificați. Când este false, would_stop.at numește locul în care s-ar opri un apel real: idempotency, target_precheck, confirmation_gate sau arguments.
3. Corectați corpul cererii — arguments.ignored numește câmpurile care ar fi eliminate în tăcere, missing_required pe cele obligatorii pe care le-ați omis, iar would_charge câte credite s-ar consuma și dacă soldul le acoperă.
4. Renunțați la dry_run — Repetați până când would_execute este true, apoi eliminați flag-ul și faceți apelul real. Cheia de idempotență trimisă în timpul preflight-ului nu a fost consumată, așa că apelul real rulează normal.
HTTP este întotdeauna 200 — „Comanda ar eșua” nu sosește niciodată ca 4xx — preflight-ul în sine a reușit, iar predicția se află în corp. Excepția este un refuz la nivel de transport, iar acolo se comportă exact ca un apel real: 404 comandă necunoscută, 403 rol/scope, 429 limită de rată.
O cheie cu scope de citire nu poate face dry-run pe o comandă de scriere — Primește 403. Un preflight răspunde la întrebarea „ce se întâmplă dacă apelez asta CU ACEASTĂ CHEIE, acum”; a da undă verde unei chei de citire și apoi un 403 la apelul real ar fi exact surpriza pe care preflight-ul există să o prevină.
Cheia de idempotență nu este consumată — O cheie trimisă în timpul unui preflight nu deschide niciun rând în registru, iar un blocaj expirat nu este eliberat. Așadar, trimiteți cheia pe care intenționați să o folosiți de fapt: preflight-ul vă spune dacă este încă liberă, dacă ar relua o rulare anterioară sau dacă intră în conflict cu altă comandă.
Se combină cu confirm — Trimiteți dry_run și confirm împreună, iar întrebarea devine „dacă confirm, ce se întâmplă?”. Tot nu rulează nimic.
Preflight-ul pentru batch este per lot — commands:batch acceptă și el dry_run, dar flag-ul aparține lotului, nu unui element (trimiterea lui pe un element înseamnă 422). Primiți un raport per element plus costul total în credite al lotului; un sold insuficient este raportat, nu refuzat.
Nu este gratuit — Fiecare preflight rulează interogări reale (previzualizare, sold) și se contorizează în limita de rată. Nu faceți preflight pe întregul catalog la fiecare deploy; faceți preflight pe comenzile pe care le-ați modificat.
Idempotență: de ce reîncercarea nu creează duplicate
Un ERP nu vă citește mesajul de eroare, nu vă vede ecranul și va retrimite aceeași cerere după un timeout. Această secțiune există exact pentru acest comportament.
Un apel care poartă un idempotency_key (cheie de idempotență) rulează cel mult o dată. Al doilea apel nu reexecută comanda; returnează rezultatul înregistrat cu statusul replayed. Când rețeaua cade, când o cerere expiră sau când o coadă preia același job de două ori, primiți primul rezultat în locul unei facturi duplicate.
Folosiți o cheie la fiecare comandă de scriere. Câmpul read_only din catalog vă oferă gratuit această distincție: fiecare comandă cu read_only: false merită o cheie de idempotență.
Strategia de reîncercare ar trebui să folosească backoff exponențial și să poarte ACEEAȘI cheie la fiecare încercare. A genera o cheie nouă la fiecare încercare este totuna cu a nu folosi deloc idempotența. Nu trimiteți aceeași cheie în paralel: execuția cel mult o dată este garantată pentru reîncercări secvențiale, nu pentru două cereri care se întrec una cu cealaltă.
Capcana 1 — și eșecul este blocat — Dacă prima execuție a fost respinsă de o regulă de business (failed), un al doilea apel cu aceeași cheie returnează aceeași eroare și același error_key și nu reîncearcă. Corectarea argumentului și o nouă încercare necesită o cheie NOUĂ. O cheie reprezintă o încercare, nu o intenție.
Capcana 2 — un rezultat mare se reia fără corp — Registrul stochează un rezultat doar dacă are sub 64 KB. Un rezultat mai mare se reia cu statusul replayed, dar cu un corp gol. Integrarea dumneavoastră ar trebui să se bazeze pe semnalul „replayed”, nu pe corp, și să preia datele cu comanda get corespunzătoare.
Capcana 3 — o cheie aparține unei singure comenzi — Trimiterea aceleiași chei cu o altă comandă returnează 409 idempotency_conflict cu conflicting_command; nu rulează nimic și nu se reia nimic. Un client care partajează o cheie între două verbe este defect și află acest lucru dintr-o eroare, nu dintr-o reluare tăcută.
Capcana 4 — blocajul durează 24 de ore, nu pentru totdeauna — După 24 de ore, aceeași cheie înseamnă o execuție nouă. Reîncercările de rețea sosesc în câteva minute; numerele de document recurente anual ale unui ERP nu trebuie să rămână „replayed” pentru totdeauna. Catalogul publică fereastra ca idempotency_ttl_hours.
Capcana 5 — o eroare de server nu blochează cheia — Un 5xx server_error nu este o respingere de business: cheia nu este legată, așa că o reîncercare cu aceeași cheie rulează cu adevărat comanda. Doar failed blochează (capcana 1).
Domeniu și format — compania dumneavoastră, orice șir, de preferat un UUID — Unicitatea este impusă pe (compania dumneavoastră, cheie): INV-1001 al altui tenant nu se ciocnește niciodată cu al dumneavoastră și nu vă poate relua niciodată rezultatul. Folosiți un UUID simplu sau o compunere unică prin construcție, cum ar fi {ERP-document-no}:{verb}.
Sincronizare incrementală și paginare
Un bridge ERP/CRM ar trebui să preia ce s-a schimbat, nu totul în fiecare oră. Fiecare comandă de listare — loads list, demands list-own, contacts list, invoices list, teammates list, load-groups list, reservations list, drivers list, tenders list, products search, warehouses search — acceptă doi parametri comuni și returnează un câmp comun.
De ce nu există offset: pe un tabel live, un offset alunecă. Un rând inserat între două pagini vă face să săriți peste o înregistrare sau să o numărați de două ori, în tăcere. Cursorul merge doar înainte, așa că o înregistrare inserată sau actualizată în timpul parcurgerii ajunge la sfârșitul listei: nu se pierde nimic, nu se dublează nimic.
O încărcare inițială completă folosește același mecanism: porniți cu updated_since=1970-01-01T00:00:00Z și urmați next_cursor până când este null. Nu există un endpoint separat de „export”, pentru că nu este nevoie de unul.
Același lucru cu lg: lg loads list --updated_since=2026-09-01T00:00:00Z --limit=100 --json, apoi lg loads list --cursor= --json.
Pentru următoarea sincronizare, setați updated_since la cel mai mare updated_at pe care l-ați văzut. Timestamp-urile au precizie de o secundă, așa că o înregistrare aflată la limită poate sosi de două ori — inofensiv, atâta timp cât pe partea dumneavoastră faceți upsert după external_ref sau după cod. Fără updated_since sau cursor, o comandă rulează în modul chat: ordonare pentru oameni, cel mult 20 de rânduri, next_cursor null și truncated care spune „mai există”. Nu folosiți acest mod pentru sincronizare.
Cheile de eroare lizibile automat pentru această secțiune: INVALID_CURSOR, INVALID_UPDATED_SINCE, DUPLICATE_EXTERNAL_REF, EXTERNAL_REF_TOO_LONG, EXTERNAL_REF_INVALID. Toate răspund cu HTTP 422, cu error_code: "failed" și result.error_key în corp. Ramificați după cheie, niciodată după text.
updated_since — Timestamp ISO-8601 (se recomandă UTC, de ex. 2026-09-01T00:00:00Z). Rândurile actualizate la acest moment sau după el. Trece comanda în modul de sincronizare: ordine fixă (updated_at, id) crescătoare, limit plafonat la 100.
cursor — next_cursor din răspunsul anterior, întocmai. Este opac și semnat: nu construiți și nu editați niciodată unul, nu refolosiți niciodată cursorul altei companii sau al altei comenzi; toate acestea sunt respinse cu INVALID_CURSOR.
limit — Dimensiunea paginii. 1-100 în modul de sincronizare (implicit 10).
next_cursor (răspuns) — Cursorul pentru pagina următoare. null înseamnă că lista este completă; este singurul răspuns corect la întrebarea „mai există ceva”.
total (răspuns) — Rândurile care corespund filtrelor, independent de pagină — pentru raportarea progresului.
Propria dumneavoastră cheie: external_ref
Nu faceți din id-urile noastre auto-increment (invoice_id, contact_id) cheia de business din ERP-ul dumneavoastră; ele sunt opace și private pentru compania dumneavoastră. Încărcăturile, cererile de transport, contactele, facturile, produsele și depozitele poartă în schimb cheia dumneavoastră.
Setați-o la scriere — loads create, demands create, contacts create și contacts update, invoices create acceptă un external_ref opțional (maximum 120 de caractere) și îl returnează neschimbat.
Folosiți-o la citire — loads get --external_ref=ORD-2026-0917, invoices get --external_ref=..., contacts get --external_ref=..., demands get --external_ref=... funcționează toate; la comenzile de listare și de căutare, --external_ref= este un filtru de potrivire exactă.
Unică per companie — O a doua înregistrare cu aceeași cheie este refuzată cu 422 și result.error_key = DUPLICATE_EXTERNAL_REF; cheia altei companii vă răspunde „nu a fost găsit”. Potrivirea nu ține cont de majuscule (ord-1 = ORD-1). O înregistrare arhivată își păstrează cheia; restaurați-o înainte de a refolosi cheia.
Trimiteți și un idempotency_key — O reîncercare după un timeout de rețea returnează primul rezultat în loc să creeze un duplicat. Cele două nu sunt interschimbabile: external_ref este cheia dumneavoastră de business, idempotency_key identifică o încercare.
Webhook-uri de ieșire: vă trimitem un POST când se întâmplă ceva
Tot ce a fost până aici era pull: dumneavoastră întrebați, noi răspundem. Un bridge ERP trebuia să întrebe o dată pe minut ca să afle că o încărcătură și-a schimbat statusul, că a fost emisă o factură sau că a sosit o ofertă. Nu mai este cazul: înregistrați o adresă https, alegeți evenimentele care vă interesează, iar un POST semnat sosește atunci când acestea au loc.
Push-ul a fost adăugat LÂNGĂ pull, nu în locul lui. Sincronizarea incrementală (updated_since + cursor) rămâne neatinsă și este în continuare instrumentul potrivit: prima încărcare completă, completarea istoricului și răspunsul la întrebarea „am ratat ceva” țin toate de ea. Webhook-urile reduc latența de la minute la secunde. Un bridge sănătos le folosește pe amândouă — webhook-ul ca declanșator, sincronizarea ca plasă de siguranță.
Payload-ul este un SEMNAL, nu o copie a înregistrării. Poartă identificatorii (id, propriul dumneavoastră external_ref, statusul, momentul); detaliile le preluați cu propria cheie prin GET, iar acel apel trece deja prin propriile dumneavoastră porți de autorizare. Suprafața de expunere rămâne astfel la nivel de identificator. Două câmpuri lipsesc în mod deliberat: identitatea companiei care a plasat o ofertă (ofertele oarbe apar sub un alias în panou; a pune identitatea într-un webhook ar străpunge această confidențialitate printr-un al doilea canal) și datele de contact ale rezervării (nu este nevoie să mutăm date personale printr-un canal suplimentar).
Numele evenimentelor sunt ÎNGHEȚATE. Dacă sensul unui nume se schimbă, se deschide un nume nou, iar cel vechi trăiește pe durata unei ferestre de depreciere. Adăugarea unui câmp nou în payload NU crește versiunea contractului — un consumator trebuie să ignore câmpurile pe care nu le cunoaște.
GET /api/common/integration-webhooks — Registrul plus catalogul de evenimente, limitele și numele antetelor. Fiecare rând poartă motivul dezactivării și un rezumat al livrărilor pe 7 zile.
POST /api/common/integration-webhooks — 201 + { webhook, secret, shown_once: true }. Secretul apare doar aici.
PATCH /api/common/integration-webhooks/{uuid} — Nume / adresă / evenimente / flag de activare. NU atinge secretul.
DELETE /api/common/integration-webhooks/{uuid} — Îl elimină: rândul este șters logic (soft delete; istoricul rămâne interogabil), iar livrările în așteptare sunt anulate.
POST /api/common/integration-webhooks/{uuid}/rotate-secret — 201 + un secret nou. Valoarea veche nu mai funcționează din acel moment.
POST /api/common/integration-webhooks/{uuid}/test — Un eveniment ping — semnătură reală, cale reală, program real de reîncercări.
GET /api/common/integration-webhooks/{uuid}/deliveries — Cele mai recente livrări: status, numărul încercării, codul HTTP, durata, eticheta de eroare.
POST /api/common/integration-webhooks/deliveries/{uuid}/replay — Retrimite o singură livrare: event_id se PĂSTREAZĂ, id-ul livrării este nou, payload-ul este copiat întocmai.
Catalogul de evenimente
Fiecare dintre cele 13 evenimente de mai jos este susținut de o clasă de eveniment care este emisă EFECTIV. În catalog nu există nume de tip „ar fi frumos”: un eveniment anunțat, dar niciodată declanșat, este un eveniment pe care integratorul îl așteaptă la nesfârșit, iar acest eșec este tăcut. Nici acest tabel nu este scris de mână — este construit din catalogul live la fiecare încărcare a paginii.
invoice.payment_recorded LIPSEȘTE în mod deliberat: această clasă de eveniment există în cod, dar nu este emisă de nicăieri. Evenimentul de plată va fi adăugat în ziua în care clasa este declanșată cu adevărat — nu mai devreme. A anunța prematur un eveniment este mai rău decât a nu-l adăuga niciodată.
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)
Verificarea semnăturii
Fiecare cerere poartă un antet X-Logistivo-Signature: t=,v1=. Șirul semnat este ".", iar algoritmul este HMAC-SHA256. Prefixul v1 păstrează schema versionabilă: dacă va apărea vreodată o a doua schemă, antetul va purta t=…,v1=…,v2=…, iar dumneavoastră o alegeți pe cea pe care o cunoașteți.
Publicăm două receptoare de referință fără dependențe, unul pentru Node și unul pentru PHP simplu. Amândouă aplică cele patru reguli de mai sus și se testează singure cu --selftest: semnătură validă, corp alterat, secret greșit, timestamp în afara ferestrei, antet malformat, capcana reserializării și ambele tipuri de repetiție (aceeași livrare / același fapt). Verificatorul este perechea exactă a codului pe care îl folosim noi înșine — consumăm contractul pe care îl publicăm.
Verificați corpul BRUT — Semnătura este calculată pe octeți. Decodarea și reserializarea corpului (JSON.stringify(req.body), json_encode($request->all())) transformă aceleași DATE în OCTEȚI diferiți, iar semnătura nu se mai potrivește. În Node capcana este formatarea numerelor (1.50 pe fir devine 1.5; întregii mari își pierd precizia), în PHP este escaparea caracterelor (/ devine \/, İ devine \u0130). Folosiți express.raw în Express și $request->getContent() în Laravel. Aceasta este cea mai frecventă greșeală la scrierea unui receptor.
Verificați timestamp-ul — t se află ÎN semnătură. Verificarea doar a semnăturii îi permite oricui a capturat o cerere validă să o retrimită ore mai târziu, iar receptorul ar socoti-o drept un eveniment verificat. Respingeți orice cerere pentru care |now − t| > tolerance, chiar dacă semnătura este corectă. Fereastra recomandată este de 300 de secunde.
Comparați în timp constant — hash_equals / timingSafeEqual. Compararea cu == îi permite unui atacator să ghicească semnătura octet cu octet.
Deduplicați după event_id, nu după id — event_id identifică FAPTUL: este același pentru doi abonați care primesc același eveniment și se PĂSTREAZĂ la reluare. id (= X-Logistivo-Delivery) identifică LIVRAREA și se schimbă la reluare. Răspundeți la întrebarea „am tratat deja asta” cu event_id; dacă răspundeți cu id, o reluare va executa aceeași muncă de două ori.
Livrare, reîncercări și dezactivare
Receptorul dumneavoastră nu va fi întotdeauna disponibil. Mecanismul pornește de la această premisă: un eșec tranzitoriu intră în programul de reîncercări, unul permanent dezactivează abonamentul — iar MOTIVUL dezactivării este întotdeauna înregistrat.
Motivul dezactivării este lizibil automat și stabil (delivery_failures, endpoint_gone, unsafe_target, key_revoked, by_user) și apare atât în panou, cât și în `lg webhooks list`. O dezactivare fără motiv ar lăsa fără răspuns întrebarea „de ce nu sosește nimic”. Reactivarea resetează contorul și marcajul.
Dumneavoastră scrieți adresa; serverul NOSTRU face cererea. Fără o poartă, un tenant care ar introduce o adresă de metadate cloud ne-ar putea face să emitem cereri din interiorul propriei noastre rețele. De aceea, adresa este verificată atât la înregistrare, cât și la FIECARE livrare:
Timeout-uri — 8 s în total, 4 s pentru conectare — un receptor lent nu trebuie să ocupe un worker. Puneți munca în coadă și returnați imediat 2xx.
Programul de reîncercări — Intervale (în secunde): 60 · 300 · 1800 · 7200 · 21600 → 6 încercări, o fereastră de aproximativ 8,6 ore.
Singurul eșec permanent: 410 Gone — Înseamnă „ștergeți-mă”: nicio reîncercare, abonamentul este dezactivat imediat. Nu returnați NICIODATĂ 410 pentru un eșec de semnătură.
Orice alt eșec — TOATE sunt reîncercate, inclusiv 4xx. Pierderea unui eveniment de business costă mai mult decât câteva cereri în plus: un receptor care returnează 403 în timp ce o regulă WAF este actualizată ar pierde în tăcere un eveniment „factură emisă” pe un mecanism care tratează 4xx ca permanent.
Retry-After — Respectat la 429 și 503 (plafonat la 6 ore).
Redirecționări — NU sunt urmate. Saltul către o adresă internă printr-un 302 ar străpunge poarta de adrese pe o a doua cale.
Dezactivare automată — După 10 livrări consecutive epuizate. Un 410, o țintă nesigură și revocarea cheii de integrare asociate dezactivează IMEDIAT.
doar https, doar porturile 443/8443, credențialele încorporate (https://user:pass@…) sunt respinse;
localhost, numele dintr-o singură etichetă și sufixele interne precum .internal / .local / .svc sunt respinse — intenția este respinsă înainte ca rezultatul rezolvării să fie măcar consultat, astfel încât un DNS split-horizon nu poate străpunge poarta;
literalele IP și TOATE înregistrările rezolvării DNS trebuie să fie publice. Dacă un nume se rezolvă atât la o adresă publică, cât și la una privată, nimeni nu ne întreabă pe care să o alegem → numele este respins direct;
la momentul livrării, adresa este rezolvată o singură dată, iar conexiunea este fixată pe adresa verificată: fereastra de DNS rebinding este închisă;
CORPUL răspunsului receptorului nu este stocat nicăieri (doar codul de status, durata și o etichetă scurtă de eroare) — astfel, calea de „citire”, care este de fapt ceea ce valorează o breșă în poarta de adrese, rămâne închisă.
În mod deliberat, NU există niciun comutator de configurare pentru „permite adrese private”: un astfel de comutator ajunge într-o zi să fie lăsat pornit din greșeală.
Este returnat O SINGURĂ DATĂ, doar la crearea abonamentului și la rotate-secret. Este stocat criptat pe server și nu poate fi citit niciodată înapoi; nu există „afișează din nou”.
lg îl afișează pe ecran și îl lasă acolo — nu îl scrie în niciun fișier de configurare sau de cache.
Dacă se pierde, îl rotiți; valoarea veche nu mai funcționează DIN ACEL MOMENT. Pentru o trecere fără întreruperi, receptorul dumneavoastră ar trebui să încerce ambele secrete pe durata tranziției.
Schimbarea adresei NU atinge secretul: o întreținere de rutină precum „URL-ul s-a mutat” nu trebuie să strice verificarea pe partea receptoare.
Sănătate și status: nimeni nu ar trebui să observe un bridge tăcut înaintea dumneavoastră
Un bridge de integrare moare rareori zgomotos. De obicei amuțește în orele mici ale nopții: un token expiră, persoana în numele căreia rulează cheia pleacă din echipă, un scope este restrâns sau endpoint-ul receptor începe să returneze 403. Primul care observă este aproape întotdeauna clientul. lg status există pentru a inversa această ordine.
O singură comandă răspunde la două întrebări deodată, pentru că în timpul unei întreruperi ambele sunt puse în același moment: funcționează platforma și este sănătos bridge-ul meu? Linia platformei funcționează fără token — în timpul unei defecțiuni, token-ul însuși este primul suspect, iar legarea întrebării despre status de el v-ar lăsa fără răspuns exact atunci când aveți nevoie de unul.
Rezumatul de sănătate nu ține niciun registru nou; el adună trei surse existente într-o singură propoziție: contorul zilnic de utilizare (cât ați apelat și cât a eșuat), registrul de cereri (ce cerere, când și de ce a fost respinsă) și registrul de livrare a webhook-urilor de ieșire (a ajuns evenimentul la receptor). Rata de eroare se citește întotdeauna din contorul zilnic; registrul de detalii este plafonat și spune clar când plafonul a fost atins.
Același rezumat apare și în panou: la Settings › Integration › Keys, fiecare rând poartă un badge și, sub el, motivul. Pragurile nu sunt calculate pe partea clientului; nivelul atribuit de server este cel pe care îl afișează atât panoul, cât și lg status, astfel încât cele două ecrane nu pot spune niciodată lucruri diferite despre aceeași cheie.
Scriptul dumneavoastră de supraveghere nu are nevoie de token. Endpoint-ul returnează doar cuvinte de status; nu conține versiune, nume de gazdă, nume de coadă, număr de job-uri, text de eroare sau date ale clienților — și nici nu poate conține.
Rezumatul de sănătate este produs cu un număr constant de interogări per cerere; numărul de interogări nu crește odată cu numărul de chei. Pentru detalii, citiți cererile recente ale acelei chei cu lg logs, iar bridge-ul de ieșire cu lg webhooks list.
SĂNĂTOS — Nicio defecțiune măsurată și avem dovada succesului: un apel reușit în registru sau trafic care a rămas fără erori în contor.
ATENȚIE — Ceva a început să se strice: rata de eroare sau seria de eșecuri consecutive a depășit un prag, cererile sunt respinse la poartă, cheia este aproape de expirare sau un bridge care comunica regulat a amuțit.
ÎN EȘEC — Bridge-ul nu funcționează în acest moment: token-ul a fost revocat neintenționat, o cheie închisă este încă apelată, există cinci eșecuri la rând, rata de eroare depășește cincizeci la sută sau un abonament webhook a fost dezactivat.
ÎNCHIS — Cheia a fost închisă deliberat și nimeni nu o apelează. Aceasta este o decizie, nu o defecțiune — și nu este colorată în roșu.
FĂRĂ DATE — Nu există nicio măsurătoare: cheia nu a fost apelată niciodată sau măsurătoarea însăși a eșuat. Niciuna dintre aceste situații nu este verde.
Fără verde fals. Badge-ul de sănătate necesită o dovadă măsurată a succesului; o cheie care nu a fost apelată niciodată nu devine niciodată verde, pentru că nicio măsurătoare nu arată că funcționează.
Fără roșu fals. Cheile pe care le-ați închis intenționat apar ca Închise. A colora totul în roșu golește roșul de sens; o cheie închisă devine roșie doar dacă este încă apelată după închidere — și atunci un bridge chiar este stricat.
„Nu s-a putut măsura” nu este același lucru cu „fără date”. Dacă o interogare eșuează pe server, rândul nu afișează în tăcere zero; spune că măsurătoarea nu a putut fi efectuată.
Tăcerea este întotdeauna raportată, dar niciodată transformată orbește în avertisment. Un bridge de sfârșit de lună care tace treizeci de ore este normal; un bridge care a comunicat în cel puțin cinci din ultimele șapte zile și apoi amuțește este o defecțiune. Ritmul este măsurat, nu presupus.
Interogarea de status nu poluează ea însăși cifrele de sănătate. Apelurile făcute de lg status apar în registrul de cereri, dar sunt excluse din calculul sănătății — altfel propria dumneavoastră interogare de status reușită ar reseta seria de eșecuri și ar ascunde exact defecțiunea pe care ecranul există să o arate.
Fiecare linie este măsurată: se rulează o interogare reală pe baza de date, catalogul de comenzi este construit efectiv, înregistrarea live a worker-ului de coadă este citită efectiv. Nimic nu este presupus.
Răspunsul în sine este și el o măsurătoare: dacă puteți citi corpul, nivelul web funcționează.
Nivelul superior derivă doar din componentele obligatorii. Când coada se oprește, răspunsul este degraded, nu down — un apel API sincron nu are nevoie de coadă, iar declararea platformei ca nefuncțională ar fi o alarmă falsă.
Când starea cozii nu poate fi măsurată, nivelul superior rămâne neatins: a nu ști nu este același lucru cu a măsura că ceva este stricat.
Dacă platforma este căzută, endpoint-ul returnează HTTP 503. Corpul nu are plic, astfel încât instrumentele de monitorizare pot trimite alerte fără să-l parseze, iar răspunsul nu este stocat niciodată în vreun cache.
Erori și coduri de ieșire
Ceea ce folosește o mașină pentru ramificare este un șir stabil. Textul din câmpul error se adresează unui om, este localizat și se schimbă fără preaviz — o integrare care se ramifică după textul mesajului nu este suportată, iar faptul că se strică nu este un bug.
Două taxonomii, două câmpuri. error_code este nivelul de transport (tabelul de mai sus) și este primul după care ramificați. error_key este cheia stabilă a regulii de business din interiorul lui failed — INSUFFICIENT_CREDITS, NOT_FOUND, DUPLICATE_CONTACT, INSUFFICIENT_STOCK — publicată ca dicționar în catalog (error_keys) și mai jos. O comandă care nu emite încă o cheie returnează error_key: null; tratați o cheie care lipsește din dicționar ca pe un eșec generic.
ok — HTTP 200 · error_code — · CLI 0 · —
replayed — HTTP 200 · error_code — · CLI 0 · Reluare idempotentă; munca NU a rulat din nou.
failed — HTTP 422 · error_code failed · CLI 1 · Nu — a fost respinsă de o regulă de business (vedeți error_key). Inutil până când argumentul se schimbă.
needs_confirmation — HTTP 409 · error_code needs_confirmation · CLI 4 · Da, cu confirm: true.
idempotency_conflict — HTTP 409 · error_code idempotency_conflict · CLI 2 · Nu — cheia a fost folosită mai întâi pentru o altă comandă (conflicting_command). Emiteți o cheie nouă.
forbidden — HTTP 403 · error_code forbidden · CLI 3 · Nu — poarta de rol sau o cheie cu scope de citire pe o comandă de scriere.
not_found — HTTP 404 · error_code not_found · CLI 2 · Nu — nume de comandă greșit sau eliminat.
(schemă) — HTTP 422 · error_code invalid_request · CLI 2 · Nu — corpul cererii sau un argument nu a trecut validarea schemei (errors{}); nu este o regulă de business.
server_error — HTTP 500 · error_code server_error · CLI 6 · Da — backoff exponențial cu ACEEAȘI cheie de idempotență; cheia nu a fost blocată.
401 unauthenticated — Token-ul a expirat sau a fost revocat. Reîncercarea nu ajută; token-ul trebuie înlocuit.
429 rate_limited — Limită de rată atinsă pentru acest token. Răspunsul poartă întotdeauna Retry-After și un corp cu retry_after, limit și bucket; respectați-l în loc să inventați o întârziere fixă. lg așteaptă și reîncearcă de până la trei ori, apoi iese cu codul 5.
5xx server_error / eroare de rețea — Reîncercați cu backoff exponențial și cu ACEEAȘI cheie de idempotență. Schimbarea cheii rulează din nou o muncă pe care serverul poate să o fi finalizat deja. lg reîncearcă de trei ori (1 s, 2 s, 4 s), apoi iese cu codul 6 și error_code network_error sau server_error.
Promisiunea de stabilitate
Cea mai costisitoare întrebare dintr-un contract de integrare este „codul pe care îl scriu astăzi va mai rula și mâine?”. Un singur număr îi răspunde: contract_version din catalog și antetul X-Contract-Version de pe fiecare răspuns. El răspunde la exact o întrebare — codul scris anterior rulează în continuare neschimbat? Dacă numărul nu a crescut, da. Dacă a crescut, nu: ceva pe care vă bazați a fost eliminat sau restrâns.
Pentru că un anunț nu elimină nimic: codul existent rulează exact ca înainte, și în ziua de după. Creșterea versiunii la anunț ar emite două semnale pentru o singură schimbare și v-ar obișnui să-l ignorați pe primul — slăbind semnalul care contează cu adevărat. Anunțul călătorește deja odată cu apelul pe care îl faceți: deprecated_at și replaced_by pe rândul din catalog, un antet X-Deprecated plus un bloc deprecated în răspunsul acelei comenzi și un avertisment de o linie pe stderr dacă folosiți lg. Nu trebuie să faceți nimic ca să aflați că ceva va dispărea; este deja în logul dumneavoastră.
Între anunț și eliminare trec cel puțin două trimestre calendaristice. Pe toată durata ferestrei, comanda veche răspunde în continuare și avertizează la fiecare apel. Când un nume CLI este retras, succesorul său preia acel nume ca alias: pe durata ferestrei, numele vechi ajunge la comanda veche, iar în ziua eliminării același apel ajunge la cea nouă — fără ca dumneavoastră să livrați o versiune nouă a clientului.
preview_invoice → get_invoice (anunțat pe 3 septembrie 2026). get_invoice returnează același bloc de previzualizare și adaugă liniile, defalcarea taxelor, plățile înregistrate, soldul rămas și adresarea după propria cheie ERP (external_ref). preview_invoice continuă să funcționeze, la fel și lg invoices preview — ambele avertizează.
fără schimbare — O comandă nouă · un parametru OPȚIONAL nou · un câmp nou în răspuns · o cheie de eroare nouă · un endpoint nou — Nu faceți nimic. Trebuie să ignorați câmpurile pe care nu le cunoașteți; un parser care eșuează la un câmp necunoscut nu este conform.
fără schimbare — Un ANUNȚ de depreciere: înștiințarea că o comandă va dispărea — Codul dumneavoastră continuă să ruleze. Puneți o sarcină în calendar — fereastra este de cel puțin 6 luni.
crește — Eliminarea unei comenzi · retragerea unui nume CLI vechi · eliminarea unui câmp din răspuns · transformarea unui parametru opțional în obligatoriu · restrângerea unui enum — Înseamnă că ați ratat fereastra; înștiințarea a ajuns la dumneavoastră în trei locuri diferite.
Numele API al unei comenzi (cum ar fi list_loads) este înghețat pentru totdeauna; acesta este numele pe care îl folosiți în apelurile HTTP.
error_code (transport) și error_key (regulă de business) sunt șiruri stabile. Pot apărea unele noi — tratați o cheie pe care nu o găsiți în dicționar ca pe un eșec generic, nu ca pe o ruptură de compatibilitate.
Corespondența dintre statusul HTTP și câmpul status din corp este fixă.
Numărul versiunii nu scade niciodată și poate fi citit pe fiecare răspuns — inclusiv pe 304 și 429 fără corp.
TEXTUL erorilor și al descrierilor. Este localizat și se schimbă fără preaviz; ramificarea după textul mesajului nu este suportată.
Absența câmpurilor pe care nu le cunoașteți. Adăugarea unui câmp nu crește versiunea.
Id-urile auto-increment drept chei de business. Purtați propria cheie cu external_ref.
Cheile de eroare dinamice derivate din nume de clase; ele nu fac parte din contract.
Tabelul de identitate al comenzilor
Tabelul de mai jos nu este scris de mână: este generat din registrul live de comenzi de fiecare dată când această pagină este servită. O comandă adăugată pe server apare aici de la sine. Coloana „Poartă” vă spune dacă o comandă cere confirmare și dacă efectul ei poate fi anulat; coloana „Roluri” vă spune ce tipuri de cont o vor găsi în catalogul lor. Badge-urile marchează comenzile care necesită o cheie de nivel manager, pe cele care primesc un fișier și pe cele care rulează doar din lg.
Numele API (list_loads) este înghețat și nu se va schimba; este numele pe care îl folosiți în apelurile HTTP. Identitatea CLI (loads list) este guvernată de politica de versionare: odată anunțată, se schimbă doar cu o creștere de versiune și o fereastră de migrare, în care catalogul servește perechea veche ca alias. Descrierile de aici provin din înregistrarea proprie a fiecărei comenzi și sunt prescurtate — pentru textul complet, tipurile parametrilor și valorile enum, citiți endpoint-ul de catalog sau rulați lg help . Comenzile exclusive afiliaților nu sunt listate aici; un cont de afiliat le vede în propriul catalog.
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… (citire · — · expeditor · API: get_account_settings) [cheie 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),… (scriere · confirmare · expeditor · API: update_account_settings) [cheie 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… (citire · — · toate · API: get_accounting_settings)
lg accounting-settings set-status — Turn the company's accounting module on or off (muhasebe modülünü aç/kapa). (scriere · confirmare · toate · 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… (scriere · confirmare · toate · 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). (citire · — · toate · 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. (citire · — · transportator · 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… (citire · — · expeditor · API: get_ai_settings) [cheie 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… (scriere · confirmare · expeditor · API: update_ai_settings) [cheie manager]
lg announcements list — Show the system announcements Logistivo sent to this user (new features, maintenance, policy changes) — newest first. (citire · — · toate · API: list_announcements)
lg announcements mark-read — Mark system announcements as read for this user. (scriere · — · toate · 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). (citire · — · toate · API: read_attachment) [primește un fișier: 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 /… (citire · — · toate · 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). (scriere · confirmare + ireversibilă · toate · API: create_company_bank_account) [cheie manager]
lg bank-accounts delete — Delete one of OUR OWN company bank accounts (for example a closed account). (scriere · confirmare + ireversibilă · toate · API: delete_company_bank_account) [cheie 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. (scriere · confirmare + ireversibilă · toate · API: extract_supplier_bank_accounts) [primește un fișier: attachment_uuid]
lg bank-accounts list — List bank accounts. (citire · — · toate · 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). (citire · — · toate · 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. (scriere · confirmare + ireversibilă · toate · API: set_default_company_bank_account) [cheie 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… (scriere · confirmare + ireversibilă · toate · API: decide_bank_account_verification) [cheie 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. (scriere · confirmare + ireversibilă · toate · API: update_company_bank_account) [cheie 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. (citire · — · toate · API: list_banks)
lg bids accept — Accept a carrier's bid on one of this company's demands. (scriere · confirmare + ireversibilă · expeditor · 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. (citire · — · transportator · API: calculate_bid_earnings)
lg bids cancel — Withdraw (geri çek) one of THIS carrier company's PENDING bids. (scriere · confirmare + ireversibilă · transportator · 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. (scriere · confirmare + ireversibilă · transportator · 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,… (citire · — · transportator · API: get_my_demand_bid)
lg bids list — List the bids (teklif) THIS carrier company has submitted, newest first, with their outcome. (citire · — · transportator · 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). (scriere · confirmare + ireversibilă · transportator · 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,… (citire · — · toate · 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. (citire · — · toate · 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. (scriere · confirmare + ireversibilă · toate · 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… (citire · — · toate · 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. (citire · — · toate · 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. (citire · — · transportator · 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. (scriere · confirmare · transportator · API: set_carrier_routes) [cheie 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. (citire · — · toate · 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). (scriere · confirmare + ireversibilă · toate · API: attach_check_to_invoices) [cheie manager]
lg checks bounce — Record that a cheque BOUNCED (came back unpaid). (scriere · confirmare + ireversibilă · toate · 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. (scriere · confirmare + ireversibilă · toate · API: cancel_settlement_check) [cheie 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. (scriere · confirmare + ireversibilă · toate · API: mark_check_collected)
lg checks create — Register a cheque in the cheque portfolio. (scriere · confirmare · toate · API: create_settlement_check) [cheie manager] [primește un fișier: 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,… (citire · — · toate · 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… (citire · — · toate · 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. (scriere · confirmare · toate · API: detach_check_from_invoices) [cheie 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… (scriere · confirmare + ireversibilă · toate · API: execute_settlement_check) [cheie 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). (scriere · confirmare · toate · API: update_settlement_check) [cheie manager]
lg companies add-role — Add a role to this company (firmaya rol ekle): customer (shipper), carrier, customs (customs broker) or affiliate. (scriere · confirmare + ireversibilă · toate · API: add_company_role) [cheie manager]
lg companies delete-logo — Remove this company's logo (firma logosu) from the branded login portal, documents and the panel. (scriere · confirmare + ireversibilă · toate · API: delete_company_logo) [cheie 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… (citire · — · toate · 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). (scriere · confirmare + ireversibilă · toate · 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). (citire · — · toate · 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… (citire · — · toate · 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. (scriere · confirmare · transportator, comisionar vamal · API: set_company_brand_colors) [cheie 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`. (scriere · confirmare + ireversibilă · toate · API: set_company_logo) [cheie manager] [primește un fișier: 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… (scriere · confirmare · toate · API: update_company_profile) [cheie 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),… (scriere · confirmare · toate · API: upload_company_document) [primește un fișier: 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… (scriere · confirmare + ireversibilă · toate · 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. (citire · — · toate · 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… (citire · — · toate · 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. (scriere · confirmare + ireversibilă · toate · API: create_company_domain) [cheie manager]
lg company-domains delete — Remove one of our UNVERIFIED company domains (e.g. added by mistake). (scriere · confirmare + ireversibilă · toate · API: delete_company_domain) [cheie 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. (citire · — · toate · 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). (scriere · confirmare + ireversibilă · toate · API: resend_company_domain_code) [cheie 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. (scriere · confirmare + ireversibilă · toate · API: verify_company_domain) [cheie manager]
lg company-relationships accept — Accept a connection proposal another company sent us (relationship_id from list_company_relationships direction=incoming). (scriere · confirmare + ireversibilă · toate · API: accept_company_relationship) [cheie 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). (scriere · confirmare + ireversibilă · toate · API: create_company_relationship) [cheie 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… (citire · — · toate · API: list_company_relationships)
lg company-relationships reject — Reject a connection proposal another company sent us (relationship_id from list_company_relationships direction=incoming). (scriere · confirmare + ireversibilă · toate · API: reject_company_relationship) [cheie manager]
lg company-relationships revoke — End a company connection we are a party of (either side may end it), or withdraw a pending proposal. (scriere · confirmare + ireversibilă · toate · API: revoke_company_relationship) [cheie 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. (scriere · confirmare · toate · 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. (scriere · confirmare + ireversibilă · toate · 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. (scriere · confirmare · toate · 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… (scriere · confirmare · toate · API: archive_business_contact)
lg contacts create — Create a new business contact (cari) in the company directory. (scriere · confirmare · toate · API: create_business_contact)
lg contacts delete-address — Delete one of a business contact's addresses. (scriere · confirmare + ireversibilă · toate · 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). (scriere · confirmare + ireversibilă · toate · API: delete_business_contact_bank_account)
lg contacts delete-person — Delete a person from a business contact, together with that person's notification preferences. (scriere · confirmare + ireversibilă · toate · 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,… (citire · — · toate · API: extract_business_contact_from_image) [primește un fișier: 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. (citire · — · toate · 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. (citire · — · toate · API: get_business_contact)
lg contacts invite — Invite a business contact to join Logistivo by e-mail. (scriere · confirmare + ireversibilă · toate · 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. (citire · — · toate · 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. (citire · — · toate · 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… (citire · — · toate · 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. (citire · — · toate · 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. (citire · — · toate · API: list_business_contact_routes)
lg contacts remove-company-link — Remove the link between a business contact and its company on the Logistivo platform. (scriere · confirmare + ireversibilă · toate · API: unlink_business_contact_company) [cheie 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. (scriere · confirmare · toate · 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. (citire · — · toate · 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. (scriere · confirmare + ireversibilă · toate · 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). (scriere · confirmare · toate · API: set_business_contact_person_notifications)
lg contacts update — Update fields of an existing business contact. (scriere · confirmare · toate · API: update_business_contact)
lg contacts update-address — Correct one of a business contact's addresses. (scriere · confirmare · toate · 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. (scriere · confirmare + ireversibilă · toate · API: update_business_contact_bank_account)
lg contacts update-person — Correct a contact person's details. (scriere · confirmare · toate · 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… (citire · — · toate · 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). (scriere · confirmare + ireversibilă · toate · API: send_conversation_file) [primește un fișier: attachment_uuid]
lg conversations add-invitation — Invite a person from ANOTHER company into a load chat by e-mail (sohbete dışarıdan davet). (scriere · confirmare + ireversibilă · toate · API: invite_to_conversation)
lg conversations add-message — Post a message into a load/bid conversation AS THIS USER (not as an assistant). (scriere · confirmare + ireversibilă · toate · 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". (scriere · confirmare · toate · 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. (scriere · confirmare + ireversibilă · expeditor · 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. (citire · — · toate · 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. (citire · — · toate · 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. (citire · — · toate · API: list_conversation_invitations)
lg conversations list-messages — Read the most recent messages of one conversation — give it a load code (e.g. (citire · — · toate · API: list_conversation_messages)
lg conversations list-participants — Who is in this conversation — name and company of every participant. (citire · — · toate · 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. (scriere · — · toate · 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). (scriere · confirmare + ireversibilă · toate · 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). (scriere · confirmare + ireversibilă · toate · 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). (scriere · confirmare · toate · 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. (citire · — · toate · 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. (citire · — · toate · 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. (citire · — · toate · 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. (citire · — · expeditor · 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. (citire · — · toate · 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. (citire · — · expeditor, transportator · 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. (citire · — · expeditor, transportator · 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). (citire · — · transportator · API: get_demand_settings) [cheie 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. (scriere · confirmare · transportator · API: update_demand_settings) [cheie manager]
lg demand-targets search — Resolve a pickup/delivery location for a demand to a target token ("5-" = district/postal area, "10-" = seaport address). (citire · — · expeditor · API: lookup_demand_target)
lg demands create — Open a freight demand (talep) so carriers can bid. (scriere · confirmare + ireversibilă · expeditor · API: create_demand) [primește un fișier: 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… (citire · — · expeditor · 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… (citire · — · expeditor · API: extract_demand_from_text)
lg demands get — Detail of ONE freight demand. (citire · — · expeditor, transportator · API: get_demand)
lg demands list — List freight demands (talep) this carrier is allowed to bid on, newest first. (citire · — · transportator · 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. (citire · — · expeditor · 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… (citire · — · expeditor · API: get_demand_form_options)
lg demands set-status — Close (make passive) one of this company's ACTIVE demands so carriers stop bidding. (scriere · confirmare + ireversibilă · expeditor · 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). (scriere · confirmare · expeditor · API: update_demand) [primește un fișier: 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… (scriere · confirmare + ireversibilă · toate · API: send_direct_message)
lg direct-conversations create — Start a direct chat. (scriere · confirmare + ireversibilă · toate · 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. (citire · — · toate · 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). (citire · — · toate · 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. (citire · — · toate · 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… (citire · — · toate · 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). (scriere · — · toate · 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. (scriere · confirmare + ireversibilă · toate · API: delete_direct_message)
lg direct-conversations update — Rename a GROUP direct chat (private one-to-one chats have no title). (scriere · confirmare · toate · 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). (scriere · confirmare · toate · 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… (scriere · — · toate · API: check_document_compliance) [primește un fișier: 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. (citire · — · toate · 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). (citire · — · toate · 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… (citire · — · transportator · 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… (citire · — · transportator · 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". (citire · — · expeditor, transportator · 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. (citire · — · expeditor, transportator · 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. (scriere · confirmare + ireversibilă · expeditor, transportator · 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. (scriere · confirmare · expeditor, transportator · API: create_driver_advance) [primește un fișier: attachment_uuid]
lg driver-advances delete — Delete a driver money movement that was entered by mistake (duplicate, wrong driver). (scriere · confirmare + ireversibilă · expeditor, transportator · 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. (citire · — · expeditor, transportator · 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. (scriere · confirmare · expeditor, transportator · 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". (scriere · confirmare · transportator · 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. (scriere · confirmare + ireversibilă · transportator · 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. (citire · — · transportator · API: list_driver_availabilities)
lg driver-availabilities update — Correct one availability period (id from list_driver_availabilities): kind, dates, Schengen presence or note. (scriere · confirmare · transportator · 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… (citire · — · expeditor, transportator · API: get_driver_expense_settings)
lg driver-expense-settings update — Change this company's driver expense module settings — only the fields you pass change. (scriere · confirmare · expeditor, transportator · API: update_driver_expense_settings) [cheie 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. (scriere · confirmare + ireversibilă · expeditor, transportator · API: process_receipt) [primește un fișier: 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". (scriere · confirmare · expeditor, transportator · API: create_driver_expense)
lg driver-expenses delete — Delete a driver expense entered by mistake (duplicate receipt, wrong driver, test entry). (scriere · confirmare + ireversibilă · expeditor, transportator · 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. (citire · — · expeditor, transportator · 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. (citire · — · expeditor, transportator · 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. (citire · — · expeditor, transportator · API: get_driver_expense)
lg driver-expenses list — List driver expense receipts (fuel, toll, ferry, parking, food, repair…) with a converted total. (citire · — · expeditor, transportator · 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… (citire · — · expeditor, transportator · 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… (citire · — · expeditor, transportator · 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… (scriere · confirmare · expeditor, transportator · 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). (scriere · confirmare · expeditor, transportator · 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… (scriere · confirmare · expeditor, transportator · 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). (scriere · — · expeditor, transportator · 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… (scriere · confirmare · transportator · 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… (scriere · confirmare · transportator · 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… (citire · — · transportator · 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… (citire · — · transportator · 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. (scriere · — · transportator · API: dismiss_driver_schedule_suggestion)
lg driver-statements cancel — Cancel a statement that should not exist (opened by mistake, duplicated). (scriere · confirmare + ireversibilă · expeditor, transportator · API: cancel_driver_account)
lg driver-statements create — Open a NEW draft settlement statement for a driver. (scriere · confirmare · expeditor, transportator · 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… (citire · — · expeditor, transportator · 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. (scriere · confirmare + ireversibilă · expeditor, transportator · API: finalize_driver_account) [cheie 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… (citire · — · expeditor, transportator · 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… (citire · — · expeditor, transportator · 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). (scriere · confirmare · expeditor, transportator · API: reopen_driver_account) [cheie manager]
lg driver-statements update — Change the note printed on a DRAFT driver settlement statement (e.g. "September trips, fuel excluded"). (scriere · confirmare · expeditor, transportator · 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. (scriere · confirmare · expeditor, transportator · 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 /… (citire · — · expeditor, transportator · 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. (scriere · confirmare · transportator · API: add_driver_document) [primește un fișier: attachment_uuid]
lg drivers archive — Archive (deactivate) a driver: their account is disabled, open mobile sessions are revoked and the login link stops working. (scriere · confirmare + ireversibilă · transportator · 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,… (citire · — · transportator · API: check_driver_for_trip)
lg drivers create — Create a new driver account for this carrier company. (scriere · confirmare · transportator · API: create_driver)
lg drivers delete-document — Remove a driver paper from the driver's file. (scriere · confirmare + ireversibilă · transportator · 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… (citire · — · transportator · 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. (citire · — · transportator · 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)… (citire · — · transportator · 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. (citire · — · transportator · 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. (citire · — · transportator · API: list_driver_locations)
lg drivers login-link — Produce the driver's 48-hour mobile app login link (sensitive credential). (scriere · confirmare · transportator · 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"). (scriere · — · transportator · API: request_driver_location)
lg drivers search — Resolve one of this company's drivers by name to its driver_id. (citire · — · transportator · API: lookup_driver)
lg drivers update — Correct a driver's first/last name. (scriere · confirmare · transportator · 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. (scriere · confirmare · transportator · 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). (scriere · confirmare + ireversibilă · transportator · 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". (scriere · confirmare · toate · API: create_equipment_damage)
lg equipment-damages delete — Delete a damage record that was opened by mistake (a duplicate, the wrong vehicle). (scriere · confirmare + ireversibilă · toate · 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". (citire · — · toate · 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… (citire · — · toate · 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. (scriere · confirmare · toate · 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. (scriere · confirmare · toate · 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".… (scriere · confirmare · toate · API: create_equipment_inspection) [primește un fișier: photos[].attachment_uuid]
lg equipment-inspections delete — Delete an equipment inspection that was recorded by mistake (wrong vehicle, duplicate), together with its photos. (scriere · confirmare + ireversibilă · toate · 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… (citire · — · toate · 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… (citire · — · toate · 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). (scriere · confirmare · toate · 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… (citire · — · toate · 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". (scriere · confirmare · toate · API: update_equipment_settings) [cheie 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. (citire · — · toate · API: get_equipment_timeline)
lg export-documents add-item — Append a line item to an export document. (scriere · — · toate · API: add_export_document_item)
lg export-documents create — Create a new export document draft. (scriere · — · toate · 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. (scriere · — · toate · API: create_export_document_set) [primește un fișier: attachment_uuid]
lg export-documents delete — Delete one export document of this company (draft or generated). (scriere · confirmare + ireversibilă · toate · 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). (scriere · — · toate · 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. (scriere · — · toate · API: extract_export_document_from_text) [primește un fișier: 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. (scriere · confirmare + ireversibilă · toate · 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. (scriere · confirmare + ireversibilă · toate · 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. (citire · — · toate · 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). (citire · — · toate · API: list_export_documents)
lg export-documents options — List the export document types and the ready-made document sets with their credit cost. (citire · — · toate · 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… (citire · — · toate · API: plan_export_document_generation)
lg export-documents remove-item — Delete one line item by its 1-based position. (scriere · — · toate · API: remove_export_document_item)
lg export-documents set — Set one or more fields on an export document draft. (scriere · — · toate · 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. (scriere · — · toate · 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. (citire · — · toate · 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. (citire · — · toate · 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). (citire · — · expeditor, transportator · 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. (scriere · confirmare + ireversibilă · toate · API: archive_freight_invoice)
lg freight-invoices create — Attach 1-20 freight invoices (navlun faturası) to a load. (scriere · confirmare · toate · API: upload_freight_invoices) [primește un fișier: 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. (citire · — · toate · 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". (scriere · confirmare · toate · 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… (citire · — · expeditor, transportator · 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. (scriere · confirmare · expeditor, transportator · API: create_fuel_card)
lg fuel-cards delete — Delete a fuel / toll card (DKV, UTA, Shell…) that was entered BY MISTAKE. (scriere · confirmare + ireversibilă · expeditor, transportator · 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. (citire · — · expeditor, transportator · 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. (scriere · confirmare · expeditor, transportator · 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… (citire · — · toate · 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. (citire · — · toate · 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),… (citire · — · toate · API: list_integration_keys) [cheie 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). (scriere · confirmare + ireversibilă · toate · API: revoke_integration_key) [cheie 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). (scriere · confirmare + ireversibilă · toate · API: invite_teammate) [cheie 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. (citire · — · toate · API: list_pending_invitations)
lg invitations resend — Re-send a pending teammate invitation e-mail and extend its expiry by 14 days. (scriere · confirmare + ireversibilă · toate · API: resend_invitation) [cheie manager]
lg invitations revoke — Cancel a pending teammate invitation so its link stops working (it can later be re-sent). (scriere · confirmare · toate · API: revoke_invitation) [cheie 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,… (citire · — · toate · 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). (scriere · confirmare + ireversibilă · toate · API: create_invoice_template) [cheie manager] [primește un fișier: logo_attachment_uuid, signature_image_attachment_uuid]
lg invoice-templates delete — Delete one of your invoice template configurations. (scriere · confirmare + ireversibilă · toate · API: delete_invoice_template) [cheie 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… (citire · — · toate · 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. (scriere · confirmare · toate · API: set_default_invoice_template) [cheie 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… (scriere · confirmare + ireversibilă · toate · API: update_invoice_template) [cheie manager] [primește un fișier: 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). (scriere · — · toate · 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. (scriere · confirmare + ireversibilă · toate · API: record_invoice_payment)
lg invoices cancel — Cancel an ISSUED invoice this company issued: posts the reversing journal entry and marks the invoice cancelled. (scriere · confirmare + ireversibilă · toate · API: cancel_invoice)
lg invoices create — Create a DRAFT invoice (reversible) issued by the current company to a recipient business contact. (scriere · — · toate · API: create_invoice_draft)
lg invoices delete-draft — Delete a DRAFT invoice of this company together with its lines and taxes. (scriere · confirmare + ireversibilă · toate · 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). (citire · — · toate · 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. (citire · — · toate · API: get_invoice)
lg invoices issue — Issue (finalize) a DRAFT invoice: assigns a number and posts accounting entries. (scriere · confirmare + ireversibilă · toate · 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). (citire · — · toate · 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. (citire · — · toate · API: preview_invoice · depreciată: 2026-09-03 · folosiți get_invoice)
lg invoices remove-line — Remove one line from a DRAFT invoice your company issued; the totals are recalculated. (scriere · confirmare · toate · 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. (scriere · confirmare + ireversibilă · toate · 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. (scriere · — · toate · 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). (scriere · — · toate · 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. (scriere · confirmare + ireversibilă · toate · API: approve_join_request) [cheie 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). (citire · — · toate · API: list_join_requests) [cheie manager]
lg join-requests reject — Reject a pending join request: the applicant does not join our company and is e-mailed the decision. (scriere · confirmare + ireversibilă · toate · API: reject_join_request) [cheie manager]
lg journal-entries create — Post a manual double-entry journal entry (yevmiye fişi). (scriere · confirmare + ireversibilă · toate · API: create_journal_entry)
lg journal-entries get — Read one journal entry with its lines (account code/name, debit, credit, counterparty) and totals. (citire · — · toate · API: get_journal_entry)
lg journal-entries list — List journal entries (yevmiye fişleri) of the company, newest first, with optional date window. (citire · — · toate · API: list_journal_entries)
lg language-settings get — Read the signed-in user's own language settings (dil ayarları). (citire · — · toate · 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". (scriere · — · toate · 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:… (citire · — · toate · 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,… (scriere · confirmare · toate · API: update_load_ai_settings) [cheie manager]
lg load-containers create — Add a sea container number to a load (yüke konteyner ekle) — "add MSC container MSCU1234565 to FKZ8515". (scriere · confirmare · expeditor, transportator · 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). (scriere · confirmare + ireversibilă · toate · 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. (citire · — · toate · 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. (citire · — · toate · 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… (scriere · confirmare · toate · 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… (scriere · confirmare + ireversibilă · toate · API: attach_chat_file_to_load) [primește un fișier: 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. (citire · — · toate · 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). (scriere · confirmare · expeditor, transportator · 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. (scriere · confirmare + ireversibilă · expeditor, transportator · 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… (scriere · — · expeditor, transportator · 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. (citire · — · expeditor, transportator · 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. (citire · — · expeditor, transportator · 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… (scriere · — · expeditor, transportator · API: optimize_trip_route)
lg load-groups remove-load — Take one consignment out of a groupage trip you own. (scriere · confirmare · expeditor, transportator · 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. (scriere · confirmare + ireversibilă · toate · 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. (citire · — · toate · 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". (scriere · confirmare + ireversibilă · transportator · 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". (citire · — · toate · 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… (citire · — · toate · 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). (citire · — · toate · 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". (scriere · confirmare + ireversibilă · toate · 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". (scriere · confirmare + ireversibilă · toate · 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). (scriere · confirmare · toate · 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. (scriere · confirmare · toate · 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… (citire · — · toate · 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). (scriere · confirmare · toate · 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. (scriere · confirmare · toate · 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… (scriere · confirmare · toate · 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). (scriere · confirmare · toate · 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. (citire · — · toate · 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". (scriere · — · toate · 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… (citire · — · toate · 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. (citire · — · toate · API: get_load_report_options)
lg load-types search — Resolve a load/transport type (e.g. (citire · — · toate · 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. (scriere · confirmare · toate · 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. (citire · — · toate · 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). (scriere · confirmare · toate · 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. (scriere · confirmare + ireversibilă · toate · 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. (scriere · — · toate · API: reanalyze_load_documents)
lg loads archive — Archive one of the company's OWN loads (yükü arşivle) — "FKZ8515'i arşive al". (scriere · confirmare + ireversibilă · toate · 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. (scriere · confirmare · transportator · 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. (citire · — · toate · 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… (scriere · confirmare · toate · API: resolve_load_problem_flag)
lg loads create — Open a freight load (yük). (scriere · confirmare + ireversibilă · toate · 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". (citire · — · toate · 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… (citire · — · expeditor · 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… (citire · — · toate · API: get_load)
lg loads list — List the freight loads (yük) this company can see, newest first. (citire · — · toate · 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. (citire · — · toate · 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… (citire · — · toate · 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). (citire · — · toate · 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). (citire · — · toate · 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… (citire · — · toate · 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". (scriere · — · toate · 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?". (citire · — · toate · 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… (citire · — · toate · 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. (scriere · confirmare · transportator · 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… (citire · — · toate · 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). (scriere · confirmare + ireversibilă · transportator · 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". (scriere · confirmare · transportator · 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". (scriere · confirmare · transportator · 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. (scriere · confirmare + ireversibilă · toate · 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. (citire · — · toate · 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… (citire · — · expeditor · API: get_notification_settings) [cheie 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… (scriere · confirmare · expeditor · API: update_notification_settings) [cheie 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. (citire · — · toate · API: list_notifications)
lg notifications mark-read — Mark ALL of the signed-in user's unread notifications as read (empty the bell). (scriere · — · toate · 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… (citire · — · toate · 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… (citire · — · toate · API: list_packages)
lg pallets add-measurement — Record a NEW measurement for an existing pallet (dimensions in centimetres and/or gross weight in kilograms). (scriere · confirmare · toate · 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). (scriere · — · toate · API: add_pallet_proof) [primește un fișier: 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… (citire · — · toate · 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. (scriere · confirmare · toate · API: create_pallet)
lg pallets delete — Delete one of this company's pallet records. (scriere · confirmare + ireversibilă · toate · API: delete_pallet)
lg pallets delete-proof — Remove one proof photo from one of this company's pallets. (scriere · confirmare + ireversibilă · toate · 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. (scriere · — · toate · API: extract_pallet_from_photos) [primește un fișier: 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… (citire · — · toate · 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. (citire · — · toate · 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. (scriere · confirmare · toate · API: update_pallet)
lg parasut-contacts create — Create a new customer or supplier contact IN PARAŞÜT and keep its local copy. (scriere · confirmare + ireversibilă · toate · 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,… (citire · — · toate · 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… (scriere · confirmare + ireversibilă · toate · 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,… (citire · — · toate · 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… (citire · — · toate · 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,… (scriere · confirmare + ireversibilă · toate · API: disconnect_parasut) [cheie 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… (citire · — · toate · API: get_parasut_settings) [cheie manager]
lg parasut-settings update — Connect this company's Paraşüt account or renew its credentials (replaces an existing connection). (scriere · confirmare · toate · API: connect_parasut) [cheie manager] [doar CLI]
lg payables list — Payables ("whom do we owe how much"): per-supplier totals of recorded purchase invoices — invoiced, paid, remaining, earliest due date — with a per-currency breakdown and an overall summary. (citire · — · toate · API: list_payables)
lg payment-cards delete — Remove a saved payment card (card_id from list_payment_cards). (scriere · confirmare + ireversibilă · toate · API: delete_payment_card) [cheie 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. (citire · — · toate · 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. (scriere · confirmare + ireversibilă · toate · API: set_default_payment_card) [cheie 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". (scriere · confirmare + ireversibilă · toate · API: cancel_settlement_instruction)
lg payment-instructions download — Get the bank payment instruction document (PDF) with a short-lived download link. (citire · — · toate · 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… (citire · — · toate · 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. (citire · — · toate · 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… (scriere · confirmare + ireversibilă · toate · 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… (citire · — · transportator · API: get_planning_board)
lg plans archive — Close a plan because the user says the work is finished or abandoned. (scriere · — · toate · 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"). (scriere · confirmare · toate · API: create_plan)
lg plans get — Read one plan: the steps that were agreed AND the commands that actually ran while it was active. (citire · — · toate · API: get_plan)
lg plans list — List this company's plans, newest first. (citire · — · toate · API: list_plans)
lg ports search — Find a seaport by name or UN/LOCODE (liman ara) — "Mersin", "TRMER", "Trieste". (citire · — · toate · 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"). (scriere · — · toate · API: remember_preference)
lg preferences delete — Forget one stored preference of this user. (scriere · — · toate · API: forget_preference)
lg preferences list — List what you have been asked to remember about THIS user, with the labels. (citire · — · toate · API: list_preferences)
lg product-brands create — Create a new product brand for this company (the panel's "new brand"). (scriere · confirmare · expeditor · API: create_product_brand)
lg product-brands list — List this company's product brands (id, name, code, active flag, number of products). (citire · — · expeditor · API: list_product_brands)
lg product-categories create — Create a new product category for this company (the panel's "new category"). (scriere · confirmare · expeditor · API: create_product_category)
lg product-categories list — List this company's product categories (id, name, code, active flag, number of products). (citire · — · expeditor · API: list_product_categories)
lg products add-image — Add a photo to a product's gallery. (scriere · — · expeditor · API: add_product_image) [primește un fișier: 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. (scriere · confirmare · expeditor · API: create_product)
lg products delete — Delete a product from this company's catalogue. (scriere · confirmare + ireversibilă · expeditor · API: delete_product)
lg products delete-image — Remove one photo from a product's gallery (image_id from get_product). (scriere · confirmare + ireversibilă · expeditor · 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. (scriere · — · expeditor · API: extract_product_from_photos) [primește un fișier: 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 /… (citire · — · expeditor · 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. (citire · — · expeditor · 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. (citire · — · expeditor · 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). (citire · — · expeditor · API: get_product_options)
lg products search — Resolve a product to its product_id + on-hand quantity. (citire · — · expeditor · API: lookup_product)
lg products set-primary-image — Make one of a product's photos its cover image (image_id from get_product). (scriere · — · expeditor · 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. (scriere · confirmare · expeditor · 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). (citire · — · toate · 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. (citire · — · toate · 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. (citire · — · toate · 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… (citire · — · toate · API: get_accounting_report)
lg reservations approve — As the warehouse owner, approve a pending reservation received at your warehouse (the booker is notified). (scriere · confirmare · expeditor · 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. (scriere · confirmare + ireversibilă · toate · 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). (scriere · confirmare + ireversibilă · expeditor · API: complete_reservation)
lg reservations create — Book a warehouse dock time slot. (scriere · confirmare · toate · 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. (citire · — · toate · 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… (citire · — · toate · API: list_reservations)
lg reservations list-slots — Available dock time slots of one day with remaining capacity. (citire · — · toate · 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. (scriere · confirmare + ireversibilă · expeditor · 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. (scriere · confirmare · expeditor · 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. (citire · — · transportator · API: list_nearby_roro_routes)
lg roro-routes select — Select the Ro-Ro (ferry) line a load you are carrying will use. (scriere · confirmare · transportator · API: select_roro_route)
lg roro-routes set-required — Mark whether a load you are carrying will travel by Ro-Ro (ferry) or not. (scriere · confirmare · transportator · 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). (scriere · confirmare · transportator · 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… (scriere · confirmare · transportator · 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). (scriere · confirmare · transportator · API: create_route_plan)
lg route-plans delete — Cancel and delete a route plan (route_plan_id or route_plan_code). (scriere · confirmare + ireversibilă · transportator · 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… (citire · — · transportator · 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. (citire · — · transportator · 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 /… (scriere · confirmare · transportator · 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. (scriere · confirmare · transportator · 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. (scriere · confirmare · transportator · 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. (scriere · confirmare · transportator · 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 /… (citire · — · transportator · 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). (scriere · confirmare · transportator · API: import_driver_schengen_periods) [primește un fișier: 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). (citire · — · transportator · 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… (citire · — · transportator · 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… (citire · — · transportator · 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. (citire · — · transportator · 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). (scriere · confirmare + ireversibilă · transportator · 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"… (scriere · confirmare · transportator · 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. (scriere · confirmare · transportator · API: set_driver_schengen_exemption)
lg settlements cancel — CANCEL a bulk collection / payment (settlement batch). (scriere · confirmare + ireversibilă · toate · API: cancel_settlement_batch) [cheie 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… (scriere · confirmare + ireversibilă · toate · 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,… (citire · — · toate · API: get_settlement_batch)
lg settlements list — List bulk collection/payment batches (code, direction, instrument, contact, currency, total, value date, status), newest first. (citire · — · toate · 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… (citire · — · toate · 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… (citire · — · toate · 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… (citire · — · toate · 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". (scriere · confirmare · expeditor, transportator · API: track_ship_for_load)
lg ship-trackings delete — Stop tracking a ship on a load (gemi takibini durdur). (scriere · confirmare · expeditor, transportator · 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". (citire · — · toate · 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". (citire · — · toate · 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. (scriere · confirmare + ireversibilă · expeditor · API: create_stock_adjustment)
lg stock list — Read current on-hand stock levels. (citire · — · expeditor · 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. (citire · — · expeditor · API: list_stock_movements)
lg stock move — Record a stock movement: inbound (giriş), outbound (çıkış), or transfer between locations. (scriere · confirmare + ireversibilă · expeditor · 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. (citire · — · expeditor · 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. (scriere · confirmare · expeditor · API: create_sub_company) [cheie 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. (scriere · confirmare + ireversibilă · expeditor · API: delete_sub_company) [cheie 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. (citire · — · expeditor · 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?". (citire · — · toate · API: get_tariff_chapter)
lg tariff-matrices get — FREE. (citire · — · toate · API: get_tariff_matrix)
lg tariff-matrices list — FREE. (citire · — · toate · API: list_tariff_matrix_runs)
lg tariff-matrices preview — FREE. (citire · — · toate · 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. (scriere · confirmare + ireversibilă · toate · API: run_tariff_matrix)
lg tariffs coverage — FREE. (citire · — · toate · 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. (scriere · — · toate · API: extract_tariff_codes_from_invoice) [primește un fișier: 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. (citire · — · toate · 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). (scriere · confirmare + ireversibilă · toate · 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. (citire · — · toate · 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. (citire · — · toate · API: lookup_tariff_code)
lg teammates delete — Remove a person from the company team. (scriere · confirmare + ireversibilă · toate · API: remove_teammate) [cheie 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… (citire · — · toate · 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). (scriere · confirmare · toate · API: update_teammate_role) [cheie manager]
lg teammates set-status — Activate or deactivate a team member. (scriere · confirmare · toate · API: set_teammate_status) [cheie 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). (scriere · confirmare + ireversibilă · transportator · API: submit_tender_bid) [primește un fișier: 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. (citire · — · transportator · 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. (scriere · confirmare + ireversibilă · expeditor · 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). (scriere · confirmare · expeditor · API: add_tender_document) [primește un fișier: 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). (scriere · confirmare · expeditor · API: create_tender) [primește un fișier: attachment_uuid]
lg tenders delete-document — Remove a specification file from one of YOUR tenders (document_id from get_tender → documents[]). (scriere · confirmare + ireversibilă · expeditor · 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). (citire · — · expeditor · API: extract_tender_specification) [primește un fișier: 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. (scriere · confirmare · expeditor · 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. (citire · — · expeditor, transportator · API: get_tender)
lg tenders list — List document-based freight tenders. (citire · — · expeditor, transportator · 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. (scriere · confirmare · expeditor · 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. (citire · — · toate · 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… (citire · — · toate · 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… (citire · — · toate · API: preview_account_closure)
lg users get — Who am I? (citire · — · toate · 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. (scriere · confirmare · expeditor, transportator · API: assign_vehicle_to_driver)
lg vehicle-assignments list — List which driver currently holds which vehicle (tractor unit / trailer). (citire · — · expeditor, transportator · API: list_vehicle_assignments)
lg vehicle-assignments revoke — Close an open vehicle assignment: the driver hands the vehicle back. (scriere · confirmare · expeditor, transportator · 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. (scriere · confirmare · expeditor, transportator · API: create_vehicle_expense) [primește un fișier: attachment_uuid]
lg vehicle-expenses delete — Delete a vehicle cost entered by mistake (duplicate, wrong plate, test entry). (scriere · confirmare + ireversibilă · expeditor, transportator · 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. (citire · — · expeditor, transportator · 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". (scriere · confirmare · expeditor, transportator · 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… (scriere · confirmare · expeditor, transportator · API: add_vehicle_document) [primește un fișier: attachment_uuid]
lg vehicles archive — Take a vehicle out of service (archive it) or put an archived one back into service. (scriere · confirmare · expeditor, transportator · 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. (scriere · confirmare · expeditor, transportator · API: create_vehicle) [primește un fișier: attachment_uuid]
lg vehicles delete — Delete a vehicle record that was created BY MISTAKE (wrong plate, duplicate). (scriere · confirmare + ireversibilă · expeditor, transportator · 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). (scriere · confirmare + ireversibilă · expeditor, transportator · 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… (citire · — · expeditor, transportator · 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… (citire · — · expeditor, transportator · 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. (citire · — · expeditor, transportator · API: lookup_vehicle)
lg vehicles update — Correct a fleet vehicle's fields: plate, kind, brand, model, model year, VIN or note. (scriere · confirmare · expeditor, transportator · 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… (scriere · confirmare · expeditor, transportator · API: update_vehicle_document)
lg wallets get — Read this company's Logistivo WALLET balance — the prepaid MONEY balance (amount + currency). (citire · — · toate · 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. (citire · — · toate · 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). (scriere · confirmare · expeditor · API: create_warehouse_area)
lg warehouse-areas delete — Delete one area/ramp of a warehouse. (scriere · confirmare + ireversibilă · expeditor · 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. (scriere · confirmare · expeditor · 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). (scriere · confirmare · expeditor · 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. (citire · — · expeditor · 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). (scriere · confirmare + ireversibilă · expeditor · API: revoke_warehouse_link)
lg warehouse-links set-status — Turn a warehouse booking link off (nobody can book through it) or back on. (scriere · confirmare · expeditor · 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. (scriere · confirmare · expeditor · API: create_warehouse)
lg warehouses delete — Delete one of this company's warehouses. (scriere · confirmare + ireversibilă · expeditor · 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… (citire · — · expeditor · 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. (citire · — · expeditor · API: list_warehouses)
lg warehouses search — Resolve a warehouse by name to its warehouse_id, with its areas. (citire · — · expeditor · 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). (scriere · confirmare · expeditor · 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. (scriere · confirmare · expeditor · API: update_warehouse)
Integrare ERP și CRM — Identitate: fără conturi de serviciu, în schimb un utilizator real
Un ERP sau un CRM se conectează la Logistivo ca un utilizator real al companiei, care deține un token de acces personal emis din panou. Un cont de serviciu sintetic — fără companie, scutit de delimitare, fără nimeni responsabil de el — nu este creat niciodată.
Aceasta este arhitectură, nu preferință. Izolarea multi-tenant se sprijină în întregime pe compania utilizatorului; pentru o identitate fără companie, domeniul de izolare devine inert, iar o singură interogare greșită pe acel token citește date care nu îi aparțin. Al doilea motiv este auditul: coloana de utilizator din registru leagă „cine a rulat asta” de o persoană; un cont de serviciu golește acea coloană de sens și lasă o integrare care emite facturi fără proprietar. Al treilea este revocarea: dacă un token aparține unei persoane, integrarea amuțește când acea persoană pleacă. Un bridge fără proprietar este bridge-ul care continuă să scrie discret ani de zile.
În practică: compania creează în panou un utilizator obișnuit (de exemplu „ERP Bridge”, deținut de un angajat anume), îi dă un rol restrâns, emite un token din sesiunea acelui utilizator și îl pune în ERP.
Acel utilizator este vizibil în sistemul de permisiuni, drepturile sale pot fi restrânse, iar token-ul său poate fi revocat separat. Ce este interzis nu este crearea unui cont — ci crearea unui cont care nu este legat de un tenant.
O integrare per token. Dacă două sisteme partajează un token, granularitatea revocării dispare: a tăia accesul CRM-ului înseamnă a-l tăia și pe al ERP-ului.
Integrare ERP și CRM — Versionare și depreciere
Răspunsul catalogului poartă un întreg contract_version; rândurile comenzilor poartă since, deprecated_at și replaced_by. Versiunea contractului crește doar la modificări care rup compatibilitatea.
Versiunea NU crește pentru: o comandă nouă, un parametru opțional nou, un câmp nou într-un răspuns. Un consumator trebuie să ignore câmpurile pe care nu le cunoaște; un client care dă eroare la un câmp necunoscut nu este conform.
Versiunea CREȘTE pentru: eliminarea sau redenumirea unei comenzi, eliminarea unui câmp din răspuns, transformarea unui parametru opțional în obligatoriu, restrângerea unui enum. Forma veche rămâne activă cel puțin două trimestre calendaristice (6 luni), cu deprecated_at și replaced_by.
Deprecierea este anunțată în catalog, nu doar într-un changelog. Deoarece clientul se construiește din catalog, o comandă cu deprecated_at setat afișează un avertisment fără nicio versiune nouă a clientului, iar integratorul îl vede în logurile sale.
Numele API este înghețat pentru totdeauna. Identitatea CLI (domeniu/verb) putea fi redefinită liber înainte de a fi anunțată; după anunț, se schimbă doar cu o creștere de versiune și o fereastră de migrare, în care perechea veche este servită ca alias.
În practică: răspunsul catalogului și antetul X-Contract-Version poartă versiunea; fiecare rând de comandă poartă since, deprecated_at, replaced_by și aliases (perechi vechi domeniu/verb). Apelarea unei comenzi depreciate funcționează în continuare și răspunde cu un antet X-Deprecated: name; deprecated_at=…; replaced_by=… plus un obiect deprecated în corp. ?domain= pe catalog rezolvă un domeniu alias vechi la comanda curentă.
Un client care înțelege versiunea 1 și întâlnește un număr mai mare ar trebui să înregistreze un avertisment și să continue; lg face exact acest lucru. Retragerile în vigoare sunt listate în promisiunea de stabilitate de mai sus.
Integrare ERP și CRM — Identificatori stabili: nu dați niciodată ERP-ului un id auto-increment drept cheie
Id-urile interne auto-increment sunt opace și delimitate per tenant: id-ul valid al altei companii vă returnează „nu a fost găsit”, nu date. Dar faptul că sunt opace nu le face chei de business. Ceea ce stochează un ERP în propria înregistrare trebuie să fie o cheie de business.
Încărcătură: code (codul clientului, de ex. FSK2158). loads get funcționează deja după cod.
Țară: ISO 3166-1 alpha-2. countries search returnează codul.
HS / tarif: codul însuși — nomenclatura este deja universală.
Factură: numărul facturii, odată emisă. O ciornă are doar un id de suprafață, iar un id de ciornă NU este o cheie de business — ERP-ul ar trebui să poarte propria referință și să nu persiste niciodată un id de ciornă.
Produs, depozit, contact: astăzi doar un id de suprafață. Regula pentru comenzile noi este explicită: orice comandă care returnează un id de suprafață returnează și cheia de business proprie a tenant-ului (SKU, cod, cod fiscal), astfel încât ERP-ul să poată face potrivirea pe partea sa.
Integrare ERP și CRM — Paginare, filtrare și sincronizare incrementală
Comenzile de listare primesc limit și returnează count. Pentru o sincronizare nocturnă, contractul se angajează la următoarele; o comandă de listare care le-a adoptat declară cursor și updated_since în JSON Schema sa, iar până atunci tratați-o ca pe o fereastră mică (plafon de 20 de rânduri, fără cursor).
Cerere: limit (1..plafonul per comandă) plus cursor (opac, doar înainte, semnat de server). offset NU se folosește — într-un tabel live, un offset se deplasează; o înregistrare inserată între două pagini face ERP-ul să sară un rând sau să-l numere de două ori, și o face în tăcere.
Răspuns: { count, total?, next_cursor|null }. count este numărul de rânduri din acest răspuns; când next_cursor este null, lista este completă. Transmiteți next_cursor înapoi neschimbat — nu este un număr de pagină și nu vă revine dumneavoastră să-l construiți.
Un cursor alterat sau străin este respins cu 422 invalid_request; un cursor este legat de compania care l-a primit și nu poate pagina datele altui tenant.
Filtrare: parametrii numiți din JSON Schema, combinați cu AND. Nu există un limbaj liber de interogare — un DSL ar fi o a doua suprafață de interogare pe care ar trebui să o apărăm.
Sincronizare incrementală: updated_since (ISO-8601, UTC) plus cursorul. Stocați cel mai nou updated_at pe care l-ați văzut și transmiteți-l înapoi la următoarea rulare; fără el, fiecare ERP preia totul din nou în fiecare oră.
Referință externă: comenzile de scriere acceptă external_ref (propria dumneavoastră cheie de document), unică per companie; o a doua creare cu același external_ref este respinsă în loc să fie duplicată, iar list/get îl returnează astfel încât să puteți potrivi înregistrările pe partea dumneavoastră.
Integrare ERP și CRM — Limite de rată
Cheia limitei este token-ul, nu IP-ul: un ERP vine din spatele unui singur NAT, iar o limită bazată pe IP ar număra o întreagă companie ca un singur utilizator. Două integrări cu două chei nu își consumă niciodată una alteia cota — al doilea motiv pentru „o integrare per cheie”.
Descoperire fără autentificare (public/cli/catalog): 30 pe minut. Este un dicționar, nu o sursă de date; citiți-l o dată când vă scrieți bridge-ul, niciodată într-o buclă de producție.
Endpoint-uri de catalog (GET common/commands, GET common/commands/{name}): 120 pe minut per token. Catalogul se schimbă rar și răspunde cu 304 la If-None-Match; nu îl preluați din nou înaintea fiecărei comenzi — lg îl păstrează în cache timp de o oră.
Comenzi de citire (POST common/commands/{name} cu read_only: true): 120 pe minut per token.
Comenzi de scriere (POST common/commands/{name} cu read_only: false; un nume necunoscut se contorizează tot aici): 30 pe minut per token. Scrierile au efecte secundare; o buclă scăpată de sub control este facturată.
Comenzi care consumă credite (credit_cost din rândul de catalog nu este zero — de exemplu tariffs inquiry și export-documents generate): limita reală o reprezintă CREDITELE, nu numărul de cereri. Un răspuns 200 poate să fi consumat un credit.
Plafoane zilnice per companie, partajate cu panoul: comenzile care trimit e-mail sau push către persoane din afara companiei dumneavoastră consumă din 300 de notificări de ieșire pe zi, iar pornirea urmăririi plătite a containerelor sau navelor din 100 pe zi. Peste plafon, o comandă răspunde cu DAILY_LIMIT_REACHED și retry_after; încărcările de fișiere au propriile plafoane (vedeți Comenzi care primesc fișiere).
429 poartă întotdeauna Retry-After și un corp { error_code: "rate_limited", retry_after, limit, bucket }; respectați-l în loc să inventați o întârziere fixă. Catalogul publică valorile curente sub rate_limits.
Integrare ERP și CRM — Lucruri pe care nu le vom face
Aceasta este adesea cea mai utilă parte a unui contract: a ști ce nu va sosi niciodată vă permite să proiectați ținând cont de asta.
Niciun cont de serviciu și nicio entitate (principal) care să nu fie legată de un tenant.
Nicio plată, niciun număr de card și niciun consimțământ legal prin API sau printr-un chat. Acești pași rămân în browserul persoanei; o comandă vă oferă linkul.
Nicio a doua cale: nu există acces direct la baza de date, nici acces shell și nici un endpoint de operații în masă care să ocolească punctul unic de aplicare. Poarta de rol, poarta de confirmare, idempotența și registrul de audit sunt aplicate doar acolo.
Ramificarea după textul mesajelor de eroare nu este suportată; textul este localizat și se schimbă fără preaviz.
Fără paginare cu offset.
Folosirea unui id de suprafață drept cheie de business în ERP-ul dumneavoastră nu este suportată.
Webhook-urile de ieșire nu sunt înghesuite în acest contract — dar acum EXISTĂ și sunt documentate pe această pagină (secțiunea despre webhook-uri de mai sus). Catalogul este o suprafață PULL, iar fluxul de evenimente este un contract SEPARAT: numele evenimentelor și schema payload-ului sunt versionate după propriile reguli și nu sunt legate de versiunea contractului catalogului de comenzi.
Catalogul lizibil automat
Această pagină a fost scrisă pentru oameni. Pentru un asistent AI sau un client automat, aceleași informații există ca o copie structurată, fără autentificare.
GET /api/public/cli/catalog nu necesită autentificare și returnează identitatea publică a comenzilor: numele API înghețat, identitatea CLI domeniu/verb, descrierea, parametrii JSON Schema, flag-urile read_only, confirmation_needed și irreversible, credit_cost și câmpurile de acces key_level, permission, file_params, secret_parameters și cli_only. Nu returnează date personale, date ale tenant-ilor sau înregistrări de exemplu — doar ce este suprafața.
Modul corect în care un agent extern îl poate folosi: citește catalogul, explică în PROPRIILE cuvinte ce operațiuni sunt posibile și, când este nevoie de execuție, îl îndrumă pe utilizator să o ruleze în propriul mediu, cu propriul token. Agentul nu cere, nu generează și nu transmite niciodată token-ul unui utilizator.
Conectarea Logistivo la un asistent AI pentru înscriere și cereri de transport este un canal separat, cu propria pagină:
Catalogul nu necesită autentificare; execuția, da. Nu există nicio modalitate de a rula o comandă în numele unui agent — ceea ce rulează este întotdeauna identitatea proprie a utilizatorului.
O parolă Logistivo, un cod de verificare sau un token de acces nu trec niciodată printr-un chat. Nu construiți un flux care cere, generează sau transmite așa ceva.
Dacă o comandă este ireversibilă scrie în catalog. Nu sugerați niciodată „hai să încercăm” pentru o comandă cu irreversible: true.
Comenzile al căror credit_cost nu este zero (de exemplu tariffs inquiry și export-documents generate) au un rezultat bănesc; nu le apelați într-o buclă automată.
Plățile, numerele de card și consimțământul legal nu trec niciodată printr-un chat sau printr-un agent. Oferiți în schimb linkul din handoff-links generate; persoana finalizează pasul în propriul browser.
Un agent care acționează cu cheia unui utilizator ar trebui să apeleze mai întâi users get: returnează rolul, nivelul de acces al cheii, permisiunile efective și dacă un consimțământ în așteptare sau o verificare a telefonului blochează scrierile — anticipați refuzurile în loc să le colecționați.
O versiune în text simplu a acestei pagini se află la /cli.md; folosiți-o dacă parsați markdown mai fiabil decât HTML.
Definiția lizibilă automat: OpenAPI 3.1 și Postman
Catalogul de mai sus este formatul propriu al Logistivo. Aceleași informații sunt publicate și în două formate standard din industrie pe care instrumentele dumneavoastră le înțeleg deja: o definiție OpenAPI 3.1 și o colecție Postman. Niciuna nu este scrisă de mână — ambele sunt generate din registrul live de comenzi la fiecare cerere, deci nu se pot învechi.
Definiția ESTE catalogul, nu o a doua realitate. Fiecare comandă apare ca o operațiune POST /api/common/commands/; schema corpului este propria JSON Schema a comenzii (octet cu octet ce vede asistentul), schema răspunsului este plicul comun, flag-urile de poartă (read_only, confirmation_needed, irreversible și badge-ul de credit) stau în extensia x-logistivo, iar cheile de eroare de business stau sub x-error-keys. O comandă retrasă este marcată deprecated: true și rămâne apelabilă pe durata ferestrei sale de șase luni.
Pe lângă suprafața de comenzi, în definiție se află și endpoint-urile REST care poartă contractul de integrare: 10 endpoint-uri de listare cu sincronizare incrementală (updated_since + cursor + limit) și 7 endpoint-uri de scriere care acceptă propria dumneavoastră cheie (external_ref). Suprafața REST a Logistivo este mult mai mare de atât; restul este lăsat deoparte INTENȚIONAT. Acele payload-uri sunt contractul propriu al produsului, iar o schemă scrisă din presupuneri v-ar strica clientul generat la primul apel — și ați căuta bug-ul în codul dumneavoastră, nu în al nostru.
Definiția este generată pentru ROLUL celui care o cere: comanda unui alt rol nu intră niciodată în document, pentru că o definiție este un contract, nu un dicționar, iar tot ce conține trebuie să fie apelabil cu acel token. Versiunea fără autentificare este reuniunea celor trei roluri și, acolo, fiecare operațiune indică sub x-logistivo.roles ce roluri o văd.
Nu ne credeți pe cuvânt — verificați: npx @redocly/cli lint logistivo-openapi.json trece cu zero avertismente.
GET /api/common/spec/openapi.json — Definiția OpenAPI 3.1 pentru rolul token-ului dumneavoastră. Poartă un ETag; If-None-Match vă dă un 304, astfel încât să nu o descărcați din nou la fiecare build.
GET /api/common/spec/postman.json — Același perimetru ca o colecție Postman v2.1, cu variabilele base_url și token și cu dosarele deja grupate pe domenii de comenzi.
GET /api/public/cli/openapi.json — Versiunea fără autentificare — reuniunea celor trei roluri. Pentru proiectarea și estimarea costului bridge-ului înainte de a avea un token.
GET /api/public/cli/postman.json — Colecția Postman fără autentificare: un singur fișier pe care îl puteți da echipei dumneavoastră.
559 de operațiuni — 519 de comenzi + 36 de operațiuni REST și de control + 4 endpoint-uri de catalog și de identitate. Cifrele de pe această pagină nu sunt tastate de mână; sunt numărate din documentul live la fiecare cerere, așa că în ziua în care se lansează o comandă cresc și aici — și se adună corect.
Schema de securitate — bearerAuth: un token Passport emis pentru un utilizator real. O cheie cu scope de citire poate apela doar operațiunile marcate x-logistivo.read_only: true; o încercare de scriere returnează 403 ÎNAINTE de poarta de confirmare, astfel încât o cheie doar de citire nu vede niciodată un 409.
Fiecare ramură de eroare este descrisă explicit — Fiecare operațiune descrie separat 401/403/404/409/422/429/500. Cele două sensuri ale lui 409 (confirmare necesară / conflict de idempotență) și cele două sensuri ale lui 422 (eroare de schemă / respingere de business) sunt distincte în document, astfel încât generatorul dumneavoastră nu le contopește într-o singură ramură.
Fără timestamp — Documentul nu conține momentul generării. Același catalog produce aceiași octeți, de aceea ETag-ul chiar funcționează, iar o definiție pe care o puneți în controlul versiunilor nu pare „modificată” la fiecare descărcare.
Nu am inventat payload-urile produsului — La endpoint-urile REST de scriere este descris doar câmpul de contract (external_ref); restul corpului rămâne deschis ca additionalProperties: true, iar cititorul este îndrumat spre documentația produsului. O definiție incompletă, dar adevărată, este mai bună decât una completă, dar inventată.
Lista cheilor de eroare per operațiune NU este exhaustivă — x-error-keys listează doar cheile care rezultă cu certitudine din înregistrarea proprie a comenzii și spune acest lucru prin x-error-keys-exhaustive: false. Dicționarul complet se află la rădăcina documentului; tratați orice cheie pe care nu o recunoașteți ca pe un eșec generic. O „listă completă” fabricată v-ar fi împins să nu scrieți niciodată ramura implicită.
Instrumentele de descoperire nu sunt în definiție — search_commands, run_command și list_capabilities există doar în bucla de chat și nu pot fi apelate prin HTTP. Dacă ar fi fost incluse, generatorul dumneavoastră ar fi scris trei metode care nu ar fi putut funcționa niciodată.
Generare de cod: un client tipizat din definiție
Aveți definiția; acum generați din ea cod funcțional. `lg codegen` citește documentul OpenAPI și scrie un client într-un singur fișier, fără dependențe — TypeScript (declarații de tipuri plus un wrapper subțire de apel) sau PHP (o clasă client cu forme de array PHPDoc). Fără `npm install`, fără composer: `fetch` pe partea TypeScript, `ext-curl` pe partea PHP.
Generarea are loc pe mașina DUMNEAVOASTRĂ, nu pe serverul nostru. Nu este o preferință: fixați definiția în repository-ul dumneavoastră o singură dată (`lg spec --out=...`), iar aceeași comandă rulează la fiecare build fără rețea și fără token, astfel încât CI-ul dumneavoastră nu depinde niciodată de disponibilitatea noastră. Și cum codul generat este cod care RULEAZĂ în ERP-ul dumneavoastră, păstrarea lui în repository în loc de a-l prelua dintr-un API înseamnă că fiecare schimbare apare în `git diff`.
Clientul generat tratează corect toate cele trei căi Logistivo și află care este care din document, nu prin ghicit: fiecare operațiune își declară calea în `x-logistivo.surface`. Calea de comenzi despachetează plicul `{success, data:{…}}`; o listă REST de sincronizare NU are plic și este returnată ca atare (despachetarea ar pierde `next_cursor`); o scriere REST returnează corpul propriu al endpoint-ului din produs. Un generator de uz general nu cunoaște această distincție — al nostru o cunoaște.
Tipurile nu sunt presupuneri: interfața de argumente a fiecărei comenzi este generată chiar din JSON Schema pe care o vede asistentul. Ce este obligatoriu rămâne obligatoriu, enum-urile devin tipuri union, obiectele imbricate devin tipuri imbricate. În practică: dacă serverul cere un câmp, apelul care îl uită nu eșuează cu un 422 în producție — eșuează la compilare.
În fișier nu se scrie niciun timestamp de generare: aceeași definiție cu aceleași flag-uri produce aceiași octeți. Prin urmare, regenerarea nu face zgomot în `git diff`, iar singurul lucru care s-a schimbat cu adevărat — contractul — rămâne vizibil.
1. Fixați definiția — Definiția este generată pentru rolul dumneavoastră; fiecare operațiune din ea este apelabilă cu acel token. Faceți commit fișierului. lg login --api-key= lg spec --out=logistivo-openapi.json
2. Generați clientul — Rezultă un singur fișier, care conține ca metodă FIECARE operațiune din definiția pe care ați fixat-o: comenzile pe care le poate apela rolul dumneavoastră, endpoint-urile REST care poartă contractul de integrare și endpoint-urile de descoperire. Numărul este cel al rolului DUMNEAVOASTRĂ, nu totalul platformei — astăzi o cheie de expeditor produce 448 de metode de comandă, una de transportator 452, una de comisionar vamal 312. Generați din definiția publică fără autentificare, iar plafonul este de 559 de operațiuni. 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. Verificați, apoi folosiți — Dacă codul generat nu se compilează, vina este a noastră, nu a dumneavoastră: integritatea definiției este păzită de o verificare executabilă pe server. npx tsc --noEmit --strict --target ES2022 --module ESNext --moduleResolution bundler logistivo-client.ts php -l LogistivoClient.php
O metodă pentru fiecare operațiune — Fiecare comandă din document, fiecare endpoint REST care poartă contractul de integrare și endpoint-urile de descoperire. Generați din definiția rolului dumneavoastră și primiți doar ce puteți apela (448 de comenzi pentru un expeditor); generați din definiția publică și primiți toate cele 559 de operațiuni. În ziua în care o comandă este adăugată pe server, regenerarea o aduce; nu trebuie să așteptați nicio versiune nouă a clientului.
Tipurile argumentelor — Schema `args` a fiecărei comenzi devine o interfață (o formă de array în PHP). Câmpurile obligatorii rămân obligatorii, enum-urile devin union-uri. În TypeScript, uitarea unui câmp obligatoriu este o eroare de compilare; în PHP, IDE-ul dumneavoastră și PHPStan văd aceeași formă.
Clase de erori — Taxonomia de transport (`error_code`) și taxonomia de business (`error_key`) sunt câmpuri separate; poarta de confirmare și limita de rată sunt tipuri de eroare separate. Union-ul cheilor de eroare rămâne deschis pentru valori necunoscute — când serverul declară o cheie nouă, codul dumneavoastră nu încetează să se compileze, ci ajunge în ramura `default`.
O politică de reîncercare corectă — Reîncercările automate se aplică doar apelurilor sigure: citirilor și scrierilor care poartă o cheie de idempotență. O scriere fără cheie care expiră nu înseamnă „nu s-a scris nimic”, așa că clientul nu o repetă niciodată orbește. La un 429 așteaptă `Retry-After` indicat de server în loc să inventeze o întârziere.
Corpurile rezultatelor nu sunt tipizate — Rezultatele comenzilor revin ca `unknown` (`mixed` în PHP), din același motiv ca în definiția însăși: formele rezultatelor sunt output-ul de business al comenzii, nu parte a contractului. Un tip de rezultat ghicit ar începe să mintă prima dată când un câmp se mută.
Fișierul generat nu se editează manual — Este un output, nu o sursă. Dacă aveți nevoie de comportament suplimentar, înfășurați clasa generată; orice scrieți în interiorul ei se pierde la următoarea generare.
Instrumentele de descoperire nu sunt generate — `search_commands`, `run_command` și `list_capabilities` trăiesc doar în bucla de chat și nu pot fi apelate prin HTTP; lipsesc din definiție și, prin urmare, din client. Includerea lor ar fi însemnat scrierea a trei metode care nu funcționează niciodată.
Perimetru onest
Am prefera să extindem această secțiune decât să o restrângem. Valoarea unui contract de integrare stă mai puțin în ceea ce promite și mai mult în cât de clar spune ce nu face.
CLI-ul rulează în contextul unui utilizator al tenant-ului — Fiecare comandă rulează sub compania și rolul utilizatorului al cărui token este prezentat. Un mod de operator al platformei — un mod administrativ care citește date din mai multe companii — se află în afara acestei suprafețe și nu va fi deschis de aici.
Lista dumneavoastră de comenzi depinde de rol — Un cont de expeditor vede 448 de comenzi, un transportator 452, un comisionar vamal 312, un afiliat 55. Dacă o comandă lipsește din catalogul dumneavoastră, verificați mai întâi rolul; dacă este listată, dar refuzată, verificați scope-ul și nivelul de acces al cheii. Conturile de șofer nu au deloc acces la această suprafață.
Unele comenzi consumă credite — Interogările de tarife, generarea de documente și alte câteva comenzi bazate pe AI consumă din soldul de credite al planului dumneavoastră. Fiecare rând din catalog poartă credit_cost {mode, credits}: fixed este taxa exactă per apel, read_only nu taxează niciodată, iar computed înseamnă că taxa depinde de apel — credits este atunci null, iar cifra reală apare pe cardul de confirmare. Un preflight (dry_run) vă spune cât ar costa un apel și dacă soldul îl acoperă.
Cheile de integrare nu pot conduce chatul din panoul de control — Asistentul AI din panoul de control este pentru oameni. Pornirea sau continuarea unei rulări a asistentului cu o cheie de integrare este refuzată cu 403; agenții folosesc endpoint-urile de comenzi, lg sau canalul MCP, unde fiecare comandă rulează la nivelul de acces al cheii, iar scrierile ei sunt înregistrate ca scrieri de integrare.
Catalogul nu înlocuiește API-ul REST existent — Suprafața REST care alimentează aplicațiile web și mobile Logistivo rămâne unde este și se află în continuare sub regula de compatibilitate înapoi. Catalogul de comenzi nu înlocuiește CRUD-ul pe resurse; el este stratul VERBELOR — modul unic, auditat, de a face un lucru.
Comenzile de listare returnează astăzi ferestre mici — Până când o comandă de listare nu declară cursor și updated_since în schema sa, plafonul ei este de 20 de rânduri, fără cursor. Nu este concepută pentru extragerea unei copii complete a datelor dumneavoastră; sincronizarea incrementală se implementează comandă cu comandă.
Întrebări frecvente
La ce folosește Logistivo CLI?
Execută munca din contul dumneavoastră Logistivo dintr-un terminal, dintr-un script sau din propriul agent AI: încărcături și curse, cereri de transport, oferte și licitații, flotă, șoferi și cheltuielile lor, documente, contacte și conturi curente, facturi și contabilitate, depozit și stoc, membri ai echipei, tarife HS și taxe antidumping. Fiecare acțiune de scriere din panou are o comandă; plățile, consimțământul legal și închiderea contului rămân în mod deliberat în browser. Aceleași comenzi pot fi apelate prin HTTP pentru integrări ERP/CRM și prin canalul MCP.
Cum sunt denumite comenzile în Logistivo CLI?
Forma este lg --parameter=value. Domeniul este o entitate la plural (loads, demands, invoices, export-documents), iar verbul provine dintr-un vocabular închis care crește doar prin decizie deliberată (list, get, create, update, search, set-status, generate și așa mai departe). Toate verbele unei entități stau într-un singur domeniu, iar perechea (domeniu, verb) este unică în întregul catalog.
Cum mă autentific în CLI?
Interactiv, lg login afișează un cod de aprobare pe care îl confirmați în browser după ce vă autentificați în Logistivo — în terminal nu se tastează nicio parolă și nicio cheie, iar sesiunea rămâne autentificată și se reînnoiește singură până când rulați lg logout. lg login --password (e-mail și parolă) rămâne ca variantă de rezervă. Pe servere și în CI, folosiți o cheie de integrare emisă în panou sau cu lg keys create: lg login --api-key o salvează într-un profil local, sau o puteți pune în variabila de mediu LOGISTIVO_TOKEN. Prin HTTP, token-ul călătorește în antetul Authorization: Bearer.
Pot crea un cont de serviciu pentru integrarea ERP?
Nu. O integrare se conectează cu token-ul unui utilizator real al companiei, creat în panou. O identitate sintetică fără companie face inertă izolarea multi-tenant, golește de sens coloana „cine a rulat asta” din registrul de audit și lasă în urmă un bridge care nu amuțește atunci când proprietarul său pleacă. Modelul corect este un utilizator dedicat, cu un rol restrâns și un proprietar numit.
Are Logistivo un mediu de test (sandbox)?
Da, și este self-service: pentru compania dumneavoastră se deschide un tenant sandbox separat — același cod, același catalog de comenzi, propriul registru de credite. Mediul este dedus din compania cheii și nu poate fi transmis odată cu cererea; un apel făcut cu profilul greșit se oprește pe server cu 403 ENVIRONMENT_MISMATCH. O cerere de transport deschisă în sandbox nu ajunge niciodată la transportatori reali, un eveniment din sandbox nu este livrat niciodată abonamentului dumneavoastră webhook live, iar soldul live nu se modifică. Endpoint-uri: POST /api/common/integration-sandbox (deschidere), POST /api/common/integration-sandbox/keys (cheie), GET /api/common/integration-sandbox/go-live (lista de verificare pentru go-live). Pe partea lg, lg --sandbox și lg --live sunt selectoare de profil pentru o singură rulare.
Cum citesc output-ul lg --json într-un script?
Output-ul este întregul plic HTTP: { "success": bool, "data": { "contract_version", "command", "status", "result" }, "code", "message" }. Payload-ul de business se află sub .data.result; la comenzile de listare, rândurile sunt .data.result., numărul este .data.result.count, iar pagina următoare este .data.result.next_cursor. Așadar, calea jq corectă arată astfel: lg loads list --json | jq -r '.data.result.loads[].load_code'. O cale care sare peste plic nu dă eroare, ci returnează în tăcere null — într-un script de supraveghere, asta devine o alarmă care nu se mai oprește. Singura excepție este /api/public/status, al cărui corp este în mod deliberat fără plic.
Dacă trimit aceeași cerere de două ori, obțin înregistrări duplicate?
Nu, dacă ați trimis un idempotency_key. Un al doilea apel cu aceeași cheie nu rulează din nou comanda; returnează primul rezultat cu statusul replayed. Cheia ar trebui să fie un UUID și trebuie să rămână ACEEAȘI între reîncercări — a genera o cheie nouă la fiecare încercare este totuna cu a nu folosi idempotența.
Ce face --yes?
Trece de poarta de confirmare. Când o comandă supusă confirmării este apelată fără --yes, nu se schimbă nimic: serverul rezumă într-o propoziție ce urmează să facă, spune dacă acțiunea este ireversibilă și se oprește (HTTP 409, cod de ieșire CLI 4). Repetarea comenzii cu --yes execută munca.
Cum detectez într-un script o comandă eșuată?
Citiți codul de ieșire, niciodată textul mesajului: 0 succes, 1 respingere de către o regulă de business, 2 eroare de comandă sau de argument, 3 eroare de autentificare sau de rol, 4 confirmare necesară. Prin HTTP, echivalentele sunt 200, 422, 404, 403 și 409, iar câmpul error_code din corp este stabil. MESAJUL de eroare este localizat și se schimbă fără preaviz.
Cum descopăr programatic comenzile disponibile?
GET /api/public/cli/catalog pentru descoperire fără autentificare și GET /api/common/commands pentru lista pe care contul dumneavoastră o poate vedea efectiv. Ambele returnează parametrii JSON Schema ai fiecărei comenzi; construiți-vă clientul pe baza lor, în loc să scrieți în cod o listă fixă de comenzi.
Trebuie să-mi actualizez clientul când se adaugă o comandă nouă?
Nu. Clientul își preia lista de comenzi din catalog, așa că o comandă adăugată pe server apare fără o versiune nouă a clientului. O actualizare este necesară doar pentru o modificare care rupe compatibilitatea și crește versiunea contractului, iar în acest caz forma veche rămâne activă cel puțin șase luni.
Înlocuiește CLI-ul API-ul REST existent?
Nu. Suprafața REST care alimentează aplicațiile web și mobile rămâne pe loc. Catalogul de comenzi nu înlocuiește CRUD-ul pe resurse; el este stratul verbelor — modul unic de a efectua o acțiune, protejat de poarta de rol și de poarta de confirmare și auditat.
Cum obțin o cheie API Logistivo și ce poate face?
Un manager cu permisiunea de gestionare a echipei o emite în panou, la Settings › Integration keys, sau dintr-un terminal cu lg keys create. Cheia acționează în numele unui membru real al echipei și are trei setări independente: scope-ul (read deschide catalogul și comenzile care nu scriu, write deschide orice comandă — poarta de confirmare rămâne așa cum este), permisiuni opționale pe domenii și un nivel de acces — employee, implicit, pentru operațiunile de zi cu zi, sau manager pentru echipă, setări, chei și bani. Este afișată o singură dată și nu este stocată pe server; poate fi rotită, transferată și revocată. Când membrul în numele căruia acționează pleacă, cheia se închide și ea. Nu există cont de serviciu.
Ce se întâmplă dacă refolosesc o cheie de idempotență pentru o altă comandă?
Serverul răspunde cu 409 idempotency_conflict și numește comanda pentru care a fost folosită prima dată cheia; nu rulează nimic și nu se reia nimic. Cheile sunt limitate la compania dumneavoastră, legate de o singură comandă și blocate timp de 24 de ore — după aceea, aceeași cheie pornește o execuție nouă.
Cum se aplică limitele de rată integrării mele?
Per token, pe minut, în trei categorii: citiri de catalog 120, comenzi de citire 120, comenzi de scriere 30. Un 429 poartă întotdeauna Retry-After și un corp cu retry_after, limit și bucket; așteptați atât și reîncercați. Catalogul publică valorile curente sub rate_limits.
Cum deosebesc o respingere de business de o eroare de transport?
Ramificați mai întâi după error_code: failed (422) este o respingere de business și poartă un error_key stabil, precum INSUFFICIENT_CREDITS sau NOT_FOUND; server_error (5xx) și erorile de rețea se reîncearcă cu aceeași cheie de idempotență; la rate_limited (429) se așteaptă. Nu ramificați niciodată după textul erorii.
Trimite Logistivo webhook-uri? Pentru ce evenimente?
Da. Înregistrați o adresă https și alegeți evenimentele care vă interesează; un POST semnat sosește atunci când acestea au loc. Astăzi vă puteți abona la 13 evenimente: încărcătură creată/status schimbat/șofer alocat, cerere de transport creată și status schimbat, ofertă plasată/revizuită/acceptată, factură ciornă/emisă/anulată și rezervare de depozit creată/status schimbat. Fiecare nume este susținut de o clasă de eveniment care este emisă efectiv — nimic nu este anunțat și apoi niciodată declanșat, pentru că un astfel de eveniment este un eșec tăcut pe care integratorul îl așteaptă la nesfârșit. Abonamentele se creează la Settings › Integration › Webhooks sau dintr-un terminal cu lg webhooks create.
Cum verific semnătura unui webhook Logistivo?
Fiecare cerere poartă un antet X-Logistivo-Signature: t=,v1=. Șirul semnat este ".", algoritmul este HMAC-SHA256, iar cheia este secretul abonamentului. Patru reguli: (1) verificați octeții BRUȚI — decodarea și reserializarea corpului (JSON.stringify / json_encode) transformă aceleași date în octeți diferiți, iar semnătura nu se mai potrivește; aceasta este cea mai frecventă greșeală; (2) verificați timestamp-ul și respingeți orice cerere pentru care |now − t| > 300 s, chiar dacă semnătura este corectă; (3) comparați în timp constant cu hash_equals / timingSafeEqual; (4) deduplicați după event_id, nu după id-ul livrării — event_id se păstrează la reluare, în timp ce id-ul livrării se schimbă. Receptoare funcționale pentru Node și PHP se află în examples/webhook-receiver/ din repository și se testează singure cu --selftest.
Ce se întâmplă dacă un webhook nu poate fi livrat? Pierd evenimentul?
Nu. Dacă receptorul dumneavoastră nu returnează 2xx, livrarea intră în programul de reîncercări: intervale (în secunde) 60 · 300 · 1800 · 7200 · 21600, 6 încercări în total, o fereastră de aproximativ 8,6 ore. FIECARE eșec, cu excepția 410 Gone, este reîncercat, inclusiv 4xx — pierderea unui eveniment de business costă mai mult decât câteva cereri în plus. După 10 livrări consecutive epuizate, abonamentul este dezactivat, iar motivul este înregistrat, astfel încât întrebarea „de ce nu sosește nimic” rămâne cu răspuns. Registrul de livrări păstrează fiecare încercare (cod de status, durată, eroare), iar o livrare individuală poate fi retrimisă din panou sau cu lg webhooks replay. Sincronizarea incrementală (updated_since + cursor) rămâne în continuare plasa de siguranță.
Poate agentul meu AI să facă tot ce poate face un utilizator în panou?
Aproape tot. Fiecare acțiune de scriere din panou are o comandă — măsurat față de endpoint-urile de scriere ale panoului, 100% dintre cele aflate în perimetru sunt acoperite — iar aceleași comenzi sunt deschise pentru lg, pentru HTTP și pentru canalul MCP. Excepțiile deliberate sunt pașii legați de identitate și de bani: autentificarea, cumpărarea unui pachet, adăugarea unui card cu 3D Secure, aprobarea textelor legale și închiderea unui cont rămân în browserul persoanei, iar lg handoff-links generate returnează linkul pentru ele. Cheile de integrare, webhook-urile și sandbox-ul se gestionează cu comenzi încorporate în lg, pentru că returnează secrete o singură dată.
Pot transmite comenzilor fișiere, cum ar fi PDF-uri sau fotografii, din CLI sau din API?
Da. Cu lg, puneți @ în fața unei căi locale (--attachment_uuid=@./cmr.pdf), iar lg încarcă mai întâi fișierul; --file este o scurtătură atunci când o comandă are un singur câmp de fișier, iar lg upload doar încarcă. Prin HTTP, trimiteți fișierul ca multipart la POST /api/common/commands:upload și transmiteți comenzii attachment_uuid returnat; clienții MCP folosesc instrumentul upload_attachment. Tipul este detectat din conținut, încărcările aparțin utilizatorului și rămân utilizabile 24 de ore, iar încărcarea din nou a aceluiași fișier returnează același id.
Care este diferența dintre o cheie de integrare employee și una manager?
Nivelul de acces decide cât de grea poate fi munca pe care o face o cheie. O cheie employee, implicită pentru cheile noi, rulează operațiunile de zi cu zi: încărcături, cereri de transport, oferte, curse, flotă, documente și contacte. O cheie manager poate face și muncă de management — membri ai echipei și roluri, setările companiei, chei de integrare, conturi bancare, carduri salvate, plăți către afiliați. O cheie nu are niciodată mai multe drepturi decât persoana în numele căreia acționează, iar o cheie employee care apelează o comandă de manager primește INSUFFICIENT_KEY_LEVEL. Schimbați nivelul în panou sau cu lg keys update --access-level=manager.
Poate un afiliat (partener de recomandare) să folosească CLI-ul?
Da. Un cont de afiliat primește un catalog propriu — 55 de comenzi pentru recomandări, lead-uri, note și sarcini CRM, prezentări de vânzare, câștiguri și plăți — și îl folosește din lg, prin HTTP sau prin MCP, ca orice alt rol. Solicitarea sau anularea unei plăți și schimbarea contului bancar pentru plăți necesită o cheie de nivel manager și o confirmare. O companie care este și expeditor, transportator sau comisionar vamal vede ambele cataloage.
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.