API pubblica v1
L’API REST pubblica è pensata per integrazioni server-to-server, ad esempio con software CRM o di fatturazione.
URL di base: https://auto.manisma.com/api/v1
Non usare direttamente l’API Directus e non inserire mai una chiave API in JavaScript frontend.
Creare una chiave API
Apri come Admin Gestione → Chiavi API. Dai alla chiave un nome riconoscibile e scegli gli scope:
read: contrassegna una chiave destinata alla lettura;write: crea o modifica le risorse scrivibili e usa gli endpoint di pianificazione.plan: richiede una proposta di pianificazione.
Per una normale integrazione in lettura/scrittura seleziona entrambi gli scope. Nota: il backend v1 attuale verifica write esplicitamente per POST/PATCH, ma consente GET per qualsiasi chiave attiva valida; read è quindi attualmente un’indicazione amministrativa e non ancora un blocco tecnico separato. La chiave grezza inizia con msk_, viene mostrata una sola volta e non può essere recuperata. In caso di smarrimento, crea una nuova chiave e disattiva o elimina quella vecchia.
Autenticazione
Usa una di queste intestazioni:
Authorization: Bearer msk_...
X-API-Key: msk_...
Tutti i risultati sono limitati server-side all’organizzazione della chiave. Un id di un altro tenant restituisce lo stesso 404 di un id sconosciuto.
Risorse e metodi
| Risorsa | GET elenco/dettaglio | POST | PATCH |
|---|---|---|---|
/clients |
Sì | Sì | Sì |
/jobs |
Sì | Sì | Sì |
/assets |
Sì | Sì | Sì |
/task_types |
Sì | Sì | Sì |
/materials |
Sì | Sì | Sì |
/asset_models |
Sì | No | No |
/technicians |
Sì | No | No |
In v1 non esiste un endpoint DELETE.
Elenchi e paginazione
GET /clients?limit=50&page=1
limit: da 1 a 100, predefinito 50;page: inizia da 1.search: per gli elenchi di clienti e materiali, ricerca parziale senza distinzione tra maiuscole e minuscole di testo letterale. Un segno di percentuale cerca un segno di percentuale. I clienti corrispondono per nome, e-mail o numero cliente; i materiali per SKU o nome.
{
"data": [],
"meta": { "total": 0, "page": 1, "limit": 50 }
}
Una risposta di dettaglio o scrittura usa { "data": { ... } }.
Clienti
Campi di lettura: id, tenant_id, customer_number, name, client_type, email, phone, vat_number, status, created_at, updated_at.
POST /clients richiede name. I campi di scrittura consentiti sono name, customer_number, client_type, email, phone, vat_number e status. Con PATCH sono tutti opzionali, ma deve essere presente almeno un campo valido. I campi sconosciuti e un tenant_id fornito vengono ignorati.
POST /addresses crea un indirizzo per un cliente e richiede client_id. Il cliente deve appartenere allo stesso tenant.
curl -X POST 'https://auto.manisma.com/api/v1/clients' \
-H 'Authorization: Bearer msk_...' \
-H 'Content-Type: application/json' \
-d '{"name":"Bakkerij Peeters","client_type":"b2b","email":"info@example.com"}'
Commesse
I campi di lettura includono id, tenant, numero di commessa, id cliente, titolo, descrizione, priorità, stato, durata prevista, id tecnico principale, numero di tecnici richiesti, pianificazione, id indirizzo di servizio, id tipo di attività, competenze richieste e timestamp. Le note interne e del tecnico non sono esposte.
POST /jobs richiede title. Campi consentiti:
job_number, client_id, title, description, priority, status, estimated_duration_minutes, required_technicians, scheduled_date, scheduled_start, scheduled_end, service_address_id, task_type_id, required_skills.
Quando status manca, viene usato unplanned. Quando job_number manca, Manisma genera un numero con il prefisso del tenant configurato. Con PATCH job_number, status e assigned_technician_id non sono modificabili.
Le chiavi esterne per cliente, indirizzo di servizio e tipo di attività devono appartenere allo stesso tenant.
POST /jobs/:id/assign pianifica una commessa con technician_id, scheduled_start e scheduled_end. POST /jobs/:id/unassign rimuove la sua assegnazione e la riporta nella coda non pianificata; non elimina la commessa.
Proposta di pianificazione
POST /plan restituisce una proposta di pianificazione e non modifica nulla: non crea né sposta alcuna commessa. Richiede lo scope separato plan ed è limitato a 3 chiamate per organizzazione ogni 10 minuti; le chiamate successive restituiscono un chiaro errore 429. Non usa l’IA di Manisma e non consuma le azioni IA incluse nel tuo piano Manisma, perché il tuo assistente chiamante fornisce il ragionamento.
Altre risorse
-
assets: dispositivi installati presso un cliente; scrivibili con POST e PATCH. -
task_types: scrivibili con POST e PATCH. -
materials: scrivibili con POST e PATCH; il prezzo di acquisto e la scorta sono leggibili e scrivibili. -
asset_models: sola lettura. -
technicians: nome, e-mail, telefono, stato attivo e competenze. Orari di lavoro, indirizzi e id utente non sono pubblici.
Errori e limiti
| Stato | Significato |
|---|---|
| 400 | Body non valido, campo obbligatorio mancante o PATCH senza un campo valido. |
| 401 | Chiave mancante, non valida o disattivata. |
| 403 | Chiave valida senza lo scope richiesto write o plan. |
| 404 | Record sconosciuto o di un altro tenant. |
| 429 | Limite superato. |
| 502 | Problema temporaneo con il servizio dati sottostante. |
| 503 | La limitazione delle richieste di pianificazione è temporaneamente non disponibile. |
L’API è limitata a 600 richieste al minuto per IP di origine. Costruisci i retry con backoff esponenziale per 429, 502 ed errori di rete temporanei. Non rieseguire i retry per errori di validazione senza correggere la richiesta.