Se você ainda não sabe o que é ou como cadastrar um webhook, veja primeiro o guia de Webhooks.
Visão geral
- Método:
POST - Content-Type:
application/json - Entrega: em tempo real — assim que o evento acontece no IPBoX
- Tentativas: timeout de 5 segundos por chamada. Seu endpoint
precisa responder rápido e com um status
2xxpara confirmar o recebimento.- Eventos de agente (
agente.*): uma única tentativa, sem retry automático. - Eventos de ligação (
ligacao.*): até 5 tentativas no total, com intervalos crescentes (5s, 15s, 1min e 5min) quando a resposta não for2xx. Veja Entrega e reenvio.
- Eventos de agente (
Headers enviados
Formato do payload
Os eventos de agente (agente.*) e os de ligação (ligacao.*)
têm formatos diferentes. Esta seção descreve os de agente; os de
ligação estão em Eventos de ligação.
Todo evento de agente chega com esse formato base:
estado: estado interno do agente no momento do evento (online,offline,paused,busyouringing)t: timestamp Unix (segundos) de quando o evento foi geradoevento: código do evento — é este campo que você usa para saber qual dos eventos marcados no cadastro está chegandousuario_id: ID do agente no IPBoX
Catálogo de eventos de agente
Campos extras do agente.busy
Os campos que não se aplicam à ligação vêm como string vazia (
""),
não null.Exemplos de payload
agente.login
agente.login
agente.logout
agente.logout
agente.pause_in
agente.pause_in
agente.pause_out
agente.pause_out
agente.busy
agente.busy
agente.ringing
agente.ringing
agente.online
agente.online
Eventos de ligação
Os eventosligacao.* acompanham o ciclo de vida de cada ligação do
IPBoX: entrantes, saintes e internas (entre ramais), feitas pelo
softphone/webphone, pelo discador ou pela API de click-to-call.
Catálogo
Sequências típicas:
Nem todo evento aparece em toda ligação (por exemplo, uma ligação que
cai antes de tocar não tem
tocando). Use sequencia para ordenar e
ligacao_id para agrupar.Campos comuns (todos os eventos de ligação)
Campos específicos por evento
ligacao.discando
ligacao.discando
ligacao.tocando
ligacao.tocando
Sem campos extras.
ligacao.atendida
ligacao.atendida
No discador, o
atendida marca o cliente atendendo e normalmente
ainda não traz ramal/usuario_id: eles chegam em seguida no
ligacao.conectada.ligacao.conectada
ligacao.conectada
Aqui
ramal e usuario_id identificam o agente que foi conectado.ligacao.abandonada
ligacao.abandonada
ligacao.falha e ligacao.encerrada
ligacao.falha e ligacao.encerrada
Os dois eventos trazem o mesmo conjunto de campos de resumo; o
ligacao.encerrada tem ainda o gravacao_url.O
ligacao.falha só é emitido quando resultado é falha. O
ligacao.encerrada é emitido sempre.Para ligações atendidas, o ligacao.encerrada pode ser enviado até
cerca de 6 segundos após o desligamento, para aguardar o registro
da gravação e poder trazer o gravacao_url.Exemplos de payload
Nos exemplos,
evento_id aparece abreviado como … e, a partir do
segundo exemplo, alguns campos comuns (linkedid, uniqueid,
uniqueids, prospect_id, numero_id, action_id) foram omitidos
para encurtar. No payload real, todos os campos comuns sempre vêm.ligacao.recebida
ligacao.recebida
ligacao.discando (entrante chamando um ramal)
ligacao.discando (entrante chamando um ramal)
ligacao.atendida
ligacao.atendida
ligacao.conectada
ligacao.conectada
ligacao.abandonada
ligacao.abandonada
ligacao.falha
ligacao.falha
ligacao.encerrada
ligacao.encerrada
Entrega e reenvio dos eventos de ligação
- Cada evento é enviado a cada webhook que o tenha marcado no cadastro.
- Se o seu endpoint responder algo diferente de
2xx, der timeout (5s) ou ficar indisponível, o IPBoX reenvia somente para aquele webhook, até 5 tentativas no total, com intervalos de 5s, 15s, 1min e 5min. Depois disso o evento é descartado. - No reenvio o payload e o
evento_idsão idênticos aos do primeiro envio. Como o endpoint pode ter processado o evento e falhado só ao responder, trate oevento_idcomo chave de idempotência. - Por causa dos reenvios, os eventos de uma mesma ligação podem chegar
fora de ordem. Ordene por
sequencia. - O
ocorrido_emé a hora real do evento, não a hora da entrega.
Validando a origem da chamada
Se você preencher o campo Secret no cadastro do webhook, toda chamada chega com o headerX-Webhook-Secret contendo exatamente esse
valor. Compare o header recebido com o valor que você configurou —
se não bater, rejeite a chamada.
Exemplo em PHP
Exemplo com curl (simulando o recebimento)
Boas práticas
- Responda rápido (idealmente em menos de 1 segundo) e com status
2xx— nos eventos de agente não há retry automático, então uma resposta lenta ou com erro faz você perder aquela notificação (nos de ligação há reenvio, veja acima). - Se precisar processar algo demorado a partir do evento, responda
200imediatamente e processe de forma assíncrona no seu lado. - Trate o campo
eventocomo a fonte da verdade sobre o que aconteceu — não dependa só do campoestado, já que o mesmo valor deestadopode aparecer em mais de um tipo de evento.
