Discord gateway intents explained: what your bot can see
When your bot connects to Discord, it asks which kinds of events it wants to receive: messages, member joins, reactions and so on. These choices are called intents. They keep bots from receiving more than they need, and they explain a very common error that stops new bots from starting. Here is what each one does, which are restricted and how to set them.
What intents are
Think of the connection between your bot and Discord as a stream of events. Without filtering, a busy server would send thousands of events a second, most of which your bot ignores. Intents are a list that you give when logging in, saying "send me these categories only".
If you do not ask for a category, you simply do not get those events. The bot connects without error, and then does nothing when members send messages. That "works but silent" behaviour is the most common beginner puzzle.
The main intents
| Intent | What it delivers | Restricted? |
|---|---|---|
| Guilds | Servers, channels and roles, and changes to them | No |
| Guild Messages | Messages sent in server channels | No |
| Direct Messages | Messages sent to the bot privately | No |
| Guild Message Reactions | Reactions added and removed | No |
| Guild Voice States | Who joins and leaves voice channels | No |
| Guild Members | Members joining, leaving, and member updates | Yes |
| Message Content | The actual text of messages | Yes |
| Guild Presences | Online status and activity of members | Yes |
The three restricted ones are called privileged intents. They carry personal information, so Discord wants you to turn them on deliberately.
Message content: the big change
Bots used to read every message to find commands that began with a prefix such as !. Now Discord only gives bots the content of messages that mention them, are sent to them directly, or when the Message Content intent is enabled. Without it, your bot sees that a message was sent, but the text is empty.
For commands, the better approach is slash commands, which do not need the content of messages at all. See Slash commands vs prefix commands. If your bot genuinely needs to read messages, such as a moderation or logging bot, turn the intent on.
Turning privileged intents on
- Open the Developer Portal and select your application.
- Go to the Bot tab.
- Scroll to Privileged Gateway Intents.
- Switch on the ones your bot needs, and save.
Then make sure your code asks for the same intents. Enabling them in the portal only permits them, and your code must request them when it connects.
In discord.js, you list them when creating the client, for example GatewayIntentBits.Guilds and GatewayIntentBits.GuildMessages. In discord.py you build an Intents object, and enable what you need, such as intents.message_content = True. Both libraries have a "default" set that leaves the privileged ones off.
The 100 server rule
Privileged intents are free to toggle for small bots. Once a bot is in 100 or more servers, Discord requires the bot to be verified, and each privileged intent has to be approved with a reason. If you plan to grow, ask for only what you need, so approval is easier.
The error you will see
If your code requests a privileged intent that is not switched on in the portal, the bot refuses to connect, with a message about disallowed intents. Fixing that is covered in How to fix "disallowed intents" errors.
Choosing intents sensibly
- Start with the minimum. A bot that only responds to slash commands needs almost nothing beyond Guilds.
- Add one at a time, when a feature needs it.
- Avoid Presences unless you really need it. It is heavy, because it sends a great deal of data, and many bots never use it.
- Think about memory. The Guild Members intent makes libraries cache members, which uses more memory on big servers. See Hosting resource sizing for Discord bots.
Privacy
Privileged intents give your bot access to personal data about members. Treat it responsibly: do not store more than you need, do not share it, and tell your community what the bot collects. A short privacy note in your server rules helps.
Still stuck? Open a ticket on Discord - run /ticket in any channel, pick a department, and include your Server ID or Invoice ID so we can jump straight in.