Skip to content

Webhooks de eventos ​

O WayChat manda um POST para a sua URL quando algo acontece. Configure em Configurações → API → Novo webhook.

Eventos ​

EventoQuando
mensagem.recebidaO cliente mandou mensagem
mensagem.enviadaA equipe, o robô ou a API mandou mensagem
conversa.criadaComeçou uma conversa
conversa.atribuidaAlguém assumiu ou recebeu a conversa
conversa.transferidaMudou de setor ou de pessoa
conversa.encerradaA conversa foi encerrada
csat.recebidoO cliente deu a nota do atendimento
ligacao.encerradaUma ligação do WhatsApp terminou (atendida, perdida, recusada ou que falhou)

Formato ​

http
POST /sua-url
Content-Type: application/json
X-WayChat-Evento: mensagem.recebida
X-WayChat-Timestamp: 1792761600
X-WayChat-Assinatura: sha256=5f1c…
json
{
  "id": "6b0c3f0e-…",
  "evento": "mensagem.recebida",
  "criado_em": "2026-10-23T14:00:00.000Z",
  "dados": {
    "conversa": { "id": 42, "protocolo": 1042, "status": "aberta", "setor": { "id": 2, "nome": "Suporte técnico" } },
    "contato": { "id": 7, "nome": "Maria Souza", "telefone": "5544999998888" },
    "mensagem": { "id": 901, "direcao": "entrada", "texto": "Meu site caiu", "criado_em": "2026-10-23T14:00:00Z" }
  }
}

conversa e contato seguem o mesmo formato das rotas da API.

Conferir a assinatura ​

Cada webhook tem um segredo (whsec_...), mostrado ao criar. Calcule o HMAC-SHA256 de timestamp + "." + corpo cru com esse segredo e compare com X-WayChat-Assinatura:

js
import { createHmac, timingSafeEqual } from 'node:crypto'

function assinaturaValida(req, corpoCru, segredo) {
  const ts = req.headers['x-waychat-timestamp']
  const esperado = 'sha256=' + createHmac('sha256', segredo).update(`${ts}.${corpoCru}`).digest('hex')
  const recebido = String(req.headers['x-waychat-assinatura'] || '')
  const agora = Math.floor(Date.now() / 1000)
  return Math.abs(agora - Number(ts)) < 300 && recebido.length === esperado.length && timingSafeEqual(Buffer.from(recebido), Buffer.from(esperado))
}

TIP

Recuse envios com mais de 5 minutos (X-WayChat-Timestamp) para evitar repetição. Use o campo id para ignorar duplicados.

Entregas e novas tentativas ​

  • Responda com qualquer status 2xx em até 10 segundos.
  • Se falhar, o WayChat tenta de novo até 6 vezes, com espera crescente (30 s, 1 min, 2 min…).
  • Depois de 50 falhas seguidas, o webhook é desligado. Ligue de novo em Editar.
  • Em Envios você vê as últimas entregas, com status e tempo. Testar manda um evento teste na hora.
  • Só endereços https públicos são aceitos.