ExoVoIPManuale sviluppatori

Convenzioni

Regole comuni a tutti gli endpoint.

Formato

  • Richieste e risposte in JSON, campi in camelCase, codifica UTF-8.
  • Date e orari in ISO 8601 UTC (2026-11-04T10:00:00.000Z); date semplici AAAA-MM-GG.
  • Identificativi numerici, salvo dove indicato (es. linkedid delle chiamate, id dei messaggi in segreteria).
  • PATCH aggiorna solo i campi inviati; un campo a null viene azzerato, un campo assente resta invariato. PUT sostituisce l'oggetto o l'impostazione indicata.
  • I segreti (password delle linee, PIN) non vengono mai restituiti: le risposte riportano hasSecret / hasPin.
  • Valori mostrati una sola volta: password SIP alla creazione di un interno, chiave API alla creazione e rotazione, segreto dei webhook, password iniziale dell'amministratore di una nuova azienda.

Indirizzo base

L'indirizzo predefinito è https://centralino.exovoip.it/api. Negli SDK è un'opzione del costruttore: se l'indirizzo cambia basta aggiornarla.

export EXOPBX_BASE_URL="https://centralino.exovoip.it/api"
curl -s "$EXOPBX_BASE_URL/health"

Paginazione

Le liste usano un cursore:

  • query limit (1–200, predefinito 50) e cursor;
  • risposta { "items": [...], "nextCursor": "..." }; nextCursor è null sull'ultima pagina;
  • il cursore è opaco: va passato così com'è, senza interpretarlo.
# Prima pagina
curl -s "https://centralino.exovoip.it/api/v1/cdr?limit=100" -H "X-API-Key: $EXOPBX_API_KEY"
# Pagina successiva: valore nextCursor della risposta precedente
curl -s "https://centralino.exovoip.it/api/v1/cdr?limit=100&cursor=eyJ2IjoxfQ" -H "X-API-Key: $EXOPBX_API_KEY"

Idempotenza

Le richieste POST accettano l'header Idempotency-Key (fino a 255 caratteri). Ripetendo la stessa richiesta con la stessa chiave entro 24 ore si ottiene la stessa risposta, senza creare duplicati; con un corpo diverso si riceve 409 IDEMPOTENCY_CONFLICT. Gli SDK inviano una chiave casuale a ogni POST, così i nuovi tentativi automatici sono sicuri.

curl -s -X POST https://centralino.exovoip.it/api/v1/extensions \
  -H "X-API-Key: $EXOPBX_API_KEY" -H "Content-Type: application/json" \
  -H "Idempotency-Key: crm-utente-4821" \
  -d '{"number":"105","name":"Giulia Verdi"}'

Errori

Ogni errore ha lo stesso formato:

{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Dati non validi",
    "details": [{ "path": ["number"], "message": "Obbligatorio" }]
  }
}

code è stabile e va usato nel codice; message è un testo leggibile che può cambiare.

StatoCodici principaliSignificato
400VALIDATION_ERROR, BAD_REQUEST, TENANT_REQUIREDDati non validi o azienda mancante
401UNAUTHORIZED, API_KEY_INVALID, API_KEY_EXPIRED, API_KEY_REVOKEDChiave mancante o non valida
403FORBIDDEN, SCOPE_MISSING, IP_NOT_ALLOWED, TENANT_SUSPENDEDPermessi insufficienti
404NOT_FOUNDRisorsa inesistente o di un'altra azienda
409CONFLICT, IN_USE, LIMIT_REACHED, IDEMPOTENCY_CONFLICTDuplicato, risorsa in uso, limite del piano
413 / 415PAYLOAD_TOO_LARGE, UNSUPPORTED_MEDIA_TYPEFile troppo grande o formato non accettato
429RATE_LIMITEDTroppe richieste
501NOT_IMPLEMENTEDFunzione non ancora disponibile
503SERVICE_UNAVAILABLEServizio temporaneamente non raggiungibile
curl -s -X POST https://centralino.exovoip.it/api/v1/extensions \
  -H "X-API-Key: $EXOPBX_API_KEY" -H "Content-Type: application/json" -d '{"number":""}'
# {"error":{"code":"VALIDATION_ERROR","message":"Dati non validi","details":[...]}}

Limiti di richieste

Ogni chiave può inviare fino a 600 richieste al minuto (valore predefinito della piattaforma). Oltre il limite si riceve 429 RATE_LIMITED con l'header Retry-After (secondi di attesa) e details.retryAfter. Gli SDK attendono e riprovano automaticamente.

# HTTP/1.1 429 Too Many Requests
# Retry-After: 12
# {"error":{"code":"RATE_LIMITED","message":"Limite di richieste superato per questa chiave","details":{"retryAfter":12}}}

Altri limiti: corpo JSON fino a 1 MB; file audio secondo i limiti indicati nella guida Messaggi vocali; massimo 10 webhook per azienda.

Cache e header utili

  • Le risposte API non vengono messe in cache (Cache-Control: no-store).
  • Indica sempre Accept: application/json (gli SDK lo fanno per te).
  • In caso di assistenza, comunica data e ora della richiesta, l'endpoint e il codice di errore.

Endpoint non ancora presenti nell'SDK

Se l'API aggiunge un endpoint prima che tu aggiorni l'SDK, puoi chiamarlo con la richiesta generica:

curl -s "https://centralino.exovoip.it/api/v1/extensions?limit=10" -H "X-API-Key: $EXOPBX_API_KEY"