Skip to content
Fluxer API

Messages

A message is one post in a channel, with its text, attachments, embeds, stickers and reactions. Categories, link channels, forum channels and media channels don't have messages of their own.

A private channel returns 404 UNKNOWN_CHANNEL when you're not a recipient. A guild channel needs VIEW_CHANNEL, and in a thread you also need access to the parent and to a private thread, as Thread permissions describes.

In a guild channel without READ_MESSAGE_HISTORY, you only see messages created after the guild's message history cutoff, and nothing when the guild has no cutoff. In an age-restricted channel, the routes that read, send, edit or delete messages return 403 NSFW_CONTENT_AGE_RESTRICTED until the account passes the age check.

Routes that need MANAGE_MESSAGES also follow the guild's MFA level for elevated permissions.

FieldTypeDescription
idsnowflakeThe ID of the message
channel_idsnowflakeThe ID of the channel
author1partial user objectThe user who sent the message
webhook_id?snowflakeThe ID of the webhook that sent the message
typeintegerMessage type
flagsintegerMessage flags
contentstringThe text of the message, empty when it only has media
timestampISO8601 timestampWhen the message was created
edited_timestamp?ISO8601 timestampWhen the message was last edited
pinnedbooleanWhether the message is pinned
mention_everyonebooleanWhether the message mentions everyone
ttsbooleanWhether the create request asked for text-to-speech
mentionsarray[partial user object]The users the message mentions
mention_rolesarray[snowflake]The IDs of the roles the message mentions
mention_channels?array[channel mention object]The channels the content links to
users?2array[partial user object]Users referred to in the message who weren't mentioned
embedsarray[embed object]The embeds, empty while SUPPRESS_EMBEDS is set
attachmentsarray[message attachment object]The files attached to the message
stickersarray[sticker item object]The stickers sent with the message
reactions?array[reaction object]The reactions on the message
message_reference?message reference objectThe message this one replies to, forwards or copies
message_snapshots?array[message snapshot object]Copies of a forwarded message
nonce?3stringThe nonce from the create request
call?message call objectThe call a CALL message records
referenced_message?4?message objectThe message a reply points to
thread?thread objectThe thread started from this message

1 For a webhook message, Fluxer builds the author from the webhook, with bot set to true

2 A user is in mentions or in users, never both. Resolve the IDs in a snapshot's mentions against this array

3 Only in the create response and its Message Create event

4 Absent when the message isn't a reply, and null when the message it replies to is gone

{
"id": "1501320000000000000",
"channel_id": "1501314428688998182",
"author": {
"id": "1501314428688990000",
"username": "ada",
"discriminator": "0001",
"avatar": "a1b2c3d4e5f60718293a4b5c6d7e8f90"
},
"type": 0,
"flags": 0,
"content": "shipping it",
"timestamp": "2026-08-31T09:14:02.000Z",
"edited_timestamp": null,
"pinned": false,
"mention_everyone": false,
"tts": false,
"mentions": [],
"mention_roles": [],
"embeds": [],
"attachments": [],
"stickers": []
}
ValueNameDescription
0DEFAULTOrdinary message
1RECIPIENT_ADDSomeone was added to a group DM or thread
2RECIPIENT_REMOVESomeone was removed from a group DM or thread
3CALLA call in a private channel
4CHANNEL_NAME_CHANGEA group DM or thread was renamed
5CHANNEL_ICON_CHANGEA group DM icon was changed
6CHANNEL_PINNED_MESSAGEA message was pinned
7USER_JOINA member joined
12CHANNEL_FOLLOW_ADDThe channel started following an announcement channel
18THREAD_CREATEDA thread was created from the channel
19REPLYA reply to another message
21THREAD_STARTER_MESSAGEThe first message of a thread started from a message

You can only edit, pin or reply to DEFAULT and REPLY messages. Thread messages describes the thread types.

ValueNameDescription
1 << 0CROSSPOSTEDThe message was published to following channels
1 << 1IS_CROSSPOSTThe message is a copy from a followed announcement channel
1 << 2SUPPRESS_EMBEDSEmbeds are hidden
1 << 3SOURCE_MESSAGE_DELETEDThe published message this copy came from was deleted
1 << 5HAS_THREADA thread was started from this message
1 << 8FAILED_TO_MENTION_SOME_ROLES_IN_THREADSome members of a mentioned role weren't added to the thread
1 << 12SUPPRESS_NOTIFICATIONSThe message sends no mention notifications
1 << 13VOICE_MESSAGEThe message is a voice message

You can set SUPPRESS_EMBEDS, SUPPRESS_NOTIFICATIONS and VOICE_MESSAGE. Fluxer ignores any other bit you send and sets the rest itself.

FieldTypeDescription
idsnowflakeThe ID of the attachment
filenamestringThe filename
title?stringThe display title
description?stringThe alt text
content_typestringThe media type Fluxer detected
content_hash?stringThe hash of the file
sizeintegerThe size in bytes
url?stringThe signed URL, or null once the attachment has expired
proxy_url?stringThe same URL as url
width?integerThe width in pixels
height?integerThe height in pixels
placeholder?stringAn encoded placeholder image
flagsintegerAttachment flags
nsfw?booleanWhether media inspection marked the file as explicit
duration?integerThe audio or video length in seconds
waveform?stringThe base64 voice waveform
expires_at?ISO8601 timestampWhen the attachment expires, or null if it doesn't
expired?booleanPresent and true once the attachment has expired

When the instance has attachment URL secrets, Fluxer adds these query parameters to url and proxy_url.

FieldTypeDescription
exstringWhen the URL expires, as Unix seconds in 8 hex digits
isstringWhen the URL was issued, as Unix seconds in 8 hex digits
hmstringThe signature, as 64 hex digits
ucstringdp on a data package URL, absent otherwise

A URL is valid for 24 hours from is. Keep the four parameters as they are, and add others such as a transformation if you need them. When ex is less than an hour away, get a new URL from Refresh attachment URLs or fetch the message again. An expired or changed URL returns 404 from the Media Proxy.

A data harvest archive links each attachment with uc=dp and ex=0. These URLs don't expire and work until the instance removes the secret that signed them.

{
"id": "1501320000000000001",
"filename": "diagram.png",
"title": null,
"description": "Sequence diagram",
"content_type": "image/png",
"content_hash": "9f86d081884c7d659a2feaa0c55ad015",
"size": 18422,
"url": "https://media.example.com/attachments/1501314428688998182/1501320000000000001/diagram.png?ex=69fba4b5&is=69fa5335&hm=5586be3ae70411fe6582431649e2f28abc6c201e4f12a4f43a3256b72b90d3de",
"proxy_url": "https://media.example.com/attachments/1501314428688998182/1501320000000000001/diagram.png?ex=69fba4b5&is=69fa5335&hm=5586be3ae70411fe6582431649e2f28abc6c201e4f12a4f43a3256b72b90d3de",
"width": 1280,
"height": 720,
"flags": 0,
"expires_at": null
}
ValueNameDescription
1 << 3IS_SPOILERThe attachment is a spoiler
1 << 4CONTAINS_EXPLICIT_MEDIAThe attachment has explicit media
1 << 5IS_ANIMATEDThe attachment is animated
FieldTypeDescription
id?snowflakeThe ID of a custom emoji
namestringThe custom emoji name, or the Unicode emoji itself
animated?booleanWhether the custom emoji is animated
FieldTypeDescription
emojiemoji objectThe emoji
countintegerHow many users reacted with it
me?booleanPresent and true when you reacted with it

A message can have up to max_reactions_per_message different emoji (default 30), and each up to max_users_per_message_reaction users (default 1,000,000).

FieldTypeDescription
channel_idsnowflakeThe ID of the referenced channel
message_id?snowflakeThe ID of the referenced message
guild_id?snowflakeThe ID of the referenced guild
typeintegerMessage reference type
ValueNameDescription
0DEFAULTA reply, a published copy's source or a thread
1FORWARDA forward, with the content in message_snapshots
FieldTypeDescription
message_idsnowflakeThe ID of the message to reply to or forward
channel_id?snowflakeThe ID of its channel, required for a forward
guild_id?snowflakeThe ID of its guild
type?integerMessage reference type (default DEFAULT)
attachment_ids?array[snowflake]The attachments to forward (at most 10)
embed_indices?array[integer]The embeds to forward (at most 10)

A forward copies all the source's media unless you pick some with attachment_ids or embed_indices.

A snapshot is a copy of a forwarded message. It doesn't change when the source is edited or deleted.

FieldTypeDescription
content?stringThe text
timestampISO8601 timestampWhen the source was created
edited_timestamp?ISO8601 timestampWhen the source was last edited
mentions?array[snowflake]The IDs of mentioned users
mention_roles?array[snowflake]The IDs of mentioned roles
mention_channels?array[channel mention object]The mentioned channels
embeds?array[embed object]The embeds
attachments?array[message attachment object]The attachments
stickers?array[sticker item object]The stickers
typeintegerThe source's message type
flagsintegerThe source's message flags
FieldTypeDescription
participantsarray[snowflake]The IDs of the users in the call
ended_timestamp?ISO8601 timestampWhen the call ended, or null while it's ongoing
FieldTypeDescription
idsnowflakeThe ID of the channel
namestringThe channel name
typeintegerChannel type
FieldTypeDescription
idsnowflakeThe ID of the sticker
namestringThe sticker name
animatedbooleanWhether the sticker is animated

An embed is a link preview Fluxer builds, or a rich embed you send.

FieldTypeDescription
typestringEmbed type
title?stringThe title
description?stringThe description
url?stringThe link
timestamp?ISO8601 timestampThe timestamp
color?integerThe color
author?embed author objectThe author
provider?1embed provider objectThe site the link is from
thumbnail?embed media objectThe thumbnail
image?embed media objectThe main image
video?1embed media objectThe video
audio?1embed media objectThe audio
footer?embed footer objectThe footer
fields?array[embed field object]The fields
nsfw?booleanWhether the embed has explicit media
html?1stringSanitized oEmbed markup
html_width?1integerThe width of the oEmbed markup in pixels
html_height?1integerThe height of the oEmbed markup in pixels
children?1array[embed object]At most one nested embed

1 Only on link previews, and you can't send it

{
"type": "rich",
"title": "Release 2.4.0",
"url": "https://example.com/releases/2.4.0",
"color": 5793266,
"footer": {"text": "example.com"},
"fields": [{"name": "Platform", "value": "Desktop", "inline": true}]
}
ValueDescription
richA rich embed, and the type of every embed you send
linkA link preview with no media
imageAn image preview
videoA video preview
audioAn audio preview
gifvA looping video preview
articleAn article preview
blueskyA Bluesky post preview
FieldTypeDescription
namestringThe author name
url?stringThe author link
icon_url?stringThe icon URL
proxy_icon_url?stringThe icon URL through the Media Proxy
FieldTypeDescription
urlstringThe media URL
proxy_urlstringThe media URL through the Media Proxy
width?integerThe width in pixels
height?integerThe height in pixels
duration?integerThe length in seconds
description?stringThe alt text
content_type?stringThe media type
content_hash?stringThe content hash
placeholder?stringAn encoded placeholder image
flags?integerCONTAINS_EXPLICIT_MEDIA and IS_ANIMATED from attachment flags

Fluxer signs every embed URL that points to an attachment on this instance, the same way as attachment URLs.

FieldTypeDescription
textstringThe footer text
icon_url?stringThe icon URL
proxy_icon_url?stringThe icon URL through the Media Proxy
FieldTypeDescription
namestringThe field name
valuestringThe field value
inlinebooleanWhether the field shows inline
FieldTypeDescription
namestringThe provider name
url?stringThe provider URL

An allowed mentions object picks which mentions in the text notify anyone.

FieldTypeDescription
parse?1array[string]Allowed mention parse values
users?array[snowflake]The users who can be mentioned (at most 100)
roles?array[snowflake]The roles that can be mentioned (at most 100)
replied_user?booleanWhether a reply mentions the author of the message it replies to (default true)

1 Leaving out the whole object allows every value. Sending users or roles without parse allows none of them. You can't send parse together with users or roles

ValueDescription
usersUser mentions
rolesRole mentions
everyone@everyone and @here

Each entry in a message's attachments array is one of these.

FieldTypeDescription
idinteger | integer stringThe attachment's position
filenamestringThe filename
upload_filenamestringThe upload key from Request attachment upload URLs
file_sizeintegerThe size in bytes
content_typestringThe media type (1-255 characters)
title??stringThe display title (1-1,024 characters)
description??stringThe alt text (1-4,096 characters)
duration?1?integerThe voice message length in seconds
waveform?1?stringThe base64 voice waveform (1-4,096 characters)
flags?integerAttachment flags (default 0)

1 Required for a voice message

Direct multipart attachment metadata object

Section titled “Direct multipart attachment metadata object”
FieldTypeDescription
idinteger | integer stringThe index of the files[N] field
filenamestringThe filename
content_type?stringThe media type (1-255 characters)
title??stringThe display title (1-1,024 characters)
description??stringThe alt text (1-4,096 characters)
flags?integerAttachment flags (default 0)
duration?1?integerThe voice message length in seconds
waveform?1?stringThe base64 voice waveform (1-4,096 characters)

1 Required for a voice message

Use this in Modify message to keep an attachment and change its title or description. When you edit someone else's message, sending filename, duration or waveform returns INVALID_FORM_BODY with CANNOT_EDIT_ATTACHMENT_METADATA.

FieldTypeDescription
idsnowflake | integerThe ID of the attachment, or its position in the message
title??stringA new display title (1-1,024 characters)
description??stringNew alt text (1-4,096 characters)
flags?integerIgnored
filename?stringIgnored
duration??integerIgnored
waveform??stringIgnored

A message can have up to max_embeds_per_message embeds (default 10).

FieldTypeDescription
url??stringThe link (1-2,048 characters)
title??stringThe title (at most 256 characters)
color??integerThe color
timestamp??ISO8601 timestampThe timestamp
description??stringThe description (1-4,096 characters)
author??embed author input objectThe author
image??embed media input objectThe main image
thumbnail??embed media input objectThe thumbnail
footer??embed footer input objectThe footer
fields??array[embed field input object]The fields (at most 25)
FieldTypeDescription
namestringThe author name (1-256 characters)
url??stringThe author link (1-2,048 characters)
icon_url??stringThe icon URL (1-2,048 characters)
FieldTypeDescription
url1stringThe media URL (1-2,048 characters)
description??stringThe alt text (1-4,096 characters)

1 An http or https URL. In image and thumbnail, it can also be attachment://<filename> for a png, jpg, jpeg, webp or gif file in the same request

FieldTypeDescription
textstringThe footer text (1-2,048 characters)
icon_url??stringThe icon URL (1-2,048 characters)
FieldTypeDescription
namestringThe field name (1-256 characters)
valuestringThe field value (at most 1,024 characters)
inline?booleanWhether the field shows inline (default false)

To upload a file before you send the message:

  1. Get upload URLs from Request attachment upload URLs.
  2. PUT the file to upload_url, or each part to its own URL for a file over 10 MiB, then call Complete attachment upload.
  3. Send the upload_filename in a pre-uploaded attachment.

The upload only works for a message in the same channel, which in a forum or media channel is the first message of a post from Start thread.

FieldTypeDescription
idintegerYour position for the attachment (0-2,147,483,647)
filenamestringThe filename
file_sizeintegerThe size in bytes
content_typestringThe media type (1-255 characters)

Returned for a file of 10 MiB or less.

FieldTypeDescription
idintegerThe id from the request
filenamestringThe filename from the request
upload_filenamestringThe upload key to send with the message
file_sizeintegerThe size from the request
content_typestringThe media type Fluxer derived from filename
upload_modestringAlways singlepart
upload_urlstringThe URL to PUT the whole file to

Returned for a file over 10 MiB.

FieldTypeDescription
idintegerThe id from the request
filenamestringThe filename from the request
upload_filenamestringThe upload key to send with the message
file_sizeintegerThe size from the request
content_typestringThe media type Fluxer derived from filename
upload_modestringAlways multipart
upload_idstringThe ID of the multipart upload
part_sizeintegerThe size of every part except the last, in bytes
partsarray[attachment upload part object]The parts in order

Each part except the last must be exactly part_size bytes, and all parts together must add up to file_size.

FieldTypeDescription
part_numberintegerThe part number, starting at 1
upload_urlstringThe URL to PUT this part to
FieldTypeDescription
upload_filenamestringThe upload key
upload_idstringThe ID of the multipart upload
FieldTypeDescription
originalstringThe URL you sent
refreshedstringThe URL with a new signature

refreshed is the same as original when the URL isn't an attachment URL of this instance.

FieldTypeDescription
messagemessage objectThe pinned message, without referenced_message and reactions
pinned_atISO8601 timestampWhen the message was pinned
FieldTypeDescription
itemsarray[channel pin object]The pins, newest first
has_morebooleanWhether there are older pins

To get the next page, set before to the pinned_at of the last item. Skip messages you already have, because two pins can share a timestamp.

FieldTypeDescription
itemsarray[partial user object]The users, by ascending ID
has_morebooleanWhether there's another page
next_after?snowflakeThe after value for the next page
FieldTypeDescription
channel_idsnowflakeThe ID of the channel
limitintegerThe number of messages to return (1-50)
before?snowflakeGet messages before this message ID
after?snowflakeGet messages after this message ID
around?snowflakeGet messages around this message ID
FieldTypeDescription
channel_idsnowflakeThe ID of the channel
messagesarray[message object]The messages, newest first
FieldTypeDescription
guildcrosspost source guild objectThe guild the message was published from
FieldTypeDescription
idsnowflakeThe ID of the guild
namestringThe guild name
icon?stringThe guild icon hash
banner?stringThe guild banner hash
description?stringThe discovery description, or null when the guild isn't in discovery
featuresarray of stringsVERIFIED, PARTNERED and DISCOVERABLE from guild features
badge_idsarray[snowflake]The custom badges of the guild. Look them up with List guild badges
approximate_member_count?integerAbout how many members the guild has
approximate_presence_count?integerAbout how many members are online
discoverablebooleanWhether you can join through Join discovery guild
GET/v1/channels/{channel_id}/messagesBot

Returns messages from a channel, newest first. A page can have fewer than limit messages when some are older than your history cutoff.

FieldTypeDescription
limit?integerThe number of messages to return (1-100, default 50)
before?snowflakeGet messages before this message ID
after?snowflakeGet messages after this message ID
around?snowflakeGet messages around this message ID, ignoring before and after
StatusBodyCondition
200array[message object]The messages were returned
400error responseINVALID_CHANNEL_TYPE for a forum or media channel

The rate limit is 100 requests per 10 seconds, on the channel:messages:read::channel_id bucket.

POST/v1/channels/messages/bulk

Returns messages from up to 25 channels in one request. Each channel needs the same access as List channel messages, and one channel you can't see fails the whole request. Bots can't use this route.

FieldTypeDescription
requestsarray[bulk message request object]1-25 channels, with limit adding up to at most 250
FieldTypeDescription
channelsarray[bulk message channel object]One result for each request, in the same order
StatusBodyCondition
200response bodyThe messages were returned

The rate limit is 20 requests per 10 seconds, on the channel:messages:bulk_read bucket.

GET/v1/channels/{channel_id}/messages/{message_id}Bot

Returns one message, or 404 UNKNOWN_MESSAGE when it's older than your history cutoff.

StatusBodyCondition
200message objectThe message was returned

The rate limit is 100 requests per 10 seconds, on the channel:message:read::channel_id bucket.

POST/v1/channels/{channel_id}/attachmentsBot

Returns upload URLs for 1 to 10 files, as described in Attachment upload objects. In a guild channel you need SEND_MESSAGES and ATTACH_FILES.

Each file can be up to the max_attachment_file_size limit, which defaults to 524288000 bytes (500 MiB), or 26214400 bytes (25 MiB) without premium on an instance with premium tiers. Bots get at most 52428800 bytes (50 MiB).

FieldTypeDescription
attachmentsarray[attachment upload request item object]The files to upload (1-10)
FieldTypeDescription
attachmentsarray[singlepart or multipart attachment upload object]One upload for each file, in request order
StatusBodyCondition
200response bodyThe upload URLs were returned
400error responseFILE_SIZE_TOO_LARGE when a file is over the size limit
400error responseCANNOT_SEND_MESSAGES_IN_NON_TEXT_CHANNEL when the channel has no messages
403error responseCOMMUNICATION_DISABLED when you're timed out
403error responseFEATURE_TEMPORARILY_DISABLED when the instance has turned off uploads

The rate limit is 10 requests per 10 seconds, on the channel:attachment:upload::channel_id bucket.

POST/v1/channels/{channel_id}/attachments/completeBot

Finishes 1 to 10 multipart uploads after you've uploaded every part. If completion fails, Fluxer discards the upload and you have to start again.

FieldTypeDescription
uploadsarray[multipart upload completion item object]The uploads to finish (1-10)
FieldTypeDescription
uploadsarray[object]One object with upload_filename for each upload
StatusBodyCondition
200response bodyThe uploads were finished
400error responseINVALID_FORM_BODY with UPLOADED_ATTACHMENT_NOT_FOUND for an unknown upload
400error responseINVALID_FORM_BODY with NO_UPLOADED_PARTS_TO_FINALIZE when no part was uploaded
400error responseFILE_SIZE_TOO_LARGE when the uploaded file is over the size limit

The rate limit is 10 requests per 10 seconds, on the channel:attachment:upload::channel_id bucket.

POST/v1/attachments/refresh-urlsBot

Signs 1 to 50 attachment URLs again. A refreshed URL is valid until its ex, which is 12 to 24 hours away. Check ex on each URL, because it isn't always a full day. OAuth2 tokens can't use this route.

FieldTypeDescription
attachment_urlsarray[string]The URLs to sign (1-50, each at most 2,048 characters)
FieldTypeDescription
refreshed_urlsarray[refreshed attachment URL object]One result for each URL, in request order
StatusBodyCondition
200response bodyThe URLs were signed

The rate limit is 60 requests per 10 seconds, on the attachment:refresh_urls bucket.

POST/v1/channels/{channel_id}/messagesBot

Sends a message and returns it, and Fluxer sends Message Create. In a guild channel you need SEND_MESSAGES, or SEND_MESSAGES_IN_THREADS in a thread. Embeds need EMBED_LINKS, files need ATTACH_FILES and @everyone needs MENTION_EVERYONE.

A message needs text, an embed, an attachment, a meme or a sticker. Text can be up to the max_message_length limit, and bots and webhooks always get at least 4,000 characters.

FieldTypeDescription
nonce?1string | integerYour ID for the message (up to 32 characters, or a non-negative integer)
content??stringThe text
embeds?array[rich embed object]The embeds
attachments?array[pre-uploaded attachment object]The attachments (default limit 10)
message_reference??message reference input objectThe message to reply to or forward
allowed_mentions??allowed mentions objectWhich mentions notify anyone
flags?integerMessage flags (default 0)
favorite_meme_id??snowflakeA saved meme to attach
sticker_ids??array[snowflake]The stickers (at most 3)
tts?booleanWhether to use text-to-speech, which needs SEND_TTS_MESSAGES

1 Fluxer remembers a nonce for 5 minutes, and sending it again in the same channel returns the first message. Reuse the nonce when you retry a send. Reusing it in a different channel within that time returns 404 UNKNOWN_MESSAGE

A forward has only message_reference, with type 1 and channel_id.

Send files as multipart/form-data, with the JSON body in payload_json. In payload_json, attachments uses the direct multipart attachment metadata object.

FieldTypeDescription
payload_json?stringThe JSON body
files[N]?binaryA file, where N starts at 0
content?stringReplaces content in payload_json
nonce?stringReplaces nonce in payload_json
tts?stringReplaces tts in payload_json (true or false)
flags?stringReplaces flags in payload_json
favorite_meme_id?stringReplaces favorite_meme_id in payload_json
sticker_ids?stringReplaces sticker_ids in payload_json, once for each sticker

These field codes come back in a 400 INVALID_FORM_BODY.

ConditionField code
A files[N] index is over the attachment limitFILE_INDEX_EXCEEDS_MAXIMUM
Two fields use the same indexDUPLICATE_FILE_INDEX
There are more files than the attachment limitTOO_MANY_FILES
An attachments entry with a filename has no matching fileNO_FILE_FOR_ATTACHMENT_METADATA

A message with the VOICE_MESSAGE flag has one audio attachment with duration and waveform, and nothing else. It can be up to max_voice_message_duration seconds long (default 1200).

ConditionField code
The message has textVOICE_MESSAGES_CANNOT_HAVE_CONTENT
The message doesn't have exactly one attachmentVOICE_MESSAGES_REQUIRE_SINGLE_ATTACHMENT
The attachment has no waveformVOICE_MESSAGES_ATTACHMENT_WAVEFORM_REQUIRED
The attachment has no durationVOICE_MESSAGES_ATTACHMENT_DURATION_REQUIRED
The recording is too longVOICE_MESSAGES_DURATION_EXCEEDS_LIMIT
StatusBodyCondition
200message objectThe message was sent
400error responseCANNOT_SEND_EMPTY_MESSAGE when the message has nothing in it
400error responseCANNOT_SEND_MESSAGES_TO_USER when the recipient's DM settings block you
400error responseSLOWMODE_RATE_LIMITED with retry_after when slowmode is on
400error responseTHREAD_LOCKED or MAX_ACTIVE_THREADS in a thread
403error responseCOMMUNICATION_DISABLED when you're timed out
403error responseNEW_CONVERSATIONS_LIMITED when you can't start new DMs
403error responseACCOUNT_LIMITED when your account is limited
403error responseUNCLAIMED_ACCOUNT_CANNOT_SEND_MESSAGES outside personal notes

The rate limit is 20 requests per 10 seconds, on the channel:message:create::channel_id bucket.

PATCH/v1/channels/{channel_id}/messages/{message_id}Bot

Edits a message and returns it, and Fluxer sends Message Update. The author can change any field. Someone else with MANAGE_MESSAGES can only change SUPPRESS_EMBEDS and the title and alt text of existing attachments. The author of a published message can edit it 3 times in a row, then once every 20 minutes.

The body works like Create message, including multipart. Fields you leave out stay the same.

FieldTypeDescription
content??stringThe new text
embeds?1array[rich embed object]The embeds
allowed_mentions??allowed mentions objectWhich mentions notify anyone
flags?integerMessage flags
attachments?1array[pre-uploaded attachment object | existing attachment reference object]The attachments to keep and add
message_snapshots?arrayNot accepted, and returns 403 MISSING_PERMISSIONS

1 Replaces the whole list, so include every existing item you want to keep

StatusBodyCondition
200message objectThe message was edited
400error responseCANNOT_MODIFY_SYSTEM_WEBHOOK for a system message
400error responseINVALID_FORM_BODY with MESSAGES_WITH_SNAPSHOTS_CANNOT_BE_EDITED for a forwarded message
400error responseTHREAD_ARCHIVED or THREAD_LOCKED in a thread
403error responseCANNOT_EDIT_OTHER_USER_MESSAGE when you can't edit someone else's message
429error responsePUBLISHED_MESSAGE_EDIT_RATE_LIMITED for a published message

The rate limit is 20 requests per 10 seconds, on the channel:message:update::channel_id bucket.

POST/v1/channels/{channel_id}/messages/{message_id}/crosspostBot

Publishes a message in an announcement channel to every channel that follows it, and returns the message with the CROSSPOSTED flag. You need SEND_MESSAGES, and MANAGE_MESSAGES for someone else's message. Only a DEFAULT message that isn't a forward can be published, and only once. Announcement channels describes the copies.

Each announcement channel can publish 10 messages in a row, then one every 6 minutes.

StatusBodyCondition
200message objectThe message was published
400error responseANNOUNCEMENT_CHANNEL_REQUIRED for another channel type
400error responseMESSAGE_NOT_CROSSPOSTABLE for a message that can't be published
400error responseMESSAGE_ALREADY_CROSSPOSTED when it's already published
403error responseCONTENT_BLOCKED when the message matches an instance blocklist
429error responseMESSAGE_CROSSPOST_RATE_LIMITED when the channel has published too many

The rate limit is 5 requests per 5 seconds, on the channel:message:crosspost::channel_id bucket.

GET/v1/channels/{channel_id}/messages/{message_id}/crosspost-sourceBot

Returns the guild a published copy came from, for a message with IS_CROSSPOST or a CHANNEL_FOLLOW_ADD message. You don't need to be a member of that guild.

StatusBodyCondition
200crosspost source objectThe guild was returned
404error responseUNKNOWN_MESSAGE for any other message
404error responseUNKNOWN_GUILD when the guild was deleted

The rate limit is 20 requests per 10 seconds, on the channel:message:crosspost_source::channel_id bucket.

DELETE/v1/channels/{channel_id}/messages/ackBot

This route is deprecated, and it returns 204 without changing anything.

StatusBodyCondition
204emptyAlways

The rate limit is 40 requests per 10 seconds, on the channel:read_state:delete::channel_id bucket.

DELETE/v1/channels/{channel_id}/messages/{message_id}BotAudit reason

Deletes a message and its attachments, and Fluxer sends Message Delete. You can delete your own messages, and someone else's message in a guild needs MANAGE_MESSAGES. Only DEFAULT, REPLY, CHANNEL_PINNED_MESSAGE, USER_JOIN, CHANNEL_FOLLOW_ADD and THREAD_CREATED messages can be deleted. In a guild, every delete adds a MESSAGE_DELETE audit log entry.

Deleting a published message replaces each copy with [Original message deleted] and sets SOURCE_MESSAGE_DELETED.

StatusBodyCondition
204emptyThe message was deleted

The rate limit is 20 requests per 10 seconds, on the channel:message:delete::channel_id bucket.

DELETE/v1/channels/{channel_id}/messages/{message_id}/attachments/{attachment_id}Bot

Deletes one attachment from your own message, and Fluxer sends Message Update. When it's the last thing in the message, Fluxer deletes the whole message and sends Message Delete instead.

StatusBodyCondition
204emptyThe attachment was deleted

The rate limit is 20 requests per 10 seconds, on the channel:message:delete::channel_id bucket.

POST/v1/channels/{channel_id}/messages/bulk-deleteBotAudit reasonMFA

Deletes up to 100 messages of any age in a guild channel and skips IDs that match nothing. You need MANAGE_MESSAGES. Fluxer sends one Message Delete Bulk and adds one MESSAGE_BULK_DELETE audit log entry.

FieldTypeDescription
message_ids?array[snowflake]The messages to delete (1-100)
messages?array[snowflake]Another name for message_ids
StatusBodyCondition
204emptyThe messages were deleted
400error responseINVALID_FORM_BODY with MESSAGE_IDS_CANNOT_BE_EMPTY when the list is empty
400error responseCANNOT_EXECUTE_ON_DM in a private channel

The rate limit is 10 requests per 10 seconds, on the channel:message:bulk_delete::channel_id bucket.

POST/v1/channels/{channel_id}/messages/purgeBot

Deletes every message in your personal notes channel and can't be undone. Fluxer sends Message Delete Bulk for every 100 messages.

FieldTypeDescription
deleted_countintegerThe number of messages deleted
StatusBodyCondition
200response bodyThe messages were deleted
400error responseINVALID_CHANNEL_TYPE for any other channel

The rate limit is 2 requests per minute, on the channel:message:purge::channel_id bucket.

POST/v1/channels/{channel_id}/messages/bulk-delete-mineBotMFA

Deletes every message you sent in a channel and its threads, and can't be undone. For a thread, only that thread is cleared. You need sudo mode, from the X-Fluxer-Sudo-Mode-JWT header or the fields in the JSON body. Fluxer sends Message Delete Bulk for every 100 messages.

FieldTypeDescription
password?stringYour password, when you have no MFA
mfa_method?stringtotp, webauthn or email_code
mfa_code?stringThe authenticator code (1-32 characters)
webauthn_response?WebAuthn assertion objectThe WebAuthn assertion
webauthn_challenge?stringThe challenge for the assertion
email_code_ticket?stringThe ticket from send a sudo email code (1-128 characters)
email_code?stringThe 6-digit code from the email
StatusBodyCondition
202emptyThe messages were deleted
403error responseSUDO_MODE_REQUIRED when you're not in sudo mode

The rate limit is 10 requests per 10 seconds, on the channel:message:bulk_delete::channel_id bucket.

GET/v1/channels/{channel_id}/messages/pinsBot

Returns a page of pinned messages, newest pin first.

FieldTypeDescription
limit?integerThe number of pins to return (1-50, default 50)
before?ISO8601 timestampGet pins pinned before this time
StatusBodyCondition
200channel pins page objectThe pins were returned
400error responseINVALID_CHANNEL_TYPE for a forum or media channel

The rate limit is 20 requests per 10 seconds, on the channel:pins::channel_id bucket.

PUT/v1/channels/{channel_id}/pins/{message_id}BotAudit reason

Pins a DEFAULT or REPLY message. In a guild you need PIN_MESSAGES, and Fluxer adds a MESSAGE_PIN audit log entry. Fluxer posts a CHANNEL_PINNED_MESSAGE message and sends Message Update, Channel Pins Update and Message Create.

StatusBodyCondition
204emptyThe message is pinned
400error responseCANNOT_MODIFY_SYSTEM_WEBHOOK for a system message
400error responseCANNOT_SEND_MESSAGES_TO_USER when the recipient's DM settings block you

The rate limit is 20 requests per 10 seconds, on the channel:pins::channel_id bucket.

DELETE/v1/channels/{channel_id}/pins/{message_id}BotAudit reason

Unpins a message, with the same permissions as Pin message. Fluxer sends Message Update and Channel Pins Update, and in a guild adds a MESSAGE_UNPIN audit log entry.

StatusBodyCondition
204emptyThe message isn't pinned
400error responseCANNOT_MODIFY_SYSTEM_WEBHOOK for a system message

The rate limit is 20 requests per 10 seconds, on the channel:pins::channel_id bucket.

POST/v1/channels/{channel_id}/pins/ackBot

Marks the channel's pins as seen, and Fluxer sends Channel Pins ACK to your sessions.

StatusBodyCondition
204emptyThe pins were acknowledged
400error responseINVALID_CHANNEL_TYPE for a forum or media channel

The rate limit is 20 requests per 10 seconds, on the channel:pins::channel_id bucket.

The {emoji} path value is URL-encoded and 1-64 characters long. Use name:id for a custom emoji and the emoji itself for a Unicode emoji.

GET/v1/channels/{channel_id}/messages/{message_id}/reactions/{emoji}Bot

Returns the users who reacted with an emoji, as a plain array. The X-Has-More and X-Next-After headers have the paging values that List reaction users returns in the body.

FieldTypeDescription
limit?integerThe number of users to return (1-100, default 25)
after?snowflakeGet users after this user ID
StatusBodyCondition
200array[partial user object]The users were returned

The rate limit is 30 requests per 10 seconds, on the channel:reactions::channel_id bucket.

GET/v1/channels/{channel_id}/messages/{message_id}/reactions/{emoji}/usersBot

Returns a page of the users who reacted with an emoji.

FieldTypeDescription
limit?integerThe number of users to return (1-100, default 25)
after?snowflakeGet users after this user ID
StatusBodyCondition
200reaction users page objectThe users were returned

The rate limit is 30 requests per 10 seconds, on the channel:reactions::channel_id bucket.

PUT/v1/channels/{channel_id}/messages/{message_id}/reactions/{emoji}/@meBot

Adds your reaction, and Fluxer sends Message Reaction Add. In a guild, adding a new emoji needs ADD_REACTIONS, and a custom emoji also needs USE_EXTERNAL_EMOJIS. Using another guild's emoji needs the feature_global_expressions limit. Your account needs a verified email.

FieldTypeDescription
session_id?stringYour Gateway session ID (1-64 characters)
StatusBodyCondition
204emptyThe reaction was added
400error responseMAX_REACTIONS when the message has too many reactions
400error responseINVALID_FORM_BODY with NOT_A_VALID_UNICODE_EMOJI or CUSTOM_EMOJI_NOT_FOUND for a bad emoji
400error responseINVALID_FORM_BODY with CUSTOM_EMOJIS_REQUIRE_PREMIUM_OUTSIDE_SOURCE for another guild's emoji
403error responseREACTION_EMAIL_VERIFICATION_REQUIRED when your email isn't verified
403error responseUNCLAIMED_ACCOUNT_CANNOT_ADD_REACTIONS outside personal notes
403error responseCOMMUNICATION_DISABLED when you're timed out

The rate limit is 30 requests per 10 seconds, on the channel:reactions::channel_id bucket.

DELETE/v1/channels/{channel_id}/messages/{message_id}/reactions/{emoji}/@meBot

Removes your reaction, and Fluxer sends Message Reaction Remove.

FieldTypeDescription
session_id?stringYour Gateway session ID (1-64 characters)
StatusBodyCondition
204emptyThe reaction was removed

The rate limit is 30 requests per 10 seconds, on the channel:reactions::channel_id bucket.

DELETE/v1/channels/{channel_id}/messages/{message_id}/reactions/{emoji}/{target_id}Bot

Removes the reaction of the user target_id, and Fluxer sends Message Reaction Remove. Unless target_id is you, this only works in a guild channel and needs MANAGE_MESSAGES.

FieldTypeDescription
session_id?stringYour Gateway session ID (1-64 characters)
StatusBodyCondition
204emptyThe reaction was removed

The rate limit is 30 requests per 10 seconds, on the channel:reactions::channel_id bucket.

DELETE/v1/channels/{channel_id}/messages/{message_id}/reactions/{emoji}Bot

Removes every reaction with one emoji, and Fluxer sends Message Reaction Remove Emoji. This only works in a guild channel, where you need MANAGE_MESSAGES. A private channel returns 403 MISSING_PERMISSIONS.

StatusBodyCondition
204emptyThe reactions were removed

The rate limit is 30 requests per 10 seconds, on the channel:reactions::channel_id bucket.

DELETE/v1/channels/{channel_id}/messages/{message_id}/reactionsBot

Removes every reaction from a message, and Fluxer sends Message Reaction Remove All. This only works in a guild channel, where you need MANAGE_MESSAGES. A private channel returns 403 MISSING_PERMISSIONS.

StatusBodyCondition
204emptyThe reactions were removed

The rate limit is 30 requests per 10 seconds, on the channel:reactions::channel_id bucket.

POST/v1/channels/{channel_id}/typingBot

Shows that you're typing, and Fluxer sends Typing Start. In a guild channel you need SEND_MESSAGES, or SEND_MESSAGES_IN_THREADS in a thread.

FieldTypeDescription
message_send_cooldown_ms?1integerMilliseconds until slowmode lets you send a message
thread_create_cooldown_ms?1integerMilliseconds until slowmode lets you create a thread

1 The schema does not declare this body

Fluxer only returns this body during a slowmode cooldown, and only to a session with the channel_threads client capability.

StatusBodyCondition
200response bodyYou're typing and slowmode is counting down
204emptyYou're typing
400error responseINVALID_CHANNEL_TYPE for a forum or media channel

The rate limit is 20 requests per 10 seconds, on the channel:typing::channel_id bucket.

POST/v1/channels/{channel_id}/messages/{message_id}/ack

Marks a channel as read up to a message, and Fluxer sends Message ACK to your sessions. Bots can't use this route.

FieldTypeDescription
mention_count?integerThe number of unread mentions left (default 0)
manual?booleanWhether to move the read marker back to this message (default false)

Setting manual to true marks the messages after message_id unread.

StatusBodyCondition
204emptyThe message was acknowledged

The rate limit is 100 requests per 10 seconds, on the channel:message:ack::channel_id bucket.