Skip to content
Fluxer API

Webhooks

A webhook posts messages into one guild channel under a name and avatar of its own.

Management routes take a user session token or a bot token. Every other webhook operation uses the webhook ID and secret token in its own path as the complete credential and ignores the Authorization header.

The Messages resource defines the message, rich embed input, and message reference input objects.

A management operation requires MANAGE_WEBHOOKS at guild level and again in the webhook’s channel. MANAGE_WEBHOOKS is an elevated permission. In a guild whose MFA level is elevated, a caller who is neither the guild owner nor enrolled in multi-factor authentication receives 400 TWO_FACTOR_REQUIRED. Fluxer confirms the permission before that check, so a caller who lacks it outright receives 403 MISSING_PERMISSIONS.

Fluxer resolves the guild before every management operation. A guild that does not exist returns 404 UNKNOWN_GUILD. A caller who is not a current member of an existing guild returns 403 MISSING_PERMISSIONS.

List guild webhooks, List channel webhooks, and Create webhook name a guild or a channel in their paths, so the availability gate applies. A guild with UNAVAILABLE_FOR_EVERYONE refuses an authenticated request with 403 MISSING_ACCESS before the operation runs, and UNAVAILABLE_FOR_EVERYONE_BUT_STAFF does the same for an account without the instance staff flag. The three remaining management routes name only a webhook ID and are not gated.

Fluxer scans a submitted webhook name against the instance phrase and URL blocklists, and a match returns 403 CONTENT_BLOCKED. The same lists scan the resolved content and embed text of a created or edited message, and a match returns the same code. The avatar member is exempt from that scan, and Fluxer checks its decoded bytes against the banned asset hash list when it stores them.

Every route bucket on this page is keyed on the caller identity as well as on the path parameter in its bucket name. The caller identity is the authenticated account when a request resolves one and the client IP address otherwise, so a token-authenticated operation is bounded per address.

Fluxer resolves an Authorization credential on a token-authenticated operation for this keying alone. Rate limits defines the keying in full.

The global HTTP limit applies to every management route. Get webhook with token, Update webhook with token, and Delete webhook with token consume it under the caller identity. Every other route on this page is exempt and is bounded only by its own route bucket.

Fluxer refuses a call from the official web client on four routes. A request whose Origin header is exactly https://web.fluxer.app or https://web.canary.fluxer.app returns 403 INVALID_API_ORIGIN on Execute webhook, Get webhook message, Edit webhook message, and Delete webhook message.

A request that sends no Origin, or any other Origin value, passes the check. It runs after the route rate limit and before path validation.

Both token paths also have a second CORS policy that answers every origin, which the cross-origin request contract states in full.

A webhook belongs to exactly one guild and posts into exactly one guild text or voice channel of that guild. Fluxer generates its execution token once at creation and never rotates it, so the pair of ID and token is a bearer credential for the lifetime of the webhook.

FieldTypeDescription
idsnowflakeThe ID of the webhook
guild_idsnowflakeThe ID of the guild containing the webhook
channel_idsnowflakeThe ID of the channel the webhook sends messages to
namestringThe name the webhook posts under (1-80 characters)
avatar?stringThe avatar hash the webhook posts under, or null when no avatar is set
token1stringThe secret token that authorises execution of this webhook
user2partial user objectThe account that created the webhook

1 64 characters drawn from the 62-character alphanumeric alphabet. No operation rotates or reissues it

2 Absent from the token webhook object. The value is the deleted user partial when the creating account no longer exists

{
"id": "1501314428688998182",
"guild_id": "1501314428688990000",
"channel_id": "1501314428688991111",
"name": "Build bot",
"avatar": "a1b2c3d4e5f60718293a4b5c6d7e8f90",
"token": "Xk3Qw9ZpL2vB7nR4tY6uI8oP0aS1dF5gH2jK4lZ9xC7vB1nM3qW5eR8tY0uI2oP4",
"user": {
"id": "1501314428688990001",
"username": "ada",
"discriminator": "0001",
"avatar": null
}
}

Token-authenticated operations return this object. It has every field of the webhook object except user.

FieldTypeDescription
idsnowflakeThe ID of the webhook
guild_idsnowflakeThe ID of the guild containing the webhook
channel_idsnowflakeThe ID of the channel the webhook sends messages to
namestringThe name the webhook posts under (1-80 characters)
avatar?stringThe avatar hash the webhook posts under, or null when no avatar is set
tokenstringThe secret token that authorises execution of this webhook

Execute webhook accepts this JSON body. Every field may be omitted, and {} is a valid body that fails later as an empty message.

FieldTypeDescription
content?1?stringMessage content
embeds?2array[rich embed input object]Rich embeds
attachments?3array[webhook attachment input object]Attachment metadata
message_reference?4?message reference input objectReply or forward reference, or null
allowed_mentions?5?allowed mentions objectMention parsing policy, or null
flags?integerMessage flags, where omission is treated as zero and every bit outside the sendable mask is cleared
favorite_meme_id??snowflakeFavorite meme to attach
sticker_ids??array[snowflake]At most 3 sticker IDs
tts?6booleanText-to-speech request
nonce?7string | integerClient-generated message identifier (1-32 characters). A non-negative safe integer becomes its decimal string
username?8?stringPer-message webhook name override (1-80 characters), or null
avatar_url?8?stringAbsolute http or https per-message webhook avatar URL override of at most 2,048 characters, or null

1 A webhook author always resolves an effective max_message_length of at least 4000 characters, and a higher configured value for the guild raises it further. Exceeding it returns 400 INVALID_FORM_BODY with the validation code CONTENT_EXCEEDS_MAX_LENGTH

2 Bounded by the resolved max_embeds_per_message value for the guild, defaulting to 10. Exceeding it returns 400 INVALID_FORM_BODY with TOO_MANY_EMBEDS

3 A JSON body attaches no file. A multipart body uses the ordinary message attachment contract

4 A forward reference requires both channel_id and message_id, and it must not accompany content, embeds, or attachments. See message references

5 An omitted policy suppresses every mention, which is the opposite of the Create message default

6 The field takes no part in the non-empty message check, so a body supplying tts and nothing else returns 400 CANNOT_SEND_EMPTY_MESSAGE. A webhook message is never marked text-to-speech

7 The nonce is remembered per webhook for five minutes and is echoed on the Message Create Dispatch. A repeated execution presenting it inside that window creates no second message and returns the first one, and a repeat after the webhook moved to another channel returns 404 UNKNOWN_MESSAGE

8 Applies to the created message, and the stored webhook keeps its own name and avatar

When embeds is absent, Fluxer rewrites the singular key embed to a one-element embeds array, and an embed of null becomes an empty array. When both are present, embed is dropped.

A multipart body accepts both pre-uploaded attachments and direct multipart attachment metadata.

Fluxer fetches an avatar_url through the media boundary.

A JSON webhook message body accepts this attachment metadata shape. Every member is optional, and a member outside this table is discarded.

FieldTypeDescription
id?snowflake | integerThe ID of the attachment
filename?stringAttachment filename (1-1024 characters)
description?stringAttachment description (1-4096 characters)
content_type?stringMedia type (1-256 characters)
size?integerByte count, as a non-negative safe integer
url?stringAbsolute http or https URL of at most 2,048 characters
proxy_url?stringAbsolute http or https URL of at most 2,048 characters
height?integerPixel height
width?integerPixel width
ephemeral?booleanWhether the attachment is ephemeral
duration?numberAudio duration in seconds
waveform?stringBase64 waveform data (1-256 characters)
flags?integerAttachment flags

Every entry supplied in a JSON body is dropped, and it counts towards neither the attachment limit nor the non-empty message check.

A webhook execution accepts the message reference input object defined by the Messages resource. Three constraints are specific to webhooks.

The channel_id field is required for a forward reference and must equal the webhook’s own channel. A value naming any other channel returns 404 UNKNOWN_MESSAGE. A reply reference always resolves in the webhook’s own channel and ignores this field.

The referenced message must exist in the webhook’s channel, and a missing message returns 404 UNKNOWN_MESSAGE. A reply reference additionally requires the referenced message to be an ordinary or reply message. Any other type returns 400 INVALID_FORM_BODY with the validation code CANNOT_REPLY_TO_SYSTEM_MESSAGE.

A forward reference must not accompany content, embeds, or attachments, and one that does returns 400 INVALID_FORM_BODY with the validation code FORWARD_MESSAGES_CANNOT_CONTAIN_CONTENT. A forward reference that omits channel_id or message_id returns the same status with FORWARD_REFERENCE_REQUIRES_CHANNEL_AND_MESSAGE.

Edit webhook message accepts this JSON body. Every supplied field replaces the stored value outright, and an omitted field keeps it. A body with no visible content, no non-empty embeds, and no flags is rejected with 400 CANNOT_SEND_EMPTY_MESSAGE.

FieldTypeDescription
content?1?stringReplacement message content, or null
embeds?2array[rich embed input object]Replacement collection of embeds
flags?integerReplacement message flags
allowed_mentions??allowed mentions objectReplacement mention parsing policy, or null

1 The same effective maximum length as Execute webhook applies

2 The supplied array becomes the complete embed collection, so an empty array removes every embed. The same resolved max_embeds_per_message ceiling applies

flags replaces only the bits inside the sendable mask, and every other stored bit is kept.

These objects define the body Execute Slack webhook accepts and the embed each part converts to.

FieldTypeDescription
text?1stringMessage text
username?stringWebhook name override for this message (1-80 characters)
icon_url?2stringWebhook avatar URL override for this message
attachments?array[Slack attachment object]Slack attachments converted to embeds

1 When text is omitted and at least one attachment converts to an embed, the created message content is the empty string

2 The value is used only when it parses as an absolute http or https URL of at most 2,048 characters, and any other value is discarded silently

FieldTypeDescription
fallback?1stringFallback text
pretext?1stringText above the attachment
text?1stringMain attachment text
color?2stringSidebar colour value
title?stringAttachment title, mapped to the embed title
title_link?3stringTitle URL, mapped to the embed URL
fields?4array[Slack attachment field object]Fields mapped to embed fields
footer?stringFooter text, mapped to the embed footer
ts?5numberUnix seconds, mapped to the embed timestamp
author_name?6stringAuthor name, mapped to the embed author name
author_link?3stringAuthor URL, mapped to the embed author URL
author_icon?3stringAuthor icon URL, mapped to the embed author icon
image_url?3stringMain image URL, mapped to the embed image
thumb_url?3stringThumbnail URL, mapped to the embed thumbnail

1 The embed description is pretext and text joined by a newline in that order, and fallback is used only when both pretext and text are absent

2 The value is mapped to the embed colour only when it is exactly six hexadecimal digits with an optional leading #, and any other value leaves the embed without a colour

3 The value is used only when it parses as an absolute http or https URL of at most 2,048 characters, and any other value is discarded silently

4 A field is converted only when it supplies both a title and a value, and any other field is discarded silently

5 The value is accepted as a JSON number or as a decimal string and must be a non-negative integer

6 The embed author is emitted only when author_name is present, so author_link and author_icon alone produce no author

FieldTypeDescription
title?stringField title, mapped to the embed field name
value?stringField value, mapped to the embed field value
short?booleanWhether the embed field is rendered inline (default false)

The Slack schema bounds only username, which must be 1 through 80 characters and rejects a longer value with WEBHOOK_NAME_LENGTH_INVALID. Fluxer applies no bound to any other Slack string or to either array.

Three checks do apply. A conversion yielding neither content nor an embed returns 400 CANNOT_SEND_EMPTY_MESSAGE. Content longer than the effective maximum returns 400 INVALID_FORM_BODY with the validation code CONTENT_EXCEEDS_MAX_LENGTH, and more converted embeds than the resolved ceiling returns the same status with TOO_MANY_EMBEDS. Fluxer discards an attachment that produces no embed property.

These objects define the body Execute GitHub webhook accepts.

FieldTypeDescription
action?1?stringGitHub event action, or null
answer??GitHub comment objectAccepted discussion answer, or null (validated, never rendered)
check_run??GitHub check run objectCheck run data, or null
check_suite??GitHub check suite objectCheck suite data, or null
comment??GitHub comment objectIssue, review, commit, or discussion comment, or null
commits??array[GitHub commit object]Push commits, or null
compare??stringAbsolute comparison URL, or null
discussion??GitHub discussion objectDiscussion data, or null
forced??booleanWhether a push was forced, or null
forkee??GitHub service objectFork repository, or null
head_commit??GitHub commit objectHead commit, or null
issue??GitHub issue objectIssue data, or null
member??GitHub user objectRepository member data, or null
pull_request?2?GitHub issue objectPull request representation, or null
ref_type?3?stringGit reference type, or null
ref??stringGit reference, or null
release??GitHub release objectRelease data, or null
repository?4?GitHub service objectRepository data, or null
review??GitHub review objectPull request review data, or null
senderGitHub user objectEvent sender

1 The value gates rendering for most event types, and the exact accepted action for each type is stated in GitHub event types

2 A pull request uses the same representation as an issue, so only the fields listed in the GitHub issue structure are consumed

3 Only the exact values branch and tag are rendered for a create or delete event, and any other reference type produces no message

4 Every rendered event type requires repository, so a callback without it produces no message

A top-level pull_request field selects the wording of an issue_comment rendering, which names a pull request when the field is present and an issue when it is absent.

Every GitHub string in these objects accepts at most 152,133 characters unless a narrower bound is stated, and every field typed as an absolute URL must parse as an http or https URL of at most 2,048 characters. A field marked as accepted and validated still has its declared type and bound, so a malformed value rejects the callback with 400 INVALID_FORM_BODY.

Every rendered embed title is truncated to 70 characters, except the ordinary push, check run, and check suite titles, which are truncated to 256. Every rendered embed description is truncated to 350 characters, except the forced push description, which is the fixed compare link and is neither decoded nor truncated. Fluxer decodes HTML entities and trims each value before truncating it.

FieldTypeDescription
idintegerNon-negative 32-bit GitHub user ID (validated, never rendered)
loginstringGitHub login, used as the rendered embed author name
html_urlstringAbsolute profile URL
avatar_urlstringAbsolute avatar URL
FieldTypeDescription
idintegerNon-negative 32-bit GitHub repository ID (validated, never rendered)
html_urlstringAbsolute repository URL
name1stringRepository name
full_name1stringOwner-qualified repository name

1 The push, check run, and check suite renderings use name, and every other rendering uses full_name

FieldTypeDescription
username??stringGitHub username, or null (validated, never rendered)
namestringAuthor display name, which is the value rendered beside each pushed commit
FieldTypeDescription
id1stringCommit identifier
urlstringAbsolute commit API URL
message2stringCommit message
authorGitHub author objectCommit author

1 Renderings abbreviate the identifier to its first seven characters

2 Every This reverts commit <sha>. sentence with a 40-character identifier is rewritten to a Markdown link to the reverted commit

FieldTypeDescription
idstring | integer (validated, never rendered)Signed 64-bit comment ID, accepted as a decimal string or as a safe integer
html_urlstringAbsolute comment URL
userGitHub user objectComment author
commit_id?1?stringAssociated commit identifier, or null
bodystringComment body

1 The field is required for a commit_comment event and unused for every other comment-bearing event

FieldTypeDescription
titlestringDiscussion title
numberintegerNon-negative 32-bit discussion number
html_urlstringAbsolute discussion URL
answer_html_url??stringAbsolute accepted-answer URL, or null (validated, never rendered)
body??stringDiscussion body, or null
userGitHub user objectDiscussion author
FieldTypeDescription
id1string | integerSigned 64-bit issue or pull request ID, accepted as a decimal string or as a safe integer
numberintegerNon-negative 32-bit issue or pull request number
html_urlstringAbsolute issue or pull request URL
user1GitHub user objectIssue or pull request author
titlestringIssue or pull request title
body?2?stringIssue or pull request body, or null

1 The field is accepted and validated and never rendered. The issue, pull request, and issue_comment renderings take their embed author from the callback sender or the comment author

2 The body is rendered as the embed description only for the opened action, and a closed or reopened action renders no description

No other key is read. An unlisted key, including a pull_request marker that GitHub places on the issue itself, is discarded.

FieldTypeDescription
idintegerNon-negative 32-bit release ID (validated, never rendered)
tag_namestringGit tag name
html_urlstringAbsolute release URL
body??stringRelease body, or null (validated, never rendered)
FieldTypeDescription
userGitHub user objectReview author
body??stringReview body, or null
html_urlstringAbsolute review URL
state1stringReview state

1 The field is accepted and validated but does not contribute to the rendered message, so an approval, a change request, and a comment review all render the same embed

FieldTypeDescription
numberintegerNon-negative 32-bit pull request number (validated, never rendered)

The object exists only inside the pull_requests arrays of the GitHub check suite structure and the GitHub check run structure. Both arrays are validated and never read.

FieldTypeDescription
namestringCheck application name, rendered in the check suite embed title
FieldTypeDescription
conclusion?1?stringCheck conclusion, or null
head_branch??stringHead branch, or null
head_shastringHead commit identifier, used to build the rendered commit URL
pull_requests??array[GitHub check pull request object]Associated pull requests, or null (validated, never rendered)
appGitHub check application objectCheck application

1 The exact value skipped suppresses the message entirely, the exact value success renders a green embed, and every other value renders a red embed

FieldTypeDescription
title??stringOutput title, or null (validated, never rendered)
summary??stringOutput summary, or null (validated, never rendered)
FieldTypeDescription
conclusion?1?stringCheck conclusion, or null
namestringCheck run name
html_url2stringAbsolute check run URL
check_suite3GitHub check suite objectParent check suite
details_url?2?stringAbsolute details URL, or null
output?2?GitHub check run output objectCheck output, or null
pull_requests?2?array[GitHub check pull request object]Associated pull requests, or null

1 The exact value success renders a green embed and every other value renders a red embed

2 The field is accepted and validated and never rendered. The check run embed links the commit built from the parent suite’s head_sha

3 A check run whose parent suite reports the conclusion skipped produces no message

The value of the X-GitHub-Event request header selects the rendering. An event type outside this registry, and an absent header, are both acknowledged without creating a message. Every listed type additionally requires repository.

ValueDescription
commit_comment1New comment on a commit, requiring the action created and a comment with commit_id
create2Creation of a branch or a tag, requiring ref and ref_type
delete2Deletion of a branch or a tag, requiring ref and ref_type
forkCreation of a fork, requiring forkee
issue_comment1New comment on an issue or a pull request, requiring the action created and both comment and issue
issues3Issue lifecycle change, requiring issue and the action opened, closed, or reopened
memberRepository collaborator addition, requiring the action added and member
publicRepository becoming public
pull_request3Pull request lifecycle change, requiring pull_request and the action opened, closed, or reopened
pull_request_review1Pull request review, requiring the action submitted and both review and pull_request
pull_request_review_comment1New review comment, requiring the action created and both comment and pull_request
push4Git push, requiring ref
releaseRelease publication, requiring the action published and release
watchRepository star, requiring the action started
check_run5Check run completion, requiring the action completed and check_run
check_suite5Check suite completion, requiring the action completed and check_suite
discussion1New discussion, requiring the action created and discussion
discussion_comment1New discussion comment, requiring the action created and both comment and discussion
repositoryRepository creation, requiring the action created

1 The embed author is the comment, discussion, or review author

2 Only the reference types branch and tag render, and any other ref_type produces no message

3 The description is rendered only for the opened action

4 A forced push requires head_commit and compare, and renders a compare link as its whole description

5 A conclusion of skipped on the relevant suite suppresses the message

An ordinary push requires compare and at least one commit, and renders one line for each commit. The line set is not capped by count, and the assembled description is truncated to the ordinary 350-character ceiling.

These objects define the body Execute Instatus webhook accepts.

FieldTypeDescription
meta??Instatus metadata objectCallback metadata, or null (validated, never rendered)
page?1?Instatus page objectStatus page data, or null
incident?2?Instatus incident objectIncident data, or null
maintenance?2?Instatus maintenance objectMaintenance data, or null
component_update?2?Instatus component update objectComponent transition data, or null
component?2?Instatus component objectComponent data, or null

1 The page supplies the embed footer text and the fallback embed URL when the incident or maintenance item supplies no URL of its own. A component transition always takes its URL from the page

2 Exactly one rendering is selected in the order incident, maintenance, then component transition. A section with no non-empty name renders nothing, and the next section in that order is tried

FieldTypeDescription
unsubscribe??stringUnsubscribe value (max 2,048 characters), or null
documentation??stringDocumentation value (max 2,048 characters), or null
FieldTypeDescription
id??stringPage ID (max 256 characters), or null
status_indicator?1?stringStatus indicator (max 256 characters), or null
status_description?1?stringStatus description (max 1,024 characters), or null
url?2?stringPage URL (max 2,048 characters), or null

1 The footer text is status_description when it is non-empty, otherwise the humanised form of status_indicator

2 Used as an embed URL only when it parses as an absolute http or https URL

A backfilled incident or maintenance item appends Backfilled to the footer text, so the footer is omitted only when both page values are empty and the rendered item is not backfilled.

FieldTypeDescription
id??stringComponent ID (max 256 characters), or null
name?1?stringComponent name (max 1,024 characters), or null
status?2?stringComponent status (max 256 characters), or null

1 A component without a non-empty name is omitted from the rendered affected components field, and a callback whose components all lack names renders no such field

2 A non-empty status is rendered in lower case in parentheses after the name, and a component without one renders its name alone

FieldTypeDescription
id??stringComponent ID (max 256 characters), or null
name?1?stringComponent name (max 1,024 characters), or null
status?2?stringComponent status (max 256 characters), or null
created_at?3?stringProvider creation time (max 64 characters), or null

1 A component transition with no non-empty name renders the literal words A component in its place

2 The value is the fallback for the rendered transition status when the component update supplies no new_status

3 The value is the fallback for the embed timestamp when the component update supplies no created_at, and a value the runtime cannot parse as a date leaves the embed without a timestamp

FieldTypeDescription
id??stringUpdate ID (max 256 characters), or null
incident_id??stringIncident ID (max 256 characters), or null
markdown?1?stringUpdate body (max 65,536 characters), or null
status??stringUpdate status (max 256 characters), or null (validated, never rendered)
created_at?1?stringProvider creation time (max 64 characters), or null
updated_at??stringProvider update time (max 64 characters), or null (validated, never rendered)

1 Only the update with the latest created_at contributes. Its markdown becomes the embed description, truncated to 4,096 characters, and its created_at becomes the embed timestamp

FieldTypeDescription
id??stringIncident ID (max 256 characters), or null
name?1?stringIncident name (max 1,024 characters), or null
url??stringIncident URL (max 2,048 characters), or null
status?2?stringIncident status (max 256 characters), or null
backfilled?3?booleanWhether the incident was backfilled, or null
created_at?4?stringProvider creation time (max 64 characters), or null
updated_at?4?stringProvider update time (max 64 characters), or null
resolved_at??stringProvider resolution time (max 64 characters), or null (validated, never rendered)
incident_updates??array[Instatus incident update object]Incident updates, or null
affected_components??array[Instatus affected component object]Affected components, or null

1 The name becomes the embed title, truncated to 256 characters. An incident with no non-empty name is skipped, and the maintenance or component data in the same callback renders in its place

2 The value selects the embed colour and the rendered Status field through Instatus status values, and an absent status renders the neutral colour and no Status field

3 A true value appends Backfilled to the embed footer, separated from the page footer text by a vertical bar. When the page supplies no footer text, Backfilled is the whole footer

4 The embed timestamp is the latest update’s created_at, then updated_at, then created_at, and the first value the runtime can parse as a date wins

FieldTypeDescription
id??stringUpdate ID (max 256 characters), or null
maintenance_id??stringMaintenance ID (max 256 characters), or null
markdown?1?stringUpdate body (max 65,536 characters), or null
created_at?1?stringProvider creation time (max 64 characters), or null
updated_at??stringProvider update time (max 64 characters), or null (validated, never rendered)

1 Only the update with the latest created_at contributes. Its markdown becomes the embed description, truncated to 4,096 characters, and its created_at becomes the embed timestamp

FieldTypeDescription
id??stringMaintenance ID (max 256 characters), or null
name?1?stringMaintenance name (max 1,024 characters), or null
url??stringMaintenance URL (max 2,048 characters), or null
status?2?stringMaintenance status (max 256 characters), or null
maintenance_start_date?3?stringProvider start time (max 64 characters), or null
maintenance_end_date?3?stringProvider end time (max 64 characters), or null
backfilled??booleanWhether the maintenance was backfilled, or null
created_at?4?stringProvider creation time (max 64 characters), or null
updated_at?4?stringProvider update time (max 64 characters), or null
resolved_at??stringProvider resolution time (max 64 characters), or null (validated, never rendered)
maintenance_updates??array[Instatus maintenance update object]Maintenance updates, or null
affected_components??array[Instatus affected component object]Affected components, or null

1 The name becomes the embed title, truncated to 256 characters. A maintenance item with no non-empty name is skipped, and the component transition in the same callback renders in its place

2 An absent status renders the maintenance colour

3 Each parseable value renders as a full timestamp in the Window field, and the field is omitted when neither value parses

4 The embed timestamp is the latest update’s created_at, then updated_at, then created_at, and the first value the runtime can parse as a date wins

FieldTypeDescription
created_at??stringProvider creation time (max 64 characters), or null
new_status?1?stringNew component status (max 256 characters), or null
component_id??stringComponent ID (max 256 characters), or null (validated, never rendered)

1 The rendering prefers new_status and falls back to the status of the accompanying component, using the literal word updated when neither is present. The selected value is rendered in lower case

Fluxer normalises an incident, maintenance, or component status by uppercasing it and removing every character outside A to Z, so degraded_performance becomes DEGRADEDPERFORMANCE. A normalised value in this registry selects the rendered label and the embed colour, and any other value is rendered unchanged with a neutral colour.

ValueDescription
UPRendered as All systems operational, with the neutral colour
HASISSUESRendered as Has issues, with the neutral colour
OPERATIONALRendered as Operational, with the operational colour
UNDERMAINTENANCERendered as Under maintenance, with the maintenance colour
DEGRADEDPERFORMANCERendered as Degraded performance, with the degraded colour
PARTIALOUTAGERendered as Partial outage, with the partial outage colour
MAJOROUTAGERendered as Major outage, with the major outage colour
INVESTIGATINGRendered as Investigating, with the major outage colour
IDENTIFIEDRendered as Identified, with the partial outage colour
MONITORINGRendered as Monitoring, with the degraded colour
RESOLVEDRendered as Resolved, with the operational colour
NOTSTARTEDYETRendered as Scheduled, with the maintenance colour
PLANNEDRendered as Planned, with the maintenance colour
INPROGRESSRendered as In progress, with the maintenance colour
COMPLETEDRendered as Completed, with the operational colour
GET/v1/guilds/{guild_id}/webhooksBot

Returns an array of webhook objects in a guild. The caller must be a member of the guild and hold the MANAGE_WEBHOOKS permission at guild level.

FieldTypeDescription
guild_idsnowflakeThe ID of the guild whose webhooks are returned
StatusBodyCondition
2001array[webhook object]Webhooks were returned, and an empty array is returned when the guild has none
400error responsePath parameter is not a valid snowflake
4002error responseThe caller holds MANAGE_WEBHOOKS without an enrolled authenticator in an elevated-MFA guild
4033error responseCredential is a bearer token
4033error responseThe account has an outstanding required action
4033error responseThe guild is unavailable
4033error responseThe caller is not a member of the guild or lacks MANAGE_WEBHOOKS
404error responseGuild does not exist, returning UNKNOWN_GUILD

1 The array can be shorter than the number of stored webhooks

2 The missing-authenticator code is TWO_FACTOR_REQUIRED, returned only after Fluxer confirms the permission itself

3 ACCOUNT_SUSPICIOUS_ACTIVITY for an outstanding required action, MISSING_ACCESS for an unavailable guild, MISSING_PERMISSIONS for a membership or permission failure, and ACCESS_DENIED otherwise

A webhook is returned only when the caller also holds both VIEW_CHANNEL and MANAGE_WEBHOOKS in that webhook’s own channel. A webhook with no channel target is never returned.

40 requests per 10 seconds for each authenticated user and guild ID, on the webhook:list::guild_id bucket.

GET/v1/channels/{channel_id}/webhooksBot

Returns an array of webhook objects in a guild text or voice channel. The caller must be able to view the channel and hold the MANAGE_WEBHOOKS permission at guild level and in the channel.

FieldTypeDescription
channel_idsnowflakeThe ID of the guild text or voice channel whose webhooks are returned
StatusBodyCondition
200array[webhook object]Webhooks were returned, and an empty array is returned when the channel has none
400error responsePath parameter is not a valid snowflake
4001error responseThe caller holds MANAGE_WEBHOOKS without an enrolled authenticator in an elevated-MFA guild
4032error responseCredential is a bearer token
4032error responseThe account has an outstanding required action
4032error responseThe guild is unavailable
4032error responseThe caller is not a member of the channel’s guild
4032error responseThe caller lacks channel access or MANAGE_WEBHOOKS
4032error responseThe channel is age restricted and the account is not age verified
404error responseChannel does not exist or is not a guild text or voice channel, each returning UNKNOWN_CHANNEL
404error responseIts guild does not resolve, returning UNKNOWN_GUILD

1 The missing-authenticator code is TWO_FACTOR_REQUIRED, returned only after Fluxer confirms the permission itself

2 ACCOUNT_SUSPICIOUS_ACTIVITY for an outstanding required action, MISSING_ACCESS for an unavailable guild, NSFW_CONTENT_AGE_RESTRICTED for an unverified account in an age restricted channel, MISSING_PERMISSIONS for a membership, channel access, or permission failure, and ACCESS_DENIED otherwise

40 requests per 10 seconds for each authenticated user and channel ID, on the webhook:list::channel_id bucket.

POST/v1/channels/{channel_id}/webhooksBotAudit reason

Creates a webhook in a guild text or voice channel and returns the new webhook object with its execution token. The caller must be able to view the channel and hold the MANAGE_WEBHOOKS permission at guild level and in the channel. The operation accepts an audit reason.

Creation emits a Webhooks Update.

Fluxer checks the request in a fixed order: the content filter, the rate limit, the credential, the body schema, channel access and MANAGE_WEBHOOKS, the guild allowance, the channel allowance, the name scan, and only then the avatar itself.

The guild allowance is the resolved max_webhooks_per_guild value for the guild, defaulting to 1000, and the channel allowance is the resolved max_webhooks_per_channel value, defaulting to 15.

FieldTypeDescription
channel_idsnowflakeThe ID of the guild text or voice channel the webhook is created in
FieldTypeDescription
namestringWebhook name (1-80 characters)
avatar?1?base64 stringBase64-encoded avatar image, or null

1 A leading data URI header is stripped at the first comma before decoding, and the base64 payload is 1 through 13981016 characters

The decoded bytes must be at most the resolved avatar_max_size value, which is the 10 MiB ceiling of 10485760 bytes by default. The decoded image must be an accepted avatar upload format, and an animated AVIF is rejected.

StatusBodyCondition
200webhook objectWebhook was created
4001error responseBody or avatar is invalid
4002error responseThe guild or channel webhook allowance is already reached
400error responseThe caller holds MANAGE_WEBHOOKS without an enrolled authenticator in an elevated-MFA guild
403error responseCredential is a bearer token
403error responseThe account has an outstanding required action
403error responseThe guild is unavailable
403error responseThe caller is not a member of the channel’s guild
403error responseThe caller lacks channel access or MANAGE_WEBHOOKS
403error responseThe channel is age restricted and the account is not age verified
403error responseThe name is blocked
403error responseThe avatar hash is banned
404error responseChannel does not exist or is not a guild text or voice channel, returning UNKNOWN_CHANNEL
404error responseIts guild does not resolve, returning UNKNOWN_GUILD

1 An avatar failure names the avatar path with BASE64_LENGTH_INVALID, INVALID_BASE64_FORMAT, IMAGE_SIZE_EXCEEDS_LIMIT, or INVALID_IMAGE_FORMAT

2 The reached allowance is in a top-level member named after its limit key

ConditionError
Guild or channel webhook allowance reached400 MAX_WEBHOOKS_PER_GUILD or 400 MAX_WEBHOOKS_PER_CHANNEL
Caller holds the permission but has no enrolled authenticator400 TWO_FACTOR_REQUIRED
Schema or image failure400 INVALID_FORM_BODY
Name is blocked, or the avatar hash is banned403 CONTENT_BLOCKED
Account has an outstanding required action403 ACCOUNT_SUSPICIOUS_ACTIVITY
Guild is unavailable403 MISSING_ACCESS
Unverified account in an age restricted channel403 NSFW_CONTENT_AGE_RESTRICTED
Membership, channel access, or permission failure403 MISSING_PERMISSIONS
Any other credential refusal403 ACCESS_DENIED

The operation consumes one guild and channel webhook slot, generates a 64-character execution token, and stores the optional avatar. It records a WEBHOOK_CREATE guild audit entry that names the created webhook, has the target channel in its metadata, and has the supplied reason. A failure to write that entry does not fail the request, and the webhook still exists.

It emits Webhooks Update with the guild and channel IDs to guild sessions that can view the channel. A failed creation leaves no webhook and consumes no slot.

10 requests per minute for each authenticated user and channel ID, on the webhook:create::channel_id bucket.

GET/v1/webhooks/{webhook_id}Bot

Returns a webhook object. The caller must be a member of the webhook’s guild and hold the MANAGE_WEBHOOKS permission at guild level and in the webhook’s current channel.

FieldTypeDescription
webhook_idsnowflakeThe ID of the webhook to return
StatusBodyCondition
200webhook objectWebhook was returned
400error responsePath parameter is not a valid snowflake
4001error responseThe caller holds MANAGE_WEBHOOKS without an enrolled authenticator in an elevated-MFA guild
4032error responseCredential is a bearer token
4032error responseThe account has an outstanding required action
4032error responseThe caller is not a member of the webhook’s guild or lacks MANAGE_WEBHOOKS in the webhook’s channel
404error responseWebhook does not exist, returning UNKNOWN_WEBHOOK, or its guild does not resolve, returning UNKNOWN_GUILD

1 The missing-authenticator code is TWO_FACTOR_REQUIRED, returned only after Fluxer confirms the permission itself

2 ACCOUNT_SUSPICIOUS_ACTIVITY for an outstanding required action, MISSING_PERMISSIONS for a membership or permission failure, and ACCESS_DENIED otherwise

100 requests per 10 seconds for each authenticated user and webhook ID, on the webhook:read::webhook_id bucket.

PATCH/v1/webhooks/{webhook_id}BotAudit reason

Updates a webhook and returns the modified webhook object. Emits a Webhooks Update Gateway event.

  • The caller is a member of the webhook’s guild and holds MANAGE_WEBHOOKS at guild level and in the webhook’s current channel.
  • Moving the webhook additionally requires channel access and that permission in the destination channel, which must belong to the same guild.
  • The operation accepts an audit reason.
FieldTypeDescription
webhook_idsnowflakeThe ID of the webhook to update
FieldTypeDescription
name?stringReplacement webhook name (1-80 characters)
avatar?1?base64 stringBase64-encoded replacement avatar, or null to remove the current avatar
channel_id?2snowflakeDestination guild text or voice channel in the same guild

1 An omitted avatar leaves the stored hash unchanged, and an explicit null clears it. The same encoding, size, and format rules as create webhook apply

2 A destination equal to the current channel is a no-op, and any other destination is subject to the destination channel’s own max_webhooks_per_channel allowance

The returned webhook object has the destination channel.

StatusBodyCondition
200webhook objectWebhook was updated
400error responseBody or avatar is invalid
4001error responseThe destination channel already holds its maximum webhooks
400error responseThe caller holds MANAGE_WEBHOOKS without an enrolled authenticator in an elevated-MFA guild
403error responseCredential is a bearer token
403error responseThe account has an outstanding required action
403error responseThe caller is not a member of the webhook’s guild
403error responseThe caller lacks MANAGE_WEBHOOKS in the current or destination channel
4032error responseThe destination channel is age restricted and the account is not age verified
403error responseThe name is blocked
403error responseThe avatar hash is banned
404error responseWebhook does not exist, returning UNKNOWN_WEBHOOK
404error responseThe destination channel is missing or is not a guild text or voice channel, returning UNKNOWN_CHANNEL
404error responseThe destination channel belongs to another guild, returning UNKNOWN_CHANNEL
404error responseThe webhook’s guild does not resolve, returning UNKNOWN_GUILD

1 The destination allowance failure has the reached value in a top-level max_webhooks_per_channel member

2 The age restriction applies to the destination channel

ConditionError
Destination channel already holds its maximum webhooks400 MAX_WEBHOOKS_PER_CHANNEL
Caller holds the permission but has no enrolled authenticator400 TWO_FACTOR_REQUIRED
Schema or image failure400 INVALID_FORM_BODY
Name is blocked, or the avatar hash is banned403 CONTENT_BLOCKED
Account has an outstanding required action403 ACCOUNT_SUSPICIOUS_ACTIVITY
Unverified account in an age restricted destination channel403 NSFW_CONTENT_AGE_RESTRICTED
Membership, channel access, or permission failure403 MISSING_PERMISSIONS
Any other credential refusal403 ACCESS_DENIED

The operation replaces the supplied fields, uploading a new avatar when one is supplied and clearing the stored hash when avatar is null. It records a WEBHOOK_UPDATE guild audit entry containing the previous and next webhook snapshots, the webhook’s channel in its metadata, and the supplied audit reason.

It emits Webhooks Update with the guild ID and the webhook’s previous channel ID to guild sessions that can view that channel.

20 requests per 10 seconds for each authenticated user and webhook ID, on the webhook:update::webhook_id bucket.

DELETE/v1/webhooks/{webhook_id}BotAudit reason

Permanently deletes a webhook and returns 204 with an empty body on success. The caller must be a member of the webhook’s guild and hold the MANAGE_WEBHOOKS permission at guild level and in the webhook’s channel. The operation accepts an audit reason.

Deletion emits a Webhooks Update.

FieldTypeDescription
webhook_idsnowflakeThe ID of the webhook to delete
StatusBodyCondition
204emptyWebhook was deleted
400error responsePath parameter is not a valid snowflake
4001error responseThe caller holds MANAGE_WEBHOOKS without an enrolled authenticator in an elevated-MFA guild
4032error responseCredential is a bearer token
4032error responseThe account has an outstanding required action
4032error responseThe caller is not a member of the webhook’s guild or lacks MANAGE_WEBHOOKS in the webhook’s channel
404error responseWebhook does not exist, returning UNKNOWN_WEBHOOK, or its guild does not resolve, returning UNKNOWN_GUILD

1 The missing-authenticator code is TWO_FACTOR_REQUIRED, returned only after Fluxer confirms the permission itself

2 ACCOUNT_SUSPICIOUS_ACTIVITY for an outstanding required action, MISSING_PERMISSIONS for a membership or permission failure, and ACCESS_DENIED otherwise

The operation removes the webhook, frees its guild and channel webhook slot, and records a WEBHOOK_DELETE guild audit entry with the deleted webhook, its channel in the entry metadata, and the supplied reason. It emits Webhooks Update with the guild and channel IDs to guild sessions that can view the channel.

20 requests per 10 seconds for each authenticated user and webhook ID, on the webhook:delete::webhook_id bucket.

The ten routes below take the matching webhook ID and token in their paths as the complete credential. The Authorization header is neither required nor read on any of them.

GET/v1/webhooks/{webhook_id}/{token}

Returns a token webhook object. No permission is evaluated.

FieldTypeDescription
webhook_idsnowflakeThe ID of the webhook to return
token1stringWebhook execution token (1-256 characters)

1 A token outside that length returns 400 INVALID_FORM_BODY. A well-formed token that does not match the webhook is reported as an unknown webhook, so valid and invalid webhook IDs are indistinguishable

StatusBodyCondition
200token webhook objectWebhook was returned
404error responseWebhook and token pair does not exist, returning UNKNOWN_WEBHOOK

100 requests per 10 seconds for each caller identity and webhook ID, on the webhook:read::webhook_id bucket.

PATCH/v1/webhooks/{webhook_id}/{token}

Updates a webhook and returns the modified token webhook object. This form cannot move the webhook and does not accept an audit reason.

A successful update emits a Webhooks Update.

FieldTypeDescription
webhook_idsnowflakeThe ID of the webhook to update
tokenstringWebhook execution token (1-256 characters)
FieldTypeDescription
name?stringReplacement webhook name (1-80 characters)
avatar?1?base64 stringBase64-encoded replacement avatar, or null to remove the current avatar

1 An omitted avatar leaves the stored hash unchanged and an explicit null clears it, exactly as in the authenticated form. The same encoding, size, and format rules as create webhook apply

StatusBodyCondition
200token webhook objectWebhook was updated
400error responsePath, body, or avatar is invalid
400error responseThe body has an unknown field
403error responseName is blocked or the avatar hash is banned, each returning CONTENT_BLOCKED
404error responseWebhook and token pair does not exist, returning UNKNOWN_WEBHOOK

The operation replaces the supplied fields and emits Webhooks Update with the guild and channel IDs to guild sessions that can view the channel. It records no guild audit entry.

20 requests per 10 seconds for each caller identity and webhook ID, on the webhook:update::webhook_id bucket.

DELETE/v1/webhooks/{webhook_id}/{token}

Permanently deletes a webhook and returns 204 with an empty body on success. The operation does not accept an audit reason.

Deletion emits a Webhooks Update.

FieldTypeDescription
webhook_idsnowflakeThe ID of the webhook to delete
tokenstringWebhook execution token (1-256 characters)
StatusBodyCondition
204emptyWebhook was deleted
404error responseWebhook and token pair does not exist, returning UNKNOWN_WEBHOOK

The operation removes the webhook, frees its guild and channel webhook slot, and emits Webhooks Update with the guild and channel IDs to guild sessions that can view the channel. It records no guild audit entry.

20 requests per 10 seconds for each caller identity and webhook ID, on the webhook:delete::webhook_id bucket.

POST/v1/webhooks/{webhook_id}/{token}

Creates a webhook-authored message in the webhook’s channel. When wait is true the created message is returned, and otherwise the operation returns 204 with an empty body.

The route refuses a call from the official web client. See origin refusal. A successful execution emits a Message Create Gateway Dispatch whether or not wait is true.

FieldTypeDescription
webhook_idsnowflakeThe ID of the webhook to execute
tokenstringWebhook execution token (1-256 characters)
FieldTypeDescription
wait?1booleanWhether to return the created message (default false)

1 Only the exact trimmed values true, True, and 1 are treated as true, and every other value, including TRUE and yes, is treated as false

The JSON representation of the request body is a webhook message body. Any request whose Content-Type does not contain multipart/form-data is read as JSON. Fluxer reads a body that is empty, whitespace-only, or unparseable as {}, and the request then fails as an empty message.

FieldTypeDescription
payload_json?1stringJSON encoded webhook message body
files[n]?2binaryDirect attachment at zero-based index n
content?3stringMessage content, merged into the payload
nonce?3stringClient-generated message identifier, merged into the payload
tts?3stringText-to-speech request, merged into the payload
flags?3stringMessage flags, merged into the payload

1 An absent payload_json is read as {}. A present value that is not a string, or that is not valid JSON, returns 400 INVALID_FORM_BODY with the validation code INVALID_JSON_IN_PAYLOAD_JSON

2 The index must be a decimal integer from 0 through the resolved max_attachments_per_message ceiling minus one, defaulting to 9. The indices may have gaps, and each index has at most one file. A field name beginning with files[ that does not match the exact form is rejected, and the legacy names file and file<n> are also accepted

3 Supplied as an ordinary form field, and it overrides the value in payload_json under the same name. Every other form field name is ignored

A multipart execution uploads every direct file as the webhook’s creating account, and as the deleted user account when that creator no longer exists. The upload requires VIEW_CHANNEL, SEND_MESSAGES, and ATTACH_FILES in the webhook’s channel, so a body with a direct file returns 403 MISSING_PERMISSIONS when the uploading account no longer holds them. A body with no direct file is unaffected.

An attachment metadata entry whose id matches a supplied file index supplies that file’s filename, title, description, flags, duration, and waveform. An entry whose id matches no supplied file and that has a filename returns 400 INVALID_FORM_BODY with the validation code NO_FILE_FOR_ATTACHMENT_METADATA. Two entries claiming the same file index return DUPLICATE_ATTACHMENT_IDS_NOT_ALLOWED. When the payload supplies no attachment metadata at all, one entry is synthesised for each file from its index and its own filename.

StatusBodyCondition
200message objectMessage was created and wait is true
204emptyMessage was created and wait is false or omitted
4001error responsePath, query, multipart framing, or message input is invalid
4001error responseThe resolved payload has no content, embed, or attachment
4001error responseThe content exceeds the effective maximum length
4001error responseThe embed or attachment count exceeds its effective ceiling
403error responseRequest has an official web client Origin, returning INVALID_API_ORIGIN
403error responseThe resolved content or embed text is blocked, returning CONTENT_BLOCKED
404error responseWebhook and token pair does not exist, returning UNKNOWN_WEBHOOK
404error responseThe target channel is missing or is not a guild text or voice channel, returning UNKNOWN_CHANNEL
404error responseThe referenced message does not exist in the webhook’s channel, returning UNKNOWN_MESSAGE

1 CANNOT_SEND_EMPTY_MESSAGE is returned as the 400 error code itself. Every other code below, including CONTENT_EXCEEDS_MAX_LENGTH, sits inside an INVALID_FORM_BODY body

ConditionError
Resolved payload has nothing sendableCANNOT_SEND_EMPTY_MESSAGE
Content longer than the effective maximumCONTENT_EXCEEDS_MAX_LENGTH
Payload the webhook message schema rejectsINVALID_MESSAGE_DATA
Embed or attachment count ceiling exceededTOO_MANY_EMBEDS or TOO_MANY_FILES
Forward reference omits channel_id or message_idFORWARD_REFERENCE_REQUIRES_CHANNEL_AND_MESSAGE
Forward reference accompanies content, embeds, or attachmentsFORWARD_MESSAGES_CANNOT_CONTAIN_CONTENT
Reply reference names a system messageCANNOT_REPLY_TO_SYSTEM_MESSAGE

The operation creates one webhook-authored message, attaches direct multipart files, and resolves forward snapshots and mentions under the allowed mentions policy.

A supplied username replaces the author name on this message. A supplied avatar_url is fetched for this message, and the webhook’s stored name and avatar do not change. When the avatar cannot be fetched, Fluxer creates the message without the override.

The operation updates channel state and search results and emits Message Create to sessions that can read the channel.

60 requests per minute for each caller identity and webhook ID, on the webhook:execute::webhook_id bucket, which is exempt from the global limit.

GET/v1/webhooks/{webhook_id}/{token}/messages/{message_id}

Returns a message that the webhook authored.

The route refuses a call from the official web client. See origin refusal.

FieldTypeDescription
webhook_idsnowflakeThe ID of the webhook that authored the message
tokenstringWebhook execution token (1-256 characters)
message_id1snowflakeThe ID of the message to return

1 The message is resolved within the webhook’s current channel, so a message the webhook created before it was moved to another channel is no longer reachable through this route

StatusBodyCondition
200message objectWebhook message was returned
403error responseRequest has an official web client Origin, returning INVALID_API_ORIGIN
403error responseThe message was authored by another webhook, a user, or a bot, returning MISSING_PERMISSIONS
404error responseWebhook and token pair does not exist, returning UNKNOWN_WEBHOOK
404error responseThe webhook has no channel target, returning UNKNOWN_CHANNEL
404error responseThe message does not exist in that channel, returning UNKNOWN_MESSAGE

60 requests per minute for each caller identity and webhook ID, on the webhook:message_get::webhook_id bucket, which is exempt from the global limit.

PATCH/v1/webhooks/{webhook_id}/{token}/messages/{message_id}

Updates a message that the webhook authored and returns the modified message.

The route refuses a call from the official web client. See origin refusal. A successful edit emits a Message Update.

FieldTypeDescription
webhook_idsnowflakeThe ID of the webhook that authored the message
tokenstringWebhook execution token (1-256 characters)
message_idsnowflakeThe ID of the message to update

The body is a webhook message edit body.

StatusBodyCondition
200message objectWebhook message was updated
400error responsePath, body, embed, flag, or mention input is invalid
4001error responseThe body leaves the message empty
400error responseThe content or embed count exceeds its effective ceiling
400error responseThe target message is not an editable type
400error responseThe webhook’s stored channel no longer resolves to a guild channel
403error responseRequest has an official web client Origin, returning INVALID_API_ORIGIN
403error responseThe message was authored by another webhook, a user, or a bot, returning MISSING_PERMISSIONS
403error responseThe replacement content or embed text is blocked, returning CONTENT_BLOCKED
404error responseWebhook and token pair does not exist, returning UNKNOWN_WEBHOOK
404error responseThe message does not exist in the webhook’s channel, returning UNKNOWN_MESSAGE

1 A flags member of any value, including zero, satisfies the non-empty check, so {} is rejected while {"flags": 0} is accepted

ConditionError
Target message type cannot be edited400 CANNOT_MODIFY_SYSTEM_WEBHOOK
Stored channel no longer resolves to a guild channel400 CANNOT_EXECUTE_ON_DM
Body has no visible content, no non-empty embeds, and no flags400 CANNOT_SEND_EMPTY_MESSAGE
Content longer than the effective maximum400 CONTENT_EXCEEDS_MAX_LENGTH
Anything else400 INVALID_FORM_BODY

CONTENT_EXCEEDS_MAX_LENGTH is a validation code inside a 400 INVALID_FORM_BODY body.

The operation replaces the supplied fields, and a content change marks the message edited. An edit does not re-extract mentions. The stored mention lists are kept, and allowed_mentions is accepted and not read. Supplying embeds replaces the complete embed collection and revalidates every attachment reference the embeds make. The operation emits Message Update to sessions that can read the channel.

30 requests per minute for each caller identity and webhook ID, on the webhook:message_edit::webhook_id bucket, which is exempt from the global limit.

DELETE/v1/webhooks/{webhook_id}/{token}/messages/{message_id}

Deletes a message that the webhook authored and returns 204 with an empty body on success.

The route refuses a call from the official web client. See origin refusal. Deletion emits a Message Delete.

FieldTypeDescription
webhook_idsnowflakeThe ID of the webhook that authored the message
tokenstringWebhook execution token (1-256 characters)
message_idsnowflakeThe ID of the message to delete
StatusBodyCondition
204emptyWebhook message was deleted
400error responsePath parameters are invalid
400error responseThe webhook’s stored channel no longer resolves to a guild channel, returning CANNOT_EXECUTE_ON_DM
403error responseRequest has an official web client Origin, returning INVALID_API_ORIGIN
403error responseThe message was authored by another webhook, a user, or a bot, returning MISSING_PERMISSIONS
404error responseWebhook and token pair does not exist, returning UNKNOWN_WEBHOOK
404error responseThe message does not exist in the webhook’s channel, returning UNKNOWN_MESSAGE

The operation permanently removes the message, purges its attachments, and removes it from search. It emits Message Delete to sessions that can read the channel. Deleting a pinned message also removes the pin and emits Channel Pins Update.

30 requests per minute for each caller identity and webhook ID, on the webhook:message_delete::webhook_id bucket, which is exempt from the global limit.

POST/v1/webhooks/{webhook_id}/{token}/github

Accepts a GitHub callback and creates one formatted message when the event renders. The route always returns 204 with an empty body, whether or not a message was created.

A rendered event emits a Message Create.

FieldTypeDescription
webhook_idsnowflakeThe ID of the webhook to execute
tokenstringWebhook execution token (1-256 characters)
FieldTypeDescription
X-GitHub-Event?1stringGitHub event type
X-GitHub-Delivery?2stringDelivery identifier used for deduplication

1 Neither header is validated and neither is bounded in length. An absent header is read as the empty string, which matches no event type and therefore renders nothing

2 An absent or empty delivery identifier disables deduplication for that request, so the callback is processed and no dedup marker is recorded

The body is a GitHub callback object. A body the schema rejects returns 400 INVALID_FORM_BODY.

A callback that renders nothing, and one whose message creation fails, both leave the delivery identifier free for a later retry.

StatusBodyCondition
204emptyCallback was accepted, was not renderable, or repeated a delivery within the deduplication window
403error responseRendered embed text is blocked, returning CONTENT_BLOCKED
404error responseWebhook and token pair does not exist, returning UNKNOWN_WEBHOOK
404error responseThe target channel is missing or is not a guild text or voice channel, returning UNKNOWN_CHANNEL

A renderable event creates one message with exactly one embed, authored under the fixed name GitHub with the bundled GitHub avatar, and emits Message Create to sessions that can read the channel. Mention parsing is disabled for the created message, so no mention in a commit message, issue title, or comment body notifies anyone.

An unrecognised event type, a recognised type whose required fields or action are absent, and a repeated non-empty delivery identifier all create nothing and emit no Dispatch.

200 requests per minute for each caller identity and webhook ID, on the webhook:github::webhook_id bucket, which is exempt from the global limit.

POST/v1/webhooks/{webhook_id}/{token}/slack

Accepts a Slack-compatible callback, converts it to the Fluxer message contract, and creates one webhook-authored message.

A successful callback emits a Message Create.

FieldTypeDescription
webhook_idsnowflakeThe ID of the webhook to execute
tokenstringWebhook execution token (1-256 characters)

The body is a Slack callback object.

StatusBodyCondition
200the literal string okCallback message was created
400error responsePath or Slack callback is invalid
4001error responseThe conversion yields neither content nor an embed
4001error responseThe resulting content exceeds the effective maximum length
4001error responseThe converted embed count exceeds its effective ceiling
403error responseConverted content or embed text is blocked, returning CONTENT_BLOCKED
404error responseWebhook and token pair does not exist, returning UNKNOWN_WEBHOOK
404error responseThe target channel is missing or is not a guild text or voice channel, returning UNKNOWN_CHANNEL

1 The error code is CANNOT_SEND_EMPTY_MESSAGE for a conversion that yields nothing, CONTENT_EXCEEDS_MAX_LENGTH for over-length content, and INVALID_FORM_BODY with the validation code TOO_MANY_EMBEDS for the embed ceiling

The converted callback creates one webhook-authored message with the converted content and embeds, and emits Message Create to sessions that can read the channel.

A supplied username replaces the author name on that message. A supplied icon_url that parses as an absolute URL is fetched through the media boundary and stored as the message avatar, and the stored webhook name and avatar do not change. When the URL cannot be fetched, the callback still succeeds and the message has no avatar override.

The webhook execution default applies, and every mention in the converted content is suppressed. The callback has no nonce, so a repeated callback creates a second message.

60 requests per minute for each caller identity and webhook ID, on the webhook:execute::webhook_id bucket, which is exempt from the global limit and is the same bucket execute webhook consumes.

POST/v1/webhooks/{webhook_id}/{token}/instatus

Accepts an Instatus callback and creates one formatted message when the callback renders. The route always returns 204 with an empty body, whether or not a message was created.

A rendered callback emits a Message Create.

FieldTypeDescription
webhook_idsnowflakeThe ID of the webhook to execute
tokenstringWebhook execution token (1-256 characters)

The body is an Instatus callback object. A body the schema rejects returns 400 INVALID_FORM_BODY.

A callback that renders nothing, and one whose message creation fails, both leave the identifier free for a later retry.

StatusBodyCondition
204emptyCallback was accepted, was not renderable, or repeated a callback within the deduplication window
403error responseRendered embed text is blocked, returning CONTENT_BLOCKED
404error responseWebhook and token pair does not exist, returning UNKNOWN_WEBHOOK
404error responseThe target channel is missing or is not a guild text or voice channel, returning UNKNOWN_CHANNEL

An incident with a non-empty name, a maintenance item with a non-empty name, or a component transition creates one message with exactly one embed, authored under the fixed name Instatus with the bundled Instatus avatar. Fluxer emits Message Create to sessions that can read the channel.

Mention parsing is disabled for the created message, so no mention in a provider-supplied name or update body notifies anyone. A callback that selects none of those renderings creates nothing and emits no Dispatch. A repeated callback inside the deduplication window does the same.

200 requests per minute for each caller identity and webhook ID, on the webhook:instatus::webhook_id bucket, which is exempt from the global limit.