Releases: discord-jda/JDA
Release list
v6.5.0 | Message Search API
Overview
This release adds support for the Message Search API, which allows bots to search messages in a guild. See Guild#searchMessages and MessageSearchAction for detailed documentation.
Example:
guild.searchMessages()
.attachmentFilenames("cat.png")
.includeAuthorTypes(MessageSearchAction.AuthorType.USER)
.queue(response -> {
if (response.isNotReady()) {
int retryAfter = response.asNotReady().getRetryAfter();
event.reply("The server is still indexing messages, try again later").queue();
return;
}
List<Message> messages = response.asResults().getMessages();
event.reply("Found %s messages of cats!".formatted(messages.size())).queue();
});Additionally, we made a minor change in the handling for received messages. For messages received in guilds JDA now handles events with missing member objects, which is necessary to handle messages that arrive shortly after a user is banned from the guild. These messages will contain members which are not added to cache and have no roles.
New Features
- Add message search by @freya022 in #3052
- Add attachment flags by @MinnDevelopment in #3109
- Add support for image descriptions in embeds by @MinnDevelopment in #310
Changes
- Handle messages received after ban by @MinnDevelopment in #3103
Full Changelog: v6.4.2...v6.5.0
Installation
Gradle
repositories {
mavenCentral()
}
dependencies {
implementation("net.dv8tion:JDA:6.5.0")
}Maven
<dependency>
<groupId>net.dv8tion</groupId>
<artifactId>JDA</artifactId>
<version>6.5.0</version>
</dependency>v6.4.2
New Features
- Add attachment flags, embed flags and fields, and, media flags by @freya022 in #3081
- Add missing
NO_MUTUAL_GUILDSErrorResponse by @srnyx in #3083 - Add
ErrorResponse#CANNOT_FORWARD_UNREADABLE_MESSAGEby @freya022 in #3087
Changes
- Improve error messages caused by entities relying on the cache to find themselves by @freya022 in #3067
- Component options: Prevent setting an out-of-range number of default values by @freya022 in #3068
- Fix deserialization of components without unfurled media by @freya022 in #3078
Bug Fixes
- Fix Guild#invalidate not removing thread channels from global cache by @MinnDevelopment in #3094
- Fix incorrect ID used in AbstractGuildChannelImpl#getGuild for entity parent refresh by @MinnDevelopment in #3095
- Fix incorrect check for choice value length by @MinnDevelopment in #3096
- fix: handle integer sound ids in voice channel effects by @rxsto in #3085
Full Changelog: v6.4.1...v6.4.2
Installation
Gradle
repositories {
mavenCentral()
}
dependencies {
implementation("net.dv8tion:JDA:6.4.2")
}Maven
<dependency>
<groupId>net.dv8tion</groupId>
<artifactId>JDA</artifactId>
<version>6.4.2</version>
</dependency>v6.4.1
Bug Fixes
- Fixed
CheckboxGroup.Builder.setRequiredRange()incorrectly setting min and max by @replaceitem in #3065 - Fix
getCommandTypereading value of interaction type instead of command type by @freya022 in #3074
Full Changelog: v6.4.0...v6.4.1
Installation
Gradle
repositories {
mavenCentral()
}
dependencies {
implementation("net.dv8tion:JDA:6.4.1")
}Maven
<dependency>
<groupId>net.dv8tion</groupId>
<artifactId>JDA</artifactId>
<version>6.4.1</version>
</dependency>v6.4.0 | Checkboxes
Overview
This release adds support for new checkbox and radio groups in modals as well as support for voice channel effects and soundboards.
Warning
All animated assets now use .webp by default instead of .gif.
Checkboxes and Radio Groups (#3010)
You can now include checkboxes and radio groups in your modals:
Modal.create("modal", "Welcome Screening")
.addComponents(
Label.of(
"How did you find this server?",
RadioGroup.create("radio")
.addOption("I was told by a friend", "friend")
.addOption("I found it online", "online")
.addOption("Other", "other")
.build()),
Label.of(
"Server Rules",
CheckboxGroup.create("checkbox-group")
.addOption(
"I've read the server rules and agree to follow them.", "rule-checkbox")
.setMinValues(1)
.build()))
.build();
When a user submits a modal with a checkbox group, the selected values can be accessed in the ModalInteractionEvent with getValue(groupId).getAsStringList() and radio groups using getValue(groupId).getAsString().
New Features
- Add checkboxes, checkbox groups and radio groups by @freya022 in #3010
- Add soundboard sounds by @freya022 in #2753
- Add getJumpUrl for all channel types by @Vampire in #3055
Changes
- Use
ANIMATED_WEBPfor all animated assets by @freya022 in #3036 - Alternatively check for
CREATE_*permissions when managing/deleting our own events/emojis/stickers by @freya022 in #3061 - Prevent warning about message content intent if message contains content by @freya022 in #3053
Full Changelog: v6.3.2...v6.4.0
Installation
Gradle
repositories {
mavenCentral()
}
dependencies {
implementation("net.dv8tion:JDA:6.4.0")
}Maven
<dependency>
<groupId>net.dv8tion</groupId>
<artifactId>JDA</artifactId>
<version>6.4.0</version>
</dependency>v6.3.2
Overview
Small bug fix release.
Changes
- Update dependencies by @MinnDevelopment in #3038
- Bump limit of context menu commands to 15 by @freya022 in #3035
- Prevent explicitly required select menus when
minValuesis zero by @freya022 in #3023
Bug Fixes
Full Changelog: v6.3.1...v6.3.2
Installation
Gradle
repositories {
mavenCentral()
}
dependencies {
implementation("net.dv8tion:JDA:6.3.2")
}Maven
<dependency>
<groupId>net.dv8tion</groupId>
<artifactId>JDA</artifactId>
<version>6.3.2</version>
</dependency>v6.3.1
Overview
This is primarily a bug fix release, but also includes a minor breaking change for emojis.
Enable users to choose the requested format of assets (#3009)
Most methods, that previously returned ImageProxy or an image URL, now support passing ImageFormat to choose a different format. This enables users to easily switch from PNG to WEBP or other formats.
Additionally, most of the template strings used to create image URLs, such as User.AVATAR_URL, have been deprecated in favor of the new DiscordAssets utility class. You can use DiscordAssets.userAvatar(ImageFormat.PNG, userId, avatarId) to get an ImageProxy instance and use ImageProxy#getUrl to get the respective URL.
Warning
Breaking Changes
CustomEmoji#getImageandCustomEmoji#getImageUrlwill now usewebpformat by default. This is due to API changes which make thegifformat unreliable. See #2999 for details. You can useCustomEmoji#getImage(ImageFormat)to choose a different format, likeImageFormat.PNGorImageFormat.GIF.
New Features
- Adding s/S TimeFormat by @Sheldan in #3016
- Enable users to choose the requested format of assets by @freya022 in #3009
Bug Fixes
- Fix unique id not being copied in SelectMenus by @Kaktushose in #3013
- Use Locale.ROOT in AudioEncryption for consistent string handling by @arif-banai in #3024
Deprecations
- Template Strings for Image CDN URLs are replaced by DiscordAssets
- ScheduledEventUpdateImageEvent is replaced by ScheduledEventUpdateCoverImageEvent
Full Changelog: v6.3.0...v6.3.1
Installation
Gradle
repositories {
mavenCentral()
}
dependencies {
implementation("net.dv8tion:JDA:6.3.1")
}Maven
<dependency>
<groupId>net.dv8tion</groupId>
<artifactId>JDA</artifactId>
<version>6.3.1</version>
</dependency>v6.3.0 | DAVE Protocol Support
Overview
This release adds initial support for the DAVE Protocol.
Important
Audio connections without the DAVE Protocol will stop working on March 1st, 2026. If you use JDA to connect to voice channels or stage channels, you will have to update to this release and add the required DAVE Protocol implementation.
Setting up DAVE Protocol in JDA
Since the implementation for DAVE requires native library dependencies, it is not included by default by JDA. We've decided that dependencies related to audio features will no longer be included by default in the future.
Starting with JDA 6.3.0, audio features require additional setup in your JDABuilder or DefaultShardManagerBuilder. Once you have added a dependency that implements DaveSessionFactory, you can configure it in your builder using setAudioModuleConfig:
builder.setAudioModuleConfig(
new AudioModuleConfig()
.withDaveSessionFactory(daveSessionFactory)
)You can use JDAVE, which provides an implementation for this interface. Note that this library requires Java 25 and only supports a few platforms for now. Read the README for setup instructions.
Warning
This library is still in its early stages and might have some issues. However, I wanted to get this released as soon as possible to allow people to test and report issues, since the deadline is only a few weeks away. I recommend to test this thoroughly before going into production.
There are other libraries still in development that will add support for older java versions, such as libdave-jvm which uses JNI instead of the modern FFM API.
New Features
- Add support for libdave by @MinnDevelopment in #2988
Full Changelog: v6.2.1...v6.3.0
Installation
Gradle
repositories {
mavenCentral()
}
dependencies {
implementation("net.dv8tion:JDA:6.3.0")
}Maven
<dependency>
<groupId>net.dv8tion</groupId>
<artifactId>JDA</artifactId>
<version>6.3.0</version>
</dependency>v6.2.1
Overview
In this release, we have added new compliance tests that automatically validate some of our enums against the Official Discord OpenAPI Specification. This allows us to easily verify the completeness of our enums, which is why we added a lot of new enum constants. In the future, we might use this spec for serialization / deserialization internally, or even expand it to a public REST-only module.
Important
Important Announcement: Changes to Audio Connections in March 2026
Discord has announced in their Changelog: Deprecating Non-E2EE Voice Calls, that all voice connections will require End-to-End-Encryption starting March 1st, 2026.
Support for this in JDA has been blocked by Discord's slow release of their library libdave. However, they have finally released a usable C-interface 2 weeks ago. The next feature release of JDA will add a new opt-in interface to support the DAVE protocol and will log warnings and errors if this interface is not implemented. The development for this has started in my pull request: Add support for libdave #2988.
On March 1st, 2026, all JDA audio connections will require an implementation of DAVE. Users of JDA are responsible to choose or provide their own implementation of this protocol. There are already some work-in-progress implementations that directly use libdave, such as JDAVE (requires Java 25) and libdave-jvm (requires Java 8).
If you are affected by this change, you should start migrating to JDA 6 as soon as possible.
New Features
- Support retrieving available SKUs via /applications/{application.id}/skus by @rainbowdashlabs in #2828
- Adds new locales:
DiscordLocale.ARABIC,DiscordLocale.HEBREW - Adds new audit log action types:
ActionType.SOUNDBOARD_SOUND_CREATE,ActionType.SOUNDBOARD_SOUND_UPDATE,ActionType.SOUNDBOARD_SOUND_DELETEActionType.AUTO_MODERATION_QUARANTINE_USERActionType.CREATOR_MONETIZATION_REQUEST_CREATED,ActionType.CREATOR_MONETIZATION_TERMS_ACCEPTEDActionType.ONBOARDING_PROMPT_CREATE,ActionType.ONBOARDING_PROMPT_UPDATE,ActionType.ONBOARDING_PROMPT_DELETEActionType.ONBOARDING_CREATE,ActionType.ONBOARDING_UPDATEActionType.HOME_SETTINGS_CREATE,ActionType.HOME_SETTINGS_UPDATE,ActionType.GUILD_PROFILE_UPDATE
- Adds
AuditLogKey.GUILD_BRAND_COLOR_PRIMARY - Adds new audit log target types:
TargetType.SOUNDBOARD_SOUNDTargetType.ONBOARDING_PROMPT_STRUCTURETargetType.ONBOARDING
- Adds
ChannelType.GUILD_DIRECTORY
Changes
- Redact token from trace logs of gateway requests by @freya022 in #2986
- Added Component Verification in Modal Builder by @Crain-32 in #2987
- Update dependencies by @MinnDevelopment in #2989
Full Changelog: v6.2.0...v6.2.1
Installation
Gradle
repositories {
mavenCentral()
}
dependencies {
implementation("net.dv8tion:JDA:6.2.1")
}Maven
<dependency>
<groupId>net.dv8tion</groupId>
<artifactId>JDA</artifactId>
<version>6.2.1</version>
</dependency>v6.2.0
Overview
This release includes a permission change that will go into effect on February 26th, 2026. Any versions older than this will not have the correct permission checks for the new rules, or only partially support the new rules.
Permission Changes (#2967)
After the deadline of February 26th, 2026, some permissions will lose capabilities in favor of new permissions.
MESSAGE_MANAGEwill no longer allow users to Pin/Unpin Messages or Bypass Slowmode. Instead, the newBYPASS_SLOWMODEandPIN_MESSAGESpermissions have been added.MANAGE_GUILD_EXPRESSIONSwill no longer allow users to Create Emojis/Stickers. Instead, the newCREATE_GUILD_EXPRESSIONSpermission has been added.MANAGE_EVENTSwill no longer allow users to Create Scheduled Events. Instead, the newCREATE_SCHEDULED_EVENTSpermission has been added.
See the Discord Changelog for details.
Retrieve Role Member Counts (#2973)
The guild role member count can now be retrieved with Guild#retrieveRoleMemberCounts.
Example:
guild.retrieveRoleMemberCounts().queue(counts -> {
int boostRoleMemberCount = counts.get(guild.getBoostRole());
IO.println("This guild has " + boostRoleMemberCount + " boosters!");
});Enhanced Role Colors (#2975)
You can now access and modify the Gradient or Holographic role colors, a feature unlocked through boosting a guild.
Example:
guild.createRole()
.setName("Gradient Role")
.setGradientColors(0x0000FF, 0x00FF00)
.queue(role -> {
IO.println("Is role a gradient? " + role.getColors().isGradient());
IO.println("Primary: %X".formatted(role.getColors().getPrimaryRaw()));
IO.println("Secondary: %X".formatted(role.getColors().getSecondaryRaw()));
});New Features
- Add support for enhanced role colors by @MinnDevelopment in #2975
- Add
Guild#retrieveRoleMemberCountsby @freya022 in #2973 - Add GUILD_BANNER ("banner_hash") auditlog key by @Vulcano771 in #2968
- Voice Channel Invite Guest Flag by @austinpilz in #2966
Changes
Full Changelog: v6.1.3...v6.2.0
Installation
Gradle
repositories {
mavenCentral()
}
dependencies {
implementation("net.dv8tion:JDA:6.2.0")
}Maven
<dependency>
<groupId>net.dv8tion</groupId>
<artifactId>JDA</artifactId>
<version>6.2.0</version>
</dependency>v6.1.3
Bug Fixes
- Avoid downloading external URLs for component updates by @MinnDevelopment in #2971
Full Changelog: v6.1.2...v6.1.3
Installation
Gradle
repositories {
mavenCentral()
}
dependencies {
implementation("net.dv8tion:JDA:6.1.3")
}Maven
<dependency>
<groupId>net.dv8tion</groupId>
<artifactId>JDA</artifactId>
<version>6.1.3</version>
</dependency>