{"id":7590,"date":"2026-08-08T21:00:00","date_gmt":"2026-08-08T21:00:00","guid":{"rendered":"https:\/\/cybrancee.com\/blog\/?p=7590"},"modified":"2026-08-08T20:24:32","modified_gmt":"2026-08-08T20:24:32","slug":"discord-webhooks-explained-what-they-can-and-cant-do","status":"publish","type":"post","link":"https:\/\/cybrancee.com\/blog\/discord-webhooks-explained-what-they-can-and-cant-do\/","title":{"rendered":"Discord Webhooks Explained: What They Can and Can&#8217;t Do"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Ask in almost any Discord dev server how to post automated messages into a channel, and someone will say &#8220;just use a webhook&#8221; before you&#8217;ve even finished typing the question. Then, a few messages later, someone else will mention bots, intents, and slash commands, and suddenly it&#8217;s not clear if those two answers were even about the same thing.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">They&#8217;re not, not really. A webhook and a bot can both drop a message into a channel, and that&#8217;s about where the overlap ends. One is a static URL you can POST to from a script and forget about. The other is a persistent application with its own token, permissions, and an actual connection to Discord&#8217;s servers. Mixing them up is the single most common source of confusion for anyone setting up their first server integration, and it&#8217;s usually why people end up building a whole bot just to post a build notification that a five-line webhook script would have handled fine.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This one&#8217;s about webhooks specifically: what they are, how Discord implemented them, where they stop being useful, and how to actually wire one up.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><\/td><td><strong>Discord Bot<\/strong><\/td><td><strong>Discord Webhook<\/strong><\/td><\/tr><tr><td>Authentication<\/td><td>Bot token + OAuth2 scopes<\/td><td>Webhook ID + token in the URL<\/td><\/tr><tr><td>Connection type<\/td><td>Persistent Gateway (WebSocket)<\/td><td>None \u2014 one-shot HTTP POST<\/td><\/tr><tr><td>Setup effort<\/td><td>Register app, invite to server, host it<\/td><td>Generate URL in server settings<\/td><\/tr><tr><td>Permissions to create\/manage<\/td><td>Granted on invite (varies by scope)<\/td><td>MANAGE_WEBHOOKS + VIEW_CHANNEL<\/td><\/tr><tr><td>Permission to send a message<\/td><td>N\/A \u2014 just needs to be in the channel<\/td><td>None \u2014 knowing the URL is enough<\/td><\/tr><tr><td>Reading messages<\/td><td>Yes<\/td><td>No<\/td><\/tr><tr><td>Reacting to messages<\/td><td>Yes<\/td><td>No<\/td><\/tr><tr><td>Responding to slash commands<\/td><td>Yes<\/td><td>No<\/td><\/tr><tr><td>Embeds per message<\/td><td>1<\/td><td>Up to 10<\/td><\/tr><tr><td>Attachments\/files<\/td><td>Yes, up to 10 MiB (more with boosts)<\/td><td>Yes, up to 10 MiB (more with boosts)<\/td><\/tr><tr><td>Custom username\/avatar per message<\/td><td>No \u2014 fixed unless code changes it<\/td><td>Yes<\/td><\/tr><tr><td>Presence status (online\/idle\/dnd)<\/td><td>Yes<\/td><td>No<\/td><\/tr><tr><td>Interactive components (buttons, selects)<\/td><td>Yes, full support<\/td><td>Non-interactive only, unless app-owned + with_components=true<\/td><\/tr><tr><td>DMs to users<\/td><td>Yes, if allowed<\/td><td>No<\/td><\/tr><tr><td>Posting in threads<\/td><td>Yes<\/td><td>Yes, via thread_id or thread_name<\/td><\/tr><tr><td>Cross-post to announcement followers<\/td><td>Yes<\/td><td>Yes, if the webhook is in a news channel<\/td><\/tr><tr><td>Editing\/deleting its own messages<\/td><td>Yes<\/td><td>Yes<\/td><\/tr><tr><td>Rate limit<\/td><td>~50 requests\/sec per bot token<\/td><td>~30 msgs\/min per webhook, ~5 req\/5s shared per channel<\/td><\/tr><tr><td>Needs hosting<\/td><td>Yes \u2014 must stay running<\/td><td>No \u2014 Discord hosts the endpoint<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>What Is a Webhook<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"468\" src=\"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2026\/08\/image-13-1024x468.png\" alt=\"discord webhook create settings page\" class=\"wp-image-7591\" srcset=\"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2026\/08\/image-13-1024x468.png 1024w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2026\/08\/image-13-300x137.png 300w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2026\/08\/image-13-768x351.png 768w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2026\/08\/image-13-1536x702.png 1536w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2026\/08\/image-13-512x234.png 512w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2026\/08\/image-13-920x420.png 920w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2026\/08\/image-13-1600x731.png 1600w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2026\/08\/image-13.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The general concept isn&#8217;t Discord&#8217;s invention. A webhook, in the broadest sense, is just a URL that a service calls automatically when something happens, instead of you having to keep asking &#8220;did anything happen yet?&#8221; The term itself goes back to 2007, coined by developer Jeff Lindsay, and it caught on because polling an API every few seconds is wasteful when the API can just tell you the moment something changes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Discord&#8217;s version of this is narrower and, honestly, simpler than the general concept. An incoming webhook in Discord is an HTTP endpoint tied to one specific channel. You send it a JSON payload, Discord turns that payload into a message in that channel, and that&#8217;s the entire interaction. No login, no persistent connection, no bot application sitting in the background. Discord doesn&#8217;t publish an exact date for when this feature landed, but it&#8217;s been part of the platform for years now, well before slash commands or even threads existed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There are technically three webhook types on Discord, though you&#8217;ll only ever create one of them yourself:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Incoming webhooks:<\/strong> the standard kind, created through server settings or the API, used for exactly what this article covers.<\/li>\n\n\n\n<li><strong>Channel Follower webhooks:<\/strong> internal ones Discord creates automatically when you follow an announcement channel into another server. You don&#8217;t set these up manually.<\/li>\n\n\n\n<li><strong>Application webhooks:<\/strong> short-lived, tied to a specific interaction (like a slash command follow-up), and gone once that interaction&#8217;s lifecycle ends.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The feature has picked up a handful of real changes over the years instead of sitting frozen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>November 2020:<\/strong> webhooks gained the ability to edit and delete messages they&#8217;d already sent, instead of only ever posting new ones.<\/li>\n\n\n\n<li><strong>August 2022:<\/strong> Discord started requiring <code>VIEW_CHANNEL<\/code> alongside <code>MANAGE_WEBHOOKS<\/code> to create or manage a webhook, closing a permissions gap.<\/li>\n\n\n\n<li><strong>October 2024:<\/strong> Discord added outgoing Webhook Events, a separate system where Discord calls <em>your<\/em> app when something happens (like a user authorizing it). Don&#8217;t confuse this with the incoming webhooks this article is about; they&#8217;re related in name only.<\/li>\n\n\n\n<li><strong>January 2025:<\/strong> the file upload cap dropped from 25 MiB to 10 MiB platform-wide. Oddly, the change hit regular users and bots first, and webhooks weren&#8217;t folded into the new limit until slightly after the initial announcement.<\/li>\n\n\n\n<li><strong>April 2025:<\/strong> Components V2 shipped, letting messages be built out of stacked layout pieces (containers, sections, media galleries, separators) instead of the old fixed content-then-embed-then-buttons structure. Webhooks got access to it too, with some caveats covered below.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Webhooks vs. Discord Bots<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"684\" src=\"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2026\/08\/Pasted-image-20260808224506-1024x684.png\" alt=\"webhook vs bot difference in a channel\" class=\"wp-image-7592\" srcset=\"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2026\/08\/Pasted-image-20260808224506-1024x684.png 1024w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2026\/08\/Pasted-image-20260808224506-300x201.png 300w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2026\/08\/Pasted-image-20260808224506-768x513.png 768w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2026\/08\/Pasted-image-20260808224506-512x342.png 512w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2026\/08\/Pasted-image-20260808224506-920x615.png 920w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2026\/08\/Pasted-image-20260808224506.png 1119w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The one-sentence version: bots can read and write, webhooks can only write. Everything else follows from that.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Setup.<\/strong> A bot needs an application registered in Discord&#8217;s developer portal, a bot token, and an actual invite into the server with whatever permissions it needs. A webhook is a URL. You generate it in Server Settings \u2192 Integrations, or through the API, and it&#8217;s ready.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Permissions.<\/strong> Creating or managing a webhook needs <code>MANAGE_WEBHOOKS<\/code> on the channel (plus <code>VIEW_CHANNEL<\/code>, since 2022). Once it exists, though, <em>sending<\/em> through it needs nothing beyond knowing the URL. Discord doesn&#8217;t check who&#8217;s making the request, just whether the token in the URL is valid.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Capabilities.<\/strong> This is the real dividing line. Bots connect to Discord&#8217;s Gateway and get a live stream of events: messages, reactions, member joins, voice state changes, all of it. Webhooks get none of that. They can&#8217;t read a channel&#8217;s history, can&#8217;t react to anything, can&#8217;t respond to a slash command, and have no presence status. They exist purely to push messages outward.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Message features.<\/strong> Webhooks actually win a couple of these. They support up to 10 embeds in a single message versus a bot&#8217;s 1, and every message can carry its own custom username and avatar, so one webhook can look like five different &#8220;posters&#8221; depending on what you set in each request. A bot&#8217;s identity is fixed unless you&#8217;re editing its profile through code, which is a much bigger hammer for a small problem.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Rate limits.<\/strong> Bots get roughly 50 requests per second tied to their token. Webhooks don&#8217;t have a token in that sense, so Discord limits them more like anonymous traffic: something in the neighborhood of 30 messages a minute per webhook, a shared ceiling of around 5 requests every 5 seconds if multiple webhooks are hammering the same channel, and a hard global cap of 50 requests per second per IP address at the edge layer. Discord&#8217;s own docs are explicit that none of these numbers should be hardcoded. Read the rate limit headers on each response and back off when they tell you to.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Hosting.<\/strong> A bot has to run somewhere, all the time, or it goes offline. A webhook doesn&#8217;t run anywhere. Discord hosts the endpoint; you just call it when you have something to say.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>What They Can (and Can&#8217;t) Do<\/strong><\/h2>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>What webhooks can do<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Send plain text messages, up to 2,000 characters, same as any normal message.<\/li>\n\n\n\n<li>Attach up to 10 rich embeds per message, each with its own title, description, fields, and images.<\/li>\n\n\n\n<li>Upload files up to 10 MiB (more if the server has boosts pushing the shared cap higher).<\/li>\n\n\n\n<li>Override the posting name and avatar on a per-message basis.<\/li>\n\n\n\n<li>Control which mentions actually ping people through <code>allowed_mentions<\/code>, so a message can say &#8220;@everyone&#8221; as plain text without waking the whole server.<\/li>\n\n\n\n<li>Post into threads, and even spin up a new thread automatically in a forum channel by passing a <code>thread_name<\/code>.<\/li>\n\n\n\n<li>Send non-interactive components like link buttons by default, and full Components V2 layouts if the webhook is application-owned, and the request includes <code>with_components=true<\/code>.<\/li>\n\n\n\n<li>Accept Slack- and GitHub-formatted payloads directly, by appending <code>\/slack<\/code> or <code>\/github<\/code> to the webhook URL. Genuinely handy if a service already speaks one of those formats natively.<\/li>\n\n\n\n<li>Edit or delete messages it previously sent, through the same webhook URL.<\/li>\n\n\n\n<li>Crosspost into an announcement channel&#8217;s followers, if the webhook lives in a news channel.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>What webhooks can&#8217;t do<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Read anything. No message history, no channel contents, nothing incoming at all.<\/li>\n\n\n\n<li>React to messages, respond to slash commands, or handle button clicks and menu selections.<\/li>\n\n\n\n<li>Show a presence status or behave like an actual user in any sense.<\/li>\n\n\n\n<li>Send or receive DMs.<\/li>\n\n\n\n<li>Use interactive, custom-ID components unless the webhook is application-owned. A plain webhook created through server settings is stuck with static, link-only buttons.<\/li>\n\n\n\n<li>Modify or delete anyone else&#8217;s messages, only its own.<\/li>\n\n\n\n<li>Do anything outside the one channel it was created for.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">If a project needs two-way logic of any kind, a webhook alone won&#8217;t get there. That&#8217;s not a limitation to work around; it&#8217;s just outside the scope of what the feature is.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>How to Use Them<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"528\" src=\"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2026\/08\/Pasted-image-20260808225547-1024x528.png\" alt=\"kali terminal bash with discord webhook command\" class=\"wp-image-7593\" srcset=\"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2026\/08\/Pasted-image-20260808225547-1024x528.png 1024w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2026\/08\/Pasted-image-20260808225547-300x155.png 300w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2026\/08\/Pasted-image-20260808225547-768x396.png 768w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2026\/08\/Pasted-image-20260808225547-512x264.png 512w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2026\/08\/Pasted-image-20260808225547-920x474.png 920w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2026\/08\/Pasted-image-20260808225547.png 1241w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Setting one up doesn&#8217;t require touching code at all if all you want is to test it.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open your server and go to <strong>Server Settings \u2192 Integrations \u2192 Webhooks<\/strong>, or click the gear next to a specific channel and pick <strong>Create Webhook<\/strong> from there.<\/li>\n\n\n\n<li>Give it a name and pick the channel it should post to. A server can hold up to 10 webhooks.<\/li>\n\n\n\n<li>Copy the URL. It&#8217;ll look like https:\/\/discord.com\/api\/webhooks\/WEBHOOK_ID\/WEBHOOK_TOKEN. Treat it like a password. Anyone who has it can post into that channel.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">From there, sending a message is one <code>HTTP request<\/code>:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Bash<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>curl -X POST \"https:\/\/discord.com\/api\/webhooks\/YOUR_ID\/YOUR_TOKEN\" \\\n  -H \"Content-Type: application\/json\" \\\n  -d '{\"content\": \"Deploy finished, all green.\"}'<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #DCDCAA\">curl<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">-X<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">POST<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;https:\/\/discord.com\/api\/webhooks\/YOUR_ID\/YOUR_TOKEN&quot;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #D7BA7D\">\\<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">-H<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;Content-Type: application\/json&quot;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #D7BA7D\">\\<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">-d<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;{&quot;content&quot;: &quot;Deploy finished, all green.&quot;}&#39;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Node.js, using nothing but <code>fetch<\/code>:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">JavaScript<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>const WEBHOOK_URL = \"https:\/\/discord.com\/api\/webhooks\/YOUR_ID\/YOUR_TOKEN\";\n\nawait fetch(WEBHOOK_URL, {\n  method: \"POST\",\n  headers: { \"Content-Type\": \"application\/json\" },\n  body: JSON.stringify({ content: \"Build #482 passed.\" }),\n});<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">WEBHOOK_URL<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&quot;https:\/\/discord.com\/api\/webhooks\/YOUR_ID\/YOUR_TOKEN&quot;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">fetch<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #4FC1FF\">WEBHOOK_URL<\/span><span style=\"color: #D4D4D4\">, {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">method:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;POST&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">headers:<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #CE9178\">&quot;Content-Type&quot;<\/span><span style=\"color: #9CDCFE\">:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;application\/json&quot;<\/span><span style=\"color: #D4D4D4\"> },<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">body:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">JSON<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">stringify<\/span><span style=\"color: #D4D4D4\">({ <\/span><span style=\"color: #9CDCFE\">content:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;Build #482 passed.&quot;<\/span><span style=\"color: #D4D4D4\"> }),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">});<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Python, with <code>requests<\/code>:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Python<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>import requests\n\nWEBHOOK_URL = \"https:\/\/discord.com\/api\/webhooks\/YOUR_ID\/YOUR_TOKEN\"\nrequests.post(WEBHOOK_URL, json={\"content\": \"Backup completed successfully.\"})<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C586C0\">import<\/span><span style=\"color: #D4D4D4\"> requests<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">WEBHOOK_URL = <\/span><span style=\"color: #CE9178\">&quot;https:\/\/discord.com\/api\/webhooks\/YOUR_ID\/YOUR_TOKEN&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">requests.post(WEBHOOK_URL, <\/span><span style=\"color: #9CDCFE\">json<\/span><span style=\"color: #D4D4D4\">={<\/span><span style=\"color: #CE9178\">&quot;content&quot;<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;Backup completed successfully.&quot;<\/span><span style=\"color: #D4D4D4\">})<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Want an embed instead of plain text? Swap <code>content<\/code> for an <code>embeds<\/code> array:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">JSON<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>{\n  \"embeds\": &#91;\n    {\n      \"title\": \"Server Status\",\n      \"description\": \"All systems operational.\",\n      \"color\": 3066993\n    }\n  &#93;\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">&quot;embeds&quot;<\/span><span style=\"color: #D4D4D4\">: &#91;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">&quot;title&quot;<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;Server Status&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">&quot;description&quot;<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;All systems operational.&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">&quot;color&quot;<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #B5CEA8\">3066993<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Editing or deleting a message you already sent<\/strong> uses the message ID Discord hands back in the response when you first post it:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Bash<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly># Edit\ncurl -X PATCH \"https:\/\/discord.com\/api\/webhooks\/ID\/TOKEN\/messages\/MESSAGE_ID\" \\\n  -H \"Content-Type: application\/json\" \\\n  -d '{\"content\": \"Updated: build passed after retry.\"}'\n\n# Delete\ncurl -X DELETE \"https:\/\/discord.com\/api\/webhooks\/ID\/TOKEN\/messages\/MESSAGE_ID\"<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A9955\"># Edit<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">curl<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">-X<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">PATCH<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;https:\/\/discord.com\/api\/webhooks\/ID\/TOKEN\/messages\/MESSAGE_ID&quot;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #D7BA7D\">\\<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">-H<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;Content-Type: application\/json&quot;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #D7BA7D\">\\<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">-d<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;{&quot;content&quot;: &quot;Updated: build passed after retry.&quot;}&#39;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"># Delete<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">curl<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">-X<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">DELETE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;https:\/\/discord.com\/api\/webhooks\/ID\/TOKEN\/messages\/MESSAGE_ID&quot;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Piping in Slack or GitHub payloads directly<\/strong> just means changing the URL:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Bash<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>https:\/\/discord.com\/api\/webhooks\/ID\/TOKEN\/github\nhttps:\/\/discord.com\/api\/webhooks\/ID\/TOKEN\/slack<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #DCDCAA\">https:\/\/discord.com\/api\/webhooks\/ID\/TOKEN\/github<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">https:\/\/discord.com\/api\/webhooks\/ID\/TOKEN\/slack<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Point GitHub&#8217;s own webhook settings at the first one, and commits, pull requests, and issues start showing up in Discord without any translation layer on your end.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>On rate limits:<\/strong> if you get a 429, the response includes a <code>retry_after<\/code> value in milliseconds. Wait at least that long before trying again. Anyone sending more than a handful of messages a minute should queue them locally rather than firing requests as fast as the loop allows. It&#8217;s the single most common way people end up rate-limited within their first hour of testing.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Should You Use One?<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">It mostly comes down to whether Discord needs to talk <em>at<\/em> your server or <em>with<\/em> it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>You want build alerts, deployment notifications, RSS feeds, or monitoring pings.<\/strong> Webhook, no question. There&#8217;s nothing to host, nothing to keep alive, and the setup takes about two minutes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>You need slash commands, moderation tools, or anything that reacts to what someone types or clicks.<\/strong> That&#8217;s a bot. There&#8217;s no way around it. Webhooks have no path into two-way interaction, full stop.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>You want a small script to log game server events, CI results, or cron job output into a channel.<\/strong> Webhook. This is close to the textbook use case, and it&#8217;s why so many self-hosted tools ship with a &#8220;paste your webhook URL here&#8221; field instead of asking you to run a whole bot.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>You want different &#8220;characters&#8221; or sources posting into one channel with distinct names and avatars.<\/strong> Webhook, specifically because of the per-message username and avatar override. A bot can technically fake this by editing its own profile before each message, but that&#8217;s slower, rate-limited on its own, and a genuinely worse tool for the job.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>You&#8217;re building something with both halves, reacting to commands and pushing out alerts.<\/strong> Most real projects like this end up running both: a bot for the interactive side, plus one or more webhooks for the fire-and-forget alerts, since there&#8217;s no reason to route simple notifications through the heavier, stateful bot connection when a webhook does it in one request.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If the honest answer is &#8220;I just want a message to show up when X happens,&#8221; stop there and build the webhook. Reach for a bot only once something needs to talk back.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Summary<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A Discord webhook is a static, channel-specific URL that turns an HTTP POST into a message, with no bot, login, or persistent connection required. Discord recognizes three types (Incoming, Channel Follower, and Application), though Incoming is the one anyone builds by hand, and the feature has picked up real changes over the years: message editing and deleting in 2020, a stricter permission requirement in 2022, outgoing Webhook Events in 2024, a lower file size cap in early 2025, and Components V2 support in April 2025.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Against a bot, a webhook trades two-way interaction for simplicity: no reading messages, no reactions, no slash commands, no presence, but also no hosting, no token management, and support for up to 10 embeds and a custom username\/avatar on every single message. It can send, edit, and delete its own messages, post into threads, accept Slack- or GitHub-shaped payloads directly, and send non-interactive components, but anything requiring a response, a click handler, or a read of the channel is out of scope entirely.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Setting one up takes a URL and a JSON body. Using one well just means respecting the rate limits, keeping the URL private, and knowing when the job actually calls for a bot instead.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Happy coding!<\/p>\n","protected":false},"excerpt":{"rendered":"Ask in almost any Discord dev server how to post automated messages into a channel, and someone will&hellip;","protected":false},"author":10,"featured_media":7594,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_display_header_overlay":false,"csco_singular_sidebar":"","csco_page_header_type":"","footnotes":""},"categories":[5],"tags":[],"class_list":["post-7590","post","type-post","status-publish","format-standard","has-post-thumbnail","category-discord-bot-hosting","cs-entry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.9 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Discord Webhooks Explained: What They Can and Can&#039;t Do<\/title>\n<meta name=\"description\" content=\"Ask in almost any Discord dev server how to post automated messages into a channel, and someone will say &quot;just use a webhook&quot; before you&#039;ve even finished typing the question.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cybrancee.com\/blog\/discord-webhooks-explained-what-they-can-and-cant-do\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Discord Webhooks Explained: What They Can and Can&#039;t Do\" \/>\n<meta property=\"og:description\" content=\"Ask in almost any Discord dev server how to post automated messages into a channel, and someone will say &quot;just use a webhook&quot; before you&#039;ve even finished typing the question.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cybrancee.com\/blog\/discord-webhooks-explained-what-they-can-and-cant-do\/\" \/>\n<meta property=\"og:site_name\" content=\"Cybrancee Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/cybrancee\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-08T21:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2026\/08\/thumbnail_for_whatwebhooksare-scaled.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"940\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Denis\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@cybrancee\" \/>\n<meta name=\"twitter:site\" content=\"@cybrancee\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Denis\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/cybrancee.com\\\/blog\\\/discord-webhooks-explained-what-they-can-and-cant-do\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/cybrancee.com\\\/blog\\\/discord-webhooks-explained-what-they-can-and-cant-do\\\/\"},\"author\":{\"name\":\"Denis\",\"@id\":\"https:\\\/\\\/cybrancee.com\\\/blog\\\/#\\\/schema\\\/person\\\/9f00e117246b808e567c309b7a866a4b\"},\"headline\":\"Discord Webhooks Explained: What They Can and Can&#8217;t Do\",\"datePublished\":\"2026-08-08T21:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/cybrancee.com\\\/blog\\\/discord-webhooks-explained-what-they-can-and-cant-do\\\/\"},\"wordCount\":2255,\"publisher\":{\"@id\":\"https:\\\/\\\/cybrancee.com\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/cybrancee.com\\\/blog\\\/discord-webhooks-explained-what-they-can-and-cant-do\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/cybrancee.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/thumbnail_for_whatwebhooksare-scaled.png\",\"articleSection\":[\"Discord Bot Hosting\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/cybrancee.com\\\/blog\\\/discord-webhooks-explained-what-they-can-and-cant-do\\\/\",\"url\":\"https:\\\/\\\/cybrancee.com\\\/blog\\\/discord-webhooks-explained-what-they-can-and-cant-do\\\/\",\"name\":\"Discord Webhooks Explained: What They Can and Can't Do\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/cybrancee.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/cybrancee.com\\\/blog\\\/discord-webhooks-explained-what-they-can-and-cant-do\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/cybrancee.com\\\/blog\\\/discord-webhooks-explained-what-they-can-and-cant-do\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/cybrancee.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/thumbnail_for_whatwebhooksare-scaled.png\",\"datePublished\":\"2026-08-08T21:00:00+00:00\",\"description\":\"Ask in almost any Discord dev server how to post automated messages into a channel, and someone will say \\\"just use a webhook\\\" before you've even finished typing the question.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/cybrancee.com\\\/blog\\\/discord-webhooks-explained-what-they-can-and-cant-do\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/cybrancee.com\\\/blog\\\/discord-webhooks-explained-what-they-can-and-cant-do\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/cybrancee.com\\\/blog\\\/discord-webhooks-explained-what-they-can-and-cant-do\\\/#primaryimage\",\"url\":\"https:\\\/\\\/cybrancee.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/thumbnail_for_whatwebhooksare-scaled.png\",\"contentUrl\":\"https:\\\/\\\/cybrancee.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/thumbnail_for_whatwebhooksare-scaled.png\",\"width\":2560,\"height\":940,\"caption\":\"thumbnail for the blog discord webhooks cybrancee\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/cybrancee.com\\\/blog\\\/discord-webhooks-explained-what-they-can-and-cant-do\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/cybrancee.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Discord Webhooks Explained: What They Can and Can&#8217;t Do\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/cybrancee.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/cybrancee.com\\\/blog\\\/\",\"name\":\"Cybrancee Blog\",\"description\":\"Gaming News\",\"publisher\":{\"@id\":\"https:\\\/\\\/cybrancee.com\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/cybrancee.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/cybrancee.com\\\/blog\\\/#organization\",\"name\":\"Cybrancee\",\"url\":\"https:\\\/\\\/cybrancee.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/cybrancee.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/cybrancee.com\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/08\\\/logo.png\",\"contentUrl\":\"https:\\\/\\\/cybrancee.com\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/08\\\/logo.png\",\"width\":466,\"height\":100,\"caption\":\"Cybrancee\"},\"image\":{\"@id\":\"https:\\\/\\\/cybrancee.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/cybrancee\\\/\",\"https:\\\/\\\/x.com\\\/cybrancee\",\"https:\\\/\\\/www.instagram.com\\\/cybrancee\\\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/cybrancee.com\\\/blog\\\/#\\\/schema\\\/person\\\/9f00e117246b808e567c309b7a866a4b\",\"name\":\"Denis\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c0a3ff07fcf30f948d3bada6460c97de14925400844f2ce6ac085e6cb1932d99?s=96&d=retro&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c0a3ff07fcf30f948d3bada6460c97de14925400844f2ce6ac085e6cb1932d99?s=96&d=retro&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c0a3ff07fcf30f948d3bada6460c97de14925400844f2ce6ac085e6cb1932d99?s=96&d=retro&r=g\",\"caption\":\"Denis\"},\"url\":\"https:\\\/\\\/cybrancee.com\\\/blog\\\/author\\\/denis\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Discord Webhooks Explained: What They Can and Can't Do","description":"Ask in almost any Discord dev server how to post automated messages into a channel, and someone will say \"just use a webhook\" before you've even finished typing the question.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/cybrancee.com\/blog\/discord-webhooks-explained-what-they-can-and-cant-do\/","og_locale":"en_US","og_type":"article","og_title":"Discord Webhooks Explained: What They Can and Can't Do","og_description":"Ask in almost any Discord dev server how to post automated messages into a channel, and someone will say \"just use a webhook\" before you've even finished typing the question.","og_url":"https:\/\/cybrancee.com\/blog\/discord-webhooks-explained-what-they-can-and-cant-do\/","og_site_name":"Cybrancee Blog","article_publisher":"https:\/\/www.facebook.com\/cybrancee\/","article_published_time":"2026-08-08T21:00:00+00:00","og_image":[{"width":2560,"height":940,"url":"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2026\/08\/thumbnail_for_whatwebhooksare-scaled.png","type":"image\/png"}],"author":"Denis","twitter_card":"summary_large_image","twitter_creator":"@cybrancee","twitter_site":"@cybrancee","twitter_misc":{"Written by":"Denis","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/cybrancee.com\/blog\/discord-webhooks-explained-what-they-can-and-cant-do\/#article","isPartOf":{"@id":"https:\/\/cybrancee.com\/blog\/discord-webhooks-explained-what-they-can-and-cant-do\/"},"author":{"name":"Denis","@id":"https:\/\/cybrancee.com\/blog\/#\/schema\/person\/9f00e117246b808e567c309b7a866a4b"},"headline":"Discord Webhooks Explained: What They Can and Can&#8217;t Do","datePublished":"2026-08-08T21:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/cybrancee.com\/blog\/discord-webhooks-explained-what-they-can-and-cant-do\/"},"wordCount":2255,"publisher":{"@id":"https:\/\/cybrancee.com\/blog\/#organization"},"image":{"@id":"https:\/\/cybrancee.com\/blog\/discord-webhooks-explained-what-they-can-and-cant-do\/#primaryimage"},"thumbnailUrl":"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2026\/08\/thumbnail_for_whatwebhooksare-scaled.png","articleSection":["Discord Bot Hosting"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/cybrancee.com\/blog\/discord-webhooks-explained-what-they-can-and-cant-do\/","url":"https:\/\/cybrancee.com\/blog\/discord-webhooks-explained-what-they-can-and-cant-do\/","name":"Discord Webhooks Explained: What They Can and Can't Do","isPartOf":{"@id":"https:\/\/cybrancee.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cybrancee.com\/blog\/discord-webhooks-explained-what-they-can-and-cant-do\/#primaryimage"},"image":{"@id":"https:\/\/cybrancee.com\/blog\/discord-webhooks-explained-what-they-can-and-cant-do\/#primaryimage"},"thumbnailUrl":"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2026\/08\/thumbnail_for_whatwebhooksare-scaled.png","datePublished":"2026-08-08T21:00:00+00:00","description":"Ask in almost any Discord dev server how to post automated messages into a channel, and someone will say \"just use a webhook\" before you've even finished typing the question.","breadcrumb":{"@id":"https:\/\/cybrancee.com\/blog\/discord-webhooks-explained-what-they-can-and-cant-do\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cybrancee.com\/blog\/discord-webhooks-explained-what-they-can-and-cant-do\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cybrancee.com\/blog\/discord-webhooks-explained-what-they-can-and-cant-do\/#primaryimage","url":"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2026\/08\/thumbnail_for_whatwebhooksare-scaled.png","contentUrl":"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2026\/08\/thumbnail_for_whatwebhooksare-scaled.png","width":2560,"height":940,"caption":"thumbnail for the blog discord webhooks cybrancee"},{"@type":"BreadcrumbList","@id":"https:\/\/cybrancee.com\/blog\/discord-webhooks-explained-what-they-can-and-cant-do\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cybrancee.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Discord Webhooks Explained: What They Can and Can&#8217;t Do"}]},{"@type":"WebSite","@id":"https:\/\/cybrancee.com\/blog\/#website","url":"https:\/\/cybrancee.com\/blog\/","name":"Cybrancee Blog","description":"Gaming News","publisher":{"@id":"https:\/\/cybrancee.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cybrancee.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/cybrancee.com\/blog\/#organization","name":"Cybrancee","url":"https:\/\/cybrancee.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cybrancee.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2024\/08\/logo.png","contentUrl":"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2024\/08\/logo.png","width":466,"height":100,"caption":"Cybrancee"},"image":{"@id":"https:\/\/cybrancee.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/cybrancee\/","https:\/\/x.com\/cybrancee","https:\/\/www.instagram.com\/cybrancee\/"]},{"@type":"Person","@id":"https:\/\/cybrancee.com\/blog\/#\/schema\/person\/9f00e117246b808e567c309b7a866a4b","name":"Denis","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/c0a3ff07fcf30f948d3bada6460c97de14925400844f2ce6ac085e6cb1932d99?s=96&d=retro&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/c0a3ff07fcf30f948d3bada6460c97de14925400844f2ce6ac085e6cb1932d99?s=96&d=retro&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c0a3ff07fcf30f948d3bada6460c97de14925400844f2ce6ac085e6cb1932d99?s=96&d=retro&r=g","caption":"Denis"},"url":"https:\/\/cybrancee.com\/blog\/author\/denis\/"}]}},"_links":{"self":[{"href":"https:\/\/cybrancee.com\/blog\/wp-json\/wp\/v2\/posts\/7590","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cybrancee.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cybrancee.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cybrancee.com\/blog\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/cybrancee.com\/blog\/wp-json\/wp\/v2\/comments?post=7590"}],"version-history":[{"count":1,"href":"https:\/\/cybrancee.com\/blog\/wp-json\/wp\/v2\/posts\/7590\/revisions"}],"predecessor-version":[{"id":7595,"href":"https:\/\/cybrancee.com\/blog\/wp-json\/wp\/v2\/posts\/7590\/revisions\/7595"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cybrancee.com\/blog\/wp-json\/wp\/v2\/media\/7594"}],"wp:attachment":[{"href":"https:\/\/cybrancee.com\/blog\/wp-json\/wp\/v2\/media?parent=7590"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cybrancee.com\/blog\/wp-json\/wp\/v2\/categories?post=7590"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cybrancee.com\/blog\/wp-json\/wp\/v2\/tags?post=7590"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}