Sentry: como funciona a entrega de webhooks

O Sentry assina o corpo bruto com HMAC-SHA256, sem timestamp no payload assinado. O formato verificado e um verificador Node.

Comportamento de entrega

Lido na documentação do próprio provedor, verificado pela última vez em 2026-08-06. Onde o provedor não informa um número, esta tabela também não traz nenhum.

Prazo de respostanão publicado pelo provedor
Novas tentativasnão publicado pelo provedor
Desistenão publicado pelo provedor

Assinatura

Verificada com um verificador funcional, comprovado por uma suíte de testes, e não lida na documentação. Última verificação em 2026-08-20.

AlgoritmoHMAC-SHA256
Payload assinadoraw body, no timestamp
Codificaçãohex
Cabeçalhosentry-hook-signature
Tolerâncianenhuma exigida

Verifique a assinatura

O corpo bruto da requisição, byte a byte, antes de qualquer parsing de JSON. Todos os esquemas desta página quebram no momento em que um framework serializa o payload de novo.

const crypto = require("node:crypto");

// hex(HMAC-SHA256(client secret, raw body)) — no timestamp anywhere
const expected = crypto
  .createHmac("sha256", clientSecret) // Settings → Developer Settings
  .update(rawBody)
  .digest("hex");
const received = Buffer.from(req.headers["sentry-hook-signature"] ?? "");
const wanted = Buffer.from(expected);
// timingSafeEqual throws on a length mismatch, so check that first.
const valid =
  received.length === wanted.length && crypto.timingSafeEqual(received, wanted);

Armadilhas

Nada no payload assinado expira: sem timestamp, uma requisição capturada passa na verificação um mês depois tão bem quanto passou ao vivo. A idempotência do seu lado é a única coisa entre uma requisição capturada e reenviada e um efeito colateral executado de novo.

Leia também

O AnyHook fica entre Sentry e seus endpoints: responde em cerca de um segundo, tenta de novo segundo um cronograma próprio quando seu servidor está fora do ar e guarda cada evento disponível para replay. Troque uma URL e mantenha seu código.

Como funciona →