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"}}'const { extension, sipPassword } = await pbx.extensions.create({
number: '105',
name: 'Giulia Verdi',
email: 'giulia.verdi@example.com',
voicemail: { enabled: true, email: 'giulia.verdi@example.com' },
});
// sipPassword: mostrata solo ora (rigenerabile con extensions.resetPassword)$out = $pbx->extensions->create([
'number' => '105',
'name' => 'Giulia Verdi',
'email' => 'giulia.verdi@example.com',
'voicemail' => ['enabled' => true, 'email' => 'giulia.verdi@example.com'],
]);
$sipPassword = $out['sipPassword'];out = pbx.extensions.create({
"number": "105",
"name": "Giulia Verdi",
"email": "giulia.verdi@example.com",
"voicemail": {"enabled": True, "email": "giulia.verdi@example.com"},
})
sip_password = out["sipPassword"]Campi principali:
| Campo | Descrizione |
|---|---|
number | Numero interno (univoco nell'azienda) |
name, email | Nome mostrato e indirizzo per notifiche e segreteria |
voicemail | Segreteria: attivazione, email, PIN |
followMe | Deviazione sul cellulare |
forwarding | Destinazioni per occupato / non risponde / non raggiungibile |
recordMode | Registrazione: 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"const offline = await pbx.extensions.list({ registered: false });
await pbx.extensions.update(12, { name: 'Giulia Verdi (Vendite)' });
const sip = await pbx.extensions.sipCredentials(12); // username, password, domain, wssUrl, porte
await pbx.extensions.delete(12);$offline = $pbx->extensions->list(registered: false);
$pbx->extensions->update(12, ['name' => 'Giulia Verdi (Vendite)']);
$sip = $pbx->extensions->sipCredentials(12);
$pbx->extensions->delete(12);offline = pbx.extensions.list(registered=False)
pbx.extensions.update(12, {"name": "Giulia Verdi (Vendite)"})
sip = pbx.extensions.sip_credentials(12)
pbx.extensions.delete(12)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"}'await pbx.extensions.followMe(12, {
enabled: true,
number: '+393331234567',
rings: 3,
mode: 'sequential',
});$pbx->extensions->followMe(12, ['enabled' => true, 'number' => '+393331234567', 'rings' => 3, 'mode' => 'sequential']);pbx.extensions.follow_me(12, {"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"}'await pbx.featureCodes.setSettings({ overridePin: '4821' }); // null per rimuovere il PIN$pbx->featureCodes->setSettings(['overridePin' => '4821']);pbx.feature_codes.set_settings({"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 |
|---|---|
always | Sempre attivo (predefinito) |
tenant | Segue gli orari dell'azienda (calendario predefinito) |
calendar | Segue 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:
*94spegne e*95accende 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
forceconon,offoppureauto(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"}'const { availability } = await pbx.extensions.getAvailability(12);
await pbx.extensions.setAvailability(12, { scheduleMode: 'calendar', calendarId: 3 });
await pbx.extensions.setAvailability(12, { force: 'off' }); // 'auto' per tornare all'orario$state = $pbx->extensions->getAvailability(12);
$pbx->extensions->setAvailability(12, ['scheduleMode' => 'calendar', 'calendarId' => 3]);
$pbx->extensions->setAvailability(12, ['force' => 'off']);state = pbx.extensions.get_availability(12)
pbx.extensions.set_availability(12, {"scheduleMode": "calendar", "calendarId": 3})
pbx.extensions.set_availability(12, {"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
| Descrizione | Richiesta | Scope | Metodo SDK |
|---|---|---|---|
| Impostazioni codici funzione (PIN forzatura orari) | GET /v1/feature-codes/settings | extensions:read | featureCodes.getSettings() · py: feature_codes.get_settings() |
| Imposta il PIN per la forzatura orari (*90 / *91 / *92) | PUT /v1/feature-codes/settings | extensions:write | featureCodes.setSettings() · py: feature_codes.set_settings() |
| Elenco interni | GET /v1/extensions | extensions:read | extensions.list() |
| Crea interno (password SIP mostrata una volta) | POST /v1/extensions | extensions:write | extensions.create() |
| Dettaglio interno | GET /v1/extensions/:id | extensions:read | extensions.get() |
| Modifica interno | PATCH /v1/extensions/:id | extensions:write | extensions.update() |
| Elimina interno (e relativi endpoint SIP) | DELETE /v1/extensions/:id | extensions:write | extensions.delete() |
| Deviazione su cellulare | PUT /v1/extensions/:id/follow-me | extensions:write | extensions.followMe() · py: extensions.follow_me() |
| Stato non disturbare | GET /v1/extensions/:id/dnd | extensions:read | extensions.getDnd() · py: extensions.get_dnd() |
| Attiva / disattiva non disturbare (comportamento chiamate, scadenza) | PUT /v1/extensions/:id/dnd | extensions:write | extensions.setDnd() · py: extensions.set_dnd() |
| Orari e stato acceso / spento dell’interno | GET /v1/extensions/:id/availability | extensions:read | extensions.getAvailability() · py: extensions.get_availability() |
| Imposta gli orari dell’interno o lo accende / spegne (come *95 / *94) | PUT /v1/extensions/:id/availability | extensions:write | extensions.setAvailability() · py: extensions.set_availability() |
| Rigenera password SIP | POST /v1/extensions/:id/password | extensions:write | extensions.resetPassword() · py: extensions.reset_password() |
| Credenziali SIP/WebRTC (telefono e softphone) | GET /v1/extensions/:id/sip-credentials | extensions:write | extensions.sipCredentials() · py: extensions.sip_credentials() |
