Discord: como funciona a entrega de webhooks

As interações exigem uma resposta inicial em até 3 segundos e são assinadas com Ed25519 em vez de HMAC. O formato verificado e um verificador Web Crypto.

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 resposta3 s

Endpoints de interação precisam enviar uma resposta inicial em até 3 segundos

Verifique se seu handler responde a tempo

Novas tentativasnão publicado pelo provedor
Desistenão publicado pelo provedor
Fontehttps://docs.discord.com/developers/interactions/receiving-and-responding

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.

AlgoritmoEd25519
Payload assinado{timestamp}{body}
Codificaçãohex
Cabeçalhox-signature-ed25519 + x-signature-timestamp
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.

// Ed25519, not HMAC: verify with the application's public key (hex).
const hex = (s) => Uint8Array.from(s.match(/../g), (b) => parseInt(b, 16));

const key = await crypto.subtle.importKey(
  "raw",
  hex(publicKey), // Developer Portal → Application → Public Key
  { name: "Ed25519" },
  false,
  ["verify"],
);
const valid = await crypto.subtle.verify(
  "Ed25519",
  key,
  hex(req.headers["x-signature-ed25519"]),
  new TextEncoder().encode(req.headers["x-signature-timestamp"] + rawBody),
);

O Discord testa ativamente os endpoints com assinaturas inválidas e rejeita a URL se elas passarem, então um verificador de fachada falha já no cadastro, não só na revisão de segurança.

Armadilhas

O prazo de 3 segundos vale para a resposta inicial da interação. A saída é o tipo 5 (deferred): confirme o recebimento dentro da janela e depois envie o follow-up quando o trabalho de verdade terminar.

Leia também

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