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 resposta | 3 s Endpoints de interação precisam enviar uma resposta inicial em até 3 segundos |
|---|---|
| Novas tentativas | não publicado pelo provedor |
| Desiste | não publicado pelo provedor |
| Fonte | https://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.
| Algoritmo | Ed25519 |
|---|---|
| Payload assinado | {timestamp}{body} |
| Codificação | hex |
| Cabeçalho | x-signature-ed25519 + x-signature-timestamp |
| Tolerância | nenhuma 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.