Os dois canais
Há dois canais independentes de webhook, que podem ser usados juntos ou separadamente.Webhook de conta — todos os envios
Webhook de conta — todos os envios
Configurado uma vez por conta no painel. Dispara para todos os
envios da conta (API avulsa, disparos em massa e fluxos), independente da
campanha. Use quando um único endpoint concentra o status de tudo que a
conta envia.
Webhook por campanha — apenas aquela campanha
Webhook por campanha — apenas aquela campanha
Configurado na própria campanha de disparo em massa. Dispara somente
para os destinatários daquela campanha. Use para rotear o status de uma
campanha específica a um endpoint dedicado.
O evento
sms.sent não é entregue aos webhooks: a cobrança e o aceite
acontecem no momento do envio, então só os eventos de status final são
notificados. O produto é outbound-only — não existe evento de SMS
recebido.Envelope — webhook de conta
O webhook de conta envia o conteúdo do evento dentro dedata, junto de
channel e timestamp no nível raiz.
Canal de origem. Sempre
"sms".Momento do envio do webhook em ISO 8601 (UTC).
Envelope — webhook por campanha
O webhook por campanha é plano: os campos ficam no nível raiz e ele incluicampaignId e recipientId para correlação.
Nome do evento (ex:
sms.delivered).ID da campanha que originou o disparo.
ID do destinatário dentro da campanha.
Número de destino em formato E.164.
Código de erro normalizado em caso de falha, ou
null. Veja a tabela de
códigos em Eventos.Quantidade de segmentos (partes) do SMS.
Momento do evento em ISO 8601 (UTC).
Headers
A
X-DAPI-Signature só é enviada quando um secret está configurado. Ela é
o HMAC-SHA256, em hexadecimal, do corpo bruto (raw body) da requisição.
O header
X-DAPI-Webhook-Channel é enviado somente no webhook de conta.
O webhook por campanha envia apenas Content-Type (mais os headers
personalizados configurados na campanha, se houver) e, quando há secret, a
X-DAPI-Signature.Validando a assinatura
Calcule o HMAC sobre o corpo bruto recebido (não sobre o JSON re-serializado) e compare com o header usando comparação de tempo constante (timing-safe):Entrega e confiabilidade
A garantia de entrega difere entre os dois canais.Webhook de conta — fila durável
Webhook de conta — fila durável
Entregue por uma fila durável, com retentativas, circuit breaker
por URL e logs de entrega (
webhook_logs). Em caso de falha temporária,
a entrega é repetida automaticamente.Webhook por campanha — fire-and-forget
Webhook por campanha — fire-and-forget
Entregue por uma única chamada HTTP sem retentativa (fire-and-forget).
Se o endpoint estiver indisponível no momento, o evento não é reenviado.
