API di integrazione Ciamem

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

Indirizzo base: https://www.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
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://www.ciamem.com/api/v1/me" \
  -H "Authorization: Bearer ciamem_live_…"

👤 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://www.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://www.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://www.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://www.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://www.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://www.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://www.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://www.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://www.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://www.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://www.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://www.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://www.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://www.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://www.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://www.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.