Cada requisição inclui o header X-Cordialy-Signature com uma assinatura HMAC-SHA256 do corpo. Valide essa assinatura antes de processar qualquer evento.
Webhook Secret
O secret é gerado automaticamente quando você cadastra um webhook em Integrações → Webhooks. Ele é exibido uma única vez logo após a criação — copie e guarde em um local seguro.
Se você perder o secret, não é possível recuperá-lo. Delete o webhook e crie um novo para gerar um secret diferente.
Como validar
A assinatura é calculada sobre o body bruto (bytes exatos recebidos na requisição).
Se você parsear o body antes de validar (ex: express.json() no Node.js), o body já foi transformado e a assinatura não vai bater. Leia o body como stream/raw antes de qualquer parsing.
Por que timingSafeEqual / compare_digest / hash_equals?
Comparações simples (===, ==) são vulneráveis a ataques de timing — um atacante pode descobrir o secret medindo o tempo de resposta. As funções de comparação constante eliminam esse risco.