WMS Agile
API Reference
REST API per 8 microservizi · JWT Bearer + API Key · OpenAPI 3.0
Autenticazione
Headers richiesti
Ottenere il JWT — POST /api/auth/login
POST /api/auth/login Content-Type: application/x-www-form-urlencoded X-API-Key: wms-demo-api-key-2026-secure email=admin%40example.it&password=Password123%21
{
"success": true,
"data": {
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"expires_in": 3600,
"user": {
"id": 1,
"email": "admin@example.it",
"role": "admin",
"tenant_id": 1
}
}
}
application/x-www-form-urlencoded (NON JSON).
Il token JWT si trova nel campo access_token.
Il carattere ! nella password va URL-encoded come %21.
Formato risposta standard
// Successo { "success": true, "data": { ... } } // Errore { "success": false, "error": "Messaggio errore", "code": 400 }
Rate Limiting
Auth Service
| Method | Path | Auth | Descrizione |
|---|---|---|---|
| POST | /api/auth/login | Nessuna | Login utente. Body form-urlencoded: email, password |
| POST | /api/auth/logout | JWT | Invalida sessione corrente |
| GET | /api/auth/me | JWT | Profilo utente autenticato |
| GET | /api/auth/users | JWT + Admin | Lista utenti del tenant |
| POST | /api/auth/users | JWT + Admin | Crea nuovo utente |
| PUT | /api/auth/users/{id} | JWT + Admin | Aggiorna utente |
| DELETE | /api/auth/users/{id} | JWT + Admin | Disattiva utente (soft delete) |
| GET | /api/auth/tenants | API Key | Lista tenant — solo superadmin |
| POST | /api/auth/tenants | API Key | Crea nuovo tenant |
| GET | /api/auth/health | Nessuna | Health check servizio |
POST /api/auth/users Authorization: Bearer eyJ... Content-Type: application/json { "email": "user@example.it", "password": "Secure2026!", "role": "operator", "first_name": "Mario", "last_name": "Rossi" }
Inventory Service
page, limit, search. Il tenant_id è estratto automaticamente dal JWT.| Method | Path | Auth | Descrizione | Parametri chiave |
|---|---|---|---|---|
| GET | /api/inventory/products | JWT | Lista prodotti con filtri | search, category, status |
| POST | /api/inventory/products | JWT | Crea prodotto/SKU | sku, name, category, uom |
| GET | /api/inventory/products/{id} | JWT | Dettaglio prodotto + stock aggregato | — |
| PUT | /api/inventory/products/{id} | JWT | Aggiorna prodotto | — |
| GET | /api/inventory/stock | JWT | Stock levels per bin | product_id, bin_code, zone_id |
| GET | /api/inventory/lots | JWT | Lista lotti con scadenza e quantità | product_id, expiry_before |
| POST | /api/inventory/lots | JWT | Crea lotto (FEFO automatico) | product_id, lot_number, expiry_date, qty |
| GET | /api/inventory/forecast | JWT | Dashboard forecast ROP per tutti i prodotti | — |
| POST | /api/inventory/forecast/calculate | JWT | Ricalcola ROP con parametri personalizzati | lead_time_days, service_level |
| GET | /api/movements | JWT | Lista movimenti stock (ingresso, uscita, trasferimento, rettifica) | limit, offset, movement_type |
| POST | /api/stock/movement | JWT | Registra nuovo movimento stock | movement_type, sku, from_bin_code, to_bin_code, quantity, lot_number, reason |
| GET | /api/cycle-counts | JWT | Lista inventari ciclici (conteggi pianificati e completati) | status, zone_id, limit |
| POST | /api/cycle-counts | JWT | Crea nuovo inventario ciclico (totale, parziale, spot) | type (full/partial/spot), zone_id, bin_code, scheduled_date |
| GET | /api/inventory/packaging | JWT | Configurazioni UOM e imballaggi | — |
| GET | /api/inventory/health | Nessuna | Health check servizio | — |
Warehouse Service
| Method | Path | Auth | Descrizione | Note |
|---|---|---|---|---|
| GET | /api/warehouse/warehouses | JWT | Lista magazzini del tenant | — |
| POST | /api/warehouse/warehouses | JWT | Crea magazzino | name, code, address |
| GET | /api/warehouse/zones | JWT | Zone del magazzino | tipi: storage, picking, receiving, shipping, quarantine |
| POST | /api/warehouse/zones | JWT | Crea zona | name, zone_type, warehouse_id |
| GET | /api/warehouse/bins | JWT | Lista bin/scaffali | zone_id, status, bin_code |
| GET | /api/warehouse/missions | JWT | Missioni attive/completate | tipi: picking, putaway, replenishment, transfer |
| POST | /api/warehouse/missions | JWT | Crea missione manuale | type, assigned_to, tasks[] |
| PUT | /api/warehouse/missions/{id}/complete | JWT | Completa missione | — |
| GET | /api/warehouse/alerts | JWT | Alert attivi | severity: info / warning / critical / emergency |
| POST | /api/warehouse/alerts/{id}/resolve | JWT | Risolvi alert | — |
| GET | /api/warehouse/slotting/proposals | JWT | Proposte slotting ABC (riassegnazione bin) | — |
| POST | /api/warehouse/slotting/apply | JWT | Applica proposta slotting | proposal_id |
| GET | /api/warehouse/ncr | JWT | Non conformità (NCR) aperte | severity: info/warning/critical/blocking |
| POST | /api/warehouse/ncr | JWT | Crea NCR | description, severity, entity_type, entity_id |
| GET | /api/warehouse/yard | JWT | Stato banchine e trailer | — |
| GET | /api/warehouse/operators | JWT | Lista operatori in turno | shift, role |
| GET | /api/warehouse/health | Nessuna | Health check servizio | — |
Inbound Service
| Method | Path | Auth | Descrizione | Parametri chiave |
|---|---|---|---|---|
| GET | /api/inbound/orders | JWT | Lista ordini inbound | stati: expected, partial, received, completed |
| POST | /api/inbound/orders | JWT | Crea ordine inbound (Purchase Order) | supplier_id, expected_date, lines[] |
| GET | /api/inbound/orders/{id} | JWT | Dettaglio ordine + righe + stato ricevimento | — |
| POST | /api/inbound/orders/{id}/receive | JWT | Avvia ricevimento merce | lines[]{product_id, qty_received, lot_number} |
| POST | /api/inbound/orders/{id}/quality-check | JWT | Registra quality check | result: pass/fail, notes |
| POST | /api/inbound/orders/{id}/putaway | JWT | Conferma put-away bin | lines[]{lpn, bin_code} |
| GET | /api/inbound/lpn | JWT | Lista LPN (License Plate Numbers) | status, bin_code |
| POST | /api/inbound/webhook/ecommerce | HMAC | Webhook WooCommerce / Shopify / Magento | order_id, items[], source |
| GET | /api/inbound/health | Nessuna | Health check servizio | — |
POST /api/inbound/webhook/ecommerce X-API-Key: wms-demo-api-key-2026-secure X-WC-Webhook-Signature: sha256=abc123... Content-Type: application/json { "order_id": "WC-1234", "items": [ { "sku": "SKU-001", "qty": 10 }, { "sku": "SKU-042", "qty": 5 } ], "source": "woocommerce" }
Outbound Service
| Method | Path | Auth | Descrizione | Note |
|---|---|---|---|---|
| GET | /api/outbound/orders | JWT | Lista ordini outbound | stati: new, wave, picking, packing, shipped |
| POST | /api/outbound/orders | JWT | Crea ordine di spedizione | customer_id, lines[], carrier_id, priority |
| POST | /api/outbound/wave | JWT | Crea wave picking (ottimizza percorsi) | order_ids[], strategy: zone/cluster/batch |
| GET | /api/outbound/wave/{id}/picks | JWT | Lista picking task per wave | — |
| POST | /api/outbound/wave/{id}/picks/{task_id}/confirm | JWT | Conferma pick singolo | qty_picked, bin_code |
| POST | /api/outbound/orders/{id}/pack | JWT | Avvia packing + genera LPN | — |
| POST | /api/outbound/orders/{id}/ship | JWT | Spedisce + genera SSCC GS1 + tracking | carrier_id, tracking_number |
| GET | /api/outbound/sscc/{code} | Pubblico | Tracking pubblico SSCC (portale tracking) | — |
| GET | /api/outbound/carriers | JWT | Carrier configurati (BRT, NCR, etc.) | — |
| GET | /api/outbound/health | Nessuna | Health check servizio | — |
00 + 0 + azienda (9 cifre) + item ref (8 cifre) + check digit (1 cifra) = 20 cifre totali. Il portale tracking pubblico e' raggiungibile a wms.agile.software/tracking/?n=TRK-...
Customers API
Anagrafica clienti: CRUD completo con tipo, SLA, priorita e corriere default.
| Method | Endpoint | Descrizione |
|---|---|---|
| GET | /api/customers | Lista clienti (filtri: search, customer_type, is_active, limit, offset) |
| POST | /api/customers | Crea cliente (code, name, customer_type, priority, sla_hours, default_carrier_code, contatti) |
| GET | /api/customers/{id} | Dettaglio cliente |
| PUT | /api/customers/{id} | Aggiorna cliente |
| DELETE | /api/customers/{id} | Elimina cliente (soft delete) |
Suppliers API
Anagrafica fornitori: CRUD con lead time, affidabilita e associazione prodotti.
| Method | Endpoint | Descrizione |
|---|---|---|
| GET | /api/suppliers | Lista fornitori (filtri: search, category, is_active, limit, offset) |
| POST | /api/suppliers | Crea fornitore (code, name, category, lead_days_default, reliability_score, country, contatti) |
| GET | /api/suppliers/{id} | Dettaglio fornitore |
| PUT | /api/suppliers/{id} | Aggiorna fornitore |
| DELETE | /api/suppliers/{id} | Elimina fornitore (soft delete) |
Carriers API
Anagrafica corrieri: CRUD con tariffe, SLA, certificazioni GDP e Cold Chain.
| Method | Endpoint | Descrizione |
|---|---|---|
| GET | /api/carriers | Lista corrieri (filtri: search, is_active) |
| POST | /api/carriers | Crea corriere (code, name, service_type, sla_hours, base_cost, cost_per_kg, max_weight_kg, gdp_certified, cold_capable) |
| GET | /api/carriers/{id} | Dettaglio corriere |
| PUT | /api/carriers/{id} | Aggiorna corriere |
| DELETE | /api/carriers/{id} | Elimina corriere (soft delete) |
Report Service
| Method | Path | Auth | Descrizione | Parametri chiave |
|---|---|---|---|---|
| GET | /api/report/dashboard | JWT | KPI principali: missioni, stock, ordini, performance | — |
| GET | /api/report/kpi | JWT | KPI dettagliati per periodo | period: today, week, month, custom; date_from, date_to |
| GET | /api/report/labour | JWT | Shift report operatori: ore lavorate, produttivita, OEE | operator_id, date |
| GET | /api/report/audit | JWT | Audit log filtrato | user, action, entity, date_from, date_to |
| GET | /api/report/forecast-summary | JWT | Riepilogo forecast e prodotti critici | — |
| GET | /api/report/inbound-performance | JWT | Performance ricevimento (lead time, errori, fornitori) | period, supplier_id |
| GET | /api/report/outbound-performance | JWT | Performance spedizione (SLA, carrier, errori picking) | period, carrier_id |
| GET | /api/report/export/csv | JWT | Export dati in CSV | entity: products, stock, orders, missions |
| GET | /api/report/health | Nessuna | Health check servizio | — |
AI Service
| Method | Path | Auth | Descrizione |
|---|---|---|---|
| POST | /api/ai/chat | JWT | Chat AI con SSE streaming. Body: {"message":"...","context":{},"stream":true} |
| GET | /api/ai/settings | JWT + Admin | Configurazione AI per tenant (modello, tools abilitati, RAG) |
| PUT | /api/ai/settings | JWT + Admin | Aggiorna config AI (Anthropic API key, modello, prompt) |
| POST | /api/ai/ingest | JWT + Admin | Ingest documenti per RAG (PDF, TXT, HTML) |
| GET | /api/realtime/stream | JWT | SSE stream realtime: alert proattivi, missioni, stock critici |
| GET | /api/ai/health | Nessuna | Health check servizio |
Accept: text/event-stream e gestire la connessione con EventSource o fetch in streaming. Il nginx gateway ha proxy_buffering off e timeout 120s.Network Service — Rete Filiera™
NET-YYYYMMDD-NNNN (es: NET-20260228-0042).
Il flusso stati e immutabile e registrato come log di eventi.
| Method | Path | Auth | Descrizione |
|---|---|---|---|
| GET | /api/network/partners | JWT | Lista partner (supplier, carrier, 3PL, client) |
| POST | /api/network/partners | JWT | Registra nuovo partner nella rete |
| GET | /api/network/orders | JWT | Ordini di acquisto/vendita nella rete (filtro per ruolo buyer/seller) |
| POST | /api/network/orders | JWT | Crea ordine di acquisto verso partner |
| PUT | /api/network/orders/{ref}/confirm | JWT | Partner (seller) conferma ordine ricevuto |
| PUT | /api/network/orders/{ref}/ship | JWT | Partner aggiorna stato a shipped |
| PUT | /api/network/orders/{ref}/receive | JWT | Buyer conferma ricezione merce |
| GET | /api/network/events | JWT | Timeline eventi ordine (immutable log) |
| GET | /api/network/notifications | JWT | Notifiche in-app per il tenant corrente |
| GET | /api/network/edi/inbound | JWT | Messaggi EDI ricevuti (X12 / EDIFACT) |
| POST | /api/network/edi/send | JWT | Invia messaggio EDI a partner |
| GET | /api/network/health | Nessuna | Health check servizio |
Codici Errore HTTP
| Codice | Significato | Causa comune |
|---|---|---|
| 200 | OK | Operazione eseguita con successo |
| 201 | Created | Risorsa creata correttamente |
| 400 | Bad Request | Body malformato o parametri obbligatori mancanti |
| 401 | Unauthorized | JWT mancante/scaduto o API Key non valida |
| 403 | Forbidden | Ruolo non autorizzato per questa azione |
| 404 | Not Found | Risorsa non trovata o appartiene a tenant diverso |
| 409 | Conflict | Risorsa gia esistente (slug, codice duplicato) |
| 422 | Unprocessable | Validazione fallita (stock insufficiente, quantita negativa, etc.) |
| 429 | Too Many Requests | Rate limit superato (100 req/min per API Key). Attendere reset. |
| 500 | Internal Server Error | Errore interno del server. Consultare i log o contattare il supporto. |
Multi-tenancy
Come funziona
Ogni endpoint filtra automaticamente i dati per il tenant_id derivato dal JWT.
Non e' necessario passare tenant_id nelle query: l'API lo estrae internamente dal token di autenticazione.
Tutte le tabelle del database contengono una colonna tenant_id e tutte le query la usano in WHERE.
?tenant_id=X per operare su tenant specifici.
Questa funzione e' riservata esclusivamente agli account con ruolo superadmin.
Architettura 4PL Multi-tenant
WMS Agile supporta la modalita' 4PL (Fourth Party Logistics): un unico operatore logistico puo' gestire magazzini per conto di piu' clienti (tenant) nella stessa istanza. Ogni tenant ha la propria vista isolata di prodotti, stock, ordini e reportistica. La Rete Filiera™ (network-ms) permette invece la comunicazione strutturata tra tenant diversi attraverso il flusso Procure-to-Pay.
Postman Collection
WMS Agile — Postman Collection v1.0
Include tutti gli 8 microservizi con autenticazione pre-impostata, variabili d'ambiente per i base URL, e un esempio funzionante per ogni endpoint. Importa il file JSON in Postman o in qualsiasi client OpenAPI 3.0.
Scarica Collection JSONQuickstart — curl
# Login
TOKEN=$(curl -s -X POST https://wms.agile.software/api/auth/login \
-H "X-API-Key: wms-demo-api-key-2026-secure" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "email=admin%40logitech-wh.it&password=Admin2026%21" \
| python3 -c "import sys,json; print(json.load(sys.stdin)['data']['access_token'])")
echo "Token: $TOKEN"
curl -s https://wms.agile.software/api/inventory/products \ -H "X-API-Key: wms-demo-api-key-2026-secure" \ -H "Authorization: Bearer $TOKEN" | python3 -m json.tool
curl -s -N -X POST https://wms.agile.software/api/ai/chat \
-H "X-API-Key: wms-demo-api-key-2026-secure" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"message":"Quanti prodotti in stock critico?","stream":true}'