Skip to main content
Estes eventos cobrem as chamadas de voz do WhatsApp (VoIP) no número da sessão: chamadas recebidas e o ciclo de vida de chamadas de saída. Todos são entregues no webhook por sessão, com o envelope comum { event, sessionId, data, timestamp, traceId? }.
Não confunda com o produto URA. Os eventos de URA usam outro envelope — { event, channel: "voice", data: { callId, bulkCallId, ... } } — e não são o que esta página documenta. Aqui tratamos apenas das chamadas de voz do WhatsApp no número da sessão.
Eventos de chamada são despachados apenas para o webhook D-API e para o RabbitMQ — eles não são enviados para integrações de CRM. O evento call.offer é entregue mesmo com a rejeição automática ligada.

Direção dos eventos

As chamadas de saída são iniciadas via POST /calls/place (chamada padrão) e POST /calls/stream (modo com gravação). Os eventos abaixo refletem o andamento dessas chamadas.

call.offer — chamada recebida

Disparado quando o número da sessão recebe uma chamada.
string
required
Identificador da chamada.
string
required
JID de quem está ligando, resolvido quando possível para o número de telefone. Quando não é possível resolver, vem como ...@lid. A ordem de resolução é: from do bridge → contatos (@lid → telefone) → fallback @lid.
string
JID original informado pelo bridge. Pode vir como @lid.
boolean
required
true quando a chamada é de grupo.
string
JID do grupo. Presente apenas quando isGroup é true.
number
required
Momento da chamada em milissegundos (epoch).

Chamadas de saída — payload base

Os eventos de saída (call.ringing, call.connected, call.ended, call.not_answered) compartilham o mesmo payload base (CallEvent):
string
Identificador da chamada.
string
Estado da chamada. Varia por evento (ver abaixo).
string
Motivo do encerramento. Presente apenas em call.ended.
string
JID do interlocutor em formato @lid. Opcional.
string
JID do interlocutor em formato de telefone. Opcional.

call.ringing

Estado "ringing" — a chamada está tocando. É o primeiro evento de uma chamada de saída, emitido assim que a chamada é iniciada (discada) — antes de call.connected.

call.connected

Estado "active" — a chamada foi atendida e está em andamento.

call.ended

Estado "idle" — a chamada foi encerrada. O campo reason é preenchido.
Uma chamada gera exatamente um call.ended (eventos duplicados do bridge são deduplicados por callId). Para chamadas de saída, o call.ended cobre apenas as que foram atendidas — uma que tocou e não foi atendida gera call.not_answered no lugar.

call.not_answered

Estado "idle" — uma chamada de saída que tocou mas nunca foi atendida (encerrou antes de conectar, incluindo o timeout de não-atendimento). Substitui o call.ended nesse caso, para você distinguir “não atendida” de “atendida e encerrada” sem inspecionar o reason. Vale apenas para chamadas de saída.
Chamadas não atendidas não geram gravação: não há upload de áudio nem evento call.audio. (A chamada ainda fica registrada na trilha de auditoria interna, marcada como não atendida.)

call.audio

O evento call.audio tem duas variantes, dependendo de como a chamada de saída foi iniciada.
Na variante de chunks ao vivo, o call.audio pode ter volume alto — cerca de 1 evento por segundo por chamada. Habilite-o apenas se você for consumir o áudio.

Variante A — chunks de áudio ao vivo

Áudio transmitido em pedaços de ~1s cada, ordenados por seq, com final: true no último chunk.
string
Identificador da chamada.
number
Número de sequência do chunk. Use para ordenar os pedaços.
number
Taxa de amostragem (tipicamente 16000).
number
Número de canais (tipicamente 1).
string
Codificação do áudio (pcm_s16le).
string
Pedaço de áudio PCM em base64.
boolean
true no último chunk da chamada.

Variante B — gravação pronta (modo stream)

Um único evento ao final da chamada, com as URLs da gravação. Ocorre no modo stream (POST /calls/stream) apenas para chamadas atendidas — chamadas que não foram atendidas não geram gravação nem este evento.
string
Identificador da chamada.
object
Faixas de áudio mono 16kHz:
string
deprecated
Depreciado — alias de files.full.
number
Duração da gravação em milissegundos.
number | null
Tamanho do arquivo em bytes.
string
Tipo do arquivo (audio/wav).
string
Telefone associado. Opcional.

call.accepted / call.rejected

Eventos de chamada de entrada atendida em outro dispositivo (call.accepted) ou rejeitada (call.rejected).
O payload destes eventos é repassado tal como vem do bridge (relayed as-is). Os campos garantidos são from (JID formatado para telefone quando possível) e um callId. Os demais campos espelham os dados de chamada de entrada do bridge e não são documentados aqui para evitar suposições.