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.

Quem é a outra ponta: phone

Todos os eventos call.* trazem phone: o telefone da outra ponta da chamada — quem ligou para a sessão ou quem a sessão chamou —, só dígitos, sem @s.whatsapp.net. Nunca é o número da própria sessão, em nenhuma direção. Use este campo para identificar o contato.
string | null
required
Telefone da outra ponta, só dígitos (ex.: 5511999999999). Vem null quando o WhatsApp só informou um LID sem telefone conhecido; nesse caso o LID vem em lid. Não aparece nos chunks ao vivo de call.audio.
string
LID da outra ponta (...@lid). Presente apenas quando phone é null. Um LID não é um telefone: não use os dígitos dele como número.
Não use from nem callCreator para identificar o contato. Eles indicam quem iniciou a chamada: numa chamada feita pela sessão, os dois trazem o número da própria sessão. Continuam no payload por compatibilidade.

call.offer — chamada recebida

Disparado quando o número da sessão recebe uma chamada.
string
required
Identificador da chamada.
string | null
required
Telefone de quem está ligando. Ver phone.
string
required
Quem iniciou a chamada, resolvido para telefone quando possível (ou ...@lid). Mantido por compatibilidade — prefira phone.
string
Quem iniciou a chamada, como informado pelo WhatsApp. Pode vir como @lid. Mantido por compatibilidade — prefira phone.
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 | null
Telefone da outra ponta, só dígitos.

call.accepted / call.rejected

call.accepted: chamada recebida atendida em outro dispositivo. call.rejected: chamada recusada — uma recebida que a sessão recusou, ou uma feita pela sessão que o contato recusou. Nos dois casos, phone é o contato.
O payload destes eventos é repassado tal como vem do bridge (relayed as-is). Os campos garantidos são callId e phone (o contato). O from é quem iniciou a chamada — no exemplo acima, a própria sessão, que ligou e foi recusada. Os demais campos espelham os dados de chamada do bridge e não são documentados aqui para evitar suposições.