Webhooks are Discord's secret weapon for automation. No bot token, no OAuth, no permission headaches — just a URL that accepts a POST and puts a message in your server. Here's everything you need to know.
A webhook is a special URL tied to a specific channel. When you send an HTTP POST request to it with a JSON body, Discord delivers your message exactly like a bot would — complete with a custom name, avatar, and even embeds with fields. The key difference from a bot: webhooks are one-directional. They can only post. No reading messages, no slash commands, no DMs.
Here's what an incoming webhook message looks like in Discord:
/waterfall mode, and context improvements across the board. Check the changelog for full details.
Right-click any channel → Edit Channel → Integrations → Webhooks → New Webhook. Give it a name, optionally upload an avatar, and choose the channel. Hit Copy Webhook URL and you're done.
The payload is just JSON. The minimum you need is a content field. You can also pass username and avatar_url to override the defaults per-request, and embeds for rich cards.
const res = await fetch(WEBHOOK_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
username: 'MeTal Systems',
content: '🚀 Valley v2.1 is live!',
embeds: [{
title: 'Changelog',
description: 'Faster responses, new /waterfall mode',
color: 0x5865F2,
fields: [
{ name: 'Model', value: 'valley-pro-1', inline: true }
]
}]
})
});Your webhook URL is never stored or logged — the fetch goes directly from your browser to Discord's API. Keep it private; anyone with the URL can post to your channel.