Skip to main content

Overview

Gateway Intents allow you to specify which events your bot wants to receive from Discord. This reduces bandwidth and improves performance by only receiving events you actually need.

Why Intents Matter

Intents were introduced by Discord to help bots scale more efficiently. Instead of receiving all events from all guilds, you specify exactly which event categories you need.
Benefits:
  • Reduced bandwidth - Only receive events you need
  • Better performance - Less processing overhead
  • Privacy - Don’t receive sensitive data you don’t use

Privileged Intents

Three intents are marked as privileged and require special approval:

GUILD_MEMBERS

Required for member caching and chunking. Must be enabled in Discord Developer Portal.
Provides:
  • Member join/leave events
  • Member update events (nickname, roles, etc.)
  • Ability to chunk (load all members) in large guilds
JDABuilder.createDefault(token)
    .enableIntents(GatewayIntent.GUILD_MEMBERS)
    .setMemberCachePolicy(MemberCachePolicy.ALL)
    .setChunkingFilter(ChunkingFilter.ALL)
    .build();

GUILD_PRESENCES

Very heavy intent! Generates 99% of gateway traffic. Only enable if absolutely necessary.
Provides:
  • Online status updates (online, idle, dnd, offline)
  • User activities (“Playing…”, “Streaming…”, etc.)
  • Client type information (mobile, desktop, web)
JDABuilder.createDefault(token)
    .enableIntents(GatewayIntent.GUILD_PRESENCES)
    .enableCache(CacheFlag.ACTIVITY, CacheFlag.CLIENT_STATUS)
    .build();

MESSAGE_CONTENT

Required to read message content, embeds, attachments, and components. Must be enabled for message-based commands.
Provides:
  • Message content (the actual text)
  • Message embeds
  • Message attachments
  • Message components (buttons, select menus)
JDABuilder.createLight(token, EnumSet.of(
    GatewayIntent.GUILD_MESSAGES,
    GatewayIntent.MESSAGE_CONTENT  // Privileged!
))
.build();
Slash commands don’t require MESSAGE_CONTENT - they work with DEFAULT intents!

Standard Intents

These intents don’t require special approval:
IntentPurpose
GUILDSGuild create/update/delete events (always enabled)
GUILD_MODERATIONBan/unban events, audit log entries
GUILD_EXPRESSIONSEmoji, sticker, soundboard changes
GUILD_WEBHOOKSWebhook create/update/delete
GUILD_INVITESInvite create/delete
GUILD_VOICE_STATESVoice state changes (required for voice!)
GUILD_MESSAGESMessage events in guilds
GUILD_MESSAGE_REACTIONSReaction add/remove in guilds
GUILD_MESSAGE_TYPINGTyping indicators in guilds
DIRECT_MESSAGESMessage events in DMs
DIRECT_MESSAGE_REACTIONSReaction events in DMs
DIRECT_MESSAGE_TYPINGTyping indicators in DMs
SCHEDULED_EVENTSGuild scheduled event changes
AUTO_MODERATION_CONFIGURATIONAutoMod rule changes
AUTO_MODERATION_EXECUTIONAutoMod action executions

Common Configurations

Slash Command Bot

// Minimal - works with just defaults
JDABuilder.createDefault(token)
    .build();

// Or even lighter
JDABuilder.createLight(token, Collections.emptyList())
    .build();

Message Logger Bot

JDABuilder.createLight(token, EnumSet.of(
    GatewayIntent.GUILD_MESSAGES,
    GatewayIntent.MESSAGE_CONTENT,  // Privileged!
    GatewayIntent.DIRECT_MESSAGES
))
.build();

Moderation Bot

JDABuilder.createDefault(token)
    .enableIntents(
        GatewayIntent.GUILD_MEMBERS,      // Privileged!
        GatewayIntent.GUILD_MODERATION,
        GatewayIntent.MESSAGE_CONTENT     // Privileged!
    )
    .setMemberCachePolicy(MemberCachePolicy.ALL)
    .build();

Music Bot

JDABuilder.createLight(token, EnumSet.of(
    GatewayIntent.GUILD_VOICE_STATES  // Required for voice!
))
.build();

Voice Activity Tracker

JDABuilder.createDefault(token)
    .enableIntents(GatewayIntent.GUILD_VOICE_STATES)
    .enableCache(CacheFlag.VOICE_STATE)
    .setMemberCachePolicy(MemberCachePolicy.VOICE)
    .build();

Intent and Cache Relationship

Some cache flags require specific intents. If the intent is disabled, the cache flag is automatically disabled.
Cache FlagRequired Intent
MEMBER_OVERRIDESGUILD_MEMBERS
VOICE_STATEGUILD_VOICE_STATES
EMOJIGUILD_EXPRESSIONS
STICKERGUILD_EXPRESSIONS
ACTIVITYGUILD_PRESENCES
CLIENT_STATUSGUILD_PRESENCES
ONLINE_STATUSGUILD_PRESENCES

Default Intent Set

The GatewayIntent.DEFAULT constant includes:
public static final int DEFAULT = 
    getRaw(GUILDS, GUILD_MODERATION, GUILD_EXPRESSIONS,
           GUILD_WEBHOOKS, GUILD_INVITES, GUILD_VOICE_STATES,
           GUILD_MESSAGES, GUILD_MESSAGE_REACTIONS,
           DIRECT_MESSAGES, DIRECT_MESSAGE_REACTIONS,
           GUILD_MESSAGE_TYPING, DIRECT_MESSAGE_TYPING,
           SCHEDULED_EVENTS, AUTO_MODERATION_CONFIGURATION,
           AUTO_MODERATION_EXECUTION);
Not included (must be explicitly enabled):
  • GUILD_MEMBERS (privileged)
  • GUILD_PRESENCES (privileged)
  • MESSAGE_CONTENT (privileged)

Enabling Privileged Intents

1

Open Discord Developer Portal

Go to https://discord.com/developers/applications and select your application.
2

Navigate to Bot Settings

Click on Bot in the left sidebar.
3

Enable Privileged Intents

Scroll down to Privileged Gateway Intents and toggle on:
  • Presence Intent (for GUILD_PRESENCES)
  • Server Members Intent (for GUILD_MEMBERS)
  • Message Content Intent (for MESSAGE_CONTENT)
4

Save Changes

Click Save Changes at the bottom.
Bots in 100+ guilds require verification and approval from Discord before privileged intents can be enabled.

Build docs developers (and LLMs) love