Discord Bot Intents Allowed by Default in Discord.js V14
If you've started building a Discord bot with Discord.js V14, you've likely run into the concept of Gateway Intents — and noticed that not all of them are available right out of the box. Understanding which intents are enabled by default, which require explicit opt-in, and which need Discord's approval entirely is one of the first real hurdles in bot development.
What Are Discord Gateway Intents?
Gateway Intents are a permission system Discord uses to control which real-time events your bot receives from Discord's Gateway (the WebSocket connection your bot uses to listen to server activity). Rather than flooding every bot with every event from every server, Discord uses intents to let you — and Discord itself — limit what data flows to your application.
Think of intents as subscriptions. If you don't subscribe to a particular category of events, your bot simply won't receive them, even if they're happening in servers where your bot is present.
Discord.js V14 aligns closely with Discord's own API versioning (API v10), so intent handling in V14 is stricter and more explicit than in older versions of the library.
The Three Tiers of Intents
Before getting to defaults, it helps to understand that Discord sorts intents into three functional tiers:
| Tier | Description | Examples |
|---|---|---|
| Default (non-privileged) | Available without any special configuration | Guild events, voice state updates, reactions |
| Privileged (opt-in) | Must be explicitly requested and enabled in the Developer Portal | Guild Members, Presence, Message Content |
| Disabled (not requested) | Not listed in your client's intent config — events simply won't arrive | Anything you omit |
What Intents Are Allowed by Default in Discord.js V14?
In Discord.js V14, when you initialize your Client, you must pass intents explicitly in the constructor. There is no automatic default set applied for you — if you pass an empty array or omit intents, your bot will connect but receive almost nothing useful.
That said, the following intents are non-privileged, meaning Discord does not require special approval or portal toggles to use them. You still need to declare them in your code, but they're freely available to any bot:
Guilds— Receives events when your bot joins/leaves servers, and provides access to guild structure, channels, and rolesGuildModeration— FormerlyGuildBans; covers ban and unban eventsGuildEmojisAndStickers— Events related to emoji and sticker changesGuildIntegrations— Integration update eventsGuildWebhooks— Webhook update eventsGuildInvites— Invite creation and deletionGuildVoiceStates— Voice channel join/leave/move eventsGuildMessages— Message create/update/delete events in servers (note: message content requires a separate privileged intent)GuildMessageReactions— Reaction add/remove events in serversGuildMessageTyping— Typing indicators in server channelsDirectMessages— DM message eventsDirectMessageReactions— Reactions in DMsDirectMessageTyping— Typing indicators in DMsGuildScheduledEvents— Scheduled event create/update/delete/user eventsAutoModerationConfiguration— AutoMod rule eventsAutoModerationExecution— AutoMod action execution events
These are all accessible without any special approval from Discord, as long as your bot's OAuth2 scopes are set up correctly. 🔓
The Privileged Intents: What Needs Extra Steps
Three intents are classified as privileged and are not freely available by default:
GuildMembers— Required to receive member join/leave/update events and to access full member lists. Without this,guild.members.fetch()won't return complete data.GuildPresences— Needed to track online status and activity data for users.MessageContent— Arguably the most impactful for many bots. Without this, message bodies, attachments, embeds, and components in received messages will be empty strings or empty arrays, even ifGuildMessagesis enabled.
To use any of these, you need to:
- Enable them in the Discord Developer Portal under your bot's settings
- Declare them in your
Clientintents array in code
For bots in 75 or fewer servers, you can toggle these on freely in the portal. Once your bot crosses 75 servers, Discord requires verification and approval for privileged intents — a process that involves submitting a use-case justification.
How Intents Are Declared in Discord.js V14 Code
In V14, the recommended approach uses the GatewayIntentBits enum from the discord.js package:
const { Client, GatewayIntentBits } = require('discord.js'); const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent, // Privileged — requires portal toggle GatewayIntentBits.GuildMembers, // Privileged — requires portal toggle ], }); Using the enum (rather than raw integer bitfields) is cleaner and less prone to silent errors. V14 dropped support for the older string-based intent declarations that worked in V13, so this pattern is now the standard. 🛠️
What Happens If You Misconfigure Intents
Misconfigured intents produce some of the most confusing debugging experiences for new bot developers:
- Bot connects but message events never fire —
GuildMessagesnot declared message.contentis always an empty string —MessageContentprivileged intent not enabled in portal or not declared in code- Member cache is empty —
GuildMembersnot declared - Disallowed intents error on login — A privileged intent is declared in code but not toggled on in the Developer Portal
Each of these points to a specific gap between what your code requests and what Discord has authorized.
The Variables That Shape Your Intent Choices
Which intents your bot actually needs depends on factors that vary significantly between projects:
- Bot functionality — A moderation bot needs
GuildMembers; a music bot may only needGuildsandGuildVoiceStates - Scale — Bots approaching the 75-server threshold need to plan for the privileged intent verification process
- Privacy considerations — Discord introduced privileged intents partly to reduce unnecessary data collection; using only what you need is both good practice and increasingly enforced
- Slash commands vs. message commands — Bots built entirely on slash commands (Interactions) often need far fewer intents than traditional prefix-based bots, since slash command data arrives via interactions rather than message events 🎯
A minimal slash-command-only bot might function with just GatewayIntentBits.Guilds. A full-featured moderation bot reading message content, tracking members, and monitoring presence could require all three privileged intents.
The right combination isn't determined by a default list — it's determined by what your bot actually does, at what scale, and what data it genuinely needs access to.