Linear: como funciona a entrega de webhooks

O Linear não publica timeout nem novas tentativas. O que está verificado: o formato HMAC-SHA256 do linear-signature, com 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
Codificaçãohex
Cabeçalholinear-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(webhook secret, raw body))
const expected = crypto
  .createHmac("sha256", webhookSecret) // per webhook, on its detail page
  .update(rawBody)
  .digest("hex");
const received = Buffer.from(req.headers["linear-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

O comportamento de entrega (timeout, novas tentativas, desativação) não é publicado. O payload traz webhookTimestamp; compará-lo com o relógio é sua única defesa contra ataques de repetição, já que a assinatura em si não cobre nenhum timestamp.

Leia também

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