Threads
A thread is a channel inside a guild text, announcement, forum, or media channel that holds its own messages. A public thread or an announcement thread is visible to everyone who can view its parent. A private thread is visible to its members and to thread moderators.
Thread members defines joining, leaving, and member lists. Forums defines forum and media channels, where every thread is a post.
List active guild threads returns 404 NOT_FOUND to every user. Modify thread and Delete thread return 404 UNKNOWN_CHANNEL to a user without the capability.
Thread object
Section titled “Thread object”A thread is a channel object with the thread fields below.
Structure
Section titled “Structure”| Field | Type | Description |
|---|---|---|
| id1 | snowflake | The ID of the thread |
| type | integer | The thread type |
| guild_id | snowflake | The ID of the guild |
| parent_id | snowflake | The ID of the text, announcement, forum, or media channel the thread belongs to |
| owner_id | snowflake | The ID of the user or webhook that created the thread |
| name | string | The name of the thread (1-100 characters) |
| last_message_id | ?snowflake | The ID of the most recent message, or null when the thread has none |
| last_pin_timestamp | ?ISO8601 timestamp | The time a message was most recently pinned, or null when nothing has ever been pinned |
| rate_limit_per_user | integer | The slowmode interval in seconds (0-21,600) |
| flags2 | integer | The channel flags of the thread |
| thread_metadata | thread metadata object | The archive and lock state of the thread |
| message_count3 | integer | The number of messages in the thread |
| total_message_sent4 | integer | The number of messages ever sent in the thread |
| member_count | integer | The number of thread members, capped at 50 |
| applied_tags?5 | array[snowflake] | The IDs of the forum tags applied to a post (max 5) |
| member_ids_preview?5 | array[snowflake] | The IDs of the most recently joined members of a post, newest first (max 8) |
| member?6 | thread member object | The thread member object of the caller |
1 A thread started from a message has the ID of that message. The first message of a forum post has the ID of the post
2 Only PINNED is ever set, and only on a forum or media post
3 Excludes the first message of a forum post and every deleted message
4 Excludes the first message of a forum post. Deleting a message does not lower it
5 Present only on a thread whose parent is a forum or media channel. A Gateway payload has no member_ids_preview
6 Present only when the caller is a member, on Get channel, on Modify channel, on thread of a message, on Thread Create, and on the threads list of a guild in Ready, Guild Create, and Guild Sync
The schema also declares topic, url, icon, position, bitrate, user_limit, voice_connection_limit, rtc_region, permission_overwrites, recipients, nsfw, nsfw_override, content_warning_level, content_warning_text, nicks, default_auto_archive_duration, default_thread_rate_limit_per_user, available_tags, default_reaction_emoji, default_sort_order, default_forum_layout, and default_tag_setting. Fluxer never sends them on a thread. A thread uses the permissions of its parent as Thread permissions describes. An age restriction and a content warning resolve through the parent, then the parent category, and finally the guild.
Example
Section titled “Example”{ "id": "1501320100000000000", "type": 11, "guild_id": "1501314428688990000", "parent_id": "1501314428688998182", "owner_id": "1501314428688992222", "name": "Release checklist", "last_message_id": "1501320500000000000", "last_pin_timestamp": null, "rate_limit_per_user": 0, "flags": 0, "thread_metadata": { "archived": false, "auto_archive_duration": 4320, "archive_timestamp": "2026-05-05T20:30:05.018Z", "locked": false, "create_timestamp": "2026-05-05T20:30:05.018Z" }, "message_count": 12, "total_message_sent": 14, "member_count": 3}Thread metadata object
Section titled “Thread metadata object”The archive and lock state of a thread.
Structure
Section titled “Structure”| Field | Type | Description |
|---|---|---|
| archived | boolean | Whether the thread is archived |
| auto_archive_duration | integer | The auto archive duration in minutes |
| archive_timestamp1 | ISO8601 timestamp | The time the thread was last archived, unarchived, or given a new auto archive duration |
| locked | boolean | Whether only thread moderators can act in the thread |
| invitable?2 | boolean | Whether a member who is not a thread moderator can add members who are not thread moderators |
| create_timestamp | ISO8601 timestamp | The time the thread was created |
1 Equal to create_timestamp until the first of those changes
2 Present only on a private thread
Thread types
Section titled “Thread types”| Value | Name | Description |
|---|---|---|
| 10 | ANNOUNCEMENT_THREAD | A thread in an announcement channel, visible to everyone who can view the parent |
| 11 | PUBLIC_THREAD | A thread visible to everyone who can view the parent |
| 12 | PRIVATE_THREAD | A thread in a guild text channel visible to its members and to thread moderators |
A forum or media post is always PUBLIC_THREAD. Every thread in an announcement channel is ANNOUNCEMENT_THREAD, and an announcement channel holds no private threads.
Converting a guild text channel into an announcement channel turns each of its public threads into an announcement thread. Converting it back turns them into public threads again. Fluxer emits Thread Update with the new type for each active thread. A guild text channel with a private thread cannot become an announcement channel, and the request returns 400 CHANNEL_HAS_THREADS.
A message in an announcement thread cannot be published to following channels. Publishing returns 400 ANNOUNCEMENT_CHANNEL_REQUIRED. Publishing the message a thread started from works as for any other announcement. A copy delivered to a following channel starts with neither HAS_THREAD nor thread.
Auto archive durations
Section titled “Auto archive durations”| Value | Description |
|---|---|
| 60 | One hour |
| 1440 | One day |
| 4320 | Three days, the default |
| 10080 | One week |
A create request that omits auto_archive_duration gets 4320. Fluxer does not apply the default_auto_archive_duration of the parent.
Thread lifecycle
Section titled “Thread lifecycle”Fluxer archives an active thread once auto_archive_duration minutes pass after the later of its last message and its archive_timestamp. It then emits Thread Update. A pinned forum post is never archived automatically. Archiving a pinned post clears its PINNED flag.
A guild holds at most 1,000 active threads. Creating or unarchiving a thread past that count returns 400 MAX_ACTIVE_THREADS.
Sending a message to an archived thread unarchives it. Fluxer emits Thread Update before the message. A locked thread returns 400 THREAD_LOCKED to a caller who is not a thread moderator for a message, a reaction, a pin, an edit, a join, or an added member.
An archived thread accepts no reaction, pin, edit, join, leave, or member change, and each returns 400 THREAD_ARCHIVED. Deleting a message in an archived thread is allowed.
Thread moderators
Section titled “Thread moderators”A thread moderator is the guild owner, a member with ADMINISTRATOR, or a member holding MANAGE_THREADS in the parent who is not timed out.
Thread permissions
Section titled “Thread permissions”A thread has no permission overwrites of its own. Fluxer computes permissions in the parent channel and then replaces SEND_MESSAGES with SEND_MESSAGES_IN_THREADS. Posting in a forum or media channel itself uses the unreplaced SEND_MESSAGES of that channel.
Permissions lists the four thread bits, MANAGE_THREADS, CREATE_PUBLIC_THREADS, CREATE_PRIVATE_THREADS, and SEND_MESSAGES_IN_THREADS. MANAGE_THREADS is an elevated permission. ADMINISTRATOR grants all four bits. The four bits are feature-gated.
These actions need an enrolled authenticator while the guild MFA level is elevated, unless the caller owns the guild. Without one, each returns 400 TWO_FACTOR_REQUIRED.
- Delete thread.
- Modify thread with a change to
locked,rate_limit_per_user, orflagsthat needs a thread moderator, or with unarchiving a locked thread. - Modify thread with a change to
name,auto_archive_duration, orinvitable, or with archiving, by a caller who is not the thread owner. - Join thread, Add thread member, and Remove thread member in the cases those entries state.
A timed-out member can read a thread and can join or leave one. A timed-out member who is neither the guild owner nor an administrator receives 403 COMMUNICATION_DISABLED for starting, modifying, or deleting a thread. The same applies to adding or removing a thread member, sending a message, adding a reaction, pinning, and editing their own message in a thread.
A caller who can view the parent but is neither a member nor a thread moderator receives 403 MISSING_ACCESS for a private thread. Losing access to the parent keeps the membership, and the member receives no event from the thread until access returns.
Start thread from message
Section titled “Start thread from message”POST/v1/channels/{channel_id}/messages/{message_id}/threadsStarts a public thread from a message in a guild text channel, or an announcement thread from a message in an announcement channel. Requires CREATE_PUBLIC_THREADS and READ_MESSAGE_HISTORY. Returns a thread object on success. Emits a Thread Create Gateway event.
Limitations
Section titled “Limitations”- The channel must be a guild text or announcement channel.
- The message must be a default message or a reply.
- A message starts at most one thread.
Path parameters
Section titled “Path parameters”| Field | Type | Description |
|---|---|---|
| channel_id | snowflake | The ID of the guild text or announcement channel |
| message_id | snowflake | The ID of the message to start the thread from |
JSON body
Section titled “JSON body”| Field | Type | Description |
|---|---|---|
| name | string | The name of the thread (1-100 characters) |
| auto_archive_duration? | integer | The auto archive duration in minutes (default 4320) |
| rate_limit_per_user? | integer | The slowmode interval in seconds (0-21,600) |
| location? | string | A value Fluxer accepts and ignores (max 100 characters) |
rate_limit_per_user defaults to the default_thread_rate_limit_per_user of the parent, or 0 when the parent has none.
Response
Section titled “Response”| Status | Body | Condition |
|---|---|---|
| 201 | thread object | Thread was started |
| 400 | error response | Channel is not a guild text or announcement channel and the request returns INVALID_CHANNEL_TYPE |
| 400 | error response | Message is a system message and the request returns CANNOT_MODIFY_SYSTEM_WEBHOOK |
| 400 | error response | Message already started a thread and the request returns THREAD_ALREADY_CREATED_FOR_MESSAGE |
| 400 | error response | Guild has 1,000 active threads and the request returns MAX_ACTIVE_THREADS |
| 400 | error response | Parent slowmode denies the thread and the request returns SLOWMODE_RATE_LIMITED |
| 403 | error response | Caller lacks a required permission and the request returns MISSING_PERMISSIONS |
| 403 | error response | Caller is timed out and the request returns COMMUNICATION_DISABLED |
| 403 | error response | Caller account is limited and the request returns ACCOUNT_LIMITED |
| 403 | error response | The resolved age restriction is not satisfied and the request returns NSFW_CONTENT_AGE_RESTRICTED |
| 404 | error response | Channel does not exist or is outside a guild, and the request returns NOT_FOUND |
| 404 | error response | Message does not exist and the request returns UNKNOWN_MESSAGE |
Side effects
Section titled “Side effects”- Fluxer sets
HAS_THREADon the message and emits Message Update withthread. - Fluxer emits Message Create for the
THREAD_STARTER_MESSAGEof the thread. - A source message outside the five most recent messages of the parent also produces a
THREAD_CREATEDmessage in the parent. - The caller becomes the first thread member.
Starting a thread uses the parent slowmode on its own counter. A bot and a member holding BYPASS_SLOWMODE are exempt.
Rate limit
Section titled “Rate limit”10 requests per 10 seconds for each authenticated user and channel ID, on the channel:thread:create::channel_id bucket.
Start thread
Section titled “Start thread”POST/v1/channels/{channel_id}/threadsStarts a thread with no source message, or creates a post in a forum or media channel. Returns a thread object, or a forum post object for a post, on success. Emits a Thread Create Gateway event.
Limitations
Section titled “Limitations”- In a guild text channel, a public thread requires
CREATE_PUBLIC_THREADSand a private thread requiresCREATE_PRIVATE_THREADS. - In an announcement channel, a thread requires
CREATE_PUBLIC_THREADS. BothANNOUNCEMENT_THREADandPUBLIC_THREADstart an announcement thread, andPRIVATE_THREADreturns 400INVALID_CHANNEL_TYPE. - In a guild text channel,
ANNOUNCEMENT_THREADreturns 400INVALID_CHANNEL_TYPE. - In a forum or media channel, a post requires
SEND_MESSAGESin that channel.
Path parameters
Section titled “Path parameters”| Field | Type | Description |
|---|---|---|
| channel_id | snowflake | The ID of the guild text, announcement, forum, or media channel |
JSON body
Section titled “JSON body”The parent type selects the body. Either body can be sent as multipart form data with the JSON in a payload_json part. A forum or media post can also attach files in files[n] parts, as Create message describes.
rate_limit_per_user defaults to the default_thread_rate_limit_per_user of the parent, or 0 when the parent has none.
Text and announcement channel body
Section titled “Text and announcement channel body”| Field | Type | Description |
|---|---|---|
| name | string | The name of the thread (1-100 characters) |
| type | integer | The thread type to start |
| auto_archive_duration? | integer | The auto archive duration in minutes (default 4320) |
| rate_limit_per_user? | integer | The slowmode interval in seconds (0-21,600) |
| invitable?1 | boolean | Whether a member who is not a thread moderator can add members who are not thread moderators (default true) |
| location? | string | A value Fluxer accepts and ignores (max 100 characters) |
1 Applies only to a private thread
Forum post body
Section titled “Forum post body”| Field | Type | Description |
|---|---|---|
| name | string | The name of the post (1-100 characters) |
| message | object | The first message, with the fields of Create message other than message_reference, nonce, tts, and favorite_meme_id |
| applied_tags?1 | array[snowflake] | The IDs of the forum tags to apply (max 5) |
| auto_archive_duration? | integer | The auto archive duration in minutes (default 4320) |
| rate_limit_per_user? | integer | The slowmode interval in seconds (0-21,600) |
| type?2 | integer | The thread type (11 only) |
| location? | string | A value Fluxer accepts and ignores (max 100 characters) |
1 Required when the channel has REQUIRE_TAG. A tag marked moderated needs a thread moderator
2 Any other value returns 400 INVALID_CHANNEL_TYPE
Response
Section titled “Response”| Status | Body | Condition |
|---|---|---|
| 201 | forum post object | Post was created in a forum or media channel |
| 201 | thread object | Thread was started in a guild text or announcement channel |
| 400 | error response | Channel cannot hold threads, or the thread type does not fit it, returning INVALID_CHANNEL_TYPE |
| 400 | error response | Guild has 1,000 active threads and the request returns MAX_ACTIVE_THREADS |
| 400 | error response | Parent slowmode denies the thread and the request returns SLOWMODE_RATE_LIMITED |
| 400 | error response | A forum post names no tag under REQUIRE_TAG and the request returns FORUM_TAG_REQUIRED |
| 400 | error response | A forum post names no tag, with REQUIRE_TAG and no unmoderated tag, returning NO_TAGS_AVAILABLE_TO_NON_MODERATORS |
| 403 | error response | Caller lacks a required permission or applies a moderated tag, returning MISSING_PERMISSIONS |
| 403 | error response | Caller is timed out and the request returns COMMUNICATION_DISABLED |
| 403 | error response | Caller account is limited and the request returns ACCOUNT_LIMITED |
| 403 | error response | The resolved age restriction is not satisfied and the request returns NSFW_CONTENT_AGE_RESTRICTED |
| 404 | error response | Channel does not exist or is outside a guild, and the request returns NOT_FOUND |
| 404 | error response | A tag does not exist and the request returns UNKNOWN_FORUM_TAG |
In a channel with REQUIRE_TAG and no unmoderated tag, a caller who is not a thread moderator receives NO_TAGS_AVAILABLE_TO_NON_MODERATORS, and a thread moderator receives FORUM_TAG_REQUIRED. Creating and modifying a forum states how a channel reaches that state.
Side effects
Section titled “Side effects”- A public thread in a guild text channel and an announcement thread post a
THREAD_CREATEDmessage in the parent. A private thread and a forum post have none. - The first message of a forum post has the ID of the post, and a failed first message deletes the post again.
- Creating a forum post marks the forum as read for a user caller.
- The caller becomes the first thread member.
Rate limit
Section titled “Rate limit”10 requests per 10 seconds for each authenticated user and channel ID, on the channel:thread:create::channel_id bucket.
Modify thread
Section titled “Modify thread”Modify channel on a thread takes the thread body below and returns the updated thread object. It emits a Thread Update Gateway event when a field changes.
Limitations
Section titled “Limitations”name,auto_archive_duration, and archiving need the thread owner or a thread moderator.lockedneeds a thread moderator, and the thread owner can set it to true.rate_limit_per_userandflagsneed a thread moderator.invitableneeds the thread owner or a thread moderator.- Unarchiving needs a thread member, the thread owner, or a thread moderator, and needs a thread moderator when the thread is locked.
- An archived thread accepts no other change unless the same body sets
archivedto false.
Thread body
Section titled “Thread body”| Field | Type | Description |
|---|---|---|
| name? | string | The name of the thread (1-100 characters) |
| archived?1 | ?boolean | Whether the thread is archived |
| auto_archive_duration? | integer | The auto archive duration in minutes |
| locked?1 | ?boolean | Whether only thread moderators can act in the thread |
| rate_limit_per_user?2 | ?integer | The slowmode interval in seconds (0-21,600) |
| flags?3 | integer | The channel flags of the thread |
| applied_tags?4 | array[snowflake] | The complete set of forum tag IDs (max 5) |
| invitable?5 | ?boolean | Whether a member who is not a thread moderator can add members who are not thread moderators |
1 Null leaves the value unchanged
2 Null sets 0
3 Only PINNED on a forum or media post. Any other bit returns 400 INVALID_FORM_BODY
4 Only on a forum or media post, and only by the thread owner or a thread moderator
5 Applies only to a private thread. Null leaves the value unchanged
On a public thread in a guild text channel applied_tags returns 400 INVALID_CHANNEL_TYPE. A private or announcement thread ignores it.
Pinning a second post in one forum returns 400 MAX_PINNED_THREADS_IN_FORUM. Changing auto_archive_duration resets archive_timestamp. Renaming a thread posts a CHANNEL_NAME_CHANGE message in it.
Response
Section titled “Response”| Status | Body | Condition |
|---|---|---|
| 200 | thread object | Thread was modified |
| 400 | error response | Thread is archived and the body changes another field, returning THREAD_ARCHIVED |
| 400 | error response | Thread is locked and the caller is not a thread moderator, returning THREAD_LOCKED |
| 400 | error response | Unarchiving would exceed 1,000 active threads and the request returns MAX_ACTIVE_THREADS |
| 400 | error response | Forum already has a pinned post and the request returns MAX_PINNED_THREADS_IN_FORUM |
| 400 | error response | flags sets a bit the thread cannot hold and the request returns INVALID_FORM_BODY |
| 400 | error response | applied_tags is set on a public thread in a guild text channel, returning INVALID_CHANNEL_TYPE |
| 400 | error response | applied_tags is empty under REQUIRE_TAG and the request returns FORUM_TAG_REQUIRED |
| 400 | error response | applied_tags is empty, with REQUIRE_TAG and no unmoderated tag, returning NO_TAGS_AVAILABLE_TO_NON_MODERATORS |
| 400 | error response | Caller needs an authenticator and the request returns TWO_FACTOR_REQUIRED |
| 403 | error response | Caller lacks the owner or moderator role the field needs and the request returns MISSING_PERMISSIONS |
| 403 | error response | Caller is timed out and the request returns COMMUNICATION_DISABLED |
| 404 | error response | A tag does not exist and the request returns UNKNOWN_FORUM_TAG |
In a channel with REQUIRE_TAG and no unmoderated tag, a caller who is not a thread moderator receives NO_TAGS_AVAILABLE_TO_NON_MODERATORS, and a thread moderator receives FORUM_TAG_REQUIRED. Creating and modifying a forum states how a channel reaches that state.
Rate limit
Section titled “Rate limit”Shared with Modify channel.
Delete thread
Section titled “Delete thread”Delete or leave channel on a thread deletes it with its messages, attachments, and memberships. It requires a thread moderator and emits a Thread Delete Gateway event.
Side effects
Section titled “Side effects”- The source message of a thread started from a message loses
HAS_THREAD, and Fluxer emits Message Update for it. - Fluxer removes the thread and its messages from search.
- The guild audit log records action type 112.
Rate limit
Section titled “Rate limit”Shared with Delete or leave channel.
List active guild threads
Section titled “List active guild threads”GET/v1/guilds/{guild_id}/threads/activeReturns every active thread in the guild that the bot can view, newest first. Requires a bot token.
A private thread is included when the bot is a member or a thread moderator in its parent.
Path parameters
Section titled “Path parameters”| Field | Type | Description |
|---|---|---|
| guild_id | snowflake | The ID of the guild |
Response body
Section titled “Response body”| Field | Type | Description |
|---|---|---|
| threads | array[thread object] | The active threads |
| members | array[thread member object] | A thread member object for each returned thread the bot joined |
Response
Section titled “Response”| Status | Body | Condition |
|---|---|---|
| 200 | active threads object | Threads were returned |
| 403 | error response | Bot is not a member of the guild and the request returns MISSING_PERMISSIONS |
| 404 | error response | Caller is a user, and the request returns NOT_FOUND |
| 404 | error response | Guild does not exist and the request returns UNKNOWN_GUILD |
Rate limit
Section titled “Rate limit”5 requests per 10 seconds for each authenticated user and guild ID, on the guild:threads:active::guild_id bucket.
List public archived threads
Section titled “List public archived threads”GET/v1/channels/{channel_id}/threads/archived/publicReturns the archived public threads of a guild text, announcement, forum, or media channel, most recently archived first. An announcement channel returns announcement threads. Requires READ_MESSAGE_HISTORY.
Path parameters
Section titled “Path parameters”| Field | Type | Description |
|---|---|---|
| channel_id | snowflake | The ID of the parent channel |
Query parameters
Section titled “Query parameters”| Field | Type | Description |
|---|---|---|
| before? | ISO8601 timestamp | Return threads archived before this time |
| limit? | integer | The maximum number of threads to return (2-100, default 50) |
Response body
Section titled “Response body”| Field | Type | Description |
|---|---|---|
| threads | array[thread object] | The archived threads |
| members | array[thread member object] | A thread member object for each returned thread the caller joined |
| has_more | boolean | Whether a later request can return more threads |
Response
Section titled “Response”| Status | Body | Condition |
|---|---|---|
| 200 | archived threads object | Threads were returned |
| 400 | error response | Channel is not a thread parent and the request returns INVALID_CHANNEL_TYPE |
| 403 | error response | Caller lacks READ_MESSAGE_HISTORY and the request returns MISSING_PERMISSIONS |
| 404 | error response | Channel does not exist or is outside a guild, and the request returns NOT_FOUND |
Rate limit
Section titled “Rate limit”20 requests per 10 seconds for each authenticated user and channel ID, on the channel:threads:archived:list::channel_id bucket.
List private archived threads
Section titled “List private archived threads”GET/v1/channels/{channel_id}/threads/archived/privateReturns the archived private threads of a guild text channel, most recently archived first. Requires READ_MESSAGE_HISTORY and a thread moderator.
An announcement, forum, or media channel returns 400 INVALID_CHANNEL_TYPE.
Path parameters
Section titled “Path parameters”| Field | Type | Description |
|---|---|---|
| channel_id | snowflake | The ID of the guild text channel |
Query parameters
Section titled “Query parameters”| Field | Type | Description |
|---|---|---|
| before? | ISO8601 timestamp | Return threads archived before this time |
| limit? | integer | The maximum number of threads to return (2-100, default 50) |
Response body
Section titled “Response body”| Field | Type | Description |
|---|---|---|
| threads | array[thread object] | The archived threads |
| members | array[thread member object] | A thread member object for each returned thread the caller joined |
| has_more | boolean | Whether a later request can return more threads |
Rate limit
Section titled “Rate limit”20 requests per 10 seconds for each authenticated user and channel ID, on the channel:threads:archived:list::channel_id bucket.
List joined private archived threads
Section titled “List joined private archived threads”GET/v1/channels/{channel_id}/users/@me/threads/archived/privateReturns the archived private threads of a guild text channel that the caller joined, newest first. Requires READ_MESSAGE_HISTORY.
Query parameters
Section titled “Query parameters”| Field | Type | Description |
|---|---|---|
| before? | snowflake | Return threads with an ID below this thread ID |
| limit? | integer | The maximum number of threads to return (2-100, default 50) |
An announcement, forum, or media channel returns 400 INVALID_CHANNEL_TYPE.
Response body
Section titled “Response body”| Field | Type | Description |
|---|---|---|
| threads | array[thread object] | The archived threads |
| members | array[thread member object] | A thread member object for each returned thread the caller joined |
| has_more | boolean | Whether a later request can return more threads |
Rate limit
Section titled “Rate limit”20 requests per 10 seconds for each authenticated user and channel ID, on the channel:threads:archived:list::channel_id bucket.
Search threads
Section titled “Search threads”GET/v1/channels/{channel_id}/threads/searchSearches the threads of a guild text, announcement, forum, or media channel by name and tag. Requires READ_MESSAGE_HISTORY.
A caller who is not a thread moderator finds public threads and the private threads they joined.
Query parameters
Section titled “Query parameters”| Field | Type | Description |
|---|---|---|
| name? | string | The text to match in thread names (max 100 characters) |
| tag?1 | array[snowflake] | The forum tag IDs to filter by, repeated once per tag (max 20) |
| tag_setting? | string | match_some or match_all, defaulting to the default_tag_setting of the channel |
| archived? | boolean | Whether to return only archived or only active threads (default both) |
| sort_by? | string | last_message_time, archive_time, relevance, or creation_time (default last_message_time) |
| sort_order? | string | asc or desc (default desc) |
| limit? | integer | The maximum number of threads to return (1-25, default 25) |
| offset? | integer | The number of threads to skip (0-9,975, default 0) |
| max_id? | snowflake | Return threads with an ID below this ID |
| min_id? | snowflake | Return threads with an ID above this ID |
| slop? | integer | A value Fluxer accepts and ignores (0-100, default 2) |
1 Fluxer drops a tag the channel does not have. Under match_all a dropped tag empties the result, and under match_some the result is empty when every tag is dropped
Response body
Section titled “Response body”| Field | Type | Description |
|---|---|---|
| threads | array[thread object] | The matching threads |
| members | array[thread member object] | A thread member object for each returned thread the caller joined |
| has_more | boolean | Whether a later request can return more threads |
| total_results | integer | The number of matching threads |
| first_messages?1 | array[message object] | The first message of each returned post |
1 Present only for a forum or media channel
A 202 response has the body below. A search in a guild whose index is not built yet queues the build.
| Field | Type | Description |
|---|---|---|
| code | string | Always SEARCH_INDEX_NOT_READY |
| message | string | A description of the response |
| documents_indexed | integer | Always 0 |
| retry_after | number | The seconds to wait before retrying, always 2 |
Response
Section titled “Response”| Status | Body | Condition |
|---|---|---|
| 200 | thread search object | Search completed |
| 202 | index not ready object | The guild thread index is being built |
| 400 | error response | Channel is not a thread parent and the request returns INVALID_CHANNEL_TYPE |
| 403 | error response | Caller lacks READ_MESSAGE_HISTORY and the request returns MISSING_PERMISSIONS |
| 403 | error response | Thread search is unavailable on the instance and the request returns FEATURE_TEMPORARILY_DISABLED |
| 403 | error response | The resolved age restriction is not satisfied and the request returns NSFW_CONTENT_AGE_RESTRICTED |
| 404 | error response | Channel does not exist or is outside a guild, and the request returns NOT_FOUND |
Rate limit
Section titled “Rate limit”20 requests per 10 seconds for each authenticated user and channel ID, on the channel:threads:search::channel_id bucket.
Thread messages
Section titled “Thread messages”| Value | Name | Description |
|---|---|---|
| 18 | THREAD_CREATED | System message in the parent that announces a new public or announcement thread |
| 21 | THREAD_STARTER_MESSAGE | First message of a thread started from a message, built on read and never stored |
message_reference.channel_id of a THREAD_CREATED message is the thread, and the reference names no message.
Fluxer builds a THREAD_STARTER_MESSAGE when it reads the thread and stores none. It has the ID of its thread and references the source message. Deleting it returns 403 MISSING_PERMISSIONS. When the source message is deleted, the thread stays and its referenced_message becomes null.
A message that started a thread has thread, the thread object, and the message flag HAS_THREAD (1 << 5). A role mention in a public or announcement thread adds the members of the role, up to 250 per message. A message gets FAILED_TO_MENTION_SOME_ROLES_IN_THREAD (1 << 8) when that limit or the thread member limit stops a role member from being added. Only Fluxer sets either flag.
Sending a message in a thread adds a user sender who has not joined it. A mentioned user who can view the parent is added too. A private thread that is not invitable adds mentioned users only when the sender is a thread moderator.
Thread fields on other objects
Section titled “Thread fields on other objects”| Object | Field | Description |
|---|---|---|
| Text or announcement channel | default_auto_archive_duration | The stored default auto archive duration, which Fluxer does not apply to a new thread |
| Text or announcement channel | default_thread_rate_limit_per_user | The slowmode interval in seconds new threads inherit |
| Read state | flags | The read state flags |
| Message search result | threads | The threads that contain a returned message |
| Message search result | members | A thread member object for each of those threads the caller joined |
| Guild audit log response | threads | The threads a returned thread action targets |
The guild audit log records thread creation, update, and deletion as action types 110, 111, and 112.
Client capability
Section titled “Client capability”A user request reaches a route with a route header on this page only with a session token and channel_threads in the X-Fluxer-Features header. Without both, Fluxer returns 404 NOT_FOUND before the rate limit and before the login check. An OAuth2 bearer token never has the capability. A request with no token gets the same 404. A bot token needs no declaration.
A channel_id that does not exist or names a channel outside a guild returns the same 404.
On other routes, a user request without the capability sees no threads. A route that resolves a thread, forum, or media channel by ID returns 404 UNKNOWN_CHANNEL unless its own entry states another result. Message lists drop THREAD_CREATED messages, and each message loses thread and both thread message flags.
A Gateway session reads the separate CHANNEL_THREADS session flag.