Documentație API
API REST pentru integrare externă. Accesează articole, stoc, comenzi, recepții și altele prin Bearer token.
Prezentare generală
API-ul permite sistemelor externe (ERP, aplicații mobile) să citească și să scrie date operaționale în 3PL Client (articole, comenzi, recepții, retururi, webhooks și date de referință). Autentificarea folosește Bearer tokens (Laravel Sanctum). Toate endpoint-urile de date necesită autentificare.
Fiecare rută necesită și modulul API plus modulul de conținut corespunzător (ex. inbound pentru recepții) activ pentru compania din X-Company-Id.
URL de bază: https://flowscmc.ro/api
Specificație OpenAPI 3.0 (citibilă de unelte), aliniată la aceste endpoint-uri: https://flowscmc.ro/openapi.json
Autentificare
Obține un Bearer token trimitând email și parolă:
POST https://flowscmc.ro/api/auth/token
Content-Type: application/json
{
"email": "your@email.com",
"password": "your-password"
}
// Response:
{
"token": "1|abc123...",
"user": { "id": 1, "name": "...", "email": "..." }
}
Folosește tokenul în toate request-urile ulterioare:
Authorization: Bearer 1|abc123...
Pentru a revoca tokenul curent (deconectare):
POST https://flowscmc.ro/api/auth/revoke
Authorization: Bearer 1|abc123...
Context companie
Pentru a filtra datele după companie, trimite header-ul opțional:
X-Company-Id: 123
Utilizatorul trebuie să aibă acces la compania specificată. Fără acest header, super-admin văd toate companiile; utilizatorii obișnuiți văd compania lor principală.
Cantități UM 3PL pe linii
La definirea articolului, prima UM din sistem (câmpul um3pl, UM 3PL în interfață) trebuie să fie cea pentru manipularea fizică în depozit. UM2 și UM3 sunt pentru nivele superioare de ambalare, dacă este nevoie.
Comenzile de achiziție, comenzile de vânzare, recepțiile și retururile folosesc pe linie câmpurile um3pl și quantity_um3pl. Puteți trimite zecimale cu virgulă (ex. 1,5); API-ul normalizează la punct înainte de validare.
Dacă articolul impune cantități întregi pe UM 3PL sau catalogul UM al furnizorului 3PL marchează acel cod ca „doar întregi”, quantity_um3pl trebuie să fie număr întreg; altfel validarea eșuează cu răspunsul standard de erori.
Integrare eTSM inbound (Bearer partajat, fără Sanctum)
Configurați ETSM_INBOUND_BEARER_TOKEN în mediu. Header: Authorization: Bearer <acel token>. Pentru recepții: POST /api/integrations/etsm/receptions cu același corp JSON ca POST /api/receptions și X-Company-Id = id-ul companiei client. GET /api/integrations/etsm/ping verifică tokenul.
GET https://flowscmc.ro/api/integrations/etsm/ping
Authorization: Bearer <ETSM_INBOUND_BEARER_TOKEN>
POST https://flowscmc.ro/api/integrations/etsm/receptions
Authorization: Bearer <ETSM_INBOUND_BEARER_TOKEN>
X-Company-Id: 123
Content-Type: application/json
{ ... same JSON as POST /api/receptions ... }
Paginare
Endpointurile de listă suportă paginarea prin parametri de interogare:
?page=1&per_page=25
Implicit per_page: 25. Maxim per_page: 100 (200 pentru stoc). Răspunsul include meta și linkuri.
Endpoint-uri disponibile
| Metodă | Criteriu de eficacitate | Descriere |
|---|---|---|
GET |
/api/health |
Health check pentru monitoring (fără autentificare) |
GET |
/api/integrations/etsm/ping |
Verificare conectivitate eTSM (Bearer partajat; 503 dacă tokenul nu e configurat) |
POST |
/api/integrations/etsm/receptions |
Creare recepție din eTSM (obligatoriu X-Company-Id; aceleași reguli ca /api/receptions) |
GET |
/api/companies |
Companii client 3PL accesibile utilizatorului autentificat (selector în playground) |
GET |
/api/articles |
Listă articole (paginată) |
GET |
/api/articles/sync |
Sincronizare incrementală articole (updated_since, cursor) |
POST |
/api/articles |
Creare articol |
GET |
/api/articles/{id} |
Detalii articol |
PUT |
/api/articles/{id} |
Actualizare articol |
GET |
/api/stock |
Niveluri stoc (paginate, max 200/pagină) |
GET |
/api/sales-orders |
Comenzi de vânzare (paginate) |
POST |
/api/sales-orders |
Creare comandă de vânzare |
GET |
/api/sales-orders/{id} |
Detalii Comandă de Vânzare |
PUT |
/api/sales-orders/{id} |
Actualizare comandă de vânzare |
GET |
/api/purchase-orders |
Comenzi de achiziție (paginate) |
POST |
/api/purchase-orders |
Creare comandă de achiziție |
GET |
/api/purchase-orders/{id} |
Detalii Comandă de Achiziție |
PUT |
/api/purchase-orders/{id} |
Actualizare comandă de achiziție |
GET |
/api/receptions |
Recepții (paginate) |
POST |
/api/receptions |
Creare recepție |
GET |
/api/receptions/{id} |
Detalii Recepție |
PUT |
/api/receptions/{id} |
Actualizare recepție |
GET |
/api/returns |
Retururi (limită 100) |
POST |
/api/returns |
Creare retur |
GET |
/api/returns/{id} |
Detalii Retur |
GET |
/api/webhooks |
Listă webhooks |
POST |
/api/webhooks |
Creare webhook |
GET |
/api/webhooks/{id} |
Detalii webhook |
PUT |
/api/webhooks/{id} |
Actualizare webhook |
DELETE |
/api/webhooks/{id} |
Ștergere webhook |
GET |
/api/clients |
Listă companii client 3PL (paginată) |
GET |
/api/clients/{id} |
Detalii companie client 3PL |
GET |
/api/partners |
Listă parteneri (paginată) |
GET |
/api/partners/{id} |
Detalii partener |
GET |
/api/warehouses |
Listă depozite (paginată) |
GET |
/api/warehouses/{id} |
Detalii depozit |
GET |
/graphql |
Endpoint GraphQL – Interogare articole și alte date prin GraphQL. Necesită token Bearer și header X-Company-Id. |
Endpoint GraphQL
Interogare articole și alte date prin GraphQL. Necesită token Bearer și header X-Company-Id.
URL de bază: https://flowscmc.ro/graphql
Exemplu interogare – listă articole:
POST https://flowscmc.ro/graphql
Authorization: Bearer YOUR_TOKEN
X-Company-Id: 1
Content-Type: application/json
{
"query": "{ articles(limit: 10) { id article_code description } }"
}
Folosiți același token Bearer și antetul X-Company-Id ca pentru endpointurile REST.
Health check (JSON)
GET /api/health returnează același JSON ca GET /health și GET /up (fără autentificare). Răspunsul include verificări agregate, heartbeats (nume scheduler, ultimul ping, ok), integrări și module. Dacă tabela heartbeats e goală, items conține un rând placeholder pentru cron și no_records este true până rulează scheduler-ul (heartbeat:ping).
{
"status": "healthy",
"app": { "name": "3PL", "env": "production" },
"urls": {
"app": "https://example.com",
"api": "https://example.com/api"
},
"checks": {
"database": true,
"cache": true,
"queue": true,
"redis": true,
"storage": true,
"storage_public": true,
"heartbeat": true
},
"heartbeats": {
"stale_after_minutes": 15,
"no_records": false,
"items": [
{ "name": "cron", "last_ping_at": "2026-04-09T12:00:00.123456Z", "last_ping_at_ms": 1775736000123, "ok": true }
]
},
"integrations": { "anaf": true },
"modules": [ { "slug": "api", "name": "API" } ],
"timestamp": "2026-04-09T12:00:00+00:00"
}
urls.app și urls.api provin din APP_URL (bază aplicație și /api). Prometheus: adăugați ?format=prometheus. Interfață cu heartbeats live: Platformă → Health (super-admin).
Exemplu request
curl -X GET "https://flowscmc.ro/api/articles" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "X-Company-Id: 1" \
-H "Accept: application/json"
Limitare rate
POST /api/auth/token: 10 request-uri pe minut- Endpoint-uri date: 60 request-uri pe minut
Loc de joacă API
Testează endpoint-urile API direct din această pagină. Mai întâi obține un token, apoi selectează un endpoint și trimite request-ul.