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.
callId
string
required
Identificador da chamada.
from
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.
callCreator
string
JID original informado pelo bridge. Pode vir como @lid.
isGroup
boolean
required
true quando a chamada é de grupo.
groupJid
string
JID do grupo. Presente apenas quando isGroup é true.
timestamp
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):
callId
string
Identificador da chamada.
state
string
Estado da chamada. Varia por evento (ver abaixo).
reason
string
Motivo do encerramento. Presente apenas em call.ended.
peerLid
string
JID do interlocutor em formato @lid. Opcional.
peerPn
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.
callId
string
Identificador da chamada.
seq
number
Número de sequência do chunk. Use para ordenar os pedaços.
sampleRate
number
Taxa de amostragem (tipicamente 16000).
channels
number
Número de canais (tipicamente 1).
encoding
string
Codificação do áudio (pcm_s16le).
data
string
Pedaço de áudio PCM em base64.
final
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.
callId
string
Identificador da chamada.
files
object
Faixas de áudio mono 16kHz:
url
string
deprecated
Depreciado — alias de files.full.
durationMs
number
Duração da gravação em milissegundos.
sizeBytes
number | null
Tamanho do arquivo em bytes.
mimetype
string
Tipo do arquivo (audio/wav).
phone
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.