Discord Privileged Gateway Intents and MESSAGE_CONTENT in 2026: A Practical Guide
If you maintain a Discord bot in 2026, you have almost certainly seen errors about missing intents, empty message bodies, or warnings in the Discord Developer Portal about privileged gateway intents. This guide explains what gateway intents are, which ones are privileged, how the MESSAGE_CONTENT intent fits into modern bot design, and how to stay on the right side of Discord’s policies and rate limits.
What Are Gateway Intents?
Discord delivers real-time events to your bot over a WebSocket connection called the Gateway. Not every bot needs every event. Gateway intents are flags you declare when connecting. They tell Discord which classes of events you want to receive.
Examples of intent groupings include:
- Guilds: Basic server structure (channels, roles at a high level, guild create or update).
- Guild members: Member join, leave, and updates (often needed for welcome messages or role sync).
- Guild messages: Message events in servers (create, update, delete) without guaranteed access to the message body for normal messages.
- Message content: The actual text, attachments metadata, and embeds for messages in most cases where Discord would otherwise redact content for bots that do not need it.
Declaring intents is mandatory for current API versions. If you omit an intent, you simply do not get those events, or you get partial data (for example, message events without content).
Privileged vs Non-Privileged Intents
Discord splits intents into two buckets.
Non-privileged intents can be enabled for any verified or unverified application within normal limits. You toggle them in code and they work for typical bot sizes without extra approval.
Privileged gateway intents are restricted because they expose broader or more sensitive data. As of common 2025 to 2026 policy, the privileged intents are:
- SERVER MEMBERS INTENT (often called
GUILD_MEMBERSin libraries). - MESSAGE CONTENT INTENT (
MESSAGE_CONTENT). - PRESENCE INTENT (
GUILD_PRESENCES).
For bots in under 100 servers, you can usually enable these in the Developer Portal without a manual review step. For bots in 100 or more servers, Discord requires you to apply and be approved for privileged intents you actually use. If you enable them in the Portal but are not approved, behavior may be degraded or your bot may hit errors at scale.
Practical takeaway: Build features around the minimum intents you need. If you can use slash commands and interactions instead of reading every message’s text, you reduce compliance surface and often improve UX.
Why MESSAGE_CONTENT Matters
Many tutorials still assume message.content is always available. That is no longer the default story.
Without the MESSAGE CONTENT privileged intent:
- Your bot may receive message events for structural purposes in some setups, but
content(and some related fields) can be empty for most messages in guilds. - Prefix commands that parse
!commandfrom normal user messages stop working unless you move to slash commands, buttons, selects, or other interaction-based flows. - Moderation tools that scan message text need the intent (and appropriate permissions), or they must use other supported pathways.
When you genuinely need MESSAGE_CONTENT:
- Prefix-based command handlers you cannot migrate yet.
- Auto-moderation based on message body.
- Logging or ticketing flows that store message text (subject to your privacy policy and Discord’s Developer Policy).
When you often do not need it:
- Slash-only bots.
- Bots that only respond to interactions, buttons, and modals.
- Bots that use context menus on messages (those work through interactions, not by scraping content preemptively).
Migrating to application commands (slash commands) is the long-term direction Discord encourages. It also tends to reduce accidental broad data processing.
Enabling Intents in the Discord Developer Portal (2026)
- Open Discord Developer Portal and select your application.
- Go to the Bot section.
- Under Privileged Gateway Intents, toggle only what you need:
- SERVER MEMBERS INTENT
- MESSAGE CONTENT INTENT
- PRESENCE INTENT
- Save changes.
In your library, you must also pass the matching intent flags when creating the client. The Portal alone does not grant events: code and Portal must align.
For 100+ servers, complete Discord’s verification and intent application flow if you rely on privileged intents. Keep your bot’s description, support server, and privacy policy accurate. Discord reviews whether your use case justifies broad member or message content access.
Which Intents Does Your Bot Actually Need?
Use this decision checklist:
- Guilds: Almost every bot needs
GUILDSfor basic operation (slash command registration, channel lookups). - Guild messages: Useful if you care about message create or delete events even when using slash commands (for example, audit-style features). Pair with MESSAGE_CONTENT only if you must read text.
- Message content: Only if you parse normal message bodies. If you switch to slash commands, try to remove it.
- Guild members: Welcome DMs, join logging with full member object, or role sync on join.
- Guild presences: Activity status, custom status text (sensitive; many bots do not need this).
Anti-pattern: Enabling every intent “just in case.” That increases review friction, memory use, and event volume.
Rate Limits and Event Volume
Intents affect how many events hit your process. More intents, especially in large guilds, mean more Gateway traffic. That interacts with:
- Gateway connection limits per bot shard (library documentation and Discord docs spell out sharding thresholds).
- HTTP rate limits on REST calls (sending messages, fetching history). These are separate from Gateway limits but matter for the same features.
MESSAGE_CONTENT does not by itself change REST rate limits, but bots that read every message often also fetch history, upload logs, or call external APIs per message. That pattern can exhaust HTTP budgets quickly.
Mitigations:
- Debounce or sample where business rules allow.
- Use interaction tokens and follow-up messages efficiently (one response pattern per interaction).
- Shard when Discord requires it (large total guild count or large individual guilds).
If you host the bot on a small VPS, a spike in message volume can CPU-throttle your process before Discord rate limits you. Stable hosting with predictable CPU helps. Space-Node VPS hosting is built for workloads like always-on bots where you want steady performance rather than a sleeping free tier.
Verification Requirements for 100+ Servers
Once your bot reaches 100 servers, Discord’s verification process applies. For privileged intents, you typically explain:
- Why you need member, presence, or message content access.
- How you store or discard data.
- What user-facing value the feature provides.
Bots that only use slash commands and non-privileged intents have a simpler story. Bots that log all message text face stricter expectations. Align your public privacy policy with actual behavior.
Code Examples
discord.js (v14 style)
const { Client, GatewayIntentBits } = require('discord.js');
const client = new Client({
intents: [
GatewayIntentBits.Guilds,
GatewayIntentBits.GuildMessages,
GatewayIntentBits.MessageContent, // privileged: enable in Portal + approval if 100+ guilds
],
});
client.on('messageCreate', (message) => {
if (message.author.bot) return;
if (message.content === '!ping') {
message.reply('Pong.');
}
});
client.login(process.env.DISCORD_TOKEN);
To remove reliance on message content, register slash commands and use client.on('interactionCreate', ...).
discord.py (2.x)
import discord
from discord.ext import commands
intents = discord.Intents.default()
intents.message_content = True # privileged
intents.guild_messages = True
bot = commands.Bot(command_prefix='!', intents=intents)
@bot.event
async def on_message(message):
if message.author.bot:
return
if message.content == '!ping':
await message.channel.send('Pong.')
await bot.process_commands(message)
bot.run('YOUR_TOKEN')
Always load the token from environment variables, never commit it to git.
Hosting and Reliability Notes
Gateway connections are long-lived. If your host kills idle processes or rotates IPs constantly, you may see disconnects and missed events. Use a process manager (systemd, PM2, or Docker with restart policy) on a VPS you control. For teams that outgrow hobby machines, managed EU infrastructure from providers like Space-Node keeps latency predictable for European communities while you focus on code, not hardware.
FAQ
Do I need MESSAGE_CONTENT for slash commands?
Usually no. Slash commands are delivered as interactions. You read options from the interaction object, not from message.content in the same way as prefix commands.
Why is message.content empty even though I enabled the intent in code?
Typical causes: the intent is not enabled in the Developer Portal, your bot is over 100 guilds without approval, or you are testing in a context where the library defaults still omit content. Double-check Portal toggles and verification status.
Are Gateway rate limits the same as HTTP rate limits?
No. The Gateway has its own connection and payload rules. REST endpoints have per-route rate limits. You need to monitor both if you do heavy message sending or history fetching.
Can I avoid privileged intents entirely?
Many bots can. Prefer slash commands, buttons, modals, and context menus. Use MESSAGE_CONTENT only when you truly process arbitrary user text.
Where can I read the official policy?
Discord’s Developer Policy and API documentation change over time. Always cross-check this article with the latest official docs when you ship production changes.
This article is for general guidance and does not replace Discord’s official documentation or legal terms.