ExoVoIPManuale sviluppatori

Interni

Un interno è un utente del centralino: numero breve, nome, credenziali SIP per telefoni e softphone, segreteria, deviazioni e registrazione. Scope extensions:read / extensions:write.

Creare un interno

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":"105","name":"Giulia Verdi","email":"giulia.verdi@example.com",
       "voicemail":{"enabled":true,"email":"giulia.verdi@example.com"}}'

Campi principali:

CampoDescrizione
numberNumero interno (univoco nell'azienda)
name, emailNome mostrato e indirizzo per notifiche e segreteria
voicemailSegreteria: attivazione, email, PIN
followMeDeviazione sul cellulare
forwardingDestinazioni per occupato / non risponde / non raggiungibile
recordModeRegistrazione: inherit, always, on_demand, never

La password SIP è restituita alla creazione e con POST /v1/extensions/:id/password (rigenerazione). GET /v1/extensions/:id/sip-credentials restituisce le credenziali complete per configurare un telefono o il softphone WebRTC.

Limiti: se l'azienda ha raggiunto il numero massimo di interni la creazione restituisce 409 LIMIT_REACHED.

Modificare, cercare, eliminare

curl -s "https://centralino.exovoip.it/api/v1/extensions?registered=false" -H "X-API-Key: $EXOPBX_API_KEY"
curl -s -X PATCH https://centralino.exovoip.it/api/v1/extensions/12 -H "X-API-Key: $EXOPBX_API_KEY" \
  -H "Content-Type: application/json" -d '{"name":"Giulia Verdi (Vendite)"}'
curl -s https://centralino.exovoip.it/api/v1/extensions/12/sip-credentials -H "X-API-Key: $EXOPBX_API_KEY"
curl -s -X DELETE https://centralino.exovoip.it/api/v1/extensions/12 -H "X-API-Key: $EXOPBX_API_KEY"

Filtri della lista: q (numero o nome), enabled, registered. Lo stato in tempo reale (registrato, occupato, in squillo, dispositivi collegati) è in Tempo reale.

Deviazione sul cellulare

curl -s -X PUT https://centralino.exovoip.it/api/v1/extensions/12/follow-me \
  -H "X-API-Key: $EXOPBX_API_KEY" -H "Content-Type: application/json" \
  -d '{"enabled":true,"number":"+393331234567","rings":3,"mode":"sequential"}'

Le destinazioni esterne rispettano la politica dell'azienda sulle destinazioni consentite (solo nazionali, nazionali ed europee, tutte): un numero non consentito restituisce 400 VALIDATION_ERROR con il motivo nei dettagli. Per l'inoltro con annuncio o in modalità silenziosa vedi Inoltro.

Codici funzione e "Non disturbare"

Dal telefono gli interni abilitati (campo canOverrideHours) possono forzare l'apertura o la chiusura degli orari (*90 chiuso, *91 aperto, *92 ripristino, *93 stato). Ogni interno può inoltre spegnersi o riaccendersi da solo con *94 (spegni) e *95 (accendi): vedi Orari e stato dell'interno. Il PIN facoltativo per i codici degli orari aziendali si imposta così:

curl -s -X PUT https://centralino.exovoip.it/api/v1/feature-codes/settings \
  -H "X-API-Key: $EXOPBX_API_KEY" -H "Content-Type: application/json" -d '{"overridePin":"4821"}'

La funzione "Non disturbare" di un interno, quando disponibile sul tuo centralino, compare tra gli endpoint qui sotto e il suo stato è visibile nei campi dnd e availability del tempo reale.

Orari e stato dell'interno

Ogni interno ha un proprio orario, che decide quando riceve chiamate:

Orario (scheduleMode)Comportamento
alwaysSempre attivo (predefinito)
tenantSegue gli orari dell'azienda (calendario predefinito)
calendarSegue un calendario specifico dell'azienda, indicato in calendarId

Fuori orario, o quando è spento, l'interno non squilla: né i telefoni né il cellulare collegato con la deviazione. La chiamata segue la regola "nessuna risposta" dell'interno; se non è impostata, va in segreteria (se attiva). Nei gruppi di squillo e nelle code l'interno viene saltato. Chi chiama da un altro interno, anche durante un trasferimento con consultazione, sente prima l'avviso "L'interno chiamato non è al momento disponibile".

Si può forzare lo stato in qualsiasi momento:

  • dal telefono: *94 spegne e *95 accende il proprio interno, con un messaggio vocale di conferma;
  • dal pannello: nella scheda dell'interno, card "Orari e stato", con i pulsanti Accendi, Spegni e Torna all'orario; nella stessa card si sceglie l'orario;
  • via API: campo force con on, off oppure auto (torna all'orario).

La forzatura vale fino al prossimo cambio d'orario dell'interno (con "Sempre attivo", fino a nuova modifica) e non tocca gli orari dell'azienda, che si gestiscono con *90–*93.

curl -s https://centralino.exovoip.it/api/v1/extensions/12/availability -H "X-API-Key: $EXOPBX_API_KEY"

curl -s -X PUT https://centralino.exovoip.it/api/v1/extensions/12/availability \
  -H "X-API-Key: $EXOPBX_API_KEY" -H "Content-Type: application/json" \
  -d '{"scheduleMode":"calendar","calendarId":3}'

curl -s -X PUT https://centralino.exovoip.it/api/v1/extensions/12/availability \
  -H "X-API-Key: $EXOPBX_API_KEY" -H "Content-Type: application/json" -d '{"force":"off"}'

La risposta riporta l'orario, la forzatura in corso con la sua scadenza (forceExpiresAt, null se vale fino a nuova modifica) e available, cioè se in questo momento l'interno riceve chiamate. I campi non inviati nel PUT restano invariati.

Ruolo utente

Gli utenti del pannello con ruolo "utente" vedono e modificano solo il proprio interno (dettaglio, deviazione, orari e stato, credenziali SIP).

Endpoint

DescrizioneRichiestaScopeMetodo SDK
Impostazioni codici funzione (PIN forzatura orari)GET /v1/feature-codes/settingsextensions:readfeatureCodes.getSettings() · py: feature_codes.get_settings()
Imposta il PIN per la forzatura orari (*90 / *91 / *92)PUT /v1/feature-codes/settingsextensions:writefeatureCodes.setSettings() · py: feature_codes.set_settings()
Elenco interniGET /v1/extensionsextensions:readextensions.list()
Crea interno (password SIP mostrata una volta)POST /v1/extensionsextensions:writeextensions.create()
Dettaglio internoGET /v1/extensions/:idextensions:readextensions.get()
Modifica internoPATCH /v1/extensions/:idextensions:writeextensions.update()
Elimina interno (e relativi endpoint SIP)DELETE /v1/extensions/:idextensions:writeextensions.delete()
Deviazione su cellularePUT /v1/extensions/:id/follow-meextensions:writeextensions.followMe() · py: extensions.follow_me()
Stato non disturbareGET /v1/extensions/:id/dndextensions:readextensions.getDnd() · py: extensions.get_dnd()
Attiva / disattiva non disturbare (comportamento chiamate, scadenza)PUT /v1/extensions/:id/dndextensions:writeextensions.setDnd() · py: extensions.set_dnd()
Orari e stato acceso / spento dell’internoGET /v1/extensions/:id/availabilityextensions:readextensions.getAvailability() · py: extensions.get_availability()
Imposta gli orari dell’interno o lo accende / spegne (come *95 / *94)PUT /v1/extensions/:id/availabilityextensions:writeextensions.setAvailability() · py: extensions.set_availability()
Rigenera password SIPPOST /v1/extensions/:id/passwordextensions:writeextensions.resetPassword() · py: extensions.reset_password()
Credenziali SIP/WebRTC (telefono e softphone)GET /v1/extensions/:id/sip-credentialsextensions:writeextensions.sipCredentials() · py: extensions.sip_credentials()