GitHub: como funciona a entrega de webhooks

O GitHub nunca tenta de novo uma entrega com falha, e o registro some após 3 dias. O que isso significa, o formato da assinatura 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 resposta10 s

Verifique se seu handler responde a tempo

Novas tentativasNenhuma. O GitHub não reenvia automaticamente as entregas com falha
DesisteSem desativação. As entregas podem ser reenviadas manualmente por 3 dias; depois disso, o registro desaparece
Fontehttps://docs.github.com/en/webhooks/using-webhooks/best-practices-for-using-webhooks

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
Codificaçãohex
Cabeçalhox-hub-signature-256 = sha256=hex
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");

// x-hub-signature-256: "sha256=" + hex(HMAC-SHA256(secret, raw body))
const expected =
  "sha256=" +
  crypto.createHmac("sha256", webhookSecret).update(rawBody).digest("hex");
const received = Buffer.from(req.headers["x-hub-signature-256"] ?? "");
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

Você tem uma única tentativa. Todos os outros remetentes desta lista tentam de novo por conta própria; o GitHub não, então uma janela de deploy de 30 segundos perde eventos sem segunda chance. O botão Redeliver (entregar novamente) e a Redelivery API funcionam por entrega, manualmente, por 3 dias; depois disso, o próprio registro desaparece.

Leia também

O AnyHook fica entre GitHub 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 →