API di integrazione Ciamem

Collega il tuo gestionale al centralino: rubrica, clienti, ticket e agenti — in lettura e scrittura.

Indirizzo base: https://ciamem.com/api/v1 · Richiede il pacchetto Enterprise.

🔑 Chiave👤 Rubrica🏢 Clienti🎫 Ticket🎧 Agenti openapi.json

Autenticazione

La chiave si crea dalla console (pagina API) e si vede una volta sola: noi ne conserviamo solo l'impronta.

Authorization: Bearer ciamem_live_xxxxxxxxxxxxxxxxxxxxxxxx
La chiave è un segreto da server: non metterla in un'app, in una pagina web o in un repository. Le chiamate dal browser sono deliberatamente bloccate (nessun CORS). La revoca è immediata.

Permessi

ScopeConsente
contacts:readRubrica — lettura
contacts:writeRubrica — scrittura
companies:readClienti — lettura
companies:writeClienti — scrittura
tickets:readTicket — lettura
tickets:writeTicket — scrittura
catalog:readCatalogo — lettura
catalog:writeCatalogo — scrittura (sync dal gestionale)
orders:readOrdini — lettura (estrai dal gestionale)
orders:writeOrdini — scrittura (stato, note)
agents:readAgenti — lettura
agents:writeAgenti — pausa

Regole generali

Listepaginate: ?limit= (max 200, default 50) e ?offset={ items, total, limit, offset }
Limiti120 richieste/minuto per chiave · 30 scritture/minuto · 20 ticket/ora
Errori{ "error": { "code": "…", "message": "…" } } — il code è il contratto per il tuo software
CodiceHTTPQuando
chiave_mancante401Intestazione Authorization assente.
chiave_non_valida401Chiave inesistente o revocata.
piano_non_abilitato403Il pacchetto non è Enterprise.
abbonamento_scaduto403Abbonamento scaduto.
permesso_mancante403La chiave non ha lo scope richiesto.
troppe_richieste429Oltre 120 richieste/minuto (o 30 scritture/minuto).
troppi_ticket429Oltre 20 ticket in un'ora.
dati_non_validi400Corpo della richiesta incompleto o errato.
contatto_non_trovato404Contatto inesistente.
azienda_non_trovata404Azienda inesistente.
ticket_non_trovato404Ticket inesistente.
agente_non_trovato404Agente inesistente.
azienda_protetta400L'azienda "(anonimo)" non si modifica.
endpoint_sconosciuto404Percorso non riconosciuto.

🔑 Chiave

GET /me qualsiasi chiave

Identità della chiave

Verifica che la chiave funzioni: ritorna tenant, pacchetto, permessi e limiti.

curl "https://ciamem.com/api/v1/me" \
  -H "Authorization: Bearer ciamem_live_…"
GET /catalog catalog:read

Elenco del catalogo

Prodotti e servizi del tenant. Filtri: q (nome/categoria/sku), category. Il prezzo è null se non indicato.

Parametri: q · category · limit · offset

curl "https://ciamem.com/api/v1/catalog" \
  -H "Authorization: Bearer ciamem_live_…"
POST /catalog catalog:write

Crea un articolo di catalogo

Prodotto o servizio. Il prezzo è facoltativo. Tetto: 100 articoli.

{
  "name": "Vite inox M6",
  "category": "Ferramenta",
  "price": 0.12,
  "unit": "pz",
  "sku": "VX-M6",
  "notes": ""
}
curl -X POST "https://ciamem.com/api/v1/catalog" \
  -H "Authorization: Bearer ciamem_live_…" \
  -H "content-type: application/json" \
  -d '{"name":"Vite inox M6","category":"Ferramenta","price":0.12,"unit":"pz","sku":"VX-M6","notes":""}'
PUT /catalog/:id catalog:write

Aggiorna un articolo di catalogo

Aggiorna nome, categoria, prezzo (vuoto = nessun prezzo), unità, sku, note, attivo.

{
  "price": 0.15,
  "active": true
}
curl -X PUT "https://ciamem.com/api/v1/catalog/:id" \
  -H "Authorization: Bearer ciamem_live_…" \
  -H "content-type: application/json" \
  -d '{"price":0.15,"active":true}'
DELETE /catalog/:id catalog:write

Elimina un articolo di catalogo

curl -X DELETE "https://ciamem.com/api/v1/catalog/:id" \
  -H "Authorization: Bearer ciamem_live_…"
GET /orders orders:read

Elenco degli ordini

Filtri: status (ricevuto|in-lavorazione|evaso|annullato|aperti), companyId, q, from, to (YYYY-MM-DD).

Parametri: status · companyId · q · from · to · limit · offset

curl "https://ciamem.com/api/v1/orders" \
  -H "Authorization: Bearer ciamem_live_…"
GET /orders/:id orders:read

Dettaglio di un ordine

Accetta l'id o il codice (ORD-0001). Include righe, totale e timeline.

curl "https://ciamem.com/api/v1/orders/:id" \
  -H "Authorization: Bearer ciamem_live_…"
PATCH /orders/:id orders:write

Aggiorna un ordine (stato, nota)

Cambia lo stato (ricevuto|in-lavorazione|evaso|annullato) o aggiunge una nota. Accetta anche PUT.

{
  "status": "evaso",
  "note": "Spedito con corriere"
}
curl -X PATCH "https://ciamem.com/api/v1/orders/:id" \
  -H "Authorization: Bearer ciamem_live_…" \
  -H "content-type: application/json" \
  -d '{"status":"evaso","note":"Spedito con corriere"}'

👤 Rubrica

GET /contacts contacts:read

Elenco dei contatti

La rubrica del tenant. Filtri: q (numero, nome o azienda), companyId.

Parametri: q · companyId · limit · offset

curl "https://ciamem.com/api/v1/contacts" \
  -H "Authorization: Bearer ciamem_live_…"
GET /contacts/:number contacts:read

Dettaglio di un contatto

Il contatto è identificato dal numero di telefono (o dall'id chat per i clienti Telegram).

curl "https://ciamem.com/api/v1/contacts/:number" \
  -H "Authorization: Bearer ciamem_live_…"
PUT /contacts/:number contacts:write

Crea o aggiorna un contatto

Se il contatto non esiste viene creato.

{
  "name": "Mario Rossi",
  "company": "Acme SRL",
  "companyId": "id azienda in anagrafica",
  "notes": "Cliente storico",
  "language": "it"
}
curl -X PUT "https://ciamem.com/api/v1/contacts/:number" \
  -H "Authorization: Bearer ciamem_live_…" \
  -H "content-type: application/json" \
  -d '{"name":"Mario Rossi","company":"Acme SRL","companyId":"id azienda in anagrafica","notes":"Cliente storico","language":"it"}'
DELETE /contacts/:number contacts:write

Elimina un contatto

Il bot non lo riconoscerà più alla chiamata successiva.

curl -X DELETE "https://ciamem.com/api/v1/contacts/:number" \
  -H "Authorization: Bearer ciamem_live_…"

🏢 Clienti

GET /companies companies:read

Elenco dei clienti (aziende)

Filtri: q (nome o P.IVA), status (regolare | bloccato).

Parametri: q · status · limit · offset

curl "https://ciamem.com/api/v1/companies" \
  -H "Authorization: Bearer ciamem_live_…"
POST /companies companies:write

Crea un cliente

Lo stato "bloccato" impedisce al bot di aprire ticket per i contatti di quest'azienda.

{
  "name": "Acme SRL",
  "vat": "01234567890",
  "status": "regolare",
  "phone": "",
  "email": "",
  "address": "",
  "notes": ""
}
curl -X POST "https://ciamem.com/api/v1/companies" \
  -H "Authorization: Bearer ciamem_live_…" \
  -H "content-type: application/json" \
  -d '{"name":"Acme SRL","vat":"01234567890","status":"regolare","phone":"","email":"","address":"","notes":""}'
GET /companies/:id companies:read

Dettaglio di un cliente

curl "https://ciamem.com/api/v1/companies/:id" \
  -H "Authorization: Bearer ciamem_live_…"
PUT /companies/:id companies:write

Aggiorna un cliente

L'azienda predefinita "(anonimo)" non è modificabile.

{
  "name": "Acme SRL",
  "status": "bloccato"
}
curl -X PUT "https://ciamem.com/api/v1/companies/:id" \
  -H "Authorization: Bearer ciamem_live_…" \
  -H "content-type: application/json" \
  -d '{"name":"Acme SRL","status":"bloccato"}'
DELETE /companies/:id companies:write

Elimina un cliente

I contatti associati tornano sull'azienda "(anonimo)". I ticket già aperti restano.

curl -X DELETE "https://ciamem.com/api/v1/companies/:id" \
  -H "Authorization: Bearer ciamem_live_…"

🎫 Ticket

GET /tickets tickets:read

Ricerca ticket

Filtri: status (aperto | assegnato | chiuso | aperti = tutti i non chiusi), companyId, agent, from, to (YYYY-MM-DD), q. Per la sincronizzazione incrementale usa updatedSince (ISO): ricevi solo i ticket cambiati.

Parametri: status · companyId · agent · from · to · q · updatedSince · limit · offset

curl "https://ciamem.com/api/v1/tickets" \
  -H "Authorization: Bearer ciamem_live_…"
POST /tickets tickets:write

Apre un ticket

Il ticket viene annunciato agli agenti su Telegram col bottone di presa in carico, come quelli aperti dal bot. Intestazione Idempotency-Key: un retry dopo un timeout non crea un doppione.

{
  "text": "Stampante fiscale in blocco",
  "companyId": "id azienda (facoltativo)",
  "contactName": "Mario Rossi",
  "contactKey": "+393331234567",
  "priority": "normale | alta"
}
curl -X POST "https://ciamem.com/api/v1/tickets" \
  -H "Authorization: Bearer ciamem_live_…" \
  -H "content-type: application/json" \
  -d '{"text":"Stampante fiscale in blocco","companyId":"id azienda (facoltativo)","contactName":"Mario Rossi","contactKey":"+393331234567","priority":"normale | alta"}'
GET /tickets/:id tickets:read

Dettaglio di un ticket

Accetta l'id interno o il codice (TK-0001). Include la timeline e i metadati delle foto allegate.

curl "https://ciamem.com/api/v1/tickets/:id" \
  -H "Authorization: Bearer ciamem_live_…"
POST /tickets/:id/entries tickets:write

Aggiunge una nota al ticket

La nota entra nella timeline ed è visibile agli agenti.

{
  "text": "Intervento pianificato per lunedì"
}
curl -X POST "https://ciamem.com/api/v1/tickets/:id/entries" \
  -H "Authorization: Bearer ciamem_live_…" \
  -H "content-type: application/json" \
  -d '{"text":"Intervento pianificato per lunedì"}'
PATCH /tickets/:id tickets:write

Aggiorna un ticket (priorità, chiusura)

Chiudendo il ticket il cliente viene avvisato sul canale chat da cui l'ha aperto. Accetta anche PUT.

{
  "status": "chiuso",
  "note": "Sostituita la scheda",
  "priority": "alta"
}
curl -X PATCH "https://ciamem.com/api/v1/tickets/:id" \
  -H "Authorization: Bearer ciamem_live_…" \
  -H "content-type: application/json" \
  -d '{"status":"chiuso","note":"Sostituita la scheda","priority":"alta"}'

🎧 Agenti

GET /agents agents:read

Elenco degli agenti

Gli agenti Telegram del tenant e il loro stato (in turno o in pausa).

curl "https://ciamem.com/api/v1/agents" \
  -H "Authorization: Bearer ciamem_live_…"
PATCH /agents/:chatId agents:write

Mette un agente in pausa o lo rimette in turno

In pausa non riceve nuovi ticket né notifiche, ma continua a gestire i ticket già suoi. Aggiungere o rimuovere agenti resta un'operazione da console.

{
  "paused": true
}
curl -X PATCH "https://ciamem.com/api/v1/agents/:chatId" \
  -H "Authorization: Bearer ciamem_live_…" \
  -H "content-type: application/json" \
  -d '{"paused":true}'

Ricette

Aprire un ticket da un evento del gestionale

Usa Idempotency-Key con l'id dell'evento: se la rete cade e riprovi, non nasce un secondo ticket.

Tenere allineati i ticket

Salva l'ora dell'ultima sincronizzazione e chiedi GET /tickets?updatedSince=…: ricevi solo i ticket cambiati.

Sospendere un cliente moroso

Metti l'azienda a status: "bloccato": il bot smetterà di aprire ticket per i suoi contatti e li inviterà a contattare l'amministrazione.

Documentazione generata dal codice: rispecchia sempre gli endpoint attivi su questo server.