Skip to main content
received dispara para cada mensagem recebida pelo número conectado — texto, mídia, reação, voto, resposta de botão — e também para eventos de chat (alguém entrou no grupo, mensagem apagada, chamada perdida), que chegam com notification em vez de conteúdo. O schema completo com todos os campos está na referência. Esta página explica como ler o payload.

Envelope

Conteúdo por tipo

Exatamente um dos blocos abaixo vem preenchido. Teste a presença do campo (if (event.image) …) em vez de olhar um campo “tipo”.

text

Quando o texto traz link com prévia, vêm também title, description, url e thumbnail_url.
  • url é assinada e expira em 24 h. Copie o arquivo para o seu storage se precisar dele depois.
  • Se o download/decifração falhar, url vem ausente e download_error explica o motivo.
  • video: seconds, is_gif. audio: ptt (voice note) e seconds. document: file_name, title, page_count. sticker: animated.
  • view_once: true em mídia de visualização única — o WhatsApp não permite reencaminhar; trate como sensível.
Vários cartões numa mensagem chegam em contacts (array com o mesmo formato).
value vazio significa que a reação foi removida.
Votos só são decifrados para enquetes que o engine viu (enviadas pela API ou recebidas desde o último restart).
Resposta do contato a botões ou lista que você enviou:
reference_message_id aponta para a mensagem interativa original.
Mensagens interativas enviadas por outras contas (um negócio, por exemplo) chegam em buttons (message, title, footer, buttons[] com label, type, url/phone) ou list (sections[].rows[]).
product traz o snapshot do card enviado (product_id, title, price, currency, business_phone…); order traz o pedido feito pelo cliente a partir do catálogo (order_id, token, item_count, status, total…). Use order_id + token em GET /business/orders/{id} para os itens. A imagem do produto não é baixada.
Convite para administrar um canal: newsletter_id, name, caption.
Sem conteúdo de mensagem; notification diz o que aconteceu e notification_parameters traz os envolvidos:
Tipo que o Wabox ainda não mapeia: "unsupported": { "wa_type": "…" }. Abra um chamado com o wa_type se precisar dele.

Mensagens enviadas por você

Por padrão, received não inclui o que o próprio número envia. Ligue notify_sent_by_me nos filtros para receber também as mensagens digitadas no celular e as enviadas pela API (from_me: true; from_api separa as duas). É útil para espelhar a conversa num CRM.

Grupos

phone é o id do grupo (120363012345678901-group) e participant_phone quem escreveu. Para responder no grupo, use o id do grupo em phone; para responder no privado, use participant_phone. Se o remetente usa número oculto, participant_phone pode vir no formato ...@lid — ele funciona igual como destino.

Dicas

  • Responda 200 e processe depois; um received de mídia pode pesar (a mídia em si não vai no payload, só a URL).
  • Baixe a mídia logo: a URL expira em 24 h.
  • Ignore waiting_message: true (ou mostre “carregando”); o evento definitivo chega em seguida com o mesmo message_id.
  • Para não receber tipos que não usa (áudio, documentos, grupos), use os filtros em vez de descartar no seu lado.