Discord Webhooks: How to Create One and Post (2026)
A Discord webhook is a URL that posts messages into one channel of your server. Here is how to create one, find the webhook URL, send a message with curl, keep it safe and schedule posts through it.

A Discord webhook is the simplest way to get messages from somewhere else into your Discord server. You make one in your server settings, Discord gives you a URL, and anything that sends a request to that URL posts a message in the channel you picked. No bot to build, no login.
Key takeaways
- A Discord webhook is a URL that posts messages into one channel. Make one under Server Settings > Integrations > Webhooks; you need the Manage Webhooks permission.
- To post, send a POST request with a JSON content field to the URL. A webhook message holds 2,000 characters, up to 10 embeds and up to 10 files of 20 MiB each by default.
- Anyone with the URL can post as the webhook, change it or delete it, so keep it secret and delete the webhook if the URL leaks.
- Webhooks only post: they cannot read the channel, reply, react or send DMs, and they send the moment you call them.
- To schedule webhook posts, a cron job or a scheduler such as OmniSocials calls the webhook at the time you pick, with polls, link buttons and forum post titles.
On this page
- Key takeaways
- The short answer
- What is a Discord webhook?
- How to create a Discord webhook
- How to find and copy the webhook URL
- How to send a message to a Discord webhook
- Keep the webhook URL secret
- What a Discord webhook can and cannot do
- Discord webhook limits
- Rate limits
- How to schedule Discord posts through a webhook
- 1. Connect your channel
- 2. Write the post
- 3. Set the Discord options
- 4. Schedule it
- What OmniSocials does not do on Discord
- Frequently asked questions
- What is a Discord webhook URL?
- Where do I find my Discord webhook URL?
- Do Discord webhooks need a bot?
- Can a Discord webhook send DMs?
- How many webhooks can a Discord channel have?
- Can you schedule messages with a Discord webhook?
- What is the Discord webhook rate limit?
- Schedule your first Discord post
- Sources
That is why so many tools use them. GitHub can post commits through one, monitoring tools post alerts, and schedulers post announcements. OmniSocials, the scheduler I run, posts to Discord through a webhook too, so I spent a lot of time in Discord's own docs while we built it.
Below is how to create a webhook, where to find its URL, how to send a message with curl, what a webhook can and cannot do, its limits, and how to schedule posts through one.
The short answer
- What it is: a URL that posts messages into one channel of your Discord server. Webhooks "do not require a bot user or authentication to use", in Discord's words.
- How to create one: open Server Settings > Integrations > Webhooks, click New Webhook, pick the channel and click Copy Webhook URL. You need the Manage Webhooks permission.
- How to post: send a POST request with
{"content": "Hello"}to the URL. - Keep the URL secret: anyone who has it can post in your channel.
What is a Discord webhook?
Discord's developer docs put it in one line: "Webhooks are a low-effort way to post messages to channels in Discord." Its help center calls them "an easy way to get automated messages and data updates sent to a text channel in your server."
A webhook belongs to one channel. It has a name and a profile picture, and those show as the sender of every message it posts. Its URL has two parts after https://discord.com/api/webhooks/: the webhook's ID and a secret token. Whoever has both can post.
What people use them for:
- Code and deploys. GitHub can post commits and pull requests to a channel. Discord's own guide walks through it, with one catch: add
/githubto the end of the webhook URL. - Alerts. Monitoring and uptime tools post when something breaks.
- Orders and sign-ups. A new order or form entry, posted to a staff channel.
- Announcements. Release notes, menus and event reminders, posted on a schedule.
How to create a Discord webhook
You need the Manage Webhooks permission in the server. Server owners and admins have it.
- Open your server and go to Server Settings.
- Open Integrations.
- Click Create Webhook. If the server already has webhooks, open Webhooks and click New Webhook.
- Set it up: give it a name, change the avatar by clicking the picture next to the name, and pick the channel it posts to.
- Save your changes.
Two rules from Discord's docs: a webhook name can be up to 80 characters and cannot contain "discord" or "clyde". And a channel can have up to 15 webhooks, a server up to 1,000 (error codes 30007 and 30058).
How to find and copy the webhook URL
Go to Server Settings > Integrations > Webhooks, open the webhook and click Copy Webhook URL. It looks like this:
https://discord.com/api/webhooks/<webhook id>/<webhook token>
The first part after /webhooks/ is the webhook's ID, a long number, and the part after that is its secret token. The same page lists every webhook in your server, who added it and when, and which channel it posts to. It is also where you rename, move or delete one.
How to send a message to a Discord webhook
A webhook takes a POST request with a JSON body. The simplest one only has content, the text of the message:
curl -X POST "https://discord.com/api/webhooks/WEBHOOK_ID/WEBHOOK_TOKEN" \
-H "Content-Type: application/json" \
-d '{"content": "The October menu is live."}'
Discord answers 204 No Content and the message appears in the channel. Add ?wait=true to the URL to get the message back as JSON instead, with its ID. You need that ID to edit or delete the message later.
These are the fields of the Execute Webhook request you will use most:
| Field | What it does |
|---|---|
Field: content | What it does: The text, up to 2,000 characters |
Field: username, avatar_url | What it does: Another sender name and picture, for this message only |
Field: embeds | What it does: Up to 10 embeds: cards with a title, description, fields and images |
Field: files[n] | What it does: Files, sent as multipart/form-data |
Field: poll | What it does: A native Discord poll |
Field: allowed_mentions | What it does: Which mentions may notify people |
Field: flags | What it does: 4096 sends silently (no push or desktop notification), 4 hides embeds and link previews |
Field: thread_name | What it does: Starts a new post in a forum or media channel |
Field: components | What it does: Link buttons, with ?with_components=true on the URL |
To send a file, switch to a form upload and put the JSON in payload_json:
curl -X POST "https://discord.com/api/webhooks/WEBHOOK_ID/WEBHOOK_TOKEN" \
-F 'payload_json={"content": "The October menu"}' \
-F "files[0]=@menu.jpg"
A poll that stays open for 24 hours:
curl -X POST "https://discord.com/api/webhooks/WEBHOOK_ID/WEBHOOK_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"poll": {
"question": { "text": "Which day suits the live Q&A?" },
"answers": [
{ "poll_media": { "text": "Tuesday" } },
{ "poll_media": { "text": "Thursday" } }
],
"duration": 24,
"allow_multiselect": false
}
}'
A few things that trip people up:
- Forum and media channels. Every message has to start or join a post there. Add
"thread_name": "October menu"to start a new one, or?thread_id=to the URL to post in an existing one. Without either, Discord refuses the message. - Mentions. A webhook only lets user mentions ping by default.
@everyone,@hereand role mentions notify nobody unless you allow them inallowed_mentions. - Link buttons. A webhook you made in Discord can send link buttons (not interactive ones) when you add
?with_components=trueto the URL and acomponentsarray:
"components": [
{
"type": 1,
"components": [
{
"type": 2,
"style": 5,
"label": "See the menu",
"url": "https://example.com/menu"
}
]
}
]
Keep the webhook URL secret
The URL is the whole key. Discord's API lets anyone who has it post as the webhook, read its details, rename it, change its picture or delete it, all without logging in.
- Keep it out of public code, client-side JavaScript, screenshots and shared docs. Store it as an environment variable or in a secrets manager.
- Give each tool its own webhook. If one tool leaks its URL, you delete one webhook and nothing else breaks.
- If a URL leaks, delete the webhook under Server Settings > Integrations > Webhooks and make a new one. Requests to the old URL then fail, and Discord's rate limit docs say not to keep using a webhook that answers 404.
- Check the Webhooks page now and then. It shows who added each webhook and when.
What a Discord webhook can and cannot do
It can:
- Post text of up to 2,000 characters, up to 10 embeds, up to 10 files, a poll and link buttons
- Post under its own name and picture, or another one per message (
usernameandavatar_url) - Send silently and hide link previews
- Start a forum post, or post in a thread of its channel
- Edit and delete the messages it sent itself (you need the message ID, so use
?wait=true)
It cannot:
- Read the channel. It can only fetch the messages it sent itself.
- Reply, react, send DMs or moderate. The webhook API posts, edits and deletes its own messages. Everything else needs a bot.
- Send interactive buttons or menus, unless the webhook belongs to an app.
- Post at a set time. Execute Webhook has no schedule field: the message goes out when you call it.
- Post anywhere else. Each message goes to the webhook's channel, or a thread inside it.
Discord webhook limits
| Limit | Value |
|---|---|
| Limit: Message text | Value: 2,000 characters |
| Limit: Embeds | Value: 10 per message, 6,000 characters across them |
| Limit: Files | Value: 10 per message, 20 MiB each by default |
| Limit: Poll | Value: A question of 300 characters, up to 10 answers of 55, open up to 32 days |
| Limit: Webhook name | Value: Up to 80 characters, without "discord" or "clyde" |
| Limit: Webhooks | Value: 15 per channel, 1,000 per server |
| Limit: Rate limit | Value: No fixed number: Discord answers 429 when you send too fast |
Sources: Discord's docs on webhooks, messages, polls, uploading files and error codes. The 20 MiB default for bots and webhooks dates from September 2026, up from 10 MiB, according to Discord's change log. More detail in our guides to Discord character limits and Discord file size limits.
Rate limits
Discord does not publish a fixed number of messages per minute for webhooks. Its rate limit docs count limits per route and per webhook, and say rate limits "should not be hard coded into your app": read them from the response headers instead. When you go over, you get 429 Too Many Requests with a retry_after value. Wait that many seconds and send again.
Requests that keep failing (401, 403 or 429) count toward a limit of 10,000 per 10 minutes per IP address, after which Discord blocks the address for a while. A few messages a day will never get near any of this.
How to schedule Discord posts through a webhook
A webhook posts the moment you call it. To schedule a message, something has to make that call at the right time: a cron job on a server you run, an automation tool, or a social media scheduler.
OmniSocials schedules posts to a Discord channel through its webhook, on one calendar with Instagram, LinkedIn, TikTok and 9 other networks.
1. Connect your channel
In OmniSocials, open Channels, add a channel and pick Discord. There are two ways in:
- Continue with Discord (recommended). Discord's own screen asks you to choose the server and a channel. Pick a text channel, not a voice channel, and press Authorize. You need the Manage Server permission in that server. Discord creates the webhook for you.
- Paste a webhook URL. Make a webhook as described above and paste its URL in OmniSocials.
Posts show the webhook's name and picture as the sender. To change them, edit the webhook in Discord. Disconnecting the channel in OmniSocials never deletes the webhook in Discord.
2. Write the post
Pick Discord in the composer, on its own or with your other channels. A Discord post can have:
- Text of up to 2,000 characters. Discord's Markdown shows:
**bold**,*italic*, lists and[masked links](https://example.com). OmniSocials counts most emoji as 2 characters. - Up to 10 images, GIFs and videos, mixed. Videos can be up to 1 GB at any length: files of up to 20 MB are attached, and a bigger video goes as a link in the message, which Discord shows with a player.
- A poll. The post text becomes the question (up to 300 characters), with 2 to 10 answers of up to 55 characters, open from 1 hour to 2 weeks (up to 32 days through the API), with one or several answers allowed. A poll goes without media or buttons.
3. Set the Discord options
- Buttons: up to 5 link buttons under the message, with labels of up to 80 characters.
- Forum post title: for a forum or media channel, the title of the new post (up to 100 characters). Leave it empty for a text channel.
- Send silently: no push or desktop notification.
- Link preview: on by default, and you can turn it off.
- Ping @everyone and roles: off by default, so a scheduled post never pings a whole server by accident.
- Mark media as spoiler: blurs every image and video until someone clicks it.
4. Schedule it
Pick a date and time. The post sits on the calendar with your other channels and goes out through the webhook at that time.
Once it is sent, OmniSocials shows the reactions, in total and per emoji, and the votes per poll answer. Delete from Discord on the post removes the message at any time.
Developers can do the same through the OmniSocials API:
curl -X POST https://api.omnisocials.com/v1/posts/create \
-H "Authorization: Bearer $OMNISOCIALS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"content": { "default": "The October menu is live." },
"channels": ["discord"],
"media_urls": ["https://example.com/menu.jpg"],
"schedule_at": "2026-10-30T09:00:00Z",
"discord": { "silent": true }
}'
And with the OmniSocials MCP server, Claude, ChatGPT or another AI agent can write and schedule a Discord post for you, polls and buttons included.
What OmniSocials does not do on Discord
I would rather you know this before you connect:
- One channel per workspace. A second channel needs a second workspace.
- No custom sender per post. Every post shows the webhook's name and picture.
- No editing after sending. You can change a scheduled post as often as you like, but not one that is already in Discord.
- No views, reach or member counts. You get reactions and poll votes.
- No inbox and no bot features. OmniSocials does not read your channel, reply or moderate, and Discord is not part of the social inbox.
- Discord is a destination, not a source. Repost automations can post to Discord, not from it.
Frequently asked questions
What is a Discord webhook URL?
It is the address Discord creates for a webhook: https://discord.com/api/webhooks/ followed by the webhook's ID and its secret token. A POST request to that URL posts a message in the webhook's channel.
Where do I find my Discord webhook URL?
In Server Settings, then Integrations, then Webhooks. Open the webhook and click Copy Webhook URL.
Do Discord webhooks need a bot?
No. In Discord's words, webhooks "do not require a bot user or authentication to use". They can only post, though: reading messages, replying and moderating need a bot.
Can a Discord webhook send DMs?
No. A webhook posts into the channel it belongs to, or into a thread in that channel.
How many webhooks can a Discord channel have?
15 per channel and 1,000 per server, according to Discord's error codes.
Can you schedule messages with a Discord webhook?
Not on its own: a webhook posts the moment it is called. A script on a timer or a scheduler such as OmniSocials makes that call at the time you pick.
What is the Discord webhook rate limit?
Discord does not publish a fixed number. Limits apply per webhook and can change, so read the rate limit headers, and when Discord answers 429, wait the retry_after seconds before you send again.
Schedule your first Discord post
If Discord is one of several places you post, put it on the same calendar as the rest. See how Discord works in OmniSocials, or start a 14-day free trial. Plans are $10 per seat a month billed yearly, or $12 monthly, and Discord is included.
Sources
- Webhook resource: Discord's developer docs on creating and executing webhooks, names, threads, mentions and components.
- Intro to Webhooks: Discord's help article on making a webhook and copying its URL.
- Server Integrations Page: where Discord lists, edits and deletes your webhooks.
- Message resource: message, embed, mention and flag limits.
- Poll resource: poll question, answer and duration limits.
- Component reference: link buttons and their labels.
- Rate limits: how Discord limits requests and what a 429 means.
- Opcodes and status codes: the caps on webhooks per channel and server and attachments per message.
- Uploading files and the change log: the 20 MiB default file limit.
Try OmniSocials for 14 days
Plan, schedule and answer on 13 platforms from one calendar, or let your AI agent do it. The first charge comes when the trial ends.


