String Select
type: 3
Messages
Modals
Preview payload.json
The String Select is a dropdown menu with up to 25 options that you define. Users can pick one or several.
{ "flags": 32768, "components": [ { "type": 10, "content": "**Which games do you like?** Pick up to 3." }, { "type": 1, "components": [ { "type": 3, "custom_id": "games", "placeholder": "Pick your games", "min_values": 1, "max_values": 3, "options": [ { "label": "Minecraft", "value": "minecraft", "description": "Building and adventure", "emoji": { "name": "⛏️" } }, { "label": "Fortnite", "value": "fortnite", "description": "Battle royale", "emoji": { "name": "🔫" } }, { "label": "Rocket League", "value": "rocket", "description": "Soccer with cars", "emoji": { "name": "🚗" } }, { "label": "Among Us", "value": "amongus", "description": "Find the impostor", "emoji": { "name": "🕵️" } } ] } ] } ]}Fields
Section titled “Fields”| Field | Type | Description |
|---|---|---|
type |
integer | required Always 3. |
id |
integer | optional Unique identifier. |
custom_id |
string | required What your bot receives. 1-100 characters. |
options |
array of options | required 1 to 25 options. |
placeholder |
string | optional Text shown when nothing is selected. Max 150 characters. |
min_values |
integer | optional Minimum options to pick (0-25). Defaults to 1. |
max_values |
integer | optional Maximum options to pick (max 25). Defaults to 1. |
required |
boolean | optional Modals only. Whether it’s required. Defaults to true. Ignored in messages. |
disabled |
boolean | optional Messages only. Disables the menu. Defaults to false. Errors in modals. |
Option
Section titled “Option”| Field | Type | Description |
|---|---|---|
label |
string | required Visible text. Max 100 characters. |
value |
string | required Value your bot receives. Max 100 characters. |
description |
string | optional Small text below. Max 100 characters. |
emoji |
partial emoji | optional Emoji on the left. |
default |
boolean | optional Whether it starts selected. |
Use the JSON above. When someone picks, you receive data.values, for example ["minecraft", "rocket"].
import { ActionRowBuilder, StringSelectMenuBuilder, StringSelectMenuOptionBuilder, MessageFlags,} from 'discord.js';
const menu = new StringSelectMenuBuilder() .setCustomId('games') .setPlaceholder('Pick your games') .setMinValues(1) .setMaxValues(3) .addOptions( new StringSelectMenuOptionBuilder().setLabel('Minecraft').setValue('minecraft') .setDescription('Building and adventure').setEmoji('⛏️'), new StringSelectMenuOptionBuilder().setLabel('Fortnite').setValue('fortnite') .setDescription('Battle royale').setEmoji('🔫'), );
const row = new ActionRowBuilder().addComponents(menu);
// Reading the selectionclient.on('interactionCreate', async (interaction) => { if (interaction.isStringSelectMenu() && interaction.customId === 'games') { await interaction.reply({ content: `You picked: ${interaction.values.join(', ')}`, flags: MessageFlags.Ephemeral }); }});select = discord.ui.Select( custom_id="games", placeholder="Pick your games", min_values=1, max_values=3, options=[ discord.SelectOption(label="Minecraft", value="minecraft", description="Building and adventure", emoji="⛏️"), discord.SelectOption(label="Fortnite", value="fortnite", description="Battle royale", emoji="🔫"), ],)
async def on_select(interaction: discord.Interaction): await interaction.response.send_message(f"You picked: {', '.join(select.values)}", ephemeral=True)
select.callback = on_select
view = discord.ui.LayoutView()view.add_item(discord.ui.ActionRow(select))minValues := 1row := discordgo.ActionsRow{Components: []discordgo.MessageComponent{ discordgo.SelectMenu{ MenuType: discordgo.StringSelectMenu, CustomID: "games", Placeholder: "Pick your games", MinValues: &minValues, MaxValues: 3, Options: []discordgo.SelectMenuOption{ {Label: "Minecraft", Value: "minecraft", Description: "Building and adventure", Emoji: &discordgo.ComponentEmoji{Name: "⛏️"}}, {Label: "Fortnite", Value: "fortnite", Description: "Battle royale", Emoji: &discordgo.ComponentEmoji{Name: "🔫"}}, }, },}}
// Reading the selection// data := i.MessageComponentData(); data.Values -> []string{"minecraft"}In a modal
Section titled “In a modal”Inside a modal, the menu goes inside a Label:
{ "type": 18, "label": "Your platform", "component": { "type": 3, "custom_id": "platform", "options": [ { "label": "PC", "value": "pc" }, { "label": "Console", "value": "console" }, { "label": "Mobile", "value": "mobile" } ] }}