Webhooks
Configure webhooks para receber eventos em tempo real via HTTP POST.
Configurar Webhook
Define ou atualiza a configuração de webhook para uma instância. Permite configurar URL de destino, eventos que serão enviados e formato do payload.
Ativa ou desativa o webhook.
URL que receberá os eventos via POST.
Headers HTTP enviados junto com cada evento (ex: Authorization). Aceita até 20, nomes únicos ignorando maiúsculas, e exige URL https.
Lista de eventos para filtrar. Se omitida, nenhum evento é entregue
Se true, codifica o payload em base64.
curl -X POST https://api.whatsmiau.dev/v2/webhook/set/MinhaInstancia \
-H "Content-Type: application/json" \
-H "apikey: SUA_CHAVE_AQUI" \
-d '{
"webhook": {
"enabled": true,
"url": "https://meusite.com/webhook",
"events": ["messages.upsert", "connection.update", "call"]
}
}'const response = await fetch(
"https://api.whatsmiau.dev/v2/webhook/set/MinhaInstancia",
{
method: "POST",
headers: {
"Content-Type": "application/json",
"apikey": "SUA_CHAVE_AQUI"
},
body: JSON.stringify({
webhook: {
enabled: true,
url: "https://meusite.com/webhook",
events: ["messages.upsert", "connection.update", "call"]
}
})
}
);Consultar Webhook
Retorna a configuração atual de webhook para uma instância.
curl -X GET https://api.whatsmiau.dev/v2/webhook/find/MinhaInstancia \
-H "apikey: SUA_CHAVE_AQUI"const response = await fetch(
"https://api.whatsmiau.dev/v2/webhook/find/MinhaInstancia",
{
headers: {
"apikey": "SUA_CHAVE_AQUI"
}
}
);
const data = await response.json();
console.log(data.webhook);Eventos de Webhook
Todos os eventos são enviados como HTTP POST para a URL configurada, dentro de um envelope padrão. O campo data varia conforme o tipo de evento.
Envelope
{
event: string // Tipo do evento (ex: "messages.upsert")
instance: string // ID da instância
data: T // Payload específico do evento (ver abaixo)
date_time: string // Timestamp ISO 8601
sender: string // Remetente (quando aplicável)
server_url: string // URL do servidor
}messages.upsert
Disparado quando uma nova mensagem é recebida ou enviada. Inclui mensagens de texto, imagens, vídeos, áudios, documentos, reações, contatos, listas e botões.
Campos do payload (data)
Identificador da mensagem.
JID do chat (ex: 5511999999999@s.whatsapp.net).
Se a mensagem foi enviada por você.
ID único da mensagem.
JID do remetente em grupos.
Nome de exibição do remetente.
"sent" ou "received".
Conteúdo da mensagem. Apenas um dos campos abaixo estará presente por vez:
Mensagem de texto simples.
Imagem com url, mimetype, caption, width, height.
Vídeo com url, mimetype, caption, seconds.
Áudio com url, mimetype, seconds, ptt (voz).
Documento com url, mimetype, fileName, title.
Reação com key (mensagem alvo) e text (emoji).
Contato com displayName e vCard.
Resposta de lista com title e singleSelectReply.selectedRowId.
URL pública da mídia (imagem, áudio, vídeo, documento) após upload no storage.
Tipo da mensagem (ex: "conversation", "imageMessage", "audioMessage").
Unix timestamp em segundos.
ID da instância que recebeu a mensagem.
Contexto da mensagem (presente quando é resposta, menção ou mensagem efêmera).
ID da mensagem original (quando é resposta).
JID do autor da mensagem original.
Conteúdo da mensagem citada (mesma estrutura de message).
Lista de JIDs mencionados na mensagem.
Tempo de expiração em segundos (mensagens efêmeras).
{
"event": "messages.upsert",
"instance": "Atendimento01",
"date_time": "2026-03-30T14:32:00Z",
"data": {
"key": {
"remoteJid": "5511999999999@s.whatsapp.net",
"fromMe": false,
"id": "3EB04A2D1F75..."
},
"pushName": "Maria Silva",
"status": "received",
"message": {
"conversation": "Olá! Gostaria de saber o status do meu pedido."
},
"messageType": "conversation",
"messageTimestamp": 1743349920,
"instanceId": "Atendimento01",
"source": "android"
}
}{
"event": "messages.upsert",
"instance": "Atendimento01",
"date_time": "2026-03-30T14:35:00Z",
"data": {
"key": {
"remoteJid": "5511999999999@s.whatsapp.net",
"fromMe": false,
"id": "3EB04B3C2E86..."
},
"pushName": "Maria Silva",
"status": "received",
"message": {
"imageMessage": {
"mimetype": "image/jpeg",
"caption": "Foto do produto",
"height": 1080,
"width": 1920,
"fileLength": "245832"
},
"mediaUrl": "https://storage.whatsmiau.io/media/3EB04B3C2E86.jpg"
},
"messageType": "imageMessage",
"messageTimestamp": 1743350100,
"instanceId": "Atendimento01"
}
}{
"event": "messages.upsert",
"instance": "Atendimento01",
"date_time": "2026-03-30T14:40:00Z",
"data": {
"key": {
"remoteJid": "5511999999999@s.whatsapp.net",
"fromMe": false,
"id": "3EB04C4D3F97..."
},
"pushName": "Maria Silva",
"status": "received",
"message": {
"audioMessage": {
"mimetype": "audio/ogg; codecs=opus",
"seconds": 12,
"ptt": true,
"fileLength": "18432"
},
"mediaUrl": "https://storage.whatsmiau.io/media/3EB04C4D3F97.ogg"
},
"messageType": "audioMessage",
"messageTimestamp": 1743350400,
"instanceId": "Atendimento01"
}
}{
"event": "messages.upsert",
"instance": "Atendimento01",
"date_time": "2026-03-30T14:42:00Z",
"data": {
"key": {
"remoteJid": "5511999999999@s.whatsapp.net",
"fromMe": false,
"id": "3EB04E6F5BA9..."
},
"pushName": "Maria Silva",
"status": "received",
"message": {
"reactionMessage": {
"key": {
"remoteJid": "5511999999999@s.whatsapp.net",
"fromMe": true,
"id": "3EB04A2D1F75..."
},
"text": "👍"
}
},
"messageType": "reactionMessage",
"messageTimestamp": 1743350520,
"instanceId": "Atendimento01"
}
}messages.edited
Disparado quando uma mensagem é editada. O campo key identifica a mensagem original e editedMessage traz o conteúdo novo.
Campos do payload (data)
Chave da mensagem original (remoteJid, id, fromMe).
Conteúdo novo da mensagem.
Tipo da mensagem (ex: conversation).
Nome de exibição de quem editou.
Se a edição foi recebida ou enviada pela instância.
Timestamp da edição.
Sempre "whatsapp".
ID da instância.
{
"event": "messages.edited",
"instance": "Atendimento01",
"date_time": "2026-03-30T16:00:00Z",
"data": {
"key": {
"remoteJid": "5511999999999@s.whatsapp.net",
"id": "3EB04A2D1F75...",
"fromMe": false
},
"editedMessage": {
"conversation": "Texto editado"
},
"messageType": "conversation",
"instanceId": "Atendimento01",
"pushName": "Pedro Client",
"status": "received",
"messageTimestamp": 1708123456,
"source": "whatsapp"
}
}messages.update
Disparado quando o status de entrega de uma mensagem muda. Ocorre quando a mensagem é entregue no dispositivo do destinatário (DELIVERY_ACK) ou quando é lida (READ).
Campos do payload (data)
ID interno da mensagem.
ID da chave da mensagem.
JID do chat.
Se a mensagem foi enviada por você.
JID do participante (em grupos).
Novo status da mensagem.
ID da instância.
{
"event": "messages.update",
"instance": "Atendimento01",
"date_time": "2026-03-30T14:33:00Z",
"data": {
"messageId": "3EB04A2D1F75...",
"keyId": "3EB04A2D1F75...",
"remoteJid": "5511999999999@s.whatsapp.net",
"fromMe": true,
"participant": "",
"status": "DELIVERY_ACK",
"instanceId": "Atendimento01"
}
}{
"event": "messages.update",
"instance": "Atendimento01",
"date_time": "2026-03-30T14:45:00Z",
"data": {
"messageId": "3EB04A2D1F75...",
"keyId": "3EB04A2D1F75...",
"remoteJid": "5511999999999@s.whatsapp.net",
"fromMe": true,
"participant": "",
"status": "READ",
"instanceId": "Atendimento01"
}
}messages.set
Disparado durante a sincronização do histórico completo ao conectar a instância. O WhatsApp envia lotes (batches) de mensagens antigas. Este evento é emitido para cada lote recebido. O payload é um array de mensagens no mesmo formato do messages.upsert.
Para receber este evento, é necessário habilitar a opção Sincronizar Histórico no momento da criação de uma nova instância (parâmetro syncFullHistory: true) e adicionar o evento messages.set na lista de eventos do webhook.
Campos extras do envelope
Indica se é o último lote da sincronização (true quando progress ≥ 100).
Percentual da sincronização (0–100). Útil para mostrar barra de progresso.
Campos do payload (data[])
Cada item do array segue o mesmo formato de mensagem do evento messages.upsert.
Chave da mensagem (remoteJid, id, fromMe).
Nome de exibição do remetente.
Conteúdo da mensagem (mesmo formato do messages.upsert).
Tipo da mensagem (conversation, imageMessage, etc).
Timestamp Unix da mensagem original.
ID da instância.
{
"event": "messages.set",
"instance": "Atendimento01",
"date_time": "2026-07-04T10:00:00Z",
"isLatest": false,
"progress": 45,
"data": [
{
"key": {
"remoteJid": "5511999999999@s.whatsapp.net",
"id": "3EB04A2D1F75...",
"fromMe": false
},
"pushName": "5511999999999",
"message": {
"conversation": "Olá, tudo bem?"
},
"messageType": "conversation",
"messageTimestamp": 1719878400,
"instanceId": "Atendimento01"
}
]
}{
"event": "messages.set",
"instance": "Atendimento01",
"date_time": "2026-07-04T10:02:30Z",
"isLatest": true,
"progress": 100,
"data": []
}connection.update
Disparado quando o estado da conexão muda. Ocorre ao conectar com sucesso (escaneou QR Code), ao desconectar (logout, perda de sessão) ou em falhas de conexão.
Campos do payload (data)
ID da instância.
WhatsApp UID (número conectado). Presente apenas quando state = "open".
Nome do perfil do WhatsApp. Presente apenas quando state = "open".
URL da foto de perfil (quando disponível).
Estado atual da conexão.
Código do motivo (200 = sucesso, outros = erro).
{
"event": "connection.update",
"instance": "Atendimento01",
"date_time": "2026-03-30T10:00:00Z",
"data": {
"instance": "Atendimento01",
"wuid": "5511999998888@s.whatsapp.net",
"profileName": "Meu Negócio",
"profilePictureUrl": "https://pps.whatsapp.net/v/t61...",
"state": "open",
"statusReason": 200
}
}{
"event": "connection.update",
"instance": "Atendimento01",
"date_time": "2026-03-30T18:00:00Z",
"data": {
"instance": "Atendimento01",
"wuid": "",
"profileName": "",
"state": "close",
"statusReason": 408
}
}contacts.upsert
Disparado quando um contato ou grupo é criado ou atualizado. Inclui mudanças de nome de exibição (push name), nome comercial, foto de perfil, informações de grupo e sincronização de histórico. O payload é um array de contatos.
Campos do payload (data[])
JID do contato ou grupo.
LID do contato (identificador alternativo).
Nome de exibição do contato.
URL da foto de perfil.
ID da instância.
Gatilhos: Mudança de push name, nome comercial (WhatsApp Business), foto de perfil, criação/atualização de grupo, sincronização de histórico de contatos.
{
"event": "contacts.upsert",
"instance": "Atendimento01",
"date_time": "2026-03-30T15:00:00Z",
"data": [
{
"remoteJid": "5511999999999@s.whatsapp.net",
"remoteLid": "",
"pushName": "Maria Silva",
"profilePicUrl": "https://pps.whatsapp.net/v/t61...",
"instanceId": "Atendimento01"
}
]
}{
"event": "contacts.upsert",
"instance": "Atendimento01",
"date_time": "2026-03-30T15:05:00Z",
"data": [
{
"remoteJid": "120363001234567890@g.us",
"remoteLid": "",
"pushName": "Grupo de Vendas",
"profilePicUrl": "https://pps.whatsapp.net/v/t61...",
"instanceId": "Atendimento01"
}
]
}messages.delete
Disparado quando uma mensagem é apagada para todos (revoke). Ocorre quando o remetente apaga uma mensagem que já foi entregue — o WhatsApp envia um protocolo de revogação que dispara este evento.
Campos do payload (data)
ID da mensagem apagada.
JID do chat.
Se a mensagem apagada era sua.
JID do participante (em grupos).
Sempre "DELETED".
ID da instância.
{
"event": "messages.delete",
"instance": "Atendimento01",
"date_time": "2026-03-30T16:00:00Z",
"data": {
"id": "3EB04A2D1F75...",
"remoteJid": "5511999999999@s.whatsapp.net",
"fromMe": false,
"participant": "",
"status": "DELETED",
"instanceId": "Atendimento01"
}
}group-participants.update
Disparado quando a composição de participantes de um grupo é alterada — adição, remoção, promoção ou rebaixamento de membros. O campo action indica qual tipo de alteração ocorreu.
Campos do payload (data)
JID do grupo (ex: 120363429994246808@g.us).
LID de quem executou a ação (ex: 158437669392517@lid).
Tipo da alteração ocorrida.
Lista de participantes afetados. Cada item contém:
LID do participante.
Número do WhatsApp.
true se promovido a admin, false se rebaixado, null em add/remove.
Mesmos dados de participants em formato aninhado (compatibilidade Evolution API).
ID da instância.
{
"event": "group-participants.update",
"instance": "Atendimento01",
"date_time": "2026-03-30T16:00:00Z",
"data": {
"id": "120363429994246808@g.us",
"author": "158437669392517@lid",
"participants": [
{
"id": "35026011992289@lid",
"phoneNumber": "558599999999@s.whatsapp.net",
"admin": false
}
],
"action": "promote",
"participantsData": [
{
"jid": {
"id": "35026011992289@lid",
"phoneNumber": "558599999999@s.whatsapp.net",
"admin": false
}
}
]
},
"sender": "558590909090@s.whatsapp.net"
}call
Somente EvolutionDisparado durante o ciclo de vida de uma ligação. Adicione call à lista de eventos do webhook para recebê-lo. Os status possíveis são offer, preaccept, accept, transport, relaylatency, reject e terminate.
Este é um evento de sinalização segura: não inclui conteúdo ou binários de áudio/vídeo, SDP, endpoints de relay, mídia criptografada nem chaves da chamada. Não há tradução nem entrega deste evento no formato Z-API.
Campos do payload (data)
ID usado nos endpoints de controle e áudio.
JID que originou o evento.
Identificadores do criador da ligação, quando disponíveis.
JID do grupo em sinalizações de grupo.
Transição do ciclo de vida da ligação.
Tipo anunciado na oferta, quando conhecido.
Características da ligação.
Metadados do cliente remoto, quando informados.
Motivo informado ao encerrar a ligação.
Permanece false; a mídia RTC bruta não é exposta no webhook.
{
"event": "call",
"instance": "Atendimento01",
"date_time": "2026-08-15T12:00:00Z",
"data": {
"callId": "ABCD1234",
"from": "5511999999999@s.whatsapp.net",
"callCreator": "5511999999999@s.whatsapp.net",
"status": "offer",
"media": "audio",
"isVideo": false,
"isGroup": false,
"rtcMediaAvailable": false
}
}{
"event": "call",
"instance": "Atendimento01",
"date_time": "2026-08-15T12:05:00Z",
"data": {
"callId": "ABCD1234",
"from": "5511999999999@s.whatsapp.net",
"status": "terminate",
"reason": "timeout",
"isGroup": false,
"rtcMediaAvailable": false
}
}
Whatsmiau