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).
versionstringVersão do schema; hoje 1.
created_atstringInstante em ISO 8601 / RFC3339 (na prática, UTC com sufixo Z).
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.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 na pipeline ou estágio da oportunidade mudou.Doc
calendar.event.createdEvento na agendaEvento criado na agenda.Doc