Skip to main content
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 2xx para 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 for 2xx. Veja Entrega e reenvio.

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, busy ou ringing)
  • t: timestamp Unix (segundos) de quando o evento foi gerado
  • evento: código do evento — é este campo que você usa para saber qual dos eventos marcados no cadastro está chegando
  • usuario_id: ID do agente no IPBoX
Alguns eventos trazem campos extras, além desses quatro (ver tabela abaixo).

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

Eventos de ligação

Os eventos ligacao.* 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. 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

Sem campos extras.
No discador, o atendida marca o cliente atendendo e normalmente ainda não traz ramal/usuario_id: eles chegam em seguida no ligacao.conectada.
Aqui ramal e usuario_id identificam o agente que foi conectado.
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.

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_id são idênticos aos do primeiro envio. Como o endpoint pode ter processado o evento e falhado só ao responder, trate o evento_id como 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.
Sempre responda rápido com 2xx e processe em segundo plano. Respostas lentas ou com erro geram reenvios e duplicidade.
Webhook que falha sempre é suspenso. Depois de 20 falhas de envio seguidas, o envio é suspenso e o webhook deixa de receber eventos. Uma resposta 2xx zera a contagem. No cadastro de webhooks, ele continua listado, com a situação Suspenso por falhas e a data. Corrija o endpoint, abra o webhook e salve com a opção Reativar o envio ao salvar marcada. Os reenvios de cada evento contam como falhas, então uma URL fora do ar chega ao limite em poucos eventos.

Validando a origem da chamada

Se você preencher o campo Secret no cadastro do webhook, toda chamada chega com o header X-Webhook-Secret contendo exatamente esse valor. Compare o header recebido com o valor que você configurou — se não bater, rejeite a chamada.
Esse mecanismo é um segredo compartilhado simples (o mesmo valor vai em todas as chamadas), não uma assinatura criptográfica do corpo da requisição (tipo HMAC). Ele protege contra chamadas de quem não conhece o secret, mas não garante que o corpo da requisição não foi alterado em trânsito. Use sempre uma URL HTTPS para evitar que o secret trafegue em texto puro numa rede não confiável.

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 200 imediatamente e processe de forma assíncrona no seu lado.
  • Trate o campo evento como a fonte da verdade sobre o que aconteceu — não dependa só do campo estado, já que o mesmo valor de estado pode aparecer em mais de um tipo de evento.