# 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.

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

Envie essa configuração para [POST /webhook](/reference/updateWebhook.md), 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.

| Campo | Tipo | Significado |
|---|---|---|
| `EventType` | string | **Obrigatório.** Tipo de evento, por exemplo connection ou messages. |
| `owner` | string | **Obrigatório.** Consulte o objeto ou exemplo correspondente. |
| `token` | string | **Obrigatório.** Token da instância; dado sensível. |
| `BaseUrl` | string | **Obrigatório.** Consulte o objeto ou exemplo correspondente. |
| `instanceName` | string | Consulte o objeto ou exemplo correspondente. |
| `message` | object | Publicação de Status normalizada. Campos disponíveis variam conforme o tipo. |
| `message.id` | string | Identificador retornado pelo sistema (`owner:messageid`); preserve como string. |
| `message.messageid` | string | ID da publicação no WhatsApp. |
| `message.chatid` | string | `status@broadcast` nos Status de contatos; o JID do grupo (`@g.us`) no Status de grupo. |
| `message.sender` | string | JID do autor da publicação. |
| `message.senderName` | string | Nome disponível do autor. |
| `message.sender_pn` | string | Número do autor (`@s.whatsapp.net`), quando conhecido. |
| `message.sender_lid` | string | LID do autor, quando conhecido. |
| `message.isStatus` | boolean | Sempre `true` neste evento. |
| `message.isGroup` | boolean | `true` no Status de grupo (`chatid` do grupo); `false` nos Status de contatos. |
| `message.fromMe` | boolean | Publicação feita pela própria conta conectada. |
| `message.wasSentByApi` | boolean | Publicação enviada pela API. |
| `message.messageType` | string | Tipo da mensagem do WhatsApp, por exemplo `ExtendedTextMessage`, `ImageMessage` ou `VideoMessage`. |
| `message.mediaType` | string | Tipo de mídia informado pelo WhatsApp; vazio em texto. |
| `message.type` | string | Categoria normalizada (`text` ou `media`). |
| `message.text` | string | Texto ou legenda disponível. |
| `message.content` | variável | Conteú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.source` | string | Plataforma de origem inferida pelo ID. |
| `message.messageTimestamp` | integer | Timestamp da publicação em milissegundos Unix. |
| `message.owner` | string | Conta 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

```json
{
  "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

```json
{
  "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

```json
{
  "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](/docs/integrations-webhooks#diagnostico) e implemente a reconciliação necessária. Eventos repetidos ou fora de ordem ainda precisam ser tolerados pelo receptor.

## Referências

- [Introdução, configuração e catálogo](/docs/integrations-webhooks)
- [Autenticação](/docs/authentication)
- [Contrato OpenAPI completo](/openapi-bundled.json)
