Webhooks

Webhooks

Resumo

Os webhooks avisam seu sistema sobre o que acontece na Coreli em tempo quase real. A configuração é por conta: no painel, abra Configurações → Webhook.

  • Enviamos uma requisição HTTP com corpo em JSON para a URL que você informar.
  • Só entram na fila os tipos de evento que você marcar na configuração.
  • A URL deve ser HTTPS. HTTP (incluindo 127.0.0.1 e localhost) não é aceito.

Lista de tipos de evento: secção Eventos abaixo.

Corpo (JSON)

Todos os eventos usam o mesmo envelope:

CampoTipoDescrição
idstring (UUID)ID único da entrega (repetido no cabeçalho).
typestringTipo do evento (ex.: message.inbound).
created_atstringInstante em ISO 8601 / RFC3339 (na prática, UTC com sufixo Z).
developer_app_idstring (UUID)UUID do aplicativo de desenvolvedor (repetido no cabeçalho).
dataobjetoCampos específicos do evento (podem variar por canal).

Strings longas em data podem ser truncadas internamente para proteger seu endpoint.

Cabeçalhos

CabeçalhoDescrição
Content-Typeapplication/json
X-Coreli-Webhook-IdMesmo valor que id no JSON.
X-Coreli-EventMesmo valor que type no JSON.
X-Coreli-SignatureAssinatura HMAC-SHA256 do corpo bruto (bytes exatos do JSON), em hexadecimal, prefixada por v1=.

O segredo HMAC é o signing secret (whsec_...) mostrado somente uma vez ao criar o webhook, ao regenerar o segredo ou na primeira gravação.

Verificação da assinatura

  1. Leia o corpo da requisição como bytes brutos (antes de parsear JSON).
  2. Calcule HMAC-SHA256(corpo_bruto, signing_secret).
  3. Compare com o valor após v1= em X-Coreli-Signature (hex minúsculo), de forma constant-time quando possível.

Exemplo em Node.js (middleware que preserva raw body):

import crypto from "crypto";

function coreliVerify(rawBody, headerSig, secret) {
  if (!headerSig || typeof headerSig !== "string" || !headerSig.startsWith("v1=")) return false;
  const want = headerSig.slice(3);
  const got = crypto.createHmac("sha256", secret).update(rawBody).digest("hex");
  try {
    return crypto.timingSafeEqual(Buffer.from(want, "hex"), Buffer.from(got, "hex"));
  } catch {
    return false;
  }
}

Boas práticas

  • Responda 2xx rápido e processe o evento em fila no seu lado.
  • Trate reentregas: use X-Coreli-Webhook-Id para idempotência.
  • Guarde o segredo em variável de ambiente e mantenha o endpoint em HTTPS.

Eventos

Tabela de tipos e atalhos para a página de cada um. Configuração da URL, envelope JSON, cabeçalhos e verificação HMAC estão nas secções acima nesta mesma página.

typeNomeQuandoDoc
chat.createdNova conversa iniciadaNova conversa iniciada e persistida.Doc
message.inboundMensagem recebidaMensagem recebida do contato ou de grupo WhatsApp.Doc
opportunity.createdOportunidade criadaOportunidade criada e ligada ao chat.Doc
opportunity.wonOportunidade ganhaOportunidade marcada como ganha.Doc
opportunity.lostOportunidade perdidaOportunidade marcada como perdida.Doc
pipeline.stage_changedEstágio na pipelineCard movido para coluna na pipeline ou estágio/coluna da oportunidade alterado.Doc
calendar.event.createdEvento na agendaEvento criado na agenda.Doc