Skip to main content
Discord signs each webhook with Ed25519, carried in the x-signature-ed25519 header. Register the credential on your endpoint and webhook.co verifies every captured request against the exact bytes it received, then records the outcome — with a named reason when it fails.

Get the public key

Your public key is shown on your application in the Discord Developer Portal — Discord generates it, you never supply one. See Discord’s own webhook documentation for the current steps. Discord validates an endpoint by deliberately sending invalid signatures, and expects a 401 back, so an endpoint that doesn’t verify will fail registration.

Register it on your endpoint

How the signature is checked

  • Signed message{timestamp}{rawBody} — the timestamp header concatenated to the raw body, no separator.
  • Algorithm — Ed25519, hex-encoded.
  • Key — registered secret is the app’s hex-encoded 32-byte Ed25519 public key, used verbatim.
  • Signature format — hex-encoded 64-byte Ed25519 signature.
  • Timestamp — read from the x-signature-timestamp header.

What makes this one different

  • The registered “secret” is Discord’s hex-encoded 32-byte Ed25519 PUBLIC key, not a shared secret.
  • Timestamp and body are concatenated with NO separator ({timestamp}{body}).
  • The signed timestamp is bound into the message but no replay-age window is enforced — the signature is the authenticity guarantee; downstream dedupe handles replay.

Confirm

A request whose signature matches shows verified; one that does not shows failed, with the reason named.