Documentação / Completo
Mensagens editadas e apagadas
Programa com IA? Conecte-a à sua conta por MCP: ela revisa sua configuração, cria webhooks e modelos com sua confirmação e escreve o código. Veja como →
Quando um contato edita uma mensagem (por exemplo, para corrigir um valor), chega message.edited; quando a apaga, message.revoked. Os dois trazem originalMessageId: o wamid da mensagem original, o mesmo data.message.id que chegou no message.received dela. Com ele você atualiza a linha que já guardou.
O que chega depende do tipo de número (quem decide é a Meta):
Número em coexistência (app + API). Edição → message.edited com textAvailable: true e data.message = a versão final (texto, ou foto/vídeo com a nova legenda), com a mesma forma de message.received. Exclusão → message.revoked.
Número somente Cloud API. Edição → message.edited com textAvailable: false, message: null e reason: "META_EDIT_TEXT_NOT_PROVIDED": a Meta avisa que houve uma edição mas não envia o novo texto. Exclusão → a Meta não avisa.
O WhatsApp só deixa editar nos 15 minutos seguintes ao envio (e apagar, até 2 dias). Uma edição sem texto é uma limitação da Meta: não há como pedir o texto depois.
Não guardamos o texto anterior (o WAIA Connect não guarda o conteúdo das mensagens): se precisar, ele está na sua base, em originalMessageId.
# Nothing to call: WAIA Connect POSTs message.edited / message.revoked to your webhook.
# Read a saved body: the final text (or null when Meta did not send it) and the original id.
jq -r 'if .type == "message.edited"
then "\(.data.originalMessageId) edited -> " + (if .data.textAvailable then (.data.message.text.body // .data.message.image.caption // .data.message.video.caption // "") else "(text not provided by Meta)" end)
else "\(.data.originalMessageId) deleted" end' body.jsonUm webhook criado antes destes eventos com «todos os eventos» não os recebe sozinho: escolha «todos» de novo (PATCH com events: null, ou o botão da linha dele no painel) ou some-os à lista. newEventsAvailable diz quais faltam.
Um endpoint que recebe message.edited/message.revoked deixa de receber essa edição ou exclusão crua como message.received (type: "edit", "revoke" ou "unsupported"). Um que não os recebe continua igual.
originalConnectMessageId é o nosso msg_… quando você enviou o original pela API; para uma mensagem do contato vem null.
Deduplique como qualquer evento: pelo id do envelope (evt_…).