ExoVoIPManuale sviluppatori

Webhook

I webhook inviano gli eventi del centralino ai tuoi sistemi con una richiesta HTTPS firmata: nessuna connessione da mantenere aperta. Scope webhooks:read / webhooks:write; massimo 10 webhook per azienda.

Creare un webhook

curl -s -X POST https://centralino.exovoip.it/api/v1/webhooks \
  -H "X-API-Key: $EXOPBX_API_KEY" -H "Content-Type: application/json" \
  -d '{"name":"CRM","url":"https://crm.example.com/exopbx","events":["channel.hangup","calendar.override"]}'
curl -s -X POST https://centralino.exovoip.it/api/v1/webhooks/2/test -H "X-API-Key: $EXOPBX_API_KEY"
  • events: tipi di evento (gli stessi del tempo reale) oppure ["*"] per tutti. L'elenco dei tipi disponibili è in GET /v1/webhooks/event-types.
  • Il segreto whsec_… è mostrato solo alla creazione e alla rotazione (POST /v1/webhooks/:id/rotate-secret).
  • POST /v1/webhooks/:id/test invia subito un evento webhook.test e restituisce l'esito.

Richiesta inviata

POST all'indirizzo del webhook, corpo JSON:

{
  "id": "7f1c1f4e-2c1b-4d4e-9d61-0b8a2b8e6c55",
  "type": "channel.hangup",
  "tenantId": 3,
  "createdAt": "2026-11-04T10:00:00.000Z",
  "data": { "type": "channel.hangup", "uniqueid": "1762250400.42", "durationS": 95 }
}
HeaderContenuto
X-ExoPBX-Signaturet=<unix>,v1=<hmac>: firma da verificare
X-ExoPBX-TimestampMomento dell'invio (secondi Unix)
X-ExoPBX-EventTipo di evento
X-ExoPBX-DeliveryId dell'evento, uguale in tutti i tentativi: usalo per scartare i duplicati
User-AgentExoPBX-Webhook/1.0

Verificare la firma

La firma è l'HMAC-SHA256, in esadecimale, del testo <t>.<corpo grezzo> calcolato con il segreto del webhook. Rifiuta le richieste con timestamp più vecchio di 5 minuti. Usa il corpo così come ricevuto: ri-serializzare il JSON cambia la firma.

# Verifica manuale con openssl: firma = HMAC-SHA256("<t>.<corpo>")
printf '%s.%s' "$T" "$BODY" | openssl dgst -sha256 -hmac "$EXOPBX_WEBHOOK_SECRET" -hex

Esempi completi di endpoint (Node, Flask, PHP) sono negli archivi degli SDK, cartella examples.

Consegna e nuovi tentativi

  • Successo: qualsiasi risposta 2xx entro 10 secondi. Rispondi subito ed elabora l'evento in seguito.
  • Altrimenti nuovi tentativi dopo 30 s, 2 min, 8 min, 32 min, circa 2 h, 6 h e 6 h (8 tentativi in tutto); poi la consegna resta failed e si può ripetere dal registro.
  • I redirect non vengono seguiti; l'indirizzo deve essere pubblico (http o https, consigliato https).
  • Riattivare un webhook disattivato per errori consecutivi azzera il contatore.
curl -s "https://centralino.exovoip.it/api/v1/webhooks/2/deliveries?status=failed" -H "X-API-Key: $EXOPBX_API_KEY"
curl -s -X POST https://centralino.exovoip.it/api/v1/webhooks/2/deliveries/918/retry -H "X-API-Key: $EXOPBX_API_KEY"
curl -s -X POST https://centralino.exovoip.it/api/v1/webhooks/2/rotate-secret -H "X-API-Key: $EXOPBX_API_KEY"

Il registro delle consegne è conservato 30 giorni.

Endpoint

DescrizioneRichiestaScopeMetodo SDK
Tipi di evento sottoscrivibiliGET /v1/webhooks/event-typeswebhooks:readwebhooks.eventTypes() · py: webhooks.event_types()
Elenco webhook (piattaforma senza X-Tenant-Id)GET /v1/webhookswebhooks:readwebhooks.list()
Crea webhook (segreto di firma mostrato una sola volta)POST /v1/webhookswebhooks:writewebhooks.create()
Dettaglio webhookGET /v1/webhooks/:idwebhooks:readwebhooks.get()
Modifica webhookPATCH /v1/webhooks/:idwebhooks:writewebhooks.update()
Elimina webhook e storico inviiDELETE /v1/webhooks/:idwebhooks:writewebhooks.delete()
Nuovo segreto di firma (mostrato una sola volta)POST /v1/webhooks/:id/rotate-secretwebhooks:writewebhooks.rotateSecret() · py: webhooks.rotate_secret()
Invio di prova (evento webhook.test)POST /v1/webhooks/:id/testwebhooks:writewebhooks.test()
Registro invii (esito, codice risposta, tentativi)GET /v1/webhooks/:id/deliverieswebhooks:readwebhooks.deliveries()
Nuovo invio di un evento già registratoPOST /v1/webhooks/:id/deliveries/:deliveryId/retrywebhooks:writewebhooks.redeliver()