Skip to main content
O Webhook de Confirmação de Leitura entrega um callback HTTP assinado ao seu servidor toda vez que uma mensagem do WhatsApp que você envia muda de status — enviado, entregue, lido ou falhado. Use-o para rastreamento de entrega, confirmação de leitura e trilhas de auditoria. Ele é configurado por remetente do WhatsApp, então remetentes diferentes podem apontar para diferentes endpoints.

Configuração do Webhook

Para habilitar as confirmações de leitura para um remetente:
  1. Edite seu remetente do WhatsApp e abra a seção Webhook de Confirmação de Leitura
  2. Insira sua URL do Webhook e salve
  3. Um Segredo de Assinatura é gerado automaticamente — use-o para verificar a assinatura em cada solicitação
Cada payload carrega o whatsapp_message_id retornado pelos endpoints Enviar Modelo e Enviar Livre, para que você possa correlacionar cada atualização com a mensagem original.

Formato da Solicitação

O webhook é enviado como uma solicitação POST para sua URL configurada com um corpo JSON e um cabeçalho X-Signature-256.

Estrutura do Payload

string
O tipo de evento. Valor: message_status
integer
Identificador numérico da mensagem — o mesmo whatsapp_message_id retornado quando você enviou a mensagem. Use isso para correlacionar a atualização de status com o envio original.
string
Identificador da mensagem do provedor para mensagens enviadas via Twilio, ou null
string
Identificador da mensagem do provedor (WhatsApp wamid) para mensagens enviadas via Meta Cloud API, ou null
string
Identificador único (UUID) da conversa à qual a mensagem pertence, ou null
string
Identificador único (UUID) do assistente conectado ao remetente, ou null
object
O remetente do WhatsApp de onde a mensagem foi enviada
string
O número de telefone do destinatário
string
O número de telefone do remetente
string
Direção da mensagem. Valor: outbound
string
O novo status de entrega. Valores possíveis: enviado, entregue, lido, falhado, não entregue
integer
Código de erro do provedor quando status é falhado ou não entregue, caso contrário null
string
Mensagem de erro bruta do provedor quando a mensagem falhou, caso contrário null
string
Descrição legível do erro, caso contrário null
string
Timestamp ISO 8601 de quando a plataforma registrou a mudança de status, no fuso horário configurado do proprietário do número do WhatsApp
string
Timestamp ISO 8601 do próprio tempo do evento da operadora, no fuso horário configurado do proprietário. Presente para mensagens enviadas via Meta Cloud API; null via Twilio (o callback de status da Twilio não inclui um tempo de evento). Prefira isso quando presente — é o tempo autoritativo da operadora.

Verificando a Assinatura

Cada solicitação inclui um cabeçalho X-Signature-256 contendo um HMAC-SHA256 do corpo da solicitação bruta, chaveado com o Segredo de Assinatura do seu remetente:
Recalcule a assinatura sobre o corpo bruto e compare-a usando uma comparação em tempo constante. Rejeite a solicitação se não corresponder.

Comportamento de Retentativa

Se seu endpoint retornar um status não-2xx ou a solicitação falhar, a entrega será reattemptada: Erros de servidor (5xx) e limites de taxa (429) são reattemptados. Erros de cliente (4xx) são tratados como um endpoint mal configurado e não são reattemptados.

Notas Importantes

  • O webhook é configurado por remetente — cada remetente pode ter sua própria URL e segredo.
  • Eventos acionados pelo botão Fazer solicitação de teste nas configurações do remetente incluem um campo extra test: true e usam valores de espaço reservado. Atualizações de status reais nunca incluem test.
  • lido só é acionado se o destinatário tiver as confirmações de leitura habilitadas nas configurações de privacidade do WhatsApp. entregue sempre é acionado.
  • Os status podem chegar fora de ordem ou serem reenviados pelo provedor. Nós apenas encaminhamos o verdadeiro progresso, então você não receberá um entregue após um lido para a mesma mensagem — mas você ainda deve tratar o webhook como a fonte da verdade e desduplicar por whatsapp_message_id + status.
  • timestamp é sempre o tempo que a plataforma registrou a mudança (no fuso horário do proprietário do número). provider_timestamp é o tempo autoritativo do evento da operadora quando disponível — prefira-o pela precisão e recorra ao timestamp quando for null.
  • Use Regenerar nas configurações do remetente para girar o segredo de assinatura se ele for exposto.