Como receber eventos de chamada no seu sistema de atendimento usando este hub como ponte.
A WhatsApp Cloud API Calling envia atualizações de chamadas no mesmo fluxo de webhooks da Meta. Este hub:
/api/webhooks/meta (já configurado no App).calls, encaminha cada item para as URLs
configuradas na conexão (webhookUrl e/ou webhookUrl2).call.event e o corpo descrito abaixo.O seu sistema pode iniciar outbound com call-offer/connect e, no inbound, gerar o
SDP answer (WebRTC); o hub encaminha connect, pre_accept,
accept, reject e terminate para a
Graph API com o token da conexão — sem expor credenciais Meta ao seu frontend.
Na conexão WhatsApp do hub, informe a URL do seu sistema em Webhook URL (e opcionalmente
Webhook URL 2). O hub fará POST com Content-Type: application/json.
X-Webhook-Event: call.eventX-Webhook-Timestamp — ISO 8601X-Webhook-Attempt — número da tentativa (retries em falhas transitórias)Campos de alto nível:
event — sempre "call.event".timestamp — momento do encaminhamento pelo hub.connection — identificação da conexão (token, canal, nome, wabaId quando
disponível).metadata — display_phone_number e phone_number_id do webhook Meta.
call — objeto retornado pela Meta para aquele item (sanitizado; sem blobs base64).Exemplo vivo (ambiente configurado):
GET {APP_URL}/api/integrations/whatsapp-calling/referenceSubstitua {APP_URL} pela URL base da sua instância (ex.: https://api.suaempresa.com).
Autenticação: Authorization: Bearer <company_token_uuid> ou X-Company-Token
(igual às outras rotas). Opcional: X-Request-Id, Idempotency-Key.
No corpo, informe connection_id (UUID da conexão = campo token no banco, mesmo que
connection.id no webhook call.event) ou phone_number_id.
POST {APP_URL}/api/calls/call-offer ou .../connect — inicia ligação outbound (body com to)POST {APP_URL}/api/calls/<callId>/pre-accept — corpo com session.sdp_type: "answer" e session.sdpPOST {APP_URL}/api/calls/<callId>/accept — mesmo corpo (SDP answer final)POST {APP_URL}/api/calls/<callId>/reject ou .../declinePOST {APP_URL}/api/calls/<callId>/terminateAlias com prefixo interno (mesmo router): /api/internal/calls/<callId>/...
Contrato detalhado: docs/hub-calling-api-accept-decline.md no repositório.
O schema CallEventWebhookPayload e o endpoint de referência estão na documentação Swagger da API:
GET /api-docs (ou a rota configurada para o Swagger UI no seu deploy)/api/webhooks/meta).call.id e estado conforme os eventos que a Meta enviar.pre_accept e accept
na ordem recomendada pela Meta.Documentação Meta (referência externa): Cloud API — Calling