Discord API · error code

Discord error 10015: Unknown webhook

Permanent - do not retryHTTP 404Unknown resource (10xxx)

Last verified against Discord Developer Docs - Opcodes and status codes

What Discord returns
Unknown webhook

What error 10015 means

The webhook ID (or ID + token pair) in your request does not match any existing webhook. Webhooks are deleted far more casually than other resources: a server admin clears out Integrations, a channel is deleted, or someone rotates the webhook because the URL leaked. Your stored URL keeps working until that moment and then returns 10015 forever.

This also fires when the URL is simply malformed. A webhook URL is https://discord.com/api/webhooks/{id}/{token}; if you stored the ID without the token, URL-encoded the token, or trimmed characters, the webhook cannot be resolved. Interaction follow-up routes reuse the webhook shape (/webhooks/{application.id}/{interaction.token}) and return 10015 when the interaction token has expired after 15 minutes.

What it looks like

{
  "message": "Unknown Webhook",
  "code": 10015
}

Why it happens

  • Webhook deleted by a server admin or when its channel was deleted
  • Webhook URL stored incorrectly (missing or mangled token, extra whitespace)
  • Follow-up message sent with an interaction token older than 15 minutes
  • Application ID wrong in an interaction webhook route
  • Webhook belongs to a different application when using bot-token auth on /webhooks/{id}

How to fix Discord error 10015

  1. 1Open the channel's Integrations > Webhooks page and confirm the webhook still exists; compare its URL to what you stored
  2. 2GET /webhooks/{webhook.id}/{webhook.token} to test without needing a bot token
  3. 3For interaction follow-ups, check the age of the token; anything past 15 minutes must be sent via the bot token to the channel instead
  4. 4Regenerate the webhook and update every place the URL is stored
  5. 5Catch 10015 in your sender and disable that webhook in your config so you stop retrying

How to stop it recurring

Listen for the WEBHOOKS_UPDATE gateway event (requires Manage Webhooks) and re-validate stored webhooks when it fires. Where possible create webhooks through your bot rather than asking users to paste URLs, so you own the ID and can recreate it if it vanishes.

Webhook senders deserve the same hygiene as bot tokens: store the full URL atomically, test it after writing, and alert when it starts failing. For a systematic way to tell a deleted webhook from a network or signature problem, work through the webhook debugging guide; the per-channel webhook cap that forces reuse is on the Discord limits page.

Official reference: Discord Developer Docs - Opcodes and status codes. See all Discord error codes or the Discord limits and quotas.

Related codes

Error 10015 - quick answers

What does Discord error 10015 mean?

The webhook ID (or ID + token pair) in your request does not match any existing webhook. Webhooks are deleted far more casually than other resources: a server admin clears out Integrations, a channel is deleted, or someone rotates the webhook because the URL leaked. Your stored URL keeps working until that moment and then returns 10015 forever. This also fires when the URL is simply malformed.

How do I fix Discord error 10015?

1. Open the channel's Integrations > Webhooks page and confirm the webhook still exists; compare its URL to what you stored 2. GET /webhooks/{webhook.id}/{webhook.token} to test without needing a bot token 3. For interaction follow-ups, check the age of the token; anything past 15 minutes must be sent via the bot token to the channel instead 4. Regenerate the webhook and update every place the URL is stored 5. Catch 10015 in your sender and disable that webhook in your…

Should I retry after error 10015?

No. Retrying the same request produces the same error; the condition has to be fixed first. Treat it as a permanent failure for that message and surface it, rather than looping.

Stop debugging Discord by hand

Connect the channel through Conferbot: tokens, webhooks and retries are handled, failures show as readable status.