Publicações de Status

Evento: status_posts · Transporte: POST para o seu receptor

Receba as publicações de Status (status@broadcast) dos seus contatos e os Status de grupo em tempo real, em evento separado de messages.

Inscrição explícita

O evento só é entregue a quem inclui status_posts pelo nome em events, no webhook da instância, no webhook global ou no SSE. Lista vazia ou All não incluem status_posts, para não enviar os Status de todos os contatos a quem não pediu. Enquanto ninguém estiver inscrito, a instância descarta os Status recebidos; eles não são entregues depois.

Diferenças em relação a messages

message.chatid é status@broadcast e message.isStatus é true. No Status de grupo, publicado por qualquer membro (inclusive a própria conta), message.chatid é o JID do grupo (@g.us) e message.isGroup é true. O autor está em message.sender, com sender_pn, sender_lid e senderName quando disponíveis. Publicações da própria conta chegam com fromMe: true.

Enquanto há inscritos, cada publicação é gravada antes do webhook, com chatid: status@broadcast: a mídia pode ser baixada por POST /message/download assim que o evento chega, e a publicação aparece em POST /message/find (filtrando por chatid: status@broadcast ou sem chatid). Ela sai na limpeza normal de mensagens. O Status de grupo fica na conversa do grupo, com messageType: GroupStatusMessage e o texto em text, e também sai em 24 horas (o de campanha do /sender fica com a campanha): liste com POST /message/find e messageType: GroupStatusMessage. A publicação não cria chat nem contador de não lidas e não dispara chatbot, fluxos ou Chatwoot. Respostas a um Status continuam chegando pela conversa individual, no evento messages.

Limites

Só publicações recebidas enquanto a instância está conectada. Edições, exclusões, reações e visualizações de Status não geram este evento. Os filtros fromMeYes, fromMeNo, wasSentByApi e wasNotSentByApi de excludeMessages também valem aqui; isGroupYes e isGroupNo não. Para separar os Status de grupo dos de contatos, use message.isGroup.

Habilitar este evento

Adicione status_posts à lista events do webhook da instância. Preserve os outros eventos de que sua integração precisa.

{
  "enabled": true,
  "url": "https://seu-sistema.example/hooks/whatsapp",
  "events": [
    "status_posts"
  ]
}

Envie essa configuração para POST /webhook, usando o header token. O JSON acima configura a assinatura; os exemplos de entrega abaixo são o que seu servidor recebe.

Campos do payload

O envelope comum vem na raiz. Campos condicionais podem estar ausentes ou nulos conforme o evento; não use a tabela como obrigação de presença de todos os campos.

CampoTipoSignificado
EventTypestringObrigatório. Tipo de evento, por exemplo connection ou messages.
ownerstringObrigatório. Consulte o objeto ou exemplo correspondente.
tokenstringObrigatório. Token da instância; dado sensível.
BaseUrlstringObrigatório. Consulte o objeto ou exemplo correspondente.
instanceNamestringConsulte o objeto ou exemplo correspondente.
messageobjectPublicação de Status normalizada. Campos disponíveis variam conforme o tipo.
message.idstringIdentificador retornado pelo sistema (owner:messageid); preserve como string.
message.messageidstringID da publicação no WhatsApp.
message.chatidstringstatus@broadcast nos Status de contatos; o JID do grupo (@g.us) no Status de grupo.
message.senderstringJID do autor da publicação.
message.senderNamestringNome disponível do autor.
message.sender_pnstringNúmero do autor (@s.whatsapp.net), quando conhecido.
message.sender_lidstringLID do autor, quando conhecido.
message.isStatusbooleanSempre true neste evento.
message.isGroupbooleantrue no Status de grupo (chatid do grupo); false nos Status de contatos.
message.fromMebooleanPublicação feita pela própria conta conectada.
message.wasSentByApibooleanPublicação enviada pela API.
message.messageTypestringTipo da mensagem do WhatsApp, por exemplo ExtendedTextMessage, ImageMessage ou VideoMessage.
message.mediaTypestringTipo de mídia informado pelo WhatsApp; vazio em texto.
message.typestringCategoria normalizada (text ou media).
message.textstringTexto ou legenda disponível.
message.contentvariávelConteúdo específico do tipo de mensagem, com as referências de mídia usadas por POST /message/download; não possui um formato único.
message.sourcestringPlataforma de origem inferida pelo ID.
message.messageTimestampintegerTimestamp da publicação em milissegundos Unix.
message.ownerstringConta conectada que recebeu a publicação.

Exemplos de entrega

Exemplos ilustrativos com identificadores fictícios. O conteúdo específico e os campos opcionais variam.

Status de texto

{
  "EventType": "status_posts",
  "owner": "5511999999999",
  "token": "INSTANCE_TOKEN",
  "BaseUrl": "https://seu-servidor.example",
  "instanceName": "Atendimento",
  "message": {
    "id": "5511999999999:3EB0STATUS0001",
    "messageid": "3EB0STATUS0001",
    "chatid": "status@broadcast",
    "sender": "5511988887777@s.whatsapp.net",
    "senderName": "Maria",
    "sender_pn": "5511988887777@s.whatsapp.net",
    "sender_lid": "123456789012345@lid",
    "isStatus": true,
    "isGroup": false,
    "fromMe": false,
    "wasSentByApi": false,
    "messageType": "ExtendedTextMessage",
    "mediaType": "",
    "type": "text",
    "text": "Promoção só hoje!",
    "messageTimestamp": 1788868800000,
    "owner": "5511999999999"
  }
}

Status de imagem com legenda

{
  "EventType": "status_posts",
  "owner": "5511999999999",
  "token": "INSTANCE_TOKEN",
  "BaseUrl": "https://seu-servidor.example",
  "instanceName": "Atendimento",
  "message": {
    "id": "5511999999999:3EB0STATUS0002",
    "messageid": "3EB0STATUS0002",
    "chatid": "status@broadcast",
    "sender": "5511988887777@s.whatsapp.net",
    "senderName": "Maria",
    "sender_pn": "5511988887777@s.whatsapp.net",
    "sender_lid": "123456789012345@lid",
    "isStatus": true,
    "isGroup": false,
    "fromMe": false,
    "wasSentByApi": false,
    "messageType": "ImageMessage",
    "mediaType": "image",
    "type": "media",
    "text": "Novidades da semana",
    "content": {
      "caption": "Novidades da semana",
      "mimetype": "image/jpeg"
    },
    "messageTimestamp": 1788868860000,
    "owner": "5511999999999"
  }
}

Status de grupo publicado por um membro

{
  "EventType": "status_posts",
  "owner": "5511999999999",
  "token": "INSTANCE_TOKEN",
  "BaseUrl": "https://seu-servidor.example",
  "instanceName": "Atendimento",
  "message": {
    "id": "5511999999999:3EB0STATUS0003",
    "messageid": "3EB0STATUS0003",
    "chatid": "120363012345678901@g.us",
    "sender": "123456789012345@lid",
    "senderName": "Maria",
    "sender_pn": "5511988887777@s.whatsapp.net",
    "sender_lid": "123456789012345@lid",
    "isStatus": true,
    "isGroup": true,
    "fromMe": false,
    "wasSentByApi": false,
    "messageType": "ExtendedTextMessage",
    "mediaType": "",
    "type": "text",
    "text": "Reunião do grupo amanhã às 19h",
    "messageTimestamp": 1788868920000,
    "owner": "5511999999999"
  }
}

Responder ao webhook

Seu receptor deve aceitar o POST JSON e devolver uma resposta 2xx rapidamente, após validar e registrar o recebimento. O corpo da resposta não é um comando para a API. Processe trabalho demorado separadamente.

O worker não repete automaticamente uma entrega HTTP malsucedida. Consulte diagnóstico de webhooks e implemente a reconciliação necessária. Eventos repetidos ou fora de ordem ainda precisam ser tolerados pelo receptor.

Referências