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.1elocalhost) não é aceito.
Lista de tipos de evento: secção Eventos abaixo.
Corpo (JSON)
Todos os eventos usam o mesmo envelope:
| Campo | Tipo | Descrição |
|---|---|---|
| id | string (UUID) | ID único da entrega (repetido no cabeçalho). |
| type | string | Tipo do evento (ex.: message.inbound). |
| version | string | Versão do schema; hoje 1. |
| created_at | string | Instante em ISO 8601 / RFC3339 (na prática, UTC com sufixo Z). |
| data | objeto | Campos específicos do evento (podem variar por canal). |
Strings longas em data podem ser truncadas internamente para proteger seu endpoint.
Cabeçalhos
| Cabeçalho | Descrição |
|---|---|
| Content-Type | application/json |
| X-Coreli-Webhook-Id | Mesmo valor que id no JSON. |
| X-Coreli-Event | Mesmo valor que type no JSON. |
| X-Coreli-Signature | Assinatura 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
- Leia o corpo da requisição como bytes brutos (antes de parsear JSON).
- Calcule
HMAC-SHA256(corpo_bruto, signing_secret). - Compare com o valor após
v1=emX-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-Idpara 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.
| type | Nome | Quando | Doc |
|---|---|---|---|
| chat.created | Nova conversa iniciada | Nova conversa iniciada e persistida. | Doc |
| message.inbound | Mensagem recebida | Mensagem recebida do contato. | Doc |
| opportunity.created | Oportunidade criada | Oportunidade criada e ligada ao chat. | Doc |
| opportunity.won | Oportunidade ganha | Oportunidade marcada como ganha. | Doc |
| opportunity.lost | Oportunidade perdida | Oportunidade marcada como perdida. | Doc |
| pipeline.stage_changed | Estágio na pipeline | Card na pipeline ou estágio da oportunidade mudou. | Doc |
| calendar.event.created | Evento na agenda | Evento criado na agenda. | Doc |