Sincronização de histórico

Evento: history · Transporte: POST para o seu receptor

Receba lotes de dados processados durante sincronizações e recuperações de histórico.

Variações do payload

EventType permanece history. O campo event identifica o conteúdo do lote: por exemplo messages, chats, calls, labels ou chat_labels. Leia o array correspondente; não suponha que todos os arrays existam no mesmo evento.

Sincronizações de etiquetas podem acrescentar history_type, sync_id, full_sync, summary e chunk. Esses metadados não são universais para todo histórico.

Como processar

Faça upsert pelos IDs, aceite vários lotes e tolere sobreposição com eventos ao vivo. O recebimento de um lote não comprova que todo o histórico do WhatsApp foi sincronizado. Quando chunk.has_more existir, ele descreve aquela sequência de chunks.

Sequências e conclusão

Cada origem de lotes recebe um batchChunkOrder: o histórico inicial, cada parte que o WhatsApp envia depois dele e cada resposta de POST /message/history-sync. Chats, mensagens e ligações da mesma origem compartilham o número. Identifique uma sequência por batchChunkOrder + event e acompanhe seus lotes com batchNumber e batchTotal. Lotes de sequências diferentes podem chegar intercalados.

Lotes com dados chegam com batchHistoryStatus: "loading". O fim é informado por um lote sem dados, com event: "status" e batchHistoryStatus: "complete"; seu batchChunkOrder é o da última sequência enviada. Ele sai quando o WhatsApp indica o fim da sincronização completa ou após cerca de 2 minutos sem novas partes do histórico. Se partes atrasadas chegarem depois, um novo complete é enviado: considere o de maior batchChunkOrder. A numeração recomeça em 1 a cada pareamento.

Um novo pareamento pode reenviar mensagens já recebidas. Deduplique por messageid e faça upsert pelos IDs: lotes também podem se sobrepor a eventos recebidos ao vivo.

Habilitar este evento

Adicione history à 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": [
    "history"
  ]
}

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.
eventstringConteúdo do lote: messages, chats, calls, labels, chat_labels ou status (conclusão do histórico).
messagesarray / nullLote de mensagens.
messages[].idstringIdentificador retornado pelo sistema; preserve como string.
messages[].messageidstringID da mensagem no WhatsApp.
messages[].chatidstringJID do contato, grupo ou canal.
messages[].senderstringJID do remetente.
messages[].senderNamestringNome disponível do remetente.
messages[].fromMebooleanMensagem enviada pela conta conectada.
messages[].wasSentByApibooleanOrigem na API quando esse campo estiver presente na mensagem.
messages[].isGroupbooleanIdentifica conversa de grupo.
messages[].messageTypestringTipo de mensagem normalizado.
messages[].textstringTexto ou legenda disponível.
messages[].messageTimestampintegerTimestamp da mensagem em milissegundos Unix.
messages[].contentvariávelConteúdo específico do tipo de mensagem; não possui um formato único.
messages[].statusstringEstado disponível da mensagem; pode estar vazio.
chatsarray / nullLote de chats.
chats[].idstringID local do chat.
chats[].wa_chatidstringJID da conversa.
chats[].namestringNome disponível.
chats[].wa_isGroupbooleanConversa de grupo.
chats[].wa_isBlockedbooleanEstado de bloqueio no snapshot.
chats[].wa_archivedbooleanEstado de arquivamento.
chats[].wa_unreadCountintegerQuantidade de mensagens não lidas disponível.
chats[].wa_labelvariávelEtiquetas associadas, conforme a projeção do chat. Pode ser texto JSON; normalize antes de usar.
labelsarray / nullLote de etiquetas.
chat_labelsarray / nullAssociações atualizadas pela sincronização de etiquetas.
sync_idstringCorrelação da sincronização de etiquetas, quando presente.
history_typestringOrigem adicional, como labels_refresh.
full_syncbooleanSe a sincronização de etiquetas foi completa.
chunkobjectMetadados opcionais de fragmentação.
chunk.indexintegerÍndice do chunk.
chunk.totalintegerTotal daquela sequência.
chunk.sizeintegerItens neste chunk.
chunk.has_morebooleanExistem mais chunks naquela sequência.
batchNumberintegerNúmero deste lote, começando em 1.
batchTotalintegerTotal de lotes desta sequência.
batchChunkOrderintegerSequência da origem deste lote, atribuída pela API. Não é a ordem do chunk no WhatsApp e recomeça em 1 a cada pareamento.
batchHistoryStatusstringloading em lotes com dados; complete no lote status que encerra o histórico.
callsarray / nullRegistros de chamadas do histórico quando event=calls.

Exemplos de entrega

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

Lote de mensagens

{
  "EventType": "history",
  "owner": "5511999999999",
  "token": "INSTANCE_TOKEN",
  "BaseUrl": "https://seu-servidor.example",
  "instanceName": "Atendimento",
  "event": "messages",
  "messages": [
    {
      "id": "5511999999999:MSG_HISTORICO",
      "messageid": "MSG_HISTORICO",
      "chatid": "5511888888888@s.whatsapp.net",
      "text": "Mensagem do histórico",
      "messageTimestamp": 1788868800000
    }
  ],
  "batchNumber": 1,
  "batchTotal": 1,
  "batchChunkOrder": 1,
  "batchHistoryStatus": "loading"
}

Lote de chats

{
  "EventType": "history",
  "owner": "5511999999999",
  "token": "INSTANCE_TOKEN",
  "BaseUrl": "https://seu-servidor.example",
  "instanceName": "Atendimento",
  "event": "chats",
  "chats": [
    {
      "id": "r0123456789abcd",
      "wa_chatid": "5511888888888@s.whatsapp.net",
      "name": "Contato de exemplo"
    }
  ],
  "batchNumber": 1,
  "batchTotal": 1,
  "batchChunkOrder": 1,
  "batchHistoryStatus": "loading"
}

Conclusão do histórico

{
  "EventType": "history",
  "owner": "5511999999999",
  "token": "INSTANCE_TOKEN",
  "BaseUrl": "https://seu-servidor.example",
  "instanceName": "Atendimento",
  "event": "status",
  "batchNumber": 1,
  "batchTotal": 1,
  "batchChunkOrder": 3,
  "batchHistoryStatus": "complete"
}

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