Layout Components
Content Components
Interactive Components
1 << 15 (IS_COMPONENTS_V2), which can be sent on a per-message basis. Once a message has been sent with this flag, it can’t be removed from that message. This enables the new components system with the following changes:
- The
contentandembedsfields will no longer work — use Text Display and Container as replacements - Attachments won’t show by default — they must be exposed through components
- The
pollandstickersfields are disabled - Messages allow up to 40 total components
What is a Component
Components allow you to style and structure your messages, modals, and interactions. They are interactive elements that can create rich user experiences in your Discord applications. Components are a field on the message object and modal. You can use them when creating messages or responding to an interaction, like an application command.Component Types
The following is a complete table of available components.| Type | Name | Description | Style | Usage |
|---|---|---|---|---|
| 1 | Action Row | Container to display a row of interactive components | Layout | Message |
| 2 | Button | Button object | Interactive | Message |
| 3 | String Select | Select menu for picking from defined text options | Interactive | Message, Modal |
| 4 | Text Input | Text input object | Interactive | Modal |
| 5 | User Select | Select menu for users | Interactive | Message, Modal |
| 6 | Role Select | Select menu for roles | Interactive | Message, Modal |
| 7 | Mentionable Select | Select menu for mentionables (users and roles) | Interactive | Message, Modal |
| 8 | Channel Select | Select menu for channels | Interactive | Message, Modal |
| 9 | Section | Container to display text alongside an accessory component | Layout | Message |
| 10 | Text Display | Markdown text | Content | Message, Modal |
| 11 | Thumbnail | Small image that can be used as an accessory | Content | Message |
| 12 | Media Gallery | Display images and other media | Content | Message |
| 13 | File | Displays an attached file | Content | Message |
| 14 | Separator | Component to add vertical padding between other components | Layout | Message |
| 17 | Container | Container that visually groups a set of components | Layout | Message |
| 18 | Label | Container associating a label and description with a component | Layout | Modal |
| 19 | File Upload | Component for uploading files | Interactive | Modal |
| 21 | Radio Group | Single-choice set of options | Interactive | Modal |
| 22 | Checkbox Group | Multi-selectable group of checkboxes | Interactive | Modal |
| 23 | Checkbox | Single checkbox for yes/no choice | Interactive | Modal |
Anatomy of a Component
All components have the following fields:| Field | Type | Description |
|---|---|---|
| type | integer | The type of the component |
| id? | integer | 32-bit integer used as an optional identifier for the component |
id field is optional and is used to identify components in the response from an interaction. The id must be unique within the message and is generated sequentially if left empty. Generation of ids won’t use another id that exists in the message if you have one defined for another component. Sending components with an id of 0 is allowed but will be treated as empty and replaced by the API.
Custom ID
Additionally, interactive components like buttons and selects must have acustom_id field. The developer defines this field when sending the component payload, and it is returned in the interaction payload sent when a user interacts with the component. For example, if you set custom_id: click_me on a button, you’ll receive an interaction containing custom_id: click_me when a user clicks that button.
custom_id is only available on interactive components and must be unique per component. Multiple components on the same message must not share the same custom_id. This field is a string of 1 to 100 characters and can be used flexibly to maintain state or pass through other important data.
| Field | Type | Description |
|---|---|---|
| custom_id | string | Developer-defined identifier, 1–100 characters |
Action Row
An Action Row is a top-level layout component. Action Rows can contain one of the following:- Up to 5 contextually grouped buttons
- A single select component (String Select, User Select, Role Select, Mentionable Select, or Channel Select)
| Component | Description |
|---|---|
| Button | An Action Row can contain up to 5 Buttons |
| String Select | A single String Select |
| User Select | A single User Select |
| Role Select | A single Role Select |
| Mentionable Select | A single Mentionable Select |
| Channel Select | A single Channel Select |
Message Example
Message create payload with an Action Row component
Message Example
Message create payload with an Action Row component
Button
A Button is an interactive component that can only be used in messages. It creates clickable elements that users can interact with, sending an interaction to your app when clicked. Buttons must be placed inside an Action Row or a Section’saccessory field.
Button Structure
| Field | Type | Description |
|---|---|---|
| type | integer | 2 for a button |
| id? | integer | Optional identifier for component |
| style | integer | A button style |
| label? | string | Text that appears on the button; max 80 characters |
| emoji? | partial emoji | name, id, and animated |
| custom_id | string | Developer-defined identifier for the button; 1–100 characters |
| sku_id? | snowflake | Identifier for a purchasable SKU; only available for premium-style buttons |
| url? | string | URL for link-style buttons; max 512 characters |
| disabled? | boolean | Whether the button is disabled (defaults to false) |
- Non-link and non-premium buttons must have a
custom_id, and cannot have aurlorsku_id - Link buttons must have a
url, and cannot have acustom_id— they do not send an interaction when clicked - Premium buttons must have a
sku_id, and cannot have acustom_id,label,url, oremoji— they do not send an interaction when clicked
| Name | Value | Action | Required Field |
|---|---|---|---|
| Primary | 1 | The most important or recommended action in a group | custom_id |
| Secondary | 2 | Alternative or supporting actions | custom_id |
| Success | 3 | Positive confirmation or completion actions | custom_id |
| Danger | 4 | An action with irreversible consequences | custom_id |
| Link | 5 | Navigates to a URL | url |
| Premium | 6 | Purchase | sku_id |
Message Example
Message create payload with a Button component
Message Example
Message create payload with a Button component
Message Interaction Response Example
When a user interacts with a Button in a message
Message Interaction Response Example
When a user interacts with a Button in a message
Button Design Guidelines
- Max 34 characters with icon or emoji; max 38 characters without
- Keep text concise — use verbs that indicate the outcome of the action
- Use clear, easily understandable language; avoid jargon
- Maintain consistency in language and tone across buttons
- Test button text for expansion or contraction in translated languages
Primary button per group. If multiple buttons are of equal significance, use Secondary for all.
Premium Buttons automatically display the shop icon, SKU name, and SKU price — no additional configuration needed.
String Select
A String Select is an interactive component that allows users to select one or more providedoptions. It supports both single-select and multi-select behavior. When a user finishes making their choice(s), your app receives an interaction.
String Selects are available in messages and modals. They must be placed inside an Action Row in messages and a Label in modals.
String Select Structure
| Field | Type | Description |
|---|---|---|
| type | integer | 3 for string select |
| id? | integer | Optional identifier for component |
| custom_id | string | ID for the select menu; 1–100 characters |
| options | array | Specified choices in a select menu; max 25 |
| placeholder? | string | Placeholder text if nothing is selected; max 150 characters |
| min_values?* | integer | Minimum number of items that must be chosen (defaults to 1); min 0, max 25 |
| max_values? | integer | Maximum number of items that can be chosen (defaults to 1); max 25 |
| required?** | boolean | Whether the string select is required in a modal (defaults to true) |
| disabled?*** | boolean | Whether select menu is disabled in a message (defaults to false) |
min_values must be omitted or at least 1 if required is omitted or true.** The
required field is only available for String Selects in modals; it is ignored in messages.*** Using
disabled in a modal will result in an error.
Select Option Structure
| Field | Type | Description |
|---|---|---|
| label | string | User-facing name of the option; max 100 characters |
| value | string | Dev-defined value of the option; max 100 characters |
| description? | string | Additional description of the option; max 100 characters |
| emoji? | partial emoji | id, name, and animated |
| default? | boolean | Will show this option as selected by default |
| Field | Type | Description |
|---|---|---|
| type* | integer | 3 for a String Select |
| component_type* | integer | 3 for a String Select |
| id | integer | Unique identifier for the component |
| custom_id | string | Developer-defined identifier; 1–100 characters |
| values | array of strings | The text of the selected options |
component_type is returned; in modal responses type is returned.
Message Example
Message create payload with a String Select component
Message Example
Message create payload with a String Select component
Message Interaction Data Example
When a user interacts with a String Select in a message
Message Interaction Data Example
When a user interacts with a String Select in a message
Modal Example
Modal create payload with a String Select component
Modal Example
Modal create payload with a String Select component
Modal Submit Interaction Data Example
When a user submits a modal containing a String Select
Modal Submit Interaction Data Example
When a user submits a modal containing a String Select
Text Input
Text Input is an interactive component that allows users to enter free-form text responses in modals. It supports both short, single-line inputs and longer, multi-line paragraph inputs. Text Inputs can only be used within modals and must be placed inside a Label.| Field | Type | Description |
|---|---|---|
| type | integer | 4 for a text input |
| id? | integer | Optional identifier for component |
| custom_id | string | Developer-defined identifier for the input; 1–100 characters |
| style | integer | The Text Input Style |
| min_length? | integer | Minimum input length; min 0, max 4000 |
| max_length? | integer | Maximum input length; min 1, max 4000 |
| required? | boolean | Whether this component is required to be filled (defaults to true) |
| value? | string | Pre-filled value for this component; max 4000 characters |
| placeholder? | string | Custom placeholder text if the input is empty; max 100 characters |
label field on a Text Input is deprecated in favor of label and description on the Label component.| Name | Value | Description |
|---|---|---|
| Short | 1 | Single-line input |
| Paragraph | 2 | Multi-line input |
| Field | Type | Description |
|---|---|---|
| type | integer | 4 for a Text Input |
| id | integer | Unique identifier for the component |
| custom_id | string | Developer-defined identifier; 1–100 characters |
| value | string | The user’s input text |
Modal Example
Modal create payload with a Text Input component
Modal Example
Modal create payload with a Text Input component
Modal Submit Interaction Data Example
When a user submits a modal containing a Text Input
Modal Submit Interaction Data Example
When a user submits a modal containing a Text Input
User Select
A User Select is an interactive component that allows users to select one or more users in a message or modal. Options are automatically populated based on the server’s available users. User Selects must be placed inside an Action Row in messages and a Label in modals. User Select Structure| Field | Type | Description |
|---|---|---|
| type | integer | 5 for user select |
| id? | integer | Optional identifier for component |
| custom_id | string | ID for the select menu; 1–100 characters |
| placeholder? | string | Placeholder text if nothing is selected; max 150 characters |
| default_values? | array | List of default values; count must be within min_values/max_values range |
| min_values?* | integer | Minimum number of items that must be chosen (defaults to 1); min 0, max 25 |
| max_values? | integer | Maximum number of items that can be chosen (defaults to 1); max 25 |
| required?** | boolean | Whether the user select is required in a modal (defaults to true) |
| disabled?*** | boolean | Whether select menu is disabled in a message (defaults to false) |
| Field | Type | Description |
|---|---|---|
| id | snowflake | ID of a user, role, or channel |
| type | string | Type of value — "user", "role", or "channel" |
Message Example
Message create payload with a User Select component
Message Example
Message create payload with a User Select component
Modal Example
Modal create payload with a User Select component
Modal Example
Modal create payload with a User Select component
Role Select
A Role Select is an interactive component that allows users to select one or more roles. Options are automatically populated based on the server’s available roles. Role Selects must be placed inside an Action Row in messages and a Label in modals. Role Select Structure| Field | Type | Description |
|---|---|---|
| type | integer | 6 for role select |
| id? | integer | Optional identifier for component |
| custom_id | string | ID for the select menu; 1–100 characters |
| placeholder? | string | Placeholder text if nothing is selected; max 150 characters |
| default_values? | array | List of default values |
| min_values?* | integer | Minimum number of items that must be chosen (defaults to 1); min 0, max 25 |
| max_values? | integer | Maximum number of items that can be chosen (defaults to 1); max 25 |
| required?** | boolean | Whether the role select is required in a modal (defaults to true) |
| disabled?*** | boolean | Whether select menu is disabled in a message (defaults to false) |
Message Example
Message create payload with a Role Select component
Message Example
Message create payload with a Role Select component
Modal Example
Modal create payload with a Role Select component
Modal Example
Modal create payload with a Role Select component
Mentionable Select
A Mentionable Select is an interactive component that allows users to select one or more mentionables (users and roles) in a message or modal. Options are automatically populated based on available mentionables in the server. Mentionable Selects must be placed inside an Action Row in messages and a Label in modals. Mentionable Select Structure| Field | Type | Description |
|---|---|---|
| type | integer | 7 for mentionable select |
| id? | integer | Optional identifier for component |
| custom_id | string | ID for the select menu; 1–100 characters |
| placeholder? | string | Placeholder text if nothing is selected; max 150 characters |
| default_values? | array | List of default values |
| min_values?* | integer | Minimum number of items that must be chosen (defaults to 1); min 0, max 25 |
| max_values? | integer | Maximum number of items that can be chosen (defaults to 1); max 25 |
| required?** | boolean | Whether the mentionable select is required in a modal (defaults to true) |
| disabled?*** | boolean | Whether select menu is disabled in a message (defaults to false) |
Message Example
Message create payload with a Mentionable Select component
Message Example
Message create payload with a Mentionable Select component
Modal Example
Modal create payload with a Mentionable Select component
Modal Example
Modal create payload with a Mentionable Select component
Channel Select
A Channel Select is an interactive component that allows users to select one or more channels. Options are automatically populated based on available channels in the server and can be filtered by channel type. Channel Selects must be placed inside an Action Row in messages and a Label in modals. Channel Select Structure| Field | Type | Description |
|---|---|---|
| type | integer | 8 for channel select |
| id? | integer | Optional identifier for component |
| custom_id | string | ID for the select menu; 1–100 characters |
| channel_types? | array | List of channel types to include in the select |
| placeholder? | string | Placeholder text if nothing is selected; max 150 characters |
| default_values? | array | List of default values |
| min_values?* | integer | Minimum number of items that must be chosen (defaults to 1); min 0, max 25 |
| max_values? | integer | Maximum number of items that can be chosen (defaults to 1); max 25 |
| required?** | boolean | Whether the channel select is required in a modal (defaults to true) |
| disabled?*** | boolean | Whether select menu is disabled in a message (defaults to false) |
Message Example
Message create payload with a Channel Select component
Message Example
Message create payload with a Channel Select component
Modal Example
Modal create payload with a Channel Select component
Modal Example
Modal create payload with a Channel Select component
Section
A Section is a top-level layout component that allows you to contextually associate content with an accessory component. The typical use-case is to associate Text Display content with an accessory. Sections are currently only available in messages.1 << 15 (IS_COMPONENTS_V2).| Field | Type | Description |
|---|---|---|
| type | integer | 9 for section component |
| id? | integer | Optional identifier for component |
| components | array | 1–3 child components representing the content of the section |
| accessory | component | A component contextually associated to the section content |
Message Example
Message create payload with a Section and Thumbnail component
Message Example
Message create payload with a Section and Thumbnail component
Text Display
A Text Display is a content component that allows you to add markdown-formatted text, including mentions (users, roles, etc.) and emojis. Its behavior is similar to thecontent field of a message, but you can add multiple Text Display components to control the layout of your message.
Pingable mentions in a Text Display will ping and send notifications based on the allowed mentions object in message.allowed_mentions.
1 << 15 (IS_COMPONENTS_V2).| Field | Type | Description |
|---|---|---|
| type | integer | 10 for text display |
| id? | integer | Optional identifier for component |
| content | string | Text that will be displayed similar to a message |
Message Example
Message create payload with a Text Display component
Message Example
Message create payload with a Text Display component
Modal Example
Modal create payload with a Text Display component
Modal Example
Modal create payload with a Text Display component
Thumbnail
A Thumbnail is a content component that displays visual media in a small form-factor, intended as an accessory to other content. It is primarily usable with Sections. Media is defined by the Unfurled Media Item structure, which supports both uploaded and external media. Thumbnails are only available in messages as an accessory within a Section. They support images including animated formats like GIF and WebP. Videos are not currently supported.1 << 15 (IS_COMPONENTS_V2).| Field | Type | Description |
|---|---|---|
| type | integer | 11 for thumbnail component |
| id? | integer | Optional identifier for component |
| media | unfurled media item | A URL or attachment provided as an Unfurled Media Item |
| description? | string | Alt text for the media; max 1024 characters |
| spoiler? | boolean | Whether the thumbnail should be blurred out (defaults to false) |
Media Gallery
A Media Gallery is a top-level content component that allows you to display 1–10 media attachments in an organized gallery format. Each item can have optional descriptions and can be marked as spoilers. Media Galleries are only available in messages.1 << 15 (IS_COMPONENTS_V2).| Field | Type | Description |
|---|---|---|
| type | integer | 12 for media gallery component |
| id? | integer | Optional identifier for component |
| items | array | 1–10 media gallery items |
| Field | Type | Description |
|---|---|---|
| media | unfurled media item | A URL or attachment provided as an Unfurled Media Item |
| description? | string | Alt text for the media; max 1024 characters |
| spoiler? | boolean | Whether the media should be blurred out (defaults to false) |
Message Example
Message create payload with a Media Gallery component
Message Example
Message create payload with a Media Gallery component
File
A File is a top-level content component that allows you to display an uploaded file as an attachment to a message. Each File component can only display 1 attached file, but you can upload multiple files and reference them from different File components within your payload. Files are only available in messages.1 << 15 (IS_COMPONENTS_V2).| Field | Type | Description |
|---|---|---|
| type | integer | 13 for a file component |
| id? | integer | Optional identifier for component |
| file | unfurled media item | Supports only attachment://<filename> syntax |
| spoiler? | boolean | Whether the media should be blurred out (defaults to false) |
| name? | string | Name of the file — ignored in requests, provided by API in responses |
| size? | integer | Size of the file in bytes — ignored in requests, provided by API in responses |
Message Example
Message create payload with a File component
Message Example
Message create payload with a File component
Separator
A Separator is a top-level layout component that adds vertical padding and visual division between other components. Separators are only available in messages.1 << 15 (IS_COMPONENTS_V2).| Field | Type | Description |
|---|---|---|
| type | integer | 14 for separator component |
| id? | integer | Optional identifier for component |
| divider? | boolean | Whether a visual divider line should be displayed (defaults to true) |
| spacing? | integer | Size of separator padding — 1 for small, 2 for large (defaults to 1) |
Message Example
Message create payload with a Separator component
Message Example
Message create payload with a Separator component
Container
A Container is a top-level layout component that visually encapsulates a collection of components with an optional customizable accent color bar. Containers are only available in messages.1 << 15 (IS_COMPONENTS_V2).| Field | Type | Description |
|---|---|---|
| type | integer | 17 for container component |
| id? | integer | Optional identifier for component |
| components | array | Child components encapsulated within the Container |
| accent_color? | integer | Color for the accent bar as RGB from 0x000000 to 0xFFFFFF |
| spoiler? | boolean | Whether the container should be blurred out (defaults to false) |
Message Example
Message create payload with a Container component
Message Example
Message create payload with a Container component
Label
A Label is a top-level layout component for modals. It wraps interactive modal components with a text label and an optional description.description may display above or below the component depending on the platform.| Field | Type | Description |
|---|---|---|
| type | integer | 18 for a label |
| id? | integer | Optional identifier for component |
| label | string | The label text; max 45 characters |
| description? | string | An optional description text; max 100 characters |
| component | component | The component within the label |
Modal Example
Modal create payload with a Label component wrapping a Text Input
Modal Example
Modal create payload with a Label component wrapping a Text Input
File Upload
File Upload is an interactive component that allows users to upload files in modals. It supports configuring minimum and maximum file counts (0–10) and arequired flag for submission. The maximum file size a user can upload is based on their upload limit in that channel.
File Uploads are only available in modals and must be placed inside a Label.
File Upload Structure
| Field | Type | Description |
|---|---|---|
| type | integer | 19 for file upload |
| id? | integer | Optional identifier for component |
| custom_id | string | ID for the file upload; 1–100 characters |
| min_values?* | integer | Minimum number of files that must be uploaded (defaults to 1); min 0, max 10 |
| max_values? | integer | Maximum number of files that can be uploaded (defaults to 1); max 10 |
| required? | boolean | Whether files are required before submitting the modal (defaults to true) |
| Field | Type | Description |
|---|---|---|
| type | integer | 19 for a File Upload |
| id | integer | Unique identifier for the component |
| custom_id | string | Developer-defined identifier; 1–100 characters |
| values | array of snowflakes | IDs of the uploaded files in the resolved data |
Modal Example
Modal create payload with a File Upload component
Modal Example
Modal create payload with a File Upload component
Modal Submit Interaction Data Example
When a user submits a modal containing a File Upload
Modal Submit Interaction Data Example
When a user submits a modal containing a File Upload
Radio Group
A Radio Group is an interactive component for selecting exactly one option from a defined list. Radio Groups are available in modals and must be placed inside a Label. Radio Group Structure| Field | Type | Description |
|---|---|---|
| type | integer | 21 for radio group |
| id? | integer | Optional identifier for component |
| custom_id | string | Developer-defined identifier; 1–100 characters |
| options | array | List of options to show; min 2, max 10 |
| required? | boolean | Whether a selection is required to submit the modal (defaults to true) |
| Field | Type | Description |
|---|---|---|
| value | string | Dev-defined value of the option; max 100 characters |
| label | string | User-facing label of the option; max 100 characters |
| description? | string | Optional description for the option; max 100 characters |
| default? | boolean | Shows the option as selected by default |
| Field | Type | Description |
|---|---|---|
| type | integer | 21 for a Radio Group |
| id | integer | Unique identifier for the component |
| custom_id | string | Developer-defined identifier; 1–100 characters |
| value | ?string | The value of the selected option, or null if none selected |
Modal Example
Modal create payload with a Radio Group component
Modal Example
Modal create payload with a Radio Group component
Modal Submit Interaction Data Example
When a user submits a modal containing a Radio Group
Modal Submit Interaction Data Example
When a user submits a modal containing a Radio Group
Checkbox Group
A Checkbox Group is an interactive component for selecting one or many options via checkboxes. Checkbox Groups are available in modals and must be placed inside a Label. Checkbox Group Structure| Field | Type | Description |
|---|---|---|
| type | integer | 22 for checkbox group |
| id? | integer | Optional identifier for component |
| custom_id | string | Developer-defined identifier; 1–100 characters |
| options | array | List of options to show; min 1, max 10 |
| min_values?* | integer | Minimum number of items that must be chosen; min 0, max 10 (defaults to 1) |
| max_values? | integer | Maximum number of items that can be chosen; min 1, max 10 (defaults to number of options) |
| required? | boolean | Whether selecting within the group is required (defaults to true) |
| Field | Type | Description |
|---|---|---|
| value | string | Dev-defined value of the option; max 100 characters |
| label | string | User-facing label of the option; max 100 characters |
| description? | string | Optional description for the option; max 100 characters |
| default? | boolean | Shows the option as selected by default |
| Field | Type | Description |
|---|---|---|
| type | integer | 22 for a Checkbox Group |
| id | integer | Unique identifier for the component |
| custom_id | string | Developer-defined identifier; 1–100 characters |
| values | array of strings | The values of the selected options, or [] if none selected |
Modal Example
Modal create payload with a Checkbox Group component
Modal Example
Modal create payload with a Checkbox Group component
Modal Submit Interaction Data Example
When a user submits a modal containing a Checkbox Group
Modal Submit Interaction Data Example
When a user submits a modal containing a Checkbox Group
Checkbox
A Checkbox is a single interactive component for simple yes/no style questions. Checkboxes are available in modals and must be placed inside a Label. Checkbox Structure| Field | Type | Description |
|---|---|---|
| type | integer | 23 for checkbox |
| id? | integer | Optional identifier for component |
| custom_id | string | Developer-defined identifier; 1–100 characters |
| default? | boolean | Whether the checkbox is selected by default |
| Field | Type | Description |
|---|---|---|
| type | integer | 23 for a Checkbox |
| id | integer | Unique identifier for the component |
| custom_id | string | Developer-defined identifier; 1–100 characters |
| value | boolean | The state of the checkbox (true if checked, false if unchecked) |
Modal Example
Modal create payload with a Checkbox component
Modal Example
Modal create payload with a Checkbox component
Modal Submit Interaction Data Example
When a user submits a modal containing a Checkbox
Modal Submit Interaction Data Example
When a user submits a modal containing a Checkbox
Unfurled Media Item
An Unfurled Media Item is a piece of media, represented by a URL, used within a component. It can be constructed via uploading media to Discord or by referencing external media via a direct link to the asset.url field is settable by developers when making requests. All other fields are automatically populated by Discord.| Field | Type | Description |
|---|---|---|
| url | string | Supports arbitrary URLs and attachment://<filename> references |
| proxy_url? | string | The proxied URL — provided by the API in responses |
| height? | integer | The height of the media item — provided by the API in responses |
| width? | integer | The width of the media item — provided by the API in responses |
| content_type? | string | The media type of the content — provided by the API in responses |
| attachment_id?* | snowflake | The ID of the uploaded attachment — provided by the API in responses |
Uploading a File
To upload a file with your message, send your payload asmultipart/form-data (rather than application/json) and include your file with a valid filename. Details and examples can be found in the API Reference.
Legacy Message Component Behavior
Before the introduction of theIS_COMPONENTS_V2 flag, message components were sent in conjunction with message content. You could send a message using a subset of available components without setting the flag, and components would be included alongside content and embeds.
Components in legacy messages will contain an id of 0.
Apps using legacy behavior will continue to work as expected, but using the IS_COMPONENTS_V2 flag is recommended for new apps and features as it offers more options for layout and customization.