Skip to content
Developers
Menu

API reference

Objects

Every shape the reference links to, in alphabetical order. Gateway events carry the same shapes; see Gateway.

AboutMe

Type: string

About Me, plain text shown as written (no markdown yet). Line endings become \n, the text is trimmed, three or more line breaks in a row become two, and at most 10 line breaks are allowed. Then at most 190 characters (code points), each line free of control and invisible formatting characters. Null or an empty string clears it.

AllowedMentions

Type: object

Only replied_user is supported. Mentions written in the content ping as described on Message.mentions whatever this says.

Fields of AllowedMentions
FieldTypeDescription
replied_user boolean

Whether a reply pings the author of the message it replies to, as on Discord (the web client sends true unless the person turns the mention off). The author is then in mentions, counts toward their mention badge and is notified, under the usual rules: they must be able to view the channel, a block stops the notification, and nobody is pinged by replying to their own message or to a webhook. The choice is kept when the reply is edited.

default false

Example AllowedMentions
{
  "replied_user": false
}

Attachment

Type: object

A file attached to a message. url and thumbnail_url are signed and expire (see media.attachment_url_ttl_seconds); fetch the message again for fresh ones. Show a file whose spoiler is true blurred until clicked. Blur an image whose sensitive is explicit as the viewer's sensitive media settings say (see AttachmentSensitive).

Fields of Attachment
FieldTypeDescription
idRequired ID
filenameRequired string

The name to show, without any path. A name starting with SPOILER_ is a spoiler, as on Discord. Re-encoded WebP images get a .jpg or .png name.

descriptionRequired string or null

Alt text, up to 1024 characters.

content_typeRequired string

The type the file is served with, decided from its content. Active content (HTML, SVG, XML, scripts) is application/octet-stream.

sizeRequired integer

at least 1

urlRequired string or null

Null when quarantined. On a separate media host or the storage bucket, never the app's origin.

thumbnail_urlRequired string or null

A still preview of at most 512 by 512 pixels, for images larger than that and for animated GIFs.

widthRequired integer or null

Images only.

heightRequired integer or null

Images only.

placeholderRequired string or null

A BlurHash (4 by 3 components) to show while the image loads. Images only.

spoilerRequired boolean
riskRequired AttachmentRisk
sensitiveRequired AttachmentSensitive or null

What the instance's image classifier found in an image: explicit (nudity or sexual content, drawn or photographed), suggestive (revealing but not explicit) or none. An animated image is judged by its first, middle and last frames and takes the highest level. Null when the file was never classified: anything that is not a still or animated image, files sent before classification existed or while the sensitive_media flag was inactive, files that could not be read for it, and quarantined files. A file whose classification did not answer in time is sent as pending and classified in the background; the message then arrives again as message_update with the level set. Clients treat pending like explicit until then (reports never carry it). Clients blur only explicit and pending images, never block them, and only where the sensitive_media flag is on (a server's features; in direct messages, the viewer's own flags). Inside an age-restricted channel nothing is blurred for a viewer who passed its age gate. Otherwise the viewer's privacy settings decide: sensitive_media_servers in servers, sensitive_media_friend_dms for direct messages from friends and sensitive_media_other_dms for other direct messages. The viewer's own uploads are never blurred for them. With sensitive_media_locked every explicit and pending image blurs. Public web pages never show explicit, suggestive or pending images.

One of none, suggestive, explicit, pending

quarantinedRequired boolean

Hidden by moderators or the trust and safety team; nothing about the file can be shown.

Example Attachment
{
  "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "filename": "string",
  "description": "string",
  "content_type": "string",
  "size": 1,
  "url": "string",
  "thumbnail_url": "string",
  "width": 0,
  "height": 0,
  "placeholder": "string",
  "spoiler": false,
  "risk": "none",
  "sensitive": "none",
  "quarantined": false
}

AttachmentRef

Type: object

Fields of AttachmentRef
FieldTypeDescription
upload_idRequired ID

A finalized attachment upload of the caller's for this channel, not used before.

filename string

A display name to use instead of the uploaded one; the extension stays.

description string

Alt text, up to 1024 characters without control characters other than newlines.

spoiler boolean

Same as a filename starting with SPOILER_.

Example AttachmentRef
{
  "upload_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "filename": "string",
  "description": "string",
  "spoiler": false
}

AttachmentRisk

Type: string

Whether opening the file could harm the device, decided by the server when the file is sent. risky: the name says it runs or installs something, or opens as a web page or shortcut (executables, installers, scripts, disk images, Java and Android packages, Office files that can hold macros, HTML, SVG and XML files, shortcuts). mismatch: the name does not match the content, such as invoice.pdf.exe, or a .png or .pdf whose bytes are a program, a script or a web page. Files sent before the classification are judged by name only. Always none for a quarantined file. Clients warn before downloading a risky or mismatch file only where the risky_files flag is on: in a server's features, and in direct messages in the viewer's own features.

One of none, risky, mismatch

AttachmentSensitive

Type: string

What the instance's image classifier found in an image: explicit (nudity or sexual content, drawn or photographed), suggestive (revealing but not explicit) or none. An animated image is judged by its first, middle and last frames and takes the highest level. Null when the file was never classified: anything that is not a still or animated image, files sent before classification existed or while the sensitive_media flag was inactive, files that could not be read for it, and quarantined files. A file whose classification did not answer in time is sent as pending and classified in the background; the message then arrives again as message_update with the level set. Clients treat pending like explicit until then (reports never carry it). Clients blur only explicit and pending images, never block them, and only where the sensitive_media flag is on (a server's features; in direct messages, the viewer's own flags). Inside an age-restricted channel nothing is blurred for a viewer who passed its age gate. Otherwise the viewer's privacy settings decide: sensitive_media_servers in servers, sensitive_media_friend_dms for direct messages from friends and sensitive_media_other_dms for other direct messages. The viewer's own uploads are never blurred for them. With sensitive_media_locked every explicit and pending image blurs. Public web pages never show explicit, suggestive or pending images.

One of none, suggestive, explicit, pending

AutoModerationAction

Type: object

Fields of AutoModerationAction
FieldTypeDescription
typeRequired string

One of block_message, send_alert_message, timeout

metadataRequired AutoModerationActionMetadata
Example AutoModerationAction
{
  "type": "block_message",
  "metadata": {
    "custom_message": "string",
    "channel_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
    "duration_seconds": 1
  }
}

AutoModerationActionMetadata

Type: object

Fields of AutoModerationActionMetadata
FieldTypeDescription
custom_message string

block_message: shown to the sender under the notice.

at most 150 characters

channel_id ID

send_alert_message: a text channel of the community, where the member saving the rule can view and send messages.

duration_seconds integer

timeout: how long; only on keyword and mention_spam rules.

at least 1; at most 2419200

Example AutoModerationActionMetadata
{
  "custom_message": "string",
  "channel_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "duration_seconds": 1
}

AutoModerationAlert

Type: object

What an auto_moderation_action alert message reports.

Fields of AutoModerationAlert
FieldTypeDescription
rule_idRequired ID
rule_nameRequired string
trigger_typeRequired AutoModerationTriggerType
channel_idRequired ID

Where the member sent or edited the message.

message_idRequired string or null

The message, when it was posted (an alert-only rule) or for an edit; null when a new message was blocked.

blockedRequired boolean
editRequired boolean

True when the content was an edit of an existing message.

matched_keywordRequired string or null

The keyword, pattern or preset entry that matched.

matched_contentRequired string or null

The matched text, folded. Null for a bot without the message content permission, and when content_hidden or content_removed is true.

contentRequired string or null

What the member sent or edited. Null for a bot without the message content permission, when content_hidden is true, and when content_removed is true. Alerts from before this field carried the text in the message content.

content_hiddenRequired boolean

True when the alert never held the text, file names or matched text: the source channel is not visible to every member, and it is not the alert channel or a public thread in it, so some readers of the alert channel might not be allowed to read it. Moderators who can see the source channel find the text in the moderation log and the execution event.

content_removedRequired boolean

True when the text, file names and matched text were removed, 90 days after the alert or when the member deleted their content.

attachmentsRequired array of string

File names that were checked with the message. Empty for a bot without the message content permission, and when content_hidden or content_removed is true.

timeout_secondsRequired integer or null

The timeout this rule applied, if any.

timeout_untilRequired string (date-time) or null
Example AutoModerationAlert
{
  "rule_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "rule_name": "string",
  "trigger_type": "keyword",
  "channel_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "message_id": "string",
  "blocked": false,
  "edit": false,
  "matched_keyword": "string",
  "matched_content": "string",
  "content": "string",
  "content_hidden": false,
  "content_removed": false,
  "attachments": [
    "string"
  ],
  "timeout_seconds": 0,
  "timeout_until": "2026-10-15T09:00:00Z"
}

AutoModerationBlock

Type: object

Why AutoMod refused a message; only on auto_moderation_blocked errors.

Fields of AutoModerationBlock
FieldTypeDescription
trigger_typeRequired AutoModerationTriggerType
custom_messageRequired string or null

The community's own words to show the sender under the notice.

Example AutoModerationBlock
{
  "trigger_type": "keyword",
  "custom_message": "string"
}

AutoModerationRule

Type: object

An AutoMod rule. Also the payload of the auto_moderation_rule_* gateway events.

Fields of AutoModerationRule
FieldTypeDescription
idRequired ID
community_idRequired ID
nameRequired string

at least 1 characters; at most 100 characters

creator_idRequired string or null
updated_byRequired string or null

Who last saved the rule. Its timeouts apply only to members ranked below this member, while they hold Moderate Members.

event_typeRequired string

One of message_send

trigger_typeRequired AutoModerationTriggerType
trigger_metadataRequired AutoModerationTriggerMetadata
actionsRequired array of AutoModerationAction

at least 1 items; at most 3 items

enabledRequired boolean
exempt_rolesRequired array of ID

Members with any of these roles are not checked (the @everyone role exempts everyone).

at most 20 items

exempt_channelsRequired array of ID

Text channels or categories not checked; a category covers its channels and a channel its threads.

at most 50 items

created_atRequired string (date-time)
updated_atRequired string (date-time)
Example AutoModerationRule
{
  "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "name": "string",
  "creator_id": "string",
  "updated_by": "string",
  "event_type": "message_send",
  "trigger_type": "keyword",
  "trigger_metadata": {
    "keyword_filter": [
      "string"
    ],
    "regex_patterns": [
      "string"
    ],
    "presets": [
      "profanity"
    ],
    "allow_list": [
      "string"
    ],
    "mention_total_limit": 1,
    "mention_raid_protection_enabled": false
  },
  "actions": [
    {
      "type": "block_message",
      "metadata": {
        "custom_message": "string",
        "channel_id": {},
        "duration_seconds": 1
      }
    }
  ],
  "enabled": false,
  "exempt_roles": [
    "01J9ZQ3V5K8M2N4P6R8T0W2Y4A"
  ],
  "exempt_channels": [
    "01J9ZQ3V5K8M2N4P6R8T0W2Y4A"
  ],
  "created_at": "2026-10-15T09:00:00Z",
  "updated_at": "2026-10-15T09:00:00Z"
}

AutoModerationRuleList

Type: object

Fields of AutoModerationRuleList
FieldTypeDescription
rulesRequired array of AutoModerationRule
Example AutoModerationRuleList
{
  "rules": [
    {
      "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "name": "string",
      "creator_id": "string",
      "updated_by": "string",
      "event_type": "message_send",
      "trigger_type": "keyword",
      "trigger_metadata": {
        "keyword_filter": [],
        "regex_patterns": [],
        "presets": [],
        "allow_list": [],
        "mention_total_limit": 1,
        "mention_raid_protection_enabled": false
      },
      "actions": [
        {
          "type": "block_message",
          "metadata": {}
        }
      ],
      "enabled": false,
      "exempt_roles": [
        "01J9ZQ3V5K8M2N4P6R8T0W2Y4A"
      ],
      "exempt_channels": [
        "01J9ZQ3V5K8M2N4P6R8T0W2Y4A"
      ],
      "created_at": "2026-10-15T09:00:00Z",
      "updated_at": "2026-10-15T09:00:00Z"
    }
  ]
}

AutoModerationTriggerMetadata

Type: object

Only the fields of the rule's trigger type are kept; others are dropped. Keywords and allow list entries are case-insensitive and folded like messages: cat matches the whole word, cat* a word starting with it, *cat a word ending with it, *cat* anywhere.

Fields of AutoModerationTriggerMetadata
FieldTypeDescription
keyword_filter array of string

keyword rules: up to 1000 keywords of 1-60 characters; * only at the start or end. Each entry may fold to at most 240 bytes, a rule's keywords and allow list together to 80 KiB, and a community's keyword and preset rules together to 192 KiB; past that the save is refused.

at most 1000 items

regex_patterns array of string

keyword rules: up to 10 Go (RE2) regular expressions of 1-260 characters, matched case-insensitively against the folded text. A pattern that matches empty text, or that is too complex (300 program instructions, 400 per rule, 400 per community), is refused.

at most 10 items

presets array of string

keyword_preset rules: the built-in lists to use, at least one.

allow_list array of string

Entries that never trigger the rule, with the keyword syntax: up to 100 for keyword rules and 1000 for keyword_preset rules. A match inside an allowed match is ignored.

at most 1000 items

mention_total_limit integer

mention_spam rules: the most distinct user and role mentions a message may have. Default 20.

at least 1; at most 50

mention_raid_protection_enabled boolean

mention_spam rules: also refuse mention-heavy messages while several members send them at once.

Example AutoModerationTriggerMetadata
{
  "keyword_filter": [
    "string"
  ],
  "regex_patterns": [
    "string"
  ],
  "presets": [
    "profanity"
  ],
  "allow_list": [
    "string"
  ],
  "mention_total_limit": 1,
  "mention_raid_protection_enabled": false
}

AutoModerationTriggerType

Type: string

One of keyword, keyword_preset, mention_spam, spam

Badge

Type: object

A badge an account holds. Show label as the text alternative; the tier is never conveyed by the icon alone.

Fields of Badge
FieldTypeDescription
keyRequired BadgeKey
nameRequired string
descriptionRequired string
labelRequired string

The name with the tier, such as "Bug hunter, Gold".

kindRequired string

One of automatic, granted, paid

issuerRequired string

The identity domain of the instance that issued it.

tierRequired object or null
tier.keyRequired string
tier.nameRequired string
tier.levelRequired integer

at least 1

next_tierRequired object or null
next_tier.keyRequired string
next_tier.nameRequired string
next_tier.requirementRequired string
activeRequired boolean

False for a frozen badge (a supporter whose plan ended); show it as inactive.

hiddenRequired boolean

Only ever true in the holder's own and admin lists.

hideableRequired boolean
granted_atRequired string (date-time) or null
expires_atRequired string (date-time) or null
organizationRequired OrganizationRef or null

A verified organization, for its badge.

domainsRequired array of string

For verified_domain, the shown domains.

Example Badge
{
  "key": "staff",
  "name": "string",
  "description": "string",
  "label": "string",
  "kind": "automatic",
  "issuer": "string",
  "tier": {
    "key": "string",
    "name": "string",
    "level": 1
  },
  "next_tier": {
    "key": "string",
    "name": "string",
    "requirement": "string"
  },
  "active": false,
  "hidden": false,
  "hideable": false,
  "granted_at": "2026-10-15T09:00:00Z",
  "expires_at": "2026-10-15T09:00:00Z",
  "organization": {
    "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
    "name": "string",
    "domain": "string"
  },
  "domains": [
    "string"
  ]
}

BadgeCatalog

Type: object

Fields of BadgeCatalog
FieldTypeDescription
badgesRequired array of BadgeDefinition
Example BadgeCatalog
{
  "badges": [
    {
      "key": "staff",
      "name": "string",
      "description": "string",
      "kind": "automatic",
      "lapse": "keep",
      "hideable": false,
      "owner_only": false,
      "order": 0,
      "tiers": [
        {
          "key": "string",
          "name": "string",
          "level": 1,
          "requirement": "string"
        }
      ]
    }
  ]
}

BadgeDefinition

Type: object

Fields of BadgeDefinition
FieldTypeDescription
keyRequired BadgeKey
nameRequired string
descriptionRequired string
kindRequired string

One of automatic, granted, paid

lapseRequired string

One of keep, freeze, drop

hideableRequired boolean
owner_onlyRequired boolean

Only the instance owner grants and revokes it.

orderRequired integer

Display order; profiles list badges in this order.

tiersRequired array of object
tiers[].keyRequired string
tiers[].nameRequired string
tiers[].levelRequired integer

at least 1

tiers[].requirementRequired string
Example BadgeDefinition
{
  "key": "staff",
  "name": "string",
  "description": "string",
  "kind": "automatic",
  "lapse": "keep",
  "hideable": false,
  "owner_only": false,
  "order": 0,
  "tiers": [
    {
      "key": "string",
      "name": "string",
      "level": 1,
      "requirement": "string"
    }
  ]
}

BadgeKey

Type: string

One of staff, verified_organization, verified_domain, partner, moderator, supporter, early_supporter, bug_hunter, event_participant, bot_developer

Ban

Type: object

Fields of Ban
FieldTypeDescription
userRequired PublicUser
reasonRequired string or null
banned_byRequired string or null

The user who last set the ban. Null once that account is deleted.

created_atRequired string (date-time)
Example Ban
{
  "user": {
    "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
    "username": "string",
    "display_name": "string",
    "kind": "user",
    "avatar": "string",
    "avatar_dark": "string"
  },
  "reason": "string",
  "banned_by": "string",
  "created_at": "2026-10-15T09:00:00Z"
}

BannerColor

Type: integer

The profile banner color as 0xRRGGBB, shown when there is no banner image. Null for the default.

at least 0; at most 16777215

BanPage

Type: object

Fields of BanPage
FieldTypeDescription
bansRequired array of Ban
nextRequired string or null

Pass as after to get the next page. Null on the last page.

Example BanPage
{
  "bans": [
    {
      "user": {
        "id": {},
        "username": "string",
        "display_name": "string",
        "kind": {},
        "avatar": {},
        "avatar_dark": {}
      },
      "reason": "string",
      "banned_by": "string",
      "created_at": "2026-10-15T09:00:00Z"
    }
  ],
  "next": "string"
}

BanRequest

Type: object

Fields of BanRequest
FieldTypeDescription
reason string or null

Shown to members with Ban Members. Trimmed; empty or null means none. No control or invisible formatting characters.

at most 512 characters

Example BanRequest
{
  "reason": "string"
}

Channel

Type: object

Fields of Channel
FieldTypeDescription
idRequired ID
community_idRequired ID
nameRequired string
kindRequired ChannelKind
positionRequired integer

Sort key within the channel's group: the categories, or the channels sharing a parent_id. See the channels tag for the full display order.

parent_idRequired string or null

The category this channel is in, or null. Always null for a category. For a thread, the text channel it belongs to.

topicRequired ChannelTopic

Empty when the channel has none. Only text channels have one. Visible to everyone who can view the channel, in lists, ready and channel_update.

created_atRequired string (date-time)
overwritesRequired array of Overwrite

Permission overwrites, role overwrites first, each group ordered by ID. Clients drop a member's overwrites when the member leaves and a role's when the role is deleted; the server removes them too. Always empty for a thread, which uses its parent's.

owner_id ID

Threads only. Who started the thread; absent if that account no longer exists.

message_count integer

Threads only. Messages sent in the thread, not counting system messages or deleted ones.

at least 0

member_count integer

Threads only. How many members the thread has.

at least 0

thread_metadata ThreadMetadata
user_limit integer

Voice channels only. How many people can be in it at once; 0 means no limit.

at least 0; at most 99

bitrate integer

Voice channels only. The audio bitrate clients send, in bits per second.

at least 8000; at most 96000

age_restricted boolean

Text and voice channels only (absent on categories and threads; a thread follows its parent). An age-restricted channel, Discord's NSFW channel: clients show an age gate ("Are you 18 or older?") the first time a viewer opens it on a device and hide its messages until they continue, never let an account with sensitive_media_locked past it, and do not blur sensitive images inside it for viewers who passed it. It cannot be published as a public web page; turning it on unpublishes the channel.

Example Channel
{
  "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "name": "string",
  "kind": "text",
  "position": 0,
  "parent_id": "string",
  "topic": "string",
  "created_at": "2026-10-15T09:00:00Z",
  "overwrites": [
    {
      "type": "role",
      "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "allow": "2748678791",
      "deny": "2748678791"
    }
  ],
  "owner_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "message_count": 0,
  "member_count": 0,
  "thread_metadata": {
    "archived": false,
    "auto_archive_duration": 60,
    "archive_timestamp": "2026-10-15T09:00:00Z",
    "locked": false,
    "invitable": false,
    "create_timestamp": "2026-10-15T09:00:00Z"
  },
  "user_limit": 0,
  "bitrate": 8000,
  "age_restricted": false
}

ChannelKind

Type: string

One of text, voice, category, public_thread, private_thread

ChannelList

Type: object

Fields of ChannelList
FieldTypeDescription
channelsRequired array of Channel
Example ChannelList
{
  "channels": [
    {
      "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "name": "string",
      "kind": "text",
      "position": 0,
      "parent_id": "string",
      "topic": "string",
      "created_at": "2026-10-15T09:00:00Z",
      "overwrites": [
        {
          "type": "role",
          "id": {},
          "allow": {},
          "deny": {}
        }
      ],
      "owner_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "message_count": 0,
      "member_count": 0,
      "thread_metadata": {
        "archived": false,
        "auto_archive_duration": 60,
        "archive_timestamp": "2026-10-15T09:00:00Z",
        "locked": false,
        "invitable": false,
        "create_timestamp": "2026-10-15T09:00:00Z"
      },
      "user_limit": 0,
      "bitrate": 8000,
      "age_restricted": false
    }
  ]
}

ChannelPinsUpdate

Type: object

Payload of the channel_pins_update gateway event, sent when a message in the channel is pinned or unpinned, or a pinned message is deleted. community_id is absent in a DM.

Fields of ChannelPinsUpdate
FieldTypeDescription
channel_idRequired ID
community_id ID
last_pin_timestampRequired string (date-time) or null

When the newest remaining pin was made; null when nothing is pinned.

Example ChannelPinsUpdate
{
  "channel_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "last_pin_timestamp": "2026-10-15T09:00:00Z"
}

ChannelPosition

Type: object

Fields of ChannelPosition
FieldTypeDescription
idRequired ID
positionRequired integer
parent_idRequired string or null
Example ChannelPosition
{
  "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "position": 0,
  "parent_id": "string"
}

ChannelPositions

Type: object

Gateway channel_positions: the position and parent of every channel the recipient can see, after a reorder.

Fields of ChannelPositions
FieldTypeDescription
community_idRequired ID
channelsRequired array of ChannelPosition
Example ChannelPositions
{
  "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "channels": [
    {
      "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "position": 0,
      "parent_id": "string"
    }
  ]
}

ChannelState

Type: object

A channel or thread with the caller's state in it. member is set on a thread the caller has joined. last_message_id and last_pin_timestamp are null without Read Message History in the channel (in the parent for a thread).

Fields of ChannelState
FieldTypeDescription
idRequired ID
community_idRequired ID
nameRequired string
kindRequired ChannelKind
positionRequired integer
parent_idRequired string or null
topicRequired ChannelTopic
created_atRequired string (date-time)
overwritesRequired array of Overwrite
owner_id ID
message_count integer

at least 0

member_count integer

at least 0

thread_metadata ThreadMetadata
last_message_idRequired ID or null

A ULID. Sorts lexically in creation order.

last_read_message_idRequired ID or null

A ULID. Sorts lexically in creation order.

mention_countRequired integer

at least 0

last_pin_timestampRequired string (date-time) or null
member ThreadMember
Example ChannelState
{
  "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "name": "string",
  "kind": "text",
  "position": 0,
  "parent_id": "string",
  "topic": "string",
  "created_at": "2026-10-15T09:00:00Z",
  "overwrites": [
    {
      "type": "role",
      "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "allow": "2748678791",
      "deny": "2748678791"
    }
  ],
  "owner_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "message_count": 0,
  "member_count": 0,
  "thread_metadata": {
    "archived": false,
    "auto_archive_duration": 60,
    "archive_timestamp": "2026-10-15T09:00:00Z",
    "locked": false,
    "invitable": false,
    "create_timestamp": "2026-10-15T09:00:00Z"
  },
  "last_message_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "last_read_message_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "mention_count": 0,
  "last_pin_timestamp": "2026-10-15T09:00:00Z",
  "member": {
    "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
    "user_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
    "join_timestamp": "2026-10-15T09:00:00Z",
    "flags": 0,
    "member": {
      "user": {},
      "nickname": "string",
      "avatar": {},
      "avatar_dark": {},
      "banner": {},
      "bio": "string",
      "pronouns": "string",
      "roles": [],
      "joined_at": "2026-10-15T09:00:00Z",
      "timeout_until": "2026-10-15T09:00:00Z",
      "bot_presence_intent": false
    }
  }
}

ChannelTopic

Type: string

The channel's description (Discord's channel topic). Line breaks are normalized to \n (including U+2028 and U+2029) and surrounding whitespace is trimmed; then at most 1024 characters, where every line follows the same rules as names: no control characters other than the line break, and no bidirectional overrides, isolates or other invisible formatting characters (ZWJ and ZWNJ only inside emoji and words, as in names).

at most 1024 characters

Command

Type: object

Fields of Command
FieldTypeDescription
idRequired ID
bot_idRequired ID
community_idRequired ID or null

Null for a global command.

nameRequired string

pattern ^[a-z0-9_-]{1,32}$

descriptionRequired string
optionsRequired array of CommandOption

at most 25 items

created_atRequired string (date-time)
updated_atRequired string (date-time)
Example Command
{
  "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "bot_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "name": "string",
  "description": "string",
  "options": [
    {
      "name": "string",
      "description": "string",
      "type": "string",
      "required": false,
      "min_length": 1,
      "max_length": 1,
      "min_value": 0,
      "max_value": 0
    }
  ],
  "created_at": "2026-10-15T09:00:00Z",
  "updated_at": "2026-10-15T09:00:00Z"
}

CommandList

Type: object

Fields of CommandList
FieldTypeDescription
commandsRequired array of Command
Example CommandList
{
  "commands": [
    {
      "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "bot_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "name": "string",
      "description": "string",
      "options": [
        {
          "name": "string",
          "description": "string",
          "type": {},
          "required": false,
          "min_length": 1,
          "max_length": 1,
          "min_value": 0,
          "max_value": 0
        }
      ],
      "created_at": "2026-10-15T09:00:00Z",
      "updated_at": "2026-10-15T09:00:00Z"
    }
  ]
}

CommandOption

Type: object

Fields of CommandOption
FieldTypeDescription
nameRequired string

pattern ^[a-z0-9_-]{1,32}$

descriptionRequired string

1-100 characters.

typeRequired CommandOptionType
requiredRequired boolean

Required options must come before optional ones.

min_length integer

Strings only.

at least 1; at most 4000

max_length integer

Strings only.

at least 1; at most 4000

min_value integer

Integers only.

max_value integer

Integers only.

Example CommandOption
{
  "name": "string",
  "description": "string",
  "type": "string",
  "required": false,
  "min_length": 1,
  "max_length": 1,
  "min_value": 0,
  "max_value": 0
}

CommandOptionType

Type: string

One of string, integer, boolean, user, channel, role

Community

Type: object

Shown to people as a "server".

Fields of Community
FieldTypeDescription
idRequired ID
nameRequired string
owner_idRequired ID
iconRequired ImageHash or null
icon_darkRequired ImageHash or null

The optional dark mode icon (same icons kind as icon). Clients show it instead of icon when the viewer uses a dark theme; null means use icon. Push notifications and other places that cannot follow the theme use icon.

bannerRequired ImageHash or null
mfa_levelRequired integer

1 when "Require 2FA for moderator actions" is on: members without MFA (for a bot, its owner) lose Administrator, Kick, Ban, Moderate Members, Manage Messages, Manage Channels, Manage Roles, Manage Community, Manage Webhooks, Manage Threads, Mute, Deafen and Move Members, and actions that need them answer 403 moderation_mfa_required.

One of 0, 1

default_notification_levelRequired DefaultNotificationLevel
bot_presence_allowedRequired boolean

Whether bots with the presence intent receive this community's presence (true for new communities, like Discord's unverified bots). Changed with Manage Community; when false, bots get no presence_update or presence_list for this community.

tierRequired Tier
limitsRequired CommunityLimits
perksRequired array of Perk
featuresRequired array of FeatureKey

The feature flags on for this server, like Discord's guild features. Changes arrive as community_update. The server enforces them; clients hide what is off.

vanity_codeRequired string or null

The vanity invite code, shown to every member; the link is /invite/<code>.

organizationRequired OrganizationRef or null

The verified organization this community belongs to, for the "official" badge.

created_atRequired string (date-time)
directory DirectoryState

Only in community_update gateway events, only for connections with Manage Community, and only when the community has a directory listing. REST responses never carry it.

Example Community
{
  "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "name": "string",
  "owner_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "icon": "string",
  "icon_dark": "string",
  "banner": "string",
  "mfa_level": 0,
  "default_notification_level": "all",
  "bot_presence_allowed": false,
  "tier": "standard",
  "limits": {
    "members": 0,
    "channels": 0,
    "roles": 0,
    "upload_bytes": 0,
    "emoji_slots": 0,
    "sticker_slots": 0
  },
  "perks": [
    "vanity_invite"
  ],
  "features": [
    "threads"
  ],
  "vanity_code": "string",
  "organization": {
    "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
    "name": "string",
    "domain": "string"
  },
  "created_at": "2026-10-15T09:00:00Z",
  "directory": {
    "status": "pending",
    "paused": false,
    "reason": "string",
    "visible": false,
    "needs_attention": false,
    "updated_at": "2026-10-15T09:00:00Z"
  }
}

CommunityAck

Type: object

Fields of CommunityAck
FieldTypeDescription
community_idRequired ID
read_statesRequired array of ReadState
Example CommunityAck
{
  "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "read_states": [
    {
      "channel_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "last_read_message_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "mention_count": 0
    }
  ]
}

CommunityLimits

Type: object

Fields of CommunityLimits
FieldTypeDescription
membersRequired integer

Joins are refused with community_full at this many members.

channelsRequired integer
rolesRequired integer

Roles other than @everyone.

upload_bytesRequired integer

The largest file a member can attach in this community.

emoji_slotsRequired integer

Custom emoji slots, enforced once custom emoji exist.

sticker_slotsRequired integer

Server sticker slots, enforced when adding a sticker.

Example CommunityLimits
{
  "members": 0,
  "channels": 0,
  "roles": 0,
  "upload_bytes": 0,
  "emoji_slots": 0,
  "sticker_slots": 0
}

CommunityList

Type: object

Fields of CommunityList
FieldTypeDescription
communitiesRequired array of Community
Example CommunityList
{
  "communities": [
    {
      "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "name": "string",
      "owner_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "icon": "string",
      "icon_dark": "string",
      "banner": "string",
      "mfa_level": 0,
      "default_notification_level": "all",
      "bot_presence_allowed": false,
      "tier": "standard",
      "limits": {
        "members": 0,
        "channels": 0,
        "roles": 0,
        "upload_bytes": 0,
        "emoji_slots": 0,
        "sticker_slots": 0
      },
      "perks": [
        "vanity_invite"
      ],
      "features": [
        "threads"
      ],
      "vanity_code": "string",
      "organization": {
        "id": {},
        "name": "string",
        "domain": "string"
      },
      "created_at": "2026-10-15T09:00:00Z",
      "directory": {
        "status": {},
        "paused": false,
        "reason": "string",
        "visible": false,
        "needs_attention": false,
        "updated_at": "2026-10-15T09:00:00Z"
      }
    }
  ]
}

CreateAttachmentSlotsRequest

Type: object

Fields of CreateAttachmentSlotsRequest
FieldTypeDescription
filesRequired array of UploadFile

at least 1 items; at most 10 items

Example CreateAttachmentSlotsRequest
{
  "files": [
    {
      "filename": "string",
      "size": 1,
      "content_type": "string"
    }
  ]
}

CreateAutoModerationRuleRequest

Type: object

Fields of CreateAutoModerationRuleRequest
FieldTypeDescription
nameRequired string
event_type string

One of message_send

trigger_typeRequired AutoModerationTriggerType
trigger_metadata AutoModerationTriggerMetadata
actionsRequired array of AutoModerationAction
enabled boolean

default true

exempt_roles array of string

IDs that are not roles of the community are dropped.

exempt_channels array of string

IDs that are not text channels or categories of the community are dropped.

Example CreateAutoModerationRuleRequest
{
  "name": "string",
  "event_type": "message_send",
  "trigger_type": "keyword",
  "trigger_metadata": {
    "keyword_filter": [
      "string"
    ],
    "regex_patterns": [
      "string"
    ],
    "presets": [
      "profanity"
    ],
    "allow_list": [
      "string"
    ],
    "mention_total_limit": 1,
    "mention_raid_protection_enabled": false
  },
  "actions": [
    {
      "type": "block_message",
      "metadata": {
        "custom_message": "string",
        "channel_id": {},
        "duration_seconds": 1
      }
    }
  ],
  "enabled": true,
  "exempt_roles": [
    "string"
  ],
  "exempt_channels": [
    "string"
  ]
}

CreateChannelRequest

Type: object

Fields of CreateChannelRequest
FieldTypeDescription
nameRequired string

Trimmed, then 1 to 100 characters with no control or invisible formatting characters. Text channel names are lowercased and each run of whitespace becomes a single -. Emoji are allowed, and the character rules of CreateRoleRequest apply to every kind. While emoji_names_enabled on GET /instance is true names are also normalized as role names are, and text channel names drop ASCII punctuation other than - and _ before the whitespace runs become -, as Discord does (Rules & Info! is stored as rules-info). Voice channel and category names keep their case and spaces. Lengths count code points.

kind ChannelKind

One of text, voice, category, public_thread, private_thread

parent_id string or null

A category in the same community to create the channel in. Not allowed for a category.

topic ChannelTopic or null

Text channels only. Omitted, null or empty means no topic.

user_limit integer

Voice channels only (voice_setting_not_allowed otherwise). 0, the default, means no limit; invalid_user_limit outside 0 to 99.

at least 0; at most 99

bitrate integer

Voice channels only (voice_setting_not_allowed otherwise). Defaults to 64000; invalid_bitrate outside 8000 to 96000.

at least 8000; at most 96000

age_restricted boolean

Text and voice channels only (age_restriction_not_allowed otherwise). Needs the sensitive_media flag on for the community (sensitive_media_disabled otherwise). Recorded in the moderation log with changes.age_restricted on an update.

Example CreateChannelRequest
{
  "name": "string",
  "kind": "text",
  "parent_id": "string",
  "topic": "string",
  "user_limit": 0,
  "bitrate": 8000,
  "age_restricted": false
}

CreateInviteRequest

Type: object

Fields of CreateInviteRequest
FieldTypeDescription
max_uses integer or null

Omit or null for unlimited uses.

at least 1; at most 1000

expires_in_seconds integer

Defaults to 7 days. 0 means never. At most 30 days.

at least 0; at most 2592000; default 604800

Example CreateInviteRequest
{
  "max_uses": 1,
  "expires_in_seconds": 604800
}

CreateMessageRequest

Type: object

Fields of CreateMessageRequest
FieldTypeDescription
content string

Trailing whitespace is removed and line breaks are normalized to \n; then 1 to 4000 characters, or empty when the message has attachments. Newlines, tabs and bidirectional formatting characters are allowed (right-to-left scripts need them); other control characters are not.

nonce string

Optional, up to 64 printable ASCII characters (no spaces), echoed back in the response and in the message_create event. Every member of the community sees it in the event. An empty string is the same as leaving it out.

at most 64 characters

attachments array of AttachmentRef

Finalized uploads to attach. Needs Attach Files as well as Send Messages.

at most 10 items

message_reference ReplyReference
allowed_mentions AllowedMentions
sticker_ids array of string

At most one sticker, as on Discord, with optional content: a built-in sticker (such as pip_hello) anywhere, or a sticker of this channel's own server. Another server's sticker is refused with 403 sticker_not_usable, and every sticker while the stickers flag is off with 403 stickers_disabled.

at most 1 items

gif_url string

Set by the GIF picker only: the media URL of the chosen GIF, which content must also contain. It must be an https URL on the provider's media hosts ending in .gif, .webp or .mp4, and the gifs flag must be on for the sender; otherwise 400 invalid_gif. The message then carries gif_url and clients embed it; a provider URL pasted without this stays a plain link.

at most 2048 characters

Example CreateMessageRequest
{
  "content": "string",
  "nonce": "string",
  "attachments": [
    {
      "upload_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "filename": "string",
      "description": "string",
      "spoiler": false
    }
  ],
  "message_reference": {
    "message_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
    "channel_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
    "fail_if_not_exists": true
  },
  "allowed_mentions": {
    "replied_user": false
  },
  "sticker_ids": [
    "string"
  ],
  "gif_url": "string"
}

CreateRoleRequest

Type: object

Fields of CreateRoleRequest
FieldTypeDescription
nameRequired string

Trimmed, then 1 to 100 characters with no control or invisible formatting characters. Emoji are allowed. At most 4 combining marks may sit on one character, a zero-width joiner is only accepted inside an emoji sequence or between letters of a script that uses joiners, a variation selector only where it changes how its character is drawn, tag characters only in the England, Scotland and Wales flags, and line and paragraph separators, private use and unassigned characters are refused; the name needs one visible character. Names that fold to everyone or here, with or without a leading @ (any case, look-alike letters), are reserved. While emoji_names_enabled on GET /instance is true the name is also stored in NFC with each run of whitespace (line and paragraph separators included) collapsed to one space. Lengths count code points either way.

color integer or null

at least 0; at most 16777215

permissions Permissions

A 64-bit permission set as a decimal string. See the roles tag for the bits.

hoist boolean

default false

mentionable boolean

default false

Example CreateRoleRequest
{
  "name": "string",
  "color": 0,
  "permissions": "2748678791",
  "hoist": false,
  "mentionable": false
}

CreateThreadRequest

Type: object

Fields of CreateThreadRequest
FieldTypeDescription
nameRequired string

1-100 characters after trimming, with no control characters and no bidirectional overrides, isolates or other invisible formatting characters, as for channel names. Unlike text channel names it keeps its case and spaces. While emoji_names_enabled on GET /instance is true the stricter name rules of CreateRoleRequest apply.

at least 1 characters; at most 100 characters

kind string

Defaults to public_thread. A thread started from a message is always public; private_thread is refused there.

One of public_thread, private_thread

auto_archive_duration integer

Defaults to 1440 (24 hours).

One of 60, 1440, 4320, 10080

invitable boolean

Private threads only; defaults to true.

Example CreateThreadRequest
{
  "name": "string",
  "kind": "public_thread",
  "auto_archive_duration": 60,
  "invitable": false
}

CreateUploadRequest

Type: object

Fields of CreateUploadRequest
FieldTypeDescription
purposeRequired string

The _dark purposes are the optional dark mode variants of the avatar, the server avatar and the server icon. Each upload is used once, for the field of its purpose. They are refused with 403 dark_images_disabled while dark_images_enabled is false on GET /instance, and so is setting a _dark field to an upload or finalizing a _dark upload whose slot was created before the switch was turned off.

One of avatar, avatar_dark, banner, community_icon, community_icon_dark, community_banner, member_avatar, member_avatar_dark, member_banner, sticker

community_id ID

Required for the community purposes community_icon, community_icon_dark and community_banner (Manage Server), sticker (Manage Expressions, the stickers flag, a PNG, APNG, GIF or WebP of at most 512 KB, 413 file_too_large above; then POST /communities/{id}/stickers) and the server profile purposes member_avatar, member_avatar_dark and member_banner (membership plus Change Nickname or Manage Nicknames), refused otherwise.

filenameRequired string
sizeRequired integer

at least 1

content_typeRequired string
Example CreateUploadRequest
{
  "purpose": "avatar",
  "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "filename": "string",
  "size": 1,
  "content_type": "string"
}

CurrentUser

Type: object

The authenticated user, with what only they can see. A deleted account elsewhere in the API is a PublicUser named d-<id> with the display name "Deleted User".

Fields of CurrentUser
FieldTypeDescription
idRequired ID
usernameRequired string
display_nameRequired string
kindRequired UserKind
avatarRequired ImageHash or null
avatar_darkRequired ImageHash or null

The optional dark mode avatar (same avatars kind as avatar). Clients show it instead of avatar when the viewer uses a dark theme; null means use avatar.

bannerRequired ImageHash or null
bioRequired string

at most 190 characters

pronounsRequired string

at most 40 characters

banner_colorRequired BannerColor or null
instance_roleRequired InstanceRole or null
created_atRequired string (date-time)
emailRequired string or null

The account's email address, or null. Always null for bots.

email_verifiedRequired boolean

Whether the address was confirmed through the link sent to it. Only a verified address receives password reset links and security notices.

addressRequired string

username@identity domain, the account's stable address.

handleRequired string

The handle shown to others; the address unless an alias domain handle is in use.

terms_version_acceptedRequired string or null

The terms of service version this account last accepted, or null.

terms_accepted_atRequired string (date-time) or null

When that version was accepted, or null.

terms_acceptance_requiredRequired boolean

True when the instance has a terms version (terms_version in GET /instance) and this account has not accepted it. Show the terms in a dialog that blocks use until POST /users/@me/terms succeeds. Always false for bots.

featuresRequired array of FeatureKey

The user and community_and_user feature flags on for this account, for its own settings and profile. Changes arrive as features_update on the gateway.

mfa_enabledRequired boolean

Whether the account has a second factor. Always false for bots.

Example CurrentUser
{
  "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "username": "string",
  "display_name": "string",
  "kind": "user",
  "avatar": "string",
  "avatar_dark": "string",
  "banner": "string",
  "bio": "string",
  "pronouns": "string",
  "banner_color": 0,
  "instance_role": "owner",
  "created_at": "2026-10-15T09:00:00Z",
  "email": "string",
  "email_verified": false,
  "address": "string",
  "handle": "string",
  "terms_version_accepted": "string",
  "terms_accepted_at": "2026-10-15T09:00:00Z",
  "terms_acceptance_required": false,
  "features": [
    "threads"
  ],
  "mfa_enabled": false
}

CustomStatus

Type: object

A custom status (for bots, their activity). Hide it once expires_at has passed; no event is sent when it expires.

Fields of CustomStatus
FieldTypeDescription
textRequired string

at least 1 characters; at most 128 characters

expires_atRequired string (date-time) or null
Example CustomStatus
{
  "text": "string",
  "expires_at": "2026-10-15T09:00:00Z"
}

DefaultNotificationLevel

Type: string

What notifies members who have not chosen a level for this community. mentions for new communities. Changed with Manage Community.

One of all, mentions

DirectoryCategory

Type: string

One of gaming, music, entertainment, art_design, science_tech, education, books_writing, anime_manga, sports_fitness, hobbies_crafts, food_drink, travel_outdoors, local_community, support_wellbeing, creators, open_source, other

DirectoryLanguage

Type: string

One of ar, cs, da, de, el, en, es, fi, fr, he, hi, hu, id, it, ja, ko, nl, no, pl, pt, ro, ru, sv, th, tr, uk, vi, zh

DirectoryListingDetail

Type: object

A listing with its review state, for its managers and instance admins.

Fields of DirectoryListingDetail
FieldTypeDescription
owner_idRequired ID
rules_channel_idRequired string or null
statusRequired ListingStatus
pausedRequired boolean
status_reasonRequired string or null
visibleRequired boolean
needs_attentionRequired boolean

Hidden because the rules channel is gone or not public; see DirectoryState.

revisionRequired string

A hash of what review covers: the description, categories, keywords, language and rules channel, and the community's name, icon and banner. Send it with approve.

weekly_joinsRequired integer
submitted_atRequired string (date-time)
reviewed_atRequired string (date-time) or null
listed_atRequired string (date-time)
updated_atRequired string (date-time)
idRequired ID
nameRequired string
iconRequired ImageHash or null
icon_darkRequired ImageHash or null

The community's optional dark mode icon; null means use icon.

bannerRequired ImageHash or null
descriptionRequired string

at most 300 characters

primary_categoryRequired DirectoryCategory
secondary_categoriesRequired array of DirectoryCategory

at most 3 items

keywordsRequired array of string

at most 10 items

languageRequired DirectoryLanguage
member_countRequired integer

Refreshed every 5 minutes.

online_countRequired integer

Members with a visible presence, refreshed every 5 minutes.

featuredRequired boolean

The community's tier has the featured perk.

partnerRequired boolean
vanity_codeRequired string or null
organizationRequired OrganizationRef or null

A verified organization, for its badge.

created_atRequired string (date-time)

When the community was created.

Example DirectoryListingDetail
{
  "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "name": "string",
  "icon": "string",
  "icon_dark": "string",
  "banner": "string",
  "description": "string",
  "primary_category": "gaming",
  "secondary_categories": [
    "gaming"
  ],
  "keywords": [
    "string"
  ],
  "language": "ar",
  "member_count": 0,
  "online_count": 0,
  "featured": false,
  "partner": false,
  "vanity_code": "string",
  "organization": {
    "id": {},
    "name": "string",
    "domain": "string"
  },
  "created_at": "2026-10-15T09:00:00Z",
  "owner_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "rules_channel_id": "string",
  "status": "pending",
  "paused": false,
  "status_reason": "string",
  "visible": false,
  "needs_attention": false,
  "revision": "string",
  "weekly_joins": 0,
  "submitted_at": "2026-10-15T09:00:00Z",
  "reviewed_at": "2026-10-15T09:00:00Z",
  "listed_at": "2026-10-15T09:00:00Z",
  "updated_at": "2026-10-15T09:00:00Z"
}

DirectoryListingPatch

Type: object

Fields of DirectoryListingPatch
FieldTypeDescription
description string
primary_category DirectoryCategory
secondary_categories array of DirectoryCategory

at most 3 items

keywords array of string

at most 10 items

language DirectoryLanguage
rules_channel_id string or null
paused boolean
Example DirectoryListingPatch
{
  "description": "string",
  "primary_category": "gaming",
  "secondary_categories": [
    "gaming"
  ],
  "keywords": [
    "string"
  ],
  "language": "ar",
  "rules_channel_id": "string",
  "paused": false
}

DirectoryListingRequest

Type: object

Fields of DirectoryListingRequest
FieldTypeDescription
descriptionRequired string

1 to 300 characters, one line, no control or invisible formatting characters.

primary_categoryRequired DirectoryCategory
secondary_categories array of DirectoryCategory

at most 3 items

keywords array of string

2 to 32 letters, digits, spaces or hyphens each; lowercased and deduplicated.

at most 10 items

languageRequired DirectoryLanguage
rules_channel_id string or null

A text channel of the community; @everyone must be able to read it to meet rules_channel.

paused boolean
Example DirectoryListingRequest
{
  "description": "string",
  "primary_category": "gaming",
  "secondary_categories": [
    "gaming"
  ],
  "keywords": [
    "string"
  ],
  "language": "ar",
  "rules_channel_id": "string",
  "paused": false
}

DirectoryRequirement

Type: object

Fields of DirectoryRequirement
FieldTypeDescription
keyRequired string

members and age (days) carry required and actual. rules_channel: the rules channel is readable by @everyone. owner_standing: verified email, not suspended. safety: no instance moderation in the community in the last 30 days.

One of members, age, icon, rules_channel, owner_standing, safety

metRequired boolean
requiredRequired integer or null
actualRequired integer or null
Example DirectoryRequirement
{
  "key": "members",
  "met": false,
  "required": 0,
  "actual": 0
}

DirectorySettings

Type: object

Fields of DirectorySettings
FieldTypeDescription
listingRequired DirectoryListingDetail or null

A listing with its review state, for its managers and instance admins.

requirementsRequired array of DirectoryRequirement
enabledRequired boolean

Whether the instance has a directory.

auto_approveRequired boolean

Whether listings that meet every requirement skip review.

Example DirectorySettings
{
  "listing": {
    "id": {},
    "name": "string",
    "icon": {},
    "icon_dark": {},
    "banner": {},
    "description": "string",
    "primary_category": {},
    "secondary_categories": [],
    "keywords": [],
    "language": {},
    "member_count": 0,
    "online_count": 0,
    "featured": false,
    "partner": false,
    "vanity_code": "string",
    "organization": {},
    "created_at": "2026-10-15T09:00:00Z",
    "owner_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
    "rules_channel_id": "string",
    "status": "pending",
    "paused": false,
    "status_reason": "string",
    "visible": false,
    "needs_attention": false,
    "revision": "string",
    "weekly_joins": 0,
    "submitted_at": "2026-10-15T09:00:00Z",
    "reviewed_at": "2026-10-15T09:00:00Z",
    "listed_at": "2026-10-15T09:00:00Z",
    "updated_at": "2026-10-15T09:00:00Z"
  },
  "requirements": [
    {
      "key": "members",
      "met": false,
      "required": 0,
      "actual": 0
    }
  ],
  "enabled": false,
  "auto_approve": false
}

DirectoryState

Type: object

A listing's review state, for members with Manage Community.

Fields of DirectoryState
FieldTypeDescription
statusRequired ListingStatus
pausedRequired boolean
reasonRequired string or null

The admins' reason for a rejection or delisting.

visibleRequired boolean

Whether the listing shows in the directory now.

needs_attentionRequired boolean

The rules channel is gone or no longer readable by @everyone, so the listing is hidden. It stays approved and shows again once the rules channel is fixed.

updated_atRequired string (date-time)
Example DirectoryState
{
  "status": "pending",
  "paused": false,
  "reason": "string",
  "visible": false,
  "needs_attention": false,
  "updated_at": "2026-10-15T09:00:00Z"
}

DMChannelList

Type: object

Fields of DMChannelList
FieldTypeDescription
channelsRequired array of DMChannelState
Example DMChannelList
{
  "channels": [
    {
      "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "kind": "dm",
      "recipients": [
        {
          "id": {},
          "username": "string",
          "display_name": "string",
          "kind": {},
          "avatar": {},
          "avatar_dark": {}
        }
      ],
      "created_at": "2026-10-15T09:00:00Z",
      "last_message_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "last_read_message_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "mention_count": 0,
      "last_pin_timestamp": "2026-10-15T09:00:00Z"
    }
  ]
}

DMChannelState

Type: object

A DM with the caller's read state, as listed over REST and in ready.

Fields of DMChannelState
FieldTypeDescription
idRequired ID
kindRequired string

One of dm

recipientsRequired array of PublicUser

Every participant, the caller included, ordered by ID.

created_atRequired string (date-time)
last_message_idRequired ID or null

The newest message; null if there is none.

last_read_message_idRequired ID or null

The newest message the caller has read; null if none.

mention_countRequired integer

Messages from the other participants since the caller last acked. Every DM message counts.

at least 0

last_pin_timestampRequired string (date-time) or null

When the newest pin in this DM was made; null when nothing is pinned.

Example DMChannelState
{
  "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "kind": "dm",
  "recipients": [
    {
      "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "username": "string",
      "display_name": "string",
      "kind": "user",
      "avatar": "string",
      "avatar_dark": "string"
    }
  ],
  "created_at": "2026-10-15T09:00:00Z",
  "last_message_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "last_read_message_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "mention_count": 0,
  "last_pin_timestamp": "2026-10-15T09:00:00Z"
}

Error

Type: object

Fields of Error
FieldTypeDescription
errorRequired ErrorDetail
Example Error
{
  "error": {
    "code": "account_moved",
    "message": "string",
    "auto_moderation": {
      "trigger_type": "keyword",
      "custom_message": "string"
    },
    "missing_permissions": "2748678791",
    "timeout_until": "2026-10-15T09:00:00Z"
  }
}

ErrorDetail

Type: object

Fields of ErrorDetail
FieldTypeDescription
codeRequired string

One of account_moved, account_moves_disabled, account_pending_deletion, account_suspended, admin_required, already_friends, already_member, attachment_not_found, auto_moderation_blocked, auto_moderation_disabled, auto_moderation_rule_limit, auto_moderation_rule_not_found, badge_not_found, badge_not_grantable, badge_not_held, badge_not_hideable, ban_not_found, banned, blocking_user, blocklist_not_published, body_too_large, bot_creation_disabled, bot_limit_reached, bot_not_found, bot_private, bot_required, bots_not_allowed, cannot_act_on_instance_staff, cannot_act_on_own_report, cannot_ban_owner, cannot_ban_self, cannot_change_owner, cannot_kick_owner, cannot_kick_self, cannot_remove_domain_owner, cannot_remove_organization_owner, cannot_report_self, cannot_set_member_profile, cannot_target_self, cannot_timeout_owner, cannot_timeout_self, cannot_transfer_to_bot, cannot_transfer_to_self, captcha_failed, captcha_required, captcha_unavailable, channel_limit_reached, channel_not_found, channel_not_text, channel_not_voice, command_limit_reached, command_not_found, community_full, community_limit_reached, community_linked, community_not_found, confirmation_mismatch, content_deletion_disabled, content_hold_reason_required, content_type_mismatch, delegation_not_configured, deletion_not_pending, directory_disabled, directory_requirements_unmet, discord_rate_limited, discord_templates_disabled, discord_unavailable, dm_not_allowed, domain_already_claimed, domain_limit_reached, domain_claim_limit_reached, domain_member_exists, domain_member_limit_reached, domain_member_not_found, domain_not_active, domain_not_found, domain_not_shared, domain_not_verified, domain_owner_required, domain_request_limit_reached, domain_reserved, domain_taken, email_already_verified, email_not_set, email_required, email_taken, entitlement_not_found, entitlement_required, everyone_role, export_not_found, export_not_ready, file_too_large, file_too_large_to_scan, gateway_unavailable, handle_taken, hub_token_expired, hub_token_untrusted, hub_token_wrong_instance, image_too_large, ineligible_user, interaction_already_acknowledged, interaction_expired, interaction_not_acknowledged, interaction_not_deferred, interaction_not_found, internal, invalid_action, invalid_attachment, invalid_auto_moderation_rule, invalid_badge_grant, invalid_banner_color, invalid_bio, invalid_bitrate, invalid_body, invalid_category, invalid_channel_kind, invalid_color, invalid_command, invalid_content, invalid_credentials, invalid_decision, invalid_description, invalid_display_name, invalid_domain, invalid_domain_kind, invalid_email, invalid_entitlement, invalid_expiry, invalid_handle, invalid_hub_token, invalid_image, invalid_interaction_response, invalid_join, invalid_keywords, invalid_language, invalid_max_uses, invalid_move_target, invalid_name, invalid_nickname, invalid_nonce, invalid_note, invalid_options, invalid_organization, invalid_parent, invalid_password, invalid_permissions, invalid_policy_level, invalid_positions, invalid_profile_reset, invalid_pronouns, invalid_push_subscription, invalid_query, invalid_search, invalid_search_scope, invalid_reason, invalid_report, invalid_rules_channel, invalid_setting, invalid_setup_token, invalid_signature, invalid_status, invalid_template_code, invalid_timeout, invalid_token, invalid_topic, invalid_transition, invalid_upload, invalid_user_limit, invalid_username, invalid_vanity_code, invite_limit_reached, invite_not_for_signup, invite_not_found, invite_required, last_text_channel, listing_delisted, listing_not_found, listing_state_conflict, managed_role, member_not_found, message_not_found, missing_permission, name_reserved, no_content_hold, no_terms, not_community_owner, not_found, not_in_voice, not_suspended, organization_closed, organization_exists, organization_limit_reached, organization_member_limit_reached, organization_community_limit_reached, organization_not_approved, organization_invite_not_allowed, applicant_suspended, invalid_takedown, organization_member_exists, organization_not_found, organization_owner_required, overwrite_limit_reached, owner_cannot_delete, owner_cannot_leave, owner_cannot_move, owner_required, owns_communities, pin_limit_reached, invalid_emoji, reaction_limit_reached, reactions_disabled, invalid_thread_parent, invalid_thread_kind, invalid_auto_archive_duration, invalid_thread_change, template_changed, template_channel_limit, template_not_found, template_overwrite_limit, template_overwrite_total_limit, template_role_limit, template_unreadable, thread_exists, thread_archived, thread_locked, thread_limit_reached, thread_member_limit_reached, thread_user_limit_reached, threads_disabled, not_thread, thread_member_not_found, cannot_view_thread, invalid_reference, reference_not_found, replies_disabled, thread_overwrites, policy_exists, policy_not_found, push_disabled, push_endpoint_not_allowed, push_subscription_not_found, rate_limited, rate_limiter_unavailable, registration_closed, relationship_limit_reached, relationship_not_found, report_duplicate_open, report_limit_reached, report_not_found, request_not_allowed, role_hierarchy, role_limit_reached, role_not_found, scan_unavailable, search_disabled, search_unavailable, session_not_found, signing_keys_unavailable, storage_unavailable, subject_not_found, system_message, terms_acceptance_required, terms_outdated, terms_required, tier_required, timed_out, timeout_not_found, too_many_attachments, too_many_files, too_many_syncs, topic_not_allowed, transfer_target_ineligible, unauthenticated, unsupported_type, upgrade_required, upload_already_received, upload_changed, upload_expired, upload_incomplete, upload_limit_reached, upload_malware, upload_not_found, upload_processing, upload_quota_exceeded, upload_rejected, upload_size_mismatch, uploads_paused, uploads_restricted, user_not_found, username_taken, vanity_not_found, vanity_reserved, vanity_taken, voice_channel_full, voice_disabled, voice_setting_not_allowed, webhook_disabled, webhook_limit_reached, webhook_not_found, wrong_password, feature_not_found, invalid_feature_mode, invalid_feature_percentage, invalid_feature_tier, feature_not_tier_unlockable, feature_tier_required, invalid_feature_beta, feature_beta_scope, feature_beta_not_found, reason_required, feature_unchanged, oidc_disabled, oauth_invalid_client, oauth_invalid_redirect_uri, oauth_invalid_request, reauthentication_required, oauth_grant_not_found, invalid_oauth_client, oauth_client_not_found, oauth_client_has_no_secret, public_channels_disabled, invalid_public_channel, public_channel_not_everyone, public_channel_age_restricted, age_restriction_not_allowed, sensitive_media_disabled, sensitive_media_locked, invalid_public_web, invalid_thread, invalid_answer, public_web_busy, public_web_needs_scanner, community_backup_disabled, community_backup_unavailable, backup_not_found, backup_not_ready, backup_limit_reached, restore_in_progress, not_permitted, invalid_archive, unsupported_archive, checksum_mismatch, unknown_issuer, foreign_archive, over_limits, backup_too_large, restore_not_found, invalid_download_link, community_restoring, invalid_backup_signature, restore_uploads_busy, backup_not_revocable, backup_revoked, invalid_mfa, mfa_required, mfa_sudo_required, mfa_disabled, invalid_mfa_code, mfa_not_enabled, totp_already_enabled, totp_not_enabled, mfa_setup_not_found, too_many_keys, key_already_registered, key_not_found, invalid_key_name, invalid_credential, mfa_method_unavailable, owner_mfa_required, staff_mfa_required, moderation_mfa_required, gifs_disabled, gif_direct, gif_proxy, gif_busy, gif_unavailable, invalid_share, gif_favorite_limit, invalid_gif, gif_favorite_not_found, stickers_disabled, sticker_not_found, invalid_sticker_name, invalid_sticker_description, invalid_sticker_tags, sticker_name_taken, sticker_not_usable, invalid_sticker, too_many_stickers, invalid_sticker_upload, sticker_slots_full, sticker_too_large, sticker_explicit, sticker_too_slow

messageRequired string
auto_moderation AutoModerationBlock
missing_permissions Permissions

With missing_permission from a message send (or a reply) or an attachment slot, the permission bits the caller lacks in that channel. Left out where the server does not name them.

timeout_until string (date-time)

With timed_out from a message send or an attachment slot, when the caller's timeout ends. Left out where the server does not name it.

Example ErrorDetail
{
  "code": "account_moved",
  "message": "string",
  "auto_moderation": {
    "trigger_type": "keyword",
    "custom_message": "string"
  },
  "missing_permissions": "2748678791",
  "timeout_until": "2026-10-15T09:00:00Z"
}

ExecuteWebhookMultipart

Type: object

As on Discord: payload_json holds the JSON body, and up to 10 file parts named files[0] to files[9], each with a filename and a content type. Files are processed like other uploads and recorded as uploads of the webhook's creator. As on Discord, a webhook attaches files whatever the channel's Attach Files permission says: whoever can manage webhooks there decided to allow it.

Fields of ExecuteWebhookMultipart
FieldTypeDescription
payload_json string
files[0] string (binary)
files[1] string (binary)
files[2] string (binary)
files[3] string (binary)
files[4] string (binary)
files[5] string (binary)
files[6] string (binary)
files[7] string (binary)
files[8] string (binary)
files[9] string (binary)
Example ExecuteWebhookMultipart
{
  "payload_json": "string",
  "files[0]": "(file contents)",
  "files[1]": "(file contents)",
  "files[2]": "(file contents)",
  "files[3]": "(file contents)",
  "files[4]": "(file contents)",
  "files[5]": "(file contents)",
  "files[6]": "(file contents)",
  "files[7]": "(file contents)",
  "files[8]": "(file contents)",
  "files[9]": "(file contents)"
}

ExecuteWebhookRequest

Type: object

Fields of ExecuteWebhookRequest
FieldTypeDescription
content string

Required unless files are attached.

username string

A name for this message only, 1-80 characters, the same rules as other names.

message_reference ReplyReference

Posts the message as a reply to a message in the webhook's channel, as for sendMessage (a webhook needs no Read Message History). Refused with replies_disabled (403) while the replies flag is off for the server, and with invalid_reference, reference_not_found or system_message (400) as for sendMessage.

allowed_mentions AllowedMentions
attachments array of object

Only with multipart. Describes the files by their files[n] number.

attachments[].idRequired integer

at least 0; at most 9

attachments[].description string
attachments[].filename string

A display name to use instead of the part's; the stored extension stays, as for AttachmentRef.

Example ExecuteWebhookRequest
{
  "content": "string",
  "username": "string",
  "message_reference": {
    "message_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
    "channel_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
    "fail_if_not_exists": true
  },
  "allowed_mentions": {
    "replied_user": false
  },
  "attachments": [
    {
      "id": 0,
      "description": "string",
      "filename": "string"
    }
  ]
}

FeatureKey

Type: string

A registered feature flag. New flags are added to this list as they ship.

One of threads, automod, discord_templates, account_content_deletion, dark_images, animated_banners, search, emoji_names, markdown, voice, oidc, public_channels, risky_files, platform_admin, community_backup, mfa, malware_scan, sensitive_media, reactions, replies, gifs, stickers, system_notices

FeatureScope

Type: string

What a flag is decided for: a server (community), an account (user), both (community_and_user: a server's own images and settings by the server, a person's own profile by the person), or the whole instance (instance: on in mode everyone, off in mode off; the other modes are refused with invalid_feature_mode and there are no beta lists).

One of community, user, community_and_user, instance

FollowupRequest

Type: object

Fields of FollowupRequest
FieldTypeDescription
contentRequired string
ephemeral boolean

default false

Example FollowupRequest
{
  "content": "string",
  "ephemeral": false
}

ID

Type: string

A ULID. Sorts lexically in creation order.

pattern ^[0-9A-HJKMNP-TV-Z]{26}$

ImageHash

Type: string

An image of a user or community, or null for none. Build the URL from media.base_url in GET /instance; see InstanceInfo.media. A hash starting with a_ is animated and also has original.gif.

pattern ^(a_)?[0-9a-f]{32}$

InstanceFeature

Type: object

Fields of InstanceFeature
FieldTypeDescription
keyRequired FeatureKey
scopeRequired FeatureScope
availableRequired boolean

Whether the flag can be on for anyone here (its ceiling is on, it is not killed and its mode is not off). Use the community's or the account's features to decide what to show.

everyoneRequired boolean

Whether it is on for every server and account.

min_tierRequired Tier or null

The lowest tier that unlocks it while the flag is in tier mode, for "unlocked at Level N"; otherwise null.

One of standard, level_1, level_2, level_3, partner

Example InstanceFeature
{
  "key": "threads",
  "scope": "community",
  "available": false,
  "everyone": false,
  "min_tier": "standard"
}

InstanceInfo

Type: object

The *_enabled booleans are kept for older clients and mean "available on this instance" (the flag's available in features). Whether a feature is on for a given server or account is in the community's and the account's features.

Fields of InstanceInfo
FieldTypeDescription
featuresRequired array of InstanceFeature

Every registered feature flag, in registry order.

gif_providerRequired string or null

The GIF provider behind the GIF picker, or null when no provider and key are configured or the gifs flag is unavailable; clients then hide the GIF tab. Clients show the provider's attribution ("Powered by GIPHY", "Search KLIPY") and only render GIF previews for URLs on that provider's media hosts.

One of giphy, klipy,

gif_modeRequired string or null

How the GIF picker reaches the provider, or null when gif_provider is null. proxy: the client uses /gifs/*. direct (PALLOO_GIF_MODE=direct, Klipy only): the client fetches GET /gifs/direct when the picker opens and calls Klipy itself, so Klipy sees the user's IP address and searches. The Klipy key is never part of this public document.

One of proxy, direct,

registrationRequired Registration
require_emailRequired boolean

Whether signup needs an email address.

email_deliveryRequired boolean

Whether the instance actually sends email. When false, verification and reset links never arrive, so the client can hide "forgot password".

captchaRequired object
captcha.providerRequired string

One of none, turnstile

captcha.site_keyRequired string or null

The site key to render the widget with. Null when the provider is none. Render the widget with the action of the form it guards (signup, login, password_reset or deletion_cancel); the server refuses a token solved for another action or another host name than the public URL's.

account_deletion_grace_secondsRequired integer

How long a deleted account can still be restored.

export_cooldown_secondsRequired integer

The minimum time between two data exports.

export_available_for_secondsRequired integer

How long a finished export can be downloaded.

identity_domainRequired string

The domain after the @ in addresses on this instance.

account_moves_enabledRequired boolean

Whether people may mark their own account as moved (POST /users/@me/move), so the client can hide the option when the instance owner has it off.

directory_enabledRequired boolean

Whether the server directory exists, so clients can hide Discover.

automod_enabledRequired boolean

Whether AutoMod is available here (PALLOO_AUTOMOD_ENABLED and the automod flag). Where it is off for a server (the server's features), no message is checked and the rule routes answer auto_moderation_disabled.

search_enabledRequired boolean

Whether message search is available here (PALLOO_SEARCH_ENABLED and the search flag). Where it is off for a server or an account, search answers 403 search_disabled.

emoji_names_enabledRequired boolean

Whether the Discord-style name normalization is available here (PALLOO_EMOJI_NAMES_ENABLED and the emoji_names flag; see CreateChannelRequest and CreateRoleRequest). Whether it applies to a server is emoji_names in the server's features, so clients normalize names the same way before sending them. Stored names are never rewritten.

oidc_enabledRequired boolean

Whether Log in with Palloo is on: the OpenID Connect endpoints, Settings, Authorized Apps and the admin OAuth Apps page. Clients hide those pages while it is false; every OpenID Connect route then answers 404 oidc_disabled.

markdown_enabledRequired boolean

Whether Discord-style markdown is available here (PALLOO_MARKDOWN_ENABLED and the markdown flag). Whether it applies to a server's channels is markdown in the server's features; in direct messages it applies only while the flag is on for everyone (everyone in features). Where it applies, clients render message content as markdown and offer the formatting composer, only mentions that clients draw as mentions ping (not inside code, link URLs or masked link text, or after a \ escape), and push notification bodies have the markup stripped (spoilers become [spoiler]). Elsewhere content is plain text as before. Stored content is the same either way: the raw text the author typed.

voice_enabledRequired boolean

Whether voice channels are available here (PALLOO_VOICE_ENABLED and the voice flag). Whether a server's voice channels connect is voice in the server's features: joining elsewhere answers 403 voice_disabled. While it is false (or the flag's kill switch is on) every voice operation answers 403 voice_disabled.

threads_enabledRequired boolean

Whether threads are available here (PALLOO_THREADS_ENABLED and the threads flag). Where the server's features lacks threads, starting one answers threads_disabled. Existing threads keep working either way.

dark_images_enabledRequired boolean

Whether new dark mode avatars, server avatars and server icons can be set (PALLOO_DARK_IMAGES_ENABLED). When false, the _dark upload purposes and setting a _dark field to an upload return 403 dark_images_disabled, and clients hide the controls. Stored dark images are still returned and shown, and can still be removed.

animated_banners_enabledRequired boolean

Whether banners keep their animation (PALLOO_ANIMATED_BANNERS_ENABLED). When false, an animated GIF banner is stored as its first frame and clients show every banner still; animated banners stored earlier keep their a_ hash, but setting a banner field to an animated upload (an a_ hash finalized while it was on) returns 403 animated_banners_disabled.

terms_urlRequired string (uri) or null

The terms of service (PALLOO_TERMS_URL), or null when none is configured.

privacy_urlRequired string (uri) or null

The privacy policy (PALLOO_PRIVACY_URL), or null.

terms_versionRequired string or null

The current terms version (PALLOO_TERMS_VERSION), or null when accepting terms is not required. Signup must send it as terms_version, and a signed-in user whose terms_acceptance_required is true must accept it before using the app.

mediaRequired object

Uploads and images. Images of users and communities are public at {base_url}/avatars/{user_id}/{hash}/{size}.png (sizes 128 and 512, square), {base_url}/banners/{user_id}/{hash}/{width}.png (600 by 240 and 1200 by 480), {base_url}/icons/{community_id}/{hash}/{size}.png (128 and 512) and {base_url}/community-banners/{community_id}/{hash}/{width}.png (480 by 270 and 960 by 540). Server profile images are {base_url}/member-avatars/{user_id}/{hash}/{size}.png (like avatars) and {base_url}/member-banners/{user_id}/{hash}/{width}.png (like banners). A hash starting with a_ also has an animated original.gif (avatars, icons and every kind of banner can be animated; the PNG renditions are the first frame). The base is never the app's own origin; allow it in img-src and media-src.

media.base_urlRequired string (uri)

Always an absolute URL on a host separate from the app: the CDN or bucket address with S3 storage, or {PALLOO_MEDIA_URL}/media/public with disk storage. The server refuses to start without such a host.

media.max_upload_bytesRequired integer
media.daily_upload_bytesRequired integer

0 for no daily quota.

media.max_attachmentsRequired integer
media.attachment_url_ttl_secondsRequired integer

How long signed attachment URLs work, at least.

tiersRequired array of TierInfo

Every community tier with its limits and perks, lowest first.

discord_templates_enabledRequired boolean

Whether creating a server from a Discord template is available (PALLOO_DISCORD_TEMPLATES_ENABLED), so clients can hide the option.

account_content_deletion_enabledRequired boolean

Whether delete_content may be set when deleting an account (PALLOO_ACCOUNT_CONTENT_DELETION_ENABLED), so clients can hide the option.

Example InstanceInfo
{
  "features": [
    {
      "key": "threads",
      "scope": "community",
      "available": false,
      "everyone": false,
      "min_tier": "standard"
    }
  ],
  "gif_provider": "giphy",
  "gif_mode": "proxy",
  "registration": "open",
  "require_email": false,
  "email_delivery": false,
  "captcha": {
    "provider": "none",
    "site_key": "string"
  },
  "account_deletion_grace_seconds": 0,
  "export_cooldown_seconds": 0,
  "export_available_for_seconds": 0,
  "identity_domain": "string",
  "account_moves_enabled": false,
  "directory_enabled": false,
  "automod_enabled": false,
  "search_enabled": false,
  "emoji_names_enabled": false,
  "oidc_enabled": false,
  "markdown_enabled": false,
  "voice_enabled": false,
  "threads_enabled": false,
  "dark_images_enabled": false,
  "animated_banners_enabled": false,
  "terms_url": "https://app.palloo.app/",
  "privacy_url": "https://app.palloo.app/",
  "terms_version": "string",
  "media": {
    "base_url": "https://app.palloo.app/",
    "max_upload_bytes": 0,
    "daily_upload_bytes": 0,
    "max_attachments": 0,
    "attachment_url_ttl_seconds": 0
  },
  "tiers": [
    {
      "tier": "standard",
      "limits": {
        "members": 0,
        "channels": 0,
        "roles": 0,
        "upload_bytes": 0,
        "emoji_slots": 0,
        "sticker_slots": 0
      },
      "perks": [
        "vanity_invite"
      ],
      "features": [
        "threads"
      ]
    }
  ],
  "discord_templates_enabled": false,
  "account_content_deletion_enabled": false
}

InstanceRole

Type: string

The account's role on this instance. Null for everyone without one. Exactly one local user is the owner; bots and remote users never have a role.

One of owner, admin,

InteractionCallbackRequest

Type: object

Fields of InteractionCallbackRequest
FieldTypeDescription
typeRequired string

One of message, deferred

content string

Required with message, not allowed with deferred.

ephemeral boolean

default false

Example InteractionCallbackRequest
{
  "type": "message",
  "content": "string",
  "ephemeral": false
}

InteractionCreate

Type: object

Payload of the interaction_create gateway event, which only the command's bot receives. token answers it.

Fields of InteractionCreate
FieldTypeDescription
idRequired ID
tokenRequired string

pattern ^palloo_int_

community_idRequired ID
channel_idRequired ID
commandRequired object
command.idRequired ID
command.nameRequired string
userRequired PublicUser
optionsRequired array of object
options[].nameRequired string
options[].typeRequired CommandOptionType
options[].valueRequired any

The checked value; IDs are uppercase.

resolvedRequired object
resolved.usersRequired array of PublicUser
resolved.channelsRequired array of ResolvedChannel
resolved.rolesRequired array of Role
created_atRequired string (date-time)
respond_byRequired string (date-time)
expires_atRequired string (date-time)
Example InteractionCreate
{
  "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "token": "palloo_int_...",
  "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "channel_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "command": {
    "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
    "name": "string"
  },
  "user": {
    "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
    "username": "string",
    "display_name": "string",
    "kind": "user",
    "avatar": "string",
    "avatar_dark": "string"
  },
  "options": [
    {
      "name": "string",
      "type": "string",
      "value": {}
    }
  ],
  "resolved": {
    "users": [
      {
        "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
        "username": "string",
        "display_name": "string",
        "kind": "user",
        "avatar": "string",
        "avatar_dark": {}
      }
    ],
    "channels": [
      {
        "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
        "name": "string",
        "kind": "text"
      }
    ],
    "roles": [
      {
        "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
        "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
        "name": "string",
        "color": 0,
        "position": 0,
        "permissions": "2748678791",
        "hoist": false,
        "mentionable": false,
        "managed": false,
        "bot_id": {}
      }
    ]
  },
  "created_at": "2026-10-15T09:00:00Z",
  "respond_by": "2026-10-15T09:00:00Z",
  "expires_at": "2026-10-15T09:00:00Z"
}

InteractionDeferred

Type: object

Payload of interaction_deferred, sent to the person who used the command.

Fields of InteractionDeferred
FieldTypeDescription
idRequired ID
community_idRequired ID
channel_idRequired ID
ephemeralRequired boolean
Example InteractionDeferred
{
  "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "channel_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "ephemeral": false
}

InteractionFailure

Type: object

Payload of interaction_failure, sent to the person who used the command.

Fields of InteractionFailure
FieldTypeDescription
idRequired ID
community_idRequired ID
channel_idRequired ID
reasonRequired string

timeout: no answer within 3 seconds; expired: deferred and never completed within 15 minutes.

One of timeout, expired

Example InteractionFailure
{
  "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "channel_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "reason": "timeout"
}

Invite

Type: object

Fields of Invite
FieldTypeDescription
codeRequired string

Case-sensitive.

pattern ^[0-9A-Za-z]{8}$

community_idRequired ID
created_byRequired ID
usesRequired integer

at least 0

max_usesRequired integer or null

Null means unlimited.

at least 1; at most 1000

expires_atRequired string (date-time) or null

Null means the invite never expires.

created_atRequired string (date-time)
Example Invite
{
  "code": "string",
  "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "created_by": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "uses": 0,
  "max_uses": 1,
  "expires_at": "2026-10-15T09:00:00Z",
  "created_at": "2026-10-15T09:00:00Z"
}

InviteList

Type: object

Fields of InviteList
FieldTypeDescription
invitesRequired array of Invite
Example InviteList
{
  "invites": [
    {
      "code": "string",
      "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "created_by": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "uses": 0,
      "max_uses": 1,
      "expires_at": "2026-10-15T09:00:00Z",
      "created_at": "2026-10-15T09:00:00Z"
    }
  ]
}

InvitePreview

Type: object

Fields of InvitePreview
FieldTypeDescription
codeRequired string
community_idRequired ID
community_nameRequired string
iconRequired ImageHash or null
icon_darkRequired ImageHash or null
bannerRequired ImageHash or null

The community banner (community-banners kind); an a_ hash is animated.

member_countRequired integer

at least 0

vanityRequired boolean

Whether the code is the community's vanity code.

Example InvitePreview
{
  "code": "string",
  "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "community_name": "string",
  "icon": "string",
  "icon_dark": "string",
  "banner": "string",
  "member_count": 0,
  "vanity": false
}

JoinVoiceRequest

Type: object

Fields of JoinVoiceRequest
FieldTypeDescription
self_mute boolean

default false

self_deaf boolean

default false

Example JoinVoiceRequest
{
  "self_mute": false,
  "self_deaf": false
}

ListingStatus

Type: string

One of pending, approved, rejected, delisted

Member

Type: object

Fields of Member
FieldTypeDescription
userRequired PublicUser
nicknameRequired string or null

Shown instead of the display name in this community, when set.

avatarRequired ImageHash or null

The server avatar, shown instead of the user's avatar in this community. Its files live under the member-avatars kind, owned by the user.

avatar_darkRequired ImageHash or null

The optional dark mode server avatar (member-avatars kind). In a dark theme clients show it first, then avatar, then the user's avatar_dark, then the user's avatar.

bannerRequired ImageHash or null

The server banner (member-banners kind), shown instead of the user's banner here.

bioRequired string

The server About Me, shown instead of the user's About Me here when not empty.

at most 190 characters

pronounsRequired string

The server pronouns, shown instead of the user's pronouns here when not empty.

at most 40 characters

rolesRequired array of ID

IDs of the member's roles, ordered by ID. @everyone is implied and never listed.

joined_atRequired string (date-time)
timeout_untilRequired string (date-time) or null

When the member's timeout ends, or null when they are not timed out (an ended timeout reads as null). Clients can schedule their own update for that moment; no event is sent when it ends.

bot_presence_intent boolean

Present only for bot members: whether the bot's owner turned on the presence intent, so the bot receives members' status when the community allows it (bot_presence_allowed). Not updated live when the owner changes it.

Example Member
{
  "user": {
    "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
    "username": "string",
    "display_name": "string",
    "kind": "user",
    "avatar": "string",
    "avatar_dark": "string"
  },
  "nickname": "string",
  "avatar": "string",
  "avatar_dark": "string",
  "banner": "string",
  "bio": "string",
  "pronouns": "string",
  "roles": [
    "01J9ZQ3V5K8M2N4P6R8T0W2Y4A"
  ],
  "joined_at": "2026-10-15T09:00:00Z",
  "timeout_until": "2026-10-15T09:00:00Z",
  "bot_presence_intent": false
}

MemberPage

Type: object

Fields of MemberPage
FieldTypeDescription
membersRequired array of Member
nextRequired string or null

Pass as after to get the next page. Null on the last page.

pattern ^[0-9A-HJKMNP-TV-Z]{26}$

Example MemberPage
{
  "members": [
    {
      "user": {
        "id": {},
        "username": "string",
        "display_name": "string",
        "kind": {},
        "avatar": {},
        "avatar_dark": {}
      },
      "nickname": "string",
      "avatar": "string",
      "avatar_dark": "string",
      "banner": "string",
      "bio": "string",
      "pronouns": "string",
      "roles": [
        "01J9ZQ3V5K8M2N4P6R8T0W2Y4A"
      ],
      "joined_at": "2026-10-15T09:00:00Z",
      "timeout_until": "2026-10-15T09:00:00Z",
      "bot_presence_intent": false
    }
  ],
  "next": "string"
}

Message

Type: object

Fields of Message
FieldTypeDescription
idRequired ID
channel_idRequired ID
community_id ID

The channel's community. Absent for messages in direct messages.

authorRequired MessageAuthor
webhook_id ID

Set when a webhook posted the message; author is then the webhook's display (kind: "webhook", its ID, and the name it posted with). Webhook messages cannot be edited. The webhook may have been deleted since.

contentRequired string

Empty for a bot without the message content permission, unless the bot wrote the message or is in mentions (DMs are exempt). May be empty when the message has attachments.

attachmentsRequired array of Attachment

In upload order. Empty for a bot without the message content permission, as with content.

at most 10 items

sticker_items array of StickerItem

The sticker the message was sent with; left out when it has none.

at most 1 items

gif_url string

The GIF the message was sent with through the picker; left out otherwise, and dropped when an edit removes the URL from content. Clients embed only this URL.

created_atRequired string (date-time)
edited_atRequired string (date-time) or null

When the content was last edited; null if never.

mentionsRequired array of PublicUser

Users mentioned with <@USER_ID> who are members and can view the channel (in a DM: who are participants), in the order they first appear. Mentions of anyone else are plain text. A user who no longer exists is left out. A reply sent with allowed_mentions.replied_user also lists the author of the message it replies to, last, as on Discord.

mention_rolesRequired array of ID

Roles mentioned with <@&ROLE_ID> that ping: the role is mentionable, or the author had Mention Everyone in the channel. Other role mentions are plain text. Can name a role that was deleted later. Always empty in DMs.

mention_everyoneRequired boolean

True when the content has @everyone or @here and the author had Mention Everyone in the channel. Always false in DMs. See mention_here for who @here pinged.

mention_hereRequired boolean

True when mention_everyone comes from @here alone (the content has no pinging @everyone). Such a message pinged only the members who could view the channel and whose visible status was online, idle or dnd when it was sent (not offline, not invisible), as on Discord. A connected client counts the ping for its own user unless the user's chosen status is invisible. Always false in DMs and when mention_everyone is false.

interaction MessageInteraction

Set on a bot's answer to a slash command; who used which command.

ephemeral boolean

True on an ephemeral answer to a slash command: it only reaches the person who used the command, over the gateway, and is never stored (history never returns it, and it is gone after a reload).

nonce string

Only on the response to the send that carried it, and on the matching message_create gateway event, so a client can match its pending message. Never stored or returned later.

kindRequired string

default for everything people, bots and webhooks post. channel_pinned_message is the system message the server posts when someone pins a message ("X pinned a message to this channel"): author is who pinned, content is always empty, there are no attachments or mentions, and message_reference names the pinned message. thread_created is posted in a text channel when someone starts a public thread from the channel header ("X started a thread"): message_reference.channel_id is the thread, and thread describes it while it exists. thread_starter_message is the first message of a thread started from a message: message_reference names that message in the parent and referenced_message carries it while it exists. auto_moderation_action is an AutoMod alert in the rule's alert channel: author is the member who triggered the rule, content is empty (what they sent, blocked or not, is auto_moderation.content, as on Discord, so a bot reading content in a staff channel never sees member text), there are no mentions or attachments, and auto_moderation says what happened. Only the server creates system messages; they cannot be edited or pinned, and clients render them from kind, author and the references. Only alerts can be reported, and deleting one needs Manage Messages even for its author.

One of default, channel_pinned_message, thread_created, thread_starter_message, auto_moderation_action

pinnedRequired boolean

Whether the message is pinned in its channel. See GET /channels/{id}/pins.

reactions array of Reaction

The message's reactions, oldest emoji first, with me for the caller. Present on history and pins while the reactions flag is on for the channel (an empty list when there are none), and absent everywhere else, including every gateway message event: a client keeps the reactions it has when a message event has no reactions and follows the message_reaction_* events instead.

at most 20 items

message_reference MessageReference

On system messages: the pinned message, the thread (channel_id alone) or the message a thread was started from. On a default message it makes the message a reply: message_id is the message replied to, always in the same channel. It may have been changed or deleted since.

thread Channel

The public thread started from this message, or announced by a thread_created message, while it exists. Private threads never appear here.

referenced_message Message

On a thread_starter_message, and on a reply, while the message it names exists and the viewer may read it. It never carries its own referenced_message. Absent on a reply means the original was deleted or is not available to this viewer (a viewer without Read Message History only gets it for messages sent after they connected); clients show "Original message was deleted". Search results, report snapshots and the server directory preview leave it out and keep only message_reference. Edits to the original arrive as its own message_update, not as one per reply.

auto_moderation AutoModerationAlert

Only on an auto_moderation_action message.

Example Message
{
  "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "channel_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "author": {
    "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
    "username": "string",
    "display_name": "string",
    "kind": "user",
    "avatar": "string",
    "avatar_dark": "string"
  },
  "webhook_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "content": "string",
  "attachments": [
    {
      "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "filename": "string",
      "description": "string",
      "content_type": "string",
      "size": 1,
      "url": "string",
      "thumbnail_url": "string",
      "width": 0,
      "height": 0,
      "placeholder": "string",
      "spoiler": false,
      "risk": "none",
      "sensitive": "none",
      "quarantined": false
    }
  ],
  "sticker_items": [
    {
      "id": "string",
      "name": "string",
      "format": "string",
      "animated": false,
      "community_id": "string",
      "pack_id": "string",
      "hash": "string",
      "available": false
    }
  ],
  "gif_url": "string",
  "created_at": "2026-10-15T09:00:00Z",
  "edited_at": "2026-10-15T09:00:00Z",
  "mentions": [
    {
      "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "username": "string",
      "display_name": "string",
      "kind": "user",
      "avatar": "string",
      "avatar_dark": "string"
    }
  ],
  "mention_roles": [
    "01J9ZQ3V5K8M2N4P6R8T0W2Y4A"
  ],
  "mention_everyone": false,
  "mention_here": false,
  "interaction": {
    "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
    "name": "string",
    "user": {
      "id": {},
      "username": "string",
      "display_name": "string",
      "kind": {},
      "avatar": {},
      "avatar_dark": {}
    }
  },
  "ephemeral": false,
  "nonce": "string",
  "kind": "default",
  "pinned": false,
  "reactions": [
    {
      "emoji": {
        "id": "string",
        "name": "string"
      },
      "count": 1,
      "me": false
    }
  ],
  "message_reference": {
    "message_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
    "channel_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A"
  },
  "thread": {
    "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
    "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
    "name": "string",
    "kind": "text",
    "position": 0,
    "parent_id": "string",
    "topic": "string",
    "created_at": "2026-10-15T09:00:00Z",
    "overwrites": [
      {
        "type": "role",
        "id": {},
        "allow": {},
        "deny": {}
      }
    ],
    "owner_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
    "message_count": 0,
    "member_count": 0,
    "thread_metadata": {
      "archived": false,
      "auto_archive_duration": 60,
      "archive_timestamp": "2026-10-15T09:00:00Z",
      "locked": false,
      "invitable": false,
      "create_timestamp": "2026-10-15T09:00:00Z"
    },
    "user_limit": 0,
    "bitrate": 8000,
    "age_restricted": false
  },
  "referenced_message": {},
  "auto_moderation": {
    "rule_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
    "rule_name": "string",
    "trigger_type": "keyword",
    "channel_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
    "message_id": "string",
    "blocked": false,
    "edit": false,
    "matched_keyword": "string",
    "matched_content": "string",
    "content": "string",
    "content_hidden": false,
    "content_removed": false,
    "attachments": [
      "string"
    ],
    "timeout_seconds": 0,
    "timeout_until": "2026-10-15T09:00:00Z"
  }
}

MessageAuthor

Type: object

Who posted a message: a user or bot (the PublicUser fields), or a webhook (kind: "webhook", id is the webhook's ID and both names are the name it posted with).

Fields of MessageAuthor
FieldTypeDescription
idRequired ID
usernameRequired string
display_nameRequired string
kindRequired string

One of user, bot, webhook

avatarRequired ImageHash or null

Always null for a webhook.

avatar_darkRequired ImageHash or null

The dark mode avatar. Always null for a webhook.

Example MessageAuthor
{
  "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "username": "string",
  "display_name": "string",
  "kind": "user",
  "avatar": "string",
  "avatar_dark": "string"
}

MessageDeleteBulk

Type: object

Payload of the message_delete_bulk gateway event, sent to the same connections as message_delete, for several messages of one channel at once (at most 500), for example when a deleted account's messages are removed. last_message_id is the channel's newest message after the deletion, or null when none is left. community_id is absent for DMs. A viewer without Read Message History gets only the IDs of messages sent after their connection loaded the community, and last_message_id null.

Fields of MessageDeleteBulk
FieldTypeDescription
idsRequired array of ID

at most 500 items

channel_idRequired ID
community_id ID
last_message_idRequired ID or null

A ULID. Sorts lexically in creation order.

Example MessageDeleteBulk
{
  "ids": [
    "01J9ZQ3V5K8M2N4P6R8T0W2Y4A"
  ],
  "channel_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "last_message_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A"
}

MessageInteraction

Type: object

Fields of MessageInteraction
FieldTypeDescription
idRequired ID
nameRequired string

The command's name.

userRequired PublicUser
Example MessageInteraction
{
  "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "name": "string",
  "user": {
    "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
    "username": "string",
    "display_name": "string",
    "kind": "user",
    "avatar": "string",
    "avatar_dark": "string"
  }
}

MessageList

Type: object

Fields of MessageList
FieldTypeDescription
messagesRequired array of Message
Example MessageList
{
  "messages": [
    {
      "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "channel_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "author": {
        "id": {},
        "username": "string",
        "display_name": "string",
        "kind": "user",
        "avatar": {},
        "avatar_dark": {}
      },
      "webhook_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "content": "string",
      "attachments": [
        {
          "id": {},
          "filename": "string",
          "description": "string",
          "content_type": "string",
          "size": 1,
          "url": "string",
          "thumbnail_url": "string",
          "width": 0,
          "height": 0,
          "placeholder": "string",
          "spoiler": false,
          "risk": {},
          "sensitive": {},
          "quarantined": false
        }
      ],
      "sticker_items": [
        {
          "id": "string",
          "name": "string",
          "format": "string",
          "animated": false,
          "community_id": "string",
          "pack_id": "string",
          "hash": "string",
          "available": false
        }
      ],
      "gif_url": "string",
      "created_at": "2026-10-15T09:00:00Z",
      "edited_at": "2026-10-15T09:00:00Z",
      "mentions": [
        {
          "id": {},
          "username": "string",
          "display_name": "string",
          "kind": {},
          "avatar": {},
          "avatar_dark": {}
        }
      ],
      "mention_roles": [
        "01J9ZQ3V5K8M2N4P6R8T0W2Y4A"
      ],
      "mention_everyone": false,
      "mention_here": false,
      "interaction": {
        "id": {},
        "name": "string",
        "user": {}
      },
      "ephemeral": false,
      "nonce": "string",
      "kind": "default",
      "pinned": false,
      "reactions": [
        {
          "emoji": {},
          "count": 1,
          "me": false
        }
      ],
      "message_reference": {
        "message_id": {},
        "channel_id": {}
      },
      "thread": {
        "id": {},
        "community_id": {},
        "name": "string",
        "kind": {},
        "position": 0,
        "parent_id": "string",
        "topic": {},
        "created_at": "2026-10-15T09:00:00Z",
        "overwrites": [],
        "owner_id": {},
        "message_count": 0,
        "member_count": 0,
        "thread_metadata": {},
        "user_limit": 0,
        "bitrate": 8000,
        "age_restricted": false
      },
      "referenced_message": {},
      "auto_moderation": {
        "rule_id": {},
        "rule_name": "string",
        "trigger_type": {},
        "channel_id": {},
        "message_id": "string",
        "blocked": false,
        "edit": false,
        "matched_keyword": "string",
        "matched_content": "string",
        "content": "string",
        "content_hidden": false,
        "content_removed": false,
        "attachments": [],
        "timeout_seconds": 0,
        "timeout_until": "2026-10-15T09:00:00Z"
      }
    }
  ]
}

MessageReference

Type: object

Fields of MessageReference
FieldTypeDescription
message_id ID
channel_idRequired ID
Example MessageReference
{
  "message_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "channel_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A"
}

ModerateVoiceStateRequest

Type: object

Fields of ModerateVoiceStateRequest
FieldTypeDescription
mute boolean
deaf boolean
channel_id string or null

Move the member to this voice channel, or disconnect them with null.

Example ModerateVoiceStateRequest
{
  "mute": false,
  "deaf": false,
  "channel_id": "string"
}

ModerationAction

Type: string

One of community.update, community.transfer_ownership, community.vanity_update, community.directory_update, channel.create, channel.update, channel.delete, channel.reorder, channel.overwrite_update, channel.overwrite_delete, role.create, role.update, role.delete, role.reorder, member.role_add, member.role_remove, member.nickname, member.profile_reset, member.kick, member.ban, member.unban, member.timeout, member.timeout_remove, message.delete, message.pin, message.unpin, bot.add, report.update, attachment.quarantine, thread.create, thread.update, thread.delete, auto_moderation.rule_create, auto_moderation.rule_update, auto_moderation.rule_delete, auto_moderation.block_message, auto_moderation.flag_to_channel, auto_moderation.timeout, voice.mute, voice.deafen, voice.move, voice.disconnect, public_web.update, public_web.channel, public_web.hide, public_web.show, public_web.answer, sticker.create, sticker.update, sticker.delete

ModerationLogEntry

Type: object

Fields of ModerationLogEntry
FieldTypeDescription
idRequired ID
community_idRequired ID
actionRequired ModerationAction
actor_idRequired ID
actor_kindRequired string

instance_admin for actions an instance admin took from the admin report queue; auto_moderation for AutoMod's blocks, alerts and timeouts, whose actor_id is the rule's ID.

One of member, instance_admin, auto_moderation

actorRequired PublicUser or null

The actor as they are now; null once the account is gone.

target_typeRequired string

One of community, channel, role, user, message, report, attachment, auto_moderation_rule, sticker

target_idRequired ID
target_userRequired PublicUser or null

For a user target, the user as they are now; null otherwise or once the account is gone.

report_idRequired string or null

The report the action was taken from. Always null for callers without Moderate Members.

reasonRequired string or null
detailsRequired object

Action-specific. Updates record each change as {from, to} under changes; channel creation and deletion record name and kind; role creation records name and permissions; member role changes record role_id and role_name; overwrite changes record the overwrite's type, id, allow and deny; reorders record the moved roles; timeouts record until; bans record was_member; message deletions, pins and unpins record channel_id, author_id and webhook, or only channel_hidden: true for a caller who cannot view that channel now (channel creations and updates that carry a topic are hidden the same way); report updates record status, assignee_id and note_changed; bot additions record permissions and role_id; attachment quarantines record the attachment's channel_id, message_id and filename; vanity code changes record changes.vanity_code as {from, to}. AutoMod rule changes record name, trigger_type and, for updates, changes (keyword lists as {added, removed}). AutoMod blocks, alerts and timeouts record rule_id, rule_name, trigger_type, channel_id, message_id, edit, content, attachments, matched_keyword and matched_content (alerts add alert_channel_id and alert_message_id, timeouts duration_seconds and until); like message deletions they carry only channel_hidden: true for a caller who cannot view that channel now, and after 90 days the content fields are removed and content_expired is set.

created_atRequired string (date-time)
Example ModerationLogEntry
{
  "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "action": "community.update",
  "actor_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "actor_kind": "member",
  "actor": {
    "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
    "username": "string",
    "display_name": "string",
    "kind": "user",
    "avatar": "string",
    "avatar_dark": "string"
  },
  "target_type": "community",
  "target_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "target_user": {
    "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
    "username": "string",
    "display_name": "string",
    "kind": "user",
    "avatar": "string",
    "avatar_dark": "string"
  },
  "report_id": "string",
  "reason": "string",
  "details": {},
  "created_at": "2026-10-15T09:00:00Z"
}

ModerationLogPage

Type: object

Fields of ModerationLogPage
FieldTypeDescription
entriesRequired array of ModerationLogEntry
nextRequired string or null

Pass as before to get the next page. Null on the last page.

pattern ^[0-9A-HJKMNP-TV-Z]{26}$

Example ModerationLogPage
{
  "entries": [
    {
      "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "action": "community.update",
      "actor_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "actor_kind": "member",
      "actor": {
        "id": {},
        "username": "string",
        "display_name": "string",
        "kind": {},
        "avatar": {},
        "avatar_dark": {}
      },
      "target_type": "community",
      "target_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "target_user": {
        "id": {},
        "username": "string",
        "display_name": "string",
        "kind": {},
        "avatar": {},
        "avatar_dark": {}
      },
      "report_id": "string",
      "reason": "string",
      "details": {},
      "created_at": "2026-10-15T09:00:00Z"
    }
  ],
  "next": "string"
}

OAuthError

Type: object

The OAuth 2.0 error shape (RFC 6749), used by the token, userinfo and revocation endpoints.

Fields of OAuthError
FieldTypeDescription
errorRequired string
error_description string
Example OAuthError
{
  "error": "string",
  "error_description": "string"
}

OAuthTokenRequest

Type: object

Fields of OAuthTokenRequest
FieldTypeDescription
grant_typeRequired string

One of authorization_code, refresh_token

code string
redirect_uri string
code_verifier string
refresh_token string
scope string
client_id string
client_assertion_type string

One of urn:ietf:params:oauth:client-assertion-type:jwt-bearer

client_assertion string
Example OAuthTokenRequest
{
  "grant_type": "authorization_code",
  "code": "string",
  "redirect_uri": "string",
  "code_verifier": "string",
  "refresh_token": "string",
  "scope": "string",
  "client_id": "string",
  "client_assertion_type": "urn:ietf:params:oauth:client-assertion-type:jwt-bearer",
  "client_assertion": "string"
}

OAuthTokens

Type: object

Fields of OAuthTokens
FieldTypeDescription
access_tokenRequired string

Opaque; only opens the userinfo endpoint. Valid 10 minutes.

token_typeRequired string

One of Bearer, DPoP

expires_inRequired integer
refresh_tokenRequired string

Single use; valid 30 days.

id_tokenRequired string

A JWT valid 5 minutes, signed with the app's id_token_signed_response_alg (RS256 unless registered otherwise), with only iss, aud, sub, iat, exp, auth_time, amr, sid, at_hash and (from a code) nonce. The scope claims (profile, email, palloo_instance_role) are only at userinfo.

scopeRequired string
Example OAuthTokens
{
  "access_token": "string",
  "token_type": "Bearer",
  "expires_in": 0,
  "refresh_token": "string",
  "id_token": "string",
  "scope": "string"
}

OAuthUserinfo

Type: object

The scope claims, read live on every call; they are never in the ID token.

Fields of OAuthUserinfo
FieldTypeDescription
subRequired string

The user ID; it never changes.

preferred_username string

With profile.

name string

With profile: the display name.

picture string

With profile, when the user has an avatar: its 512 px PNG.

email string

With email, when the user set one.

email_verified boolean

With email.

palloo_instance_role string or null

With palloo:staff: the user's instance role, or null. Also null while the mfa feature is on and the sign-in's amr lacks mfa.

One of owner, admin,

Example OAuthUserinfo
{
  "sub": "string",
  "preferred_username": "string",
  "name": "string",
  "picture": "string",
  "email": "string",
  "email_verified": false,
  "palloo_instance_role": "owner"
}

OnlineMember

Type: object

Gateway only, an entry of online_members.

Fields of OnlineMember
FieldTypeDescription
memberRequired Member
presenceRequired Presence
hoisted_role_idRequired ID or null

The member's highest role (by position) with hoist set, which is the group the member list shows them under; null for the plain "Online" group.

Example OnlineMember
{
  "member": {
    "user": {
      "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "username": "string",
      "display_name": "string",
      "kind": "user",
      "avatar": "string",
      "avatar_dark": {}
    },
    "nickname": "string",
    "avatar": "string",
    "avatar_dark": "string",
    "banner": "string",
    "bio": "string",
    "pronouns": "string",
    "roles": [
      "01J9ZQ3V5K8M2N4P6R8T0W2Y4A"
    ],
    "joined_at": "2026-10-15T09:00:00Z",
    "timeout_until": "2026-10-15T09:00:00Z",
    "bot_presence_intent": false
  },
  "presence": {
    "user_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
    "status": "online",
    "custom_status": {
      "text": "string",
      "expires_at": "2026-10-15T09:00:00Z"
    },
    "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A"
  },
  "hoisted_role_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A"
}

OnlineMembers

Type: object

Gateway only: the online_members payload, the answer to request_online_members. A page of the community's members who are not offline, sorted for a member list: by the position of hoisted_role_id (highest first, members without one last), then by name (nickname, else display name, else username, case-insensitively), then by user ID. offset and total refer to that sorted list, which the server builds at most every 5 seconds per server process; between builds, members who leave, are removed or go offline drop out at once and status changes show at once, while members who come online appear with the next build. members can be shorter than asked when the page holds blocked users, who are left out. truncated means the community has more than 10,000 members online and only 10,000 were listed.

Fields of OnlineMembers
FieldTypeDescription
community_idRequired ID
offsetRequired integer

at least 0

totalRequired integer

at least 0

truncatedRequired boolean
membersRequired array of OnlineMember

at most 100 items

Example OnlineMembers
{
  "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "offset": 0,
  "total": 0,
  "truncated": false,
  "members": [
    {
      "member": {
        "user": {},
        "nickname": "string",
        "avatar": {},
        "avatar_dark": {},
        "banner": {},
        "bio": "string",
        "pronouns": "string",
        "roles": [],
        "joined_at": "2026-10-15T09:00:00Z",
        "timeout_until": "2026-10-15T09:00:00Z",
        "bot_presence_intent": false
      },
      "presence": {
        "user_id": {},
        "status": {},
        "custom_status": {},
        "community_id": {}
      },
      "hoisted_role_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A"
    }
  ]
}

OpenDMRequest

Type: object

Fields of OpenDMRequest
FieldTypeDescription
recipient_idRequired string
Example OpenDMRequest
{
  "recipient_id": "string"
}

Organization

Type: object

Fields of Organization
FieldTypeDescription
idRequired ID
nameRequired string
descriptionRequired string or null
owner_idRequired ID
owner_usernameRequired string
domainRequired string
domain_idRequired string or null

The domain claim it was verified with; null once the claim is removed.

statusRequired string

One of pending, approved, rejected, revoked

verifiedRequired boolean

Approved and its domain claim is active now; only then do members and communities show the badge.

submitted_atRequired string (date-time)
reviewed_atRequired string (date-time) or null
decision_reasonRequired string or null
communitiesRequired array of object
communities[].idRequired ID
communities[].nameRequired string
membersRequired array of OrganizationMember

Active members; the owner and instance admins also see invitations.

my_stateRequired string or null

One of invited, active,

Example Organization
{
  "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "name": "string",
  "description": "string",
  "owner_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "owner_username": "string",
  "domain": "string",
  "domain_id": "string",
  "status": "pending",
  "verified": false,
  "submitted_at": "2026-10-15T09:00:00Z",
  "reviewed_at": "2026-10-15T09:00:00Z",
  "decision_reason": "string",
  "communities": [
    {
      "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "name": "string"
    }
  ],
  "members": [
    {
      "user": {
        "id": {},
        "username": "string",
        "display_name": "string",
        "kind": {},
        "avatar": {},
        "avatar_dark": {}
      },
      "state": "invited",
      "invited_at": "2026-10-15T09:00:00Z",
      "joined_at": "2026-10-15T09:00:00Z"
    }
  ],
  "my_state": "invited"
}

OrganizationMember

Type: object

Fields of OrganizationMember
FieldTypeDescription
userRequired PublicUser
stateRequired string

One of invited, active

invited_atRequired string (date-time)
joined_atRequired string (date-time) or null
Example OrganizationMember
{
  "user": {
    "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
    "username": "string",
    "display_name": "string",
    "kind": "user",
    "avatar": "string",
    "avatar_dark": "string"
  },
  "state": "invited",
  "invited_at": "2026-10-15T09:00:00Z",
  "joined_at": "2026-10-15T09:00:00Z"
}

OrganizationRef

Type: object

A verified organization, for its badge.

Fields of OrganizationRef
FieldTypeDescription
idRequired ID
nameRequired string
domainRequired string

The organization's verified domain, in its ASCII (punycode) form.

Example OrganizationRef
{
  "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "name": "string",
  "domain": "string"
}

Overwrite

Type: object

Fields of Overwrite
FieldTypeDescription
typeRequired string

One of role, member

idRequired ID

The role ID (the community ID for @everyone) or the member's user ID.

allowRequired Permissions
denyRequired Permissions
Example Overwrite
{
  "type": "role",
  "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "allow": "2748678791",
  "deny": "2748678791"
}

OverwriteRequest

Type: object

Only channel permissions may appear (View Channel, Send Messages, Read Message History, Manage Messages, Manage Channels, Manage Roles, Mention Everyone), and no bit may be both allowed and denied.

Fields of OverwriteRequest
FieldTypeDescription
allow Permissions

A 64-bit permission set as a decimal string. See the roles tag for the bits.

deny Permissions

A 64-bit permission set as a decimal string. See the roles tag for the bits.

Example OverwriteRequest
{
  "allow": "2748678791",
  "deny": "2748678791"
}

Perk

Type: string

One of vanity_invite, partner_badge, featured

Permissions

Type: string

A 64-bit permission set as a decimal string. See the roles tag for the bits.

pattern ^[0-9]{1,20}$

PermissionSet

Type: object

Fields of PermissionSet
FieldTypeDescription
community_idRequired ID
permissionsRequired Permissions

Community-wide permissions (everything for the owner and for Administrator).

channelsRequired array of object

Effective permissions in each channel the caller can view, in channel order. Channels the caller cannot view are left out.

channels[].channel_idRequired ID
channels[].permissionsRequired Permissions
timeout_untilRequired string (date-time) or null

When the caller's timeout ends, or null. While timed out, permissions and every channel's permissions are already cut to View Channel and Read Message History.

Example PermissionSet
{
  "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "permissions": "2748678791",
  "channels": [
    {
      "channel_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "permissions": "2748678791"
    }
  ],
  "timeout_until": "2026-10-15T09:00:00Z"
}

Pin

Type: object

Fields of Pin
FieldTypeDescription
pinned_atRequired string (date-time)
messageRequired Message
Example Pin
{
  "pinned_at": "2026-10-15T09:00:00Z",
  "message": {
    "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
    "channel_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
    "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
    "author": {
      "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "username": "string",
      "display_name": "string",
      "kind": "user",
      "avatar": {},
      "avatar_dark": {}
    },
    "webhook_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
    "content": "string",
    "attachments": [
      {
        "id": {},
        "filename": "string",
        "description": "string",
        "content_type": "string",
        "size": 1,
        "url": "string",
        "thumbnail_url": "string",
        "width": 0,
        "height": 0,
        "placeholder": "string",
        "spoiler": false,
        "risk": {},
        "sensitive": {},
        "quarantined": false
      }
    ],
    "sticker_items": [
      {
        "id": "string",
        "name": "string",
        "format": "string",
        "animated": false,
        "community_id": "string",
        "pack_id": "string",
        "hash": "string",
        "available": false
      }
    ],
    "gif_url": "string",
    "created_at": "2026-10-15T09:00:00Z",
    "edited_at": "2026-10-15T09:00:00Z",
    "mentions": [
      {
        "id": {},
        "username": "string",
        "display_name": "string",
        "kind": {},
        "avatar": {},
        "avatar_dark": {}
      }
    ],
    "mention_roles": [
      "01J9ZQ3V5K8M2N4P6R8T0W2Y4A"
    ],
    "mention_everyone": false,
    "mention_here": false,
    "interaction": {
      "id": {},
      "name": "string",
      "user": {}
    },
    "ephemeral": false,
    "nonce": "string",
    "kind": "default",
    "pinned": false,
    "reactions": [
      {
        "emoji": {},
        "count": 1,
        "me": false
      }
    ],
    "message_reference": {
      "message_id": {},
      "channel_id": {}
    },
    "thread": {
      "id": {},
      "community_id": {},
      "name": "string",
      "kind": {},
      "position": 0,
      "parent_id": "string",
      "topic": {},
      "created_at": "2026-10-15T09:00:00Z",
      "overwrites": [],
      "owner_id": {},
      "message_count": 0,
      "member_count": 0,
      "thread_metadata": {},
      "user_limit": 0,
      "bitrate": 8000,
      "age_restricted": false
    },
    "referenced_message": {},
    "auto_moderation": {
      "rule_id": {},
      "rule_name": "string",
      "trigger_type": {},
      "channel_id": {},
      "message_id": "string",
      "blocked": false,
      "edit": false,
      "matched_keyword": "string",
      "matched_content": "string",
      "content": "string",
      "content_hidden": false,
      "content_removed": false,
      "attachments": [],
      "timeout_seconds": 0,
      "timeout_until": "2026-10-15T09:00:00Z"
    }
  }
}

PinList

Type: object

Fields of PinList
FieldTypeDescription
pinsRequired array of Pin

Newest pin first.

at most 50 items

Example PinList
{
  "pins": [
    {
      "pinned_at": "2026-10-15T09:00:00Z",
      "message": {
        "id": {},
        "channel_id": {},
        "community_id": {},
        "author": {},
        "webhook_id": {},
        "content": "string",
        "attachments": [],
        "sticker_items": [],
        "gif_url": "string",
        "created_at": "2026-10-15T09:00:00Z",
        "edited_at": "2026-10-15T09:00:00Z",
        "mentions": [],
        "mention_roles": [],
        "mention_everyone": false,
        "mention_here": false,
        "interaction": {},
        "ephemeral": false,
        "nonce": "string",
        "kind": "default",
        "pinned": false,
        "reactions": [],
        "message_reference": {},
        "thread": {},
        "referenced_message": {},
        "auto_moderation": {}
      }
    }
  ]
}

Presence

Type: object

Gateway only: the presence_update payload and an entry of ready.presences, presence_list and online_members. A user without an entry is offline.

Fields of Presence
FieldTypeDescription
user_idRequired ID
statusRequired PresenceStatus
custom_statusRequired CustomStatus or null

A custom status (for bots, their activity). Hide it once expires_at has passed; no event is sent when it expires.

community_id ID

Only on a presence_update that arrived because the connection follows that community (with subscribe_presence, or a bot with the presence intent). Absent on updates about friends and DM partners, on the offline the server sends when a block starts or someone stops being visible, and in lists. Presence is per user, not per community: the same status applies everywhere the user appears.

Example Presence
{
  "user_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "status": "online",
  "custom_status": {
    "text": "string",
    "expires_at": "2026-10-15T09:00:00Z"
  },
  "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A"
}

PresenceList

Type: object

Gateway only: the presence_list payload, sent when a connection starts following a community with subscribe_presence. Lists members who are not offline, at most 1,000; truncated means there were more.

Fields of PresenceList
FieldTypeDescription
community_idRequired ID
presencesRequired array of Presence
truncatedRequired boolean
Example PresenceList
{
  "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "presences": [
    {
      "user_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "status": "online",
      "custom_status": {
        "text": "string",
        "expires_at": "2026-10-15T09:00:00Z"
      },
      "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A"
    }
  ],
  "truncated": false
}

PresenceStatus

Type: string

A user's status as others see it. invisible is never sent to anyone but the user's own connections; others see offline.

One of online, idle, dnd, offline

Profile

Type: object

Fields of Profile
FieldTypeDescription
idRequired ID
usernameRequired string
display_nameRequired string
kindRequired UserKind
avatarRequired ImageHash or null
avatar_darkRequired ImageHash or null

The optional dark mode avatar (same avatars kind as avatar). Clients show it instead of avatar when the viewer uses a dark theme; null means use avatar.

bannerRequired ImageHash or null
bioRequired string

at most 190 characters

pronounsRequired string

at most 40 characters

banner_colorRequired BannerColor or null
created_atRequired string (date-time)

When the account was created.

addressRequired string
handleRequired string
moved_toRequired string or null

Set when the account moved; clients should look the new address up instead.

signing_keyRequired SigningKey or null
verified_domainsRequired array of string

Active domain claims the account shows, in ASCII (punycode) form; show mixed-script names as punycode. Empty when the account hides the verified_domain badge.

badgesRequired array of Badge

Visible badges in display order.

Example Profile
{
  "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "username": "string",
  "display_name": "string",
  "kind": "user",
  "avatar": "string",
  "avatar_dark": "string",
  "banner": "string",
  "bio": "string",
  "pronouns": "string",
  "banner_color": 0,
  "created_at": "2026-10-15T09:00:00Z",
  "address": "string",
  "handle": "string",
  "moved_to": "string",
  "signing_key": {
    "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
    "algorithm": "ed25519",
    "public_key": "string",
    "created_at": "2026-10-15T09:00:00Z",
    "retired_at": "2026-10-15T09:00:00Z",
    "retire_reason": "rotated"
  },
  "verified_domains": [
    "string"
  ],
  "badges": [
    {
      "key": "staff",
      "name": "string",
      "description": "string",
      "label": "string",
      "kind": "automatic",
      "issuer": "string",
      "tier": {
        "key": "string",
        "name": "string",
        "level": 1
      },
      "next_tier": {
        "key": "string",
        "name": "string",
        "requirement": "string"
      },
      "active": false,
      "hidden": false,
      "hideable": false,
      "granted_at": "2026-10-15T09:00:00Z",
      "expires_at": "2026-10-15T09:00:00Z",
      "organization": {
        "id": {},
        "name": "string",
        "domain": "string"
      },
      "domains": [
        "string"
      ]
    }
  ]
}

Pronouns

Type: string

Trimmed, then at most 40 characters with no control or invisible formatting characters. Null or an empty string clears them.

PublicUser

Type: object

What any member of a shared community can see about a user.

Fields of PublicUser
FieldTypeDescription
idRequired ID
usernameRequired string
display_nameRequired string
kindRequired UserKind
avatarRequired ImageHash or null
avatar_darkRequired ImageHash or null

The optional dark mode avatar (same avatars kind as avatar). Clients show it instead of avatar when the viewer uses a dark theme; null means use avatar.

Example PublicUser
{
  "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "username": "string",
  "display_name": "string",
  "kind": "user",
  "avatar": "string",
  "avatar_dark": "string"
}

PublicWebChannelState

Type: object

Fields of PublicWebChannelState
FieldTypeDescription
channel_idRequired ID
threadRequired boolean
publishedRequired boolean

The channel (or a thread's parent) is published.

liveRequired boolean

The page is served right now.

urlRequired string or null
hiddenRequired boolean

A thread hidden from the web.

answer_message_idRequired ID or null

A ULID. Sorts lexically in creation order.

hidden_message_idsRequired array of ID
can_publishRequired boolean
can_hideRequired boolean
can_answerRequired boolean
Example PublicWebChannelState
{
  "channel_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "thread": false,
  "published": false,
  "live": false,
  "url": "string",
  "hidden": false,
  "answer_message_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "hidden_message_ids": [
    "01J9ZQ3V5K8M2N4P6R8T0W2Y4A"
  ],
  "can_publish": false,
  "can_hide": false,
  "can_answer": false
}

PublicWebSettings

Type: object

A community's public web settings.

Fields of PublicWebSettings
FieldTypeDescription
community_idRequired ID
enabledRequired boolean

The master switch.

name_displayRequired string

How authors are named on public pages; member shows everyone as "Member".

One of member, display_name

invite_codeRequired string or null

The invite the join button uses when there is no vanity invite. Only for Manage Community.

urlRequired string

The community's public page.

liveRequired boolean

Whether the community's pages are served right now.

can_manageRequired boolean
requirementsRequired array of object

What must hold before pages are served, only for members with Manage Community (empty for everyone else). upload_scanner: the instance scans uploads (the master switch cannot be turned on without it). staff_approval: the community has a visible directory listing or instance staff approved its public pages.

requirements[].keyRequired string

One of upload_scanner, staff_approval, directory_enabled, community_age, owner_standing, safety

requirements[].metRequired boolean
channelsRequired array of object
channels[].channel_idRequired ID
channels[].urlRequired string
channels[].liveRequired boolean

Served right now: the community is live and @everyone can read the channel.

Example PublicWebSettings
{
  "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "enabled": false,
  "name_display": "member",
  "invite_code": "string",
  "url": "string",
  "live": false,
  "can_manage": false,
  "requirements": [
    {
      "key": "upload_scanner",
      "met": false
    }
  ],
  "channels": [
    {
      "channel_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "url": "string",
      "live": false
    }
  ]
}

QuarantineRequest

Type: object

Fields of QuarantineRequest
FieldTypeDescription
reason string

Up to 512 characters, for the moderation log.

Example QuarantineRequest
{
  "reason": "string"
}

Reaction

Type: object

One emoji on a message, as on Discord.

Fields of Reaction
FieldTypeDescription
emojiRequired ReactionEmoji
countRequired integer

How many people reacted with it.

at least 1

meRequired boolean

Whether the caller is one of them.

Example Reaction
{
  "emoji": {
    "id": "string",
    "name": "string"
  },
  "count": 1,
  "me": false
}

ReactionEmoji

Type: object

Fields of ReactionEmoji
FieldTypeDescription
idRequired string or null

Always null for now; reserved for custom emoji.

nameRequired string

The Unicode emoji.

at least 1 characters; at most 64 characters

Example ReactionEmoji
{
  "id": "string",
  "name": "string"
}

ReactionUserList

Type: object

Fields of ReactionUserList
FieldTypeDescription
usersRequired array of PublicUser

In the order they reacted.

at most 100 items

Example ReactionUserList
{
  "users": [
    {
      "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "username": "string",
      "display_name": "string",
      "kind": "user",
      "avatar": "string",
      "avatar_dark": "string"
    }
  ]
}

ReadState

Type: object

The caller's read state in one channel. The channel is unread when its newest message ID is greater than last_read_message_id, or there is a newest message and this is null.

Fields of ReadState
FieldTypeDescription
channel_idRequired ID
community_id ID

Absent for direct messages.

last_read_message_idRequired ID or null

The newest message the caller has read; null if none.

mention_countRequired integer

Messages that pinged the caller since the channel was last acked. In a DM every message from another participant counts.

at least 0

Example ReadState
{
  "channel_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "last_read_message_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "mention_count": 0
}

RegisterCommandRequest

Type: object

Fields of RegisterCommandRequest
FieldTypeDescription
nameRequired string
descriptionRequired string
options array of CommandOption
Example RegisterCommandRequest
{
  "name": "string",
  "description": "string",
  "options": [
    {
      "name": "string",
      "description": "string",
      "type": "string",
      "required": false,
      "min_length": 1,
      "max_length": 1,
      "min_value": 0,
      "max_value": 0
    }
  ]
}

Registration

Type: string

open: anyone can sign up. invite: signup needs a valid community invite code, and the new account joins that community. closed: no signup; accounts are created with palloo admin create-user.

One of open, invite, closed

ReorderChannelsRequest

Type: object

Fields of ReorderChannelsRequest
FieldTypeDescription
channelsRequired array of object

at least 1 items; at most 500 items

channels[].idRequired ID
channels[].positionRequired integer

at least 0; at most 9999

channels[].parent_id string or null

A category in the same community, or null for none. Omit to keep the parent.

channels[].lock_permissions boolean

With a category parent_id, replace the channel's overwrites with the category's. At most 50 entries per request may set it.

default false

Example ReorderChannelsRequest
{
  "channels": [
    {
      "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "position": 0,
      "parent_id": "string",
      "lock_permissions": false
    }
  ]
}

ReorderRolesRequest

Type: object

Fields of ReorderRolesRequest
FieldTypeDescription
rolesRequired array of object

at least 1 items

roles[].idRequired ID
roles[].positionRequired integer

Distinct, from 1 to the number of roles other than @everyone.

at least 1

Example ReorderRolesRequest
{
  "roles": [
    {
      "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "position": 1
    }
  ]
}

ReplyReference

Type: object

Makes the message a reply, as on Discord. The message must be a default message in the same channel, thread or DM; replying to a message in another channel and to system messages is refused. Replying needs Read Message History as well as Send Messages, and the replies flag on for the server (in a DM, for the sender).

Fields of ReplyReference
FieldTypeDescription
message_idRequired ID
channel_id ID

Optional; when given it must be the channel the reply is sent to.

fail_if_not_exists boolean

When false, a reply whose message no longer exists (or never did) is sent as a plain message instead of being refused with reference_not_found.

default true

Example ReplyReference
{
  "message_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "channel_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "fail_if_not_exists": true
}

ResolvedChannel

Type: object

Fields of ResolvedChannel
FieldTypeDescription
idRequired ID
nameRequired string
kindRequired ChannelKind
Example ResolvedChannel
{
  "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "name": "string",
  "kind": "text"
}

Role

Type: object

Fields of Role
FieldTypeDescription
idRequired ID
community_idRequired ID
nameRequired string
colorRequired integer or null

An RGB color as a number (0xRRGGBB), or null for none.

at least 0; at most 16777215

positionRequired integer

0 for @everyone, 1 to the number of other roles for the rest, with no gaps. Higher is above.

at least 0

permissionsRequired Permissions
hoistRequired boolean

Show members with this role separately in the member list.

mentionableRequired boolean

Whether anyone may mention the role. Stored now, used when mentions exist.

managedRequired boolean

True for the role created when a bot was added. It cannot be deleted, assigned or removed by hand, and disappears when the bot leaves.

bot_idRequired ID or null

The bot a managed role belongs to; null for every other role.

Example Role
{
  "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "name": "string",
  "color": 0,
  "position": 0,
  "permissions": "2748678791",
  "hoist": false,
  "mentionable": false,
  "managed": false,
  "bot_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A"
}

RoleList

Type: object

Fields of RoleList
FieldTypeDescription
rolesRequired array of Role
Example RoleList
{
  "roles": [
    {
      "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "name": "string",
      "color": 0,
      "position": 0,
      "permissions": "2748678791",
      "hoist": false,
      "mentionable": false,
      "managed": false,
      "bot_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A"
    }
  ]
}

SetVanityRequest

Type: object

Fields of SetVanityRequest
FieldTypeDescription
codeRequired string

3 to 32 letters, digits and single hyphens, not starting or ending with a hyphen. Lowercased.

Example SetVanityRequest
{
  "code": "string"
}

SigningKey

Type: object

Fields of SigningKey
FieldTypeDescription
idRequired ID
algorithmRequired string

One of ed25519

public_keyRequired string

The 32 byte Ed25519 public key in base64url without padding.

created_atRequired string (date-time)
retired_atRequired string (date-time) or null
retire_reasonRequired string or null

One of rotated, deleted,

Example SigningKey
{
  "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "algorithm": "ed25519",
  "public_key": "string",
  "created_at": "2026-10-15T09:00:00Z",
  "retired_at": "2026-10-15T09:00:00Z",
  "retire_reason": "rotated"
}

StickerItem

Type: object

The sticker a message carries. available is false once a server sticker was deleted: clients show "Unknown sticker", and the other fields are empty.

Fields of StickerItem
FieldTypeDescription
idRequired string
nameRequired string
formatRequired string

png, apng or gif; empty when unavailable.

animatedRequired boolean
community_idRequired string or null
pack_idRequired string or null
hashRequired string or null
availableRequired boolean
Example StickerItem
{
  "id": "string",
  "name": "string",
  "format": "string",
  "animated": false,
  "community_id": "string",
  "pack_id": "string",
  "hash": "string",
  "available": false
}

ThreadAnswerRequest

Type: object

Fields of ThreadAnswerRequest
FieldTypeDescription
message_idRequired ID
Example ThreadAnswerRequest
{
  "message_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A"
}

ThreadDelete

Type: object

Fields of ThreadDelete
FieldTypeDescription
idRequired ID
community_idRequired ID
parent_idRequired ID
kindRequired string

One of public_thread, private_thread

Example ThreadDelete
{
  "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "parent_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "kind": "public_thread"
}

ThreadList

Type: object

Fields of ThreadList
FieldTypeDescription
threadsRequired array of ChannelState
has_moreRequired boolean

Archived lists only; always false for the active list.

Example ThreadList
{
  "threads": [
    {
      "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "name": "string",
      "kind": "text",
      "position": 0,
      "parent_id": "string",
      "topic": "string",
      "created_at": "2026-10-15T09:00:00Z",
      "overwrites": [
        {
          "type": "role",
          "id": {},
          "allow": {},
          "deny": {}
        }
      ],
      "owner_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "message_count": 0,
      "member_count": 0,
      "thread_metadata": {
        "archived": false,
        "auto_archive_duration": 60,
        "archive_timestamp": "2026-10-15T09:00:00Z",
        "locked": false,
        "invitable": false,
        "create_timestamp": "2026-10-15T09:00:00Z"
      },
      "last_message_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "last_read_message_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "mention_count": 0,
      "last_pin_timestamp": "2026-10-15T09:00:00Z",
      "member": {
        "id": {},
        "user_id": {},
        "join_timestamp": "2026-10-15T09:00:00Z",
        "flags": 0,
        "member": {}
      }
    }
  ],
  "has_more": false
}

ThreadListSync

Type: object

The active threads of channel_ids the connection can now see, replacing what it had for those channels. Sent when the connection gains access to a channel or loses or gains Manage Threads in it.

Fields of ThreadListSync
FieldTypeDescription
community_idRequired ID
channel_idsRequired array of ID
threadsRequired array of ChannelState
Example ThreadListSync
{
  "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "channel_ids": [
    "01J9ZQ3V5K8M2N4P6R8T0W2Y4A"
  ],
  "threads": [
    {
      "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "name": "string",
      "kind": "text",
      "position": 0,
      "parent_id": "string",
      "topic": "string",
      "created_at": "2026-10-15T09:00:00Z",
      "overwrites": [
        {
          "type": "role",
          "id": {},
          "allow": {},
          "deny": {}
        }
      ],
      "owner_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "message_count": 0,
      "member_count": 0,
      "thread_metadata": {
        "archived": false,
        "auto_archive_duration": 60,
        "archive_timestamp": "2026-10-15T09:00:00Z",
        "locked": false,
        "invitable": false,
        "create_timestamp": "2026-10-15T09:00:00Z"
      },
      "last_message_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "last_read_message_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "mention_count": 0,
      "last_pin_timestamp": "2026-10-15T09:00:00Z",
      "member": {
        "id": {},
        "user_id": {},
        "join_timestamp": "2026-10-15T09:00:00Z",
        "flags": 0,
        "member": {}
      }
    }
  ]
}

ThreadMember

Type: object

Fields of ThreadMember
FieldTypeDescription
idRequired ID

The thread's ID.

user_idRequired ID
join_timestampRequired string (date-time)
flagsRequired integer

Always 0 for now.

member Member

The community member, in the thread member list only.

Example ThreadMember
{
  "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "user_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "join_timestamp": "2026-10-15T09:00:00Z",
  "flags": 0,
  "member": {
    "user": {
      "id": {},
      "username": "string",
      "display_name": "string",
      "kind": {},
      "avatar": {},
      "avatar_dark": {}
    },
    "nickname": "string",
    "avatar": "string",
    "avatar_dark": "string",
    "banner": "string",
    "bio": "string",
    "pronouns": "string",
    "roles": [
      "01J9ZQ3V5K8M2N4P6R8T0W2Y4A"
    ],
    "joined_at": "2026-10-15T09:00:00Z",
    "timeout_until": "2026-10-15T09:00:00Z",
    "bot_presence_intent": false
  }
}

ThreadMemberList

Type: object

Fields of ThreadMemberList
FieldTypeDescription
membersRequired array of ThreadMember
nextRequired string or null

Pass as after for the next page; null on the last page.

Example ThreadMemberList
{
  "members": [
    {
      "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "user_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "join_timestamp": "2026-10-15T09:00:00Z",
      "flags": 0,
      "member": {
        "user": {},
        "nickname": "string",
        "avatar": {},
        "avatar_dark": {},
        "banner": {},
        "bio": "string",
        "pronouns": "string",
        "roles": [],
        "joined_at": "2026-10-15T09:00:00Z",
        "timeout_until": "2026-10-15T09:00:00Z",
        "bot_presence_intent": false
      }
    }
  ],
  "next": "string"
}

ThreadMembersUpdate

Type: object

Fields of ThreadMembersUpdate
FieldTypeDescription
idRequired ID
community_idRequired ID
member_countRequired integer

at least 0

added_membersRequired array of ThreadMember
removed_member_idsRequired array of ID
Example ThreadMembersUpdate
{
  "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "member_count": 0,
  "added_members": [
    {
      "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "user_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "join_timestamp": "2026-10-15T09:00:00Z",
      "flags": 0,
      "member": {
        "user": {},
        "nickname": "string",
        "avatar": {},
        "avatar_dark": {},
        "banner": {},
        "bio": "string",
        "pronouns": "string",
        "roles": [],
        "joined_at": "2026-10-15T09:00:00Z",
        "timeout_until": "2026-10-15T09:00:00Z",
        "bot_presence_intent": false
      }
    }
  ],
  "removed_member_ids": [
    "01J9ZQ3V5K8M2N4P6R8T0W2Y4A"
  ]
}

ThreadMemberUpdate

Type: object

The caller's own membership of a thread changed.

Fields of ThreadMemberUpdate
FieldTypeDescription
idRequired ID
user_idRequired ID
join_timestampRequired string (date-time)
flagsRequired integer
community_idRequired ID
joinedRequired boolean

True when the caller joined or was added, false when they left or were removed.

Example ThreadMemberUpdate
{
  "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "user_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "join_timestamp": "2026-10-15T09:00:00Z",
  "flags": 0,
  "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "joined": false
}

ThreadMetadata

Type: object

Threads only.

Fields of ThreadMetadata
FieldTypeDescription
archivedRequired boolean
auto_archive_durationRequired integer

Minutes without a message after which the thread archives itself.

One of 60, 1440, 4320, 10080

archive_timestampRequired string (date-time)

When the thread was last archived or unarchived (its creation if never).

lockedRequired boolean

Only members with Manage Threads can send, unarchive or change it.

invitable boolean

Private threads only. Whether members without Manage Threads can add people to the thread.

create_timestampRequired string (date-time)
Example ThreadMetadata
{
  "archived": false,
  "auto_archive_duration": 60,
  "archive_timestamp": "2026-10-15T09:00:00Z",
  "locked": false,
  "invitable": false,
  "create_timestamp": "2026-10-15T09:00:00Z"
}

Tier

Type: string

A community's tier: the highest community entitlement in force (community_level_1 to community_level_3, community_partner), standard without one.

One of standard, level_1, level_2, level_3, partner

TierInfo

Type: object

Fields of TierInfo
FieldTypeDescription
tierRequired Tier
limitsRequired CommunityLimits
perksRequired array of Perk
featuresRequired array of FeatureKey

The feature flags this tier unlocks right now (flags in tier mode whose min_tier it reaches).

Example TierInfo
{
  "tier": "standard",
  "limits": {
    "members": 0,
    "channels": 0,
    "roles": 0,
    "upload_bytes": 0,
    "emoji_slots": 0,
    "sticker_slots": 0
  },
  "perks": [
    "vanity_invite"
  ],
  "features": [
    "threads"
  ]
}

TimeoutRequest

Type: object

Exactly one of until and duration_seconds.

Fields of TimeoutRequest
FieldTypeDescription
until string (date-time)

When the timeout ends. In the future and at most 28 days after the server's clock.

duration_seconds integer

How long the timeout lasts, counted from the server's clock. Prefer this for presets.

at least 1; at most 2419200

reason string or null

Recorded in the moderation log. At most 512 characters with no control or invisible formatting characters.

Example TimeoutRequest
{
  "until": "2026-10-15T09:00:00Z",
  "duration_seconds": 1,
  "reason": "string"
}

TypingStart

Type: object

Gateway only, the typing_start payload. community_id is absent in a DM.

Fields of TypingStart
FieldTypeDescription
channel_idRequired ID
community_id ID
user_idRequired ID
started_atRequired string (date-time)
Example TypingStart
{
  "channel_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "user_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "started_at": "2026-10-15T09:00:00Z"
}

UpdateAutoModerationRuleRequest

Type: object

Fields of UpdateAutoModerationRuleRequest
FieldTypeDescription
name string
event_type string

One of message_send

trigger_type AutoModerationTriggerType

Accepted only when it is the rule's own trigger type.

One of keyword, keyword_preset, mention_spam, spam

trigger_metadata AutoModerationTriggerMetadata
actions array of AutoModerationAction
enabled boolean
exempt_roles array of string
exempt_channels array of string
Example UpdateAutoModerationRuleRequest
{
  "name": "string",
  "event_type": "message_send",
  "trigger_type": "keyword",
  "trigger_metadata": {
    "keyword_filter": [
      "string"
    ],
    "regex_patterns": [
      "string"
    ],
    "presets": [
      "profanity"
    ],
    "allow_list": [
      "string"
    ],
    "mention_total_limit": 1,
    "mention_raid_protection_enabled": false
  },
  "actions": [
    {
      "type": "block_message",
      "metadata": {
        "custom_message": "string",
        "channel_id": {},
        "duration_seconds": 1
      }
    }
  ],
  "enabled": false,
  "exempt_roles": [
    "string"
  ],
  "exempt_channels": [
    "string"
  ]
}

UpdateChannelRequest

Type: object

Fields of UpdateChannelRequest
FieldTypeDescription
name string

Same rules as when creating the channel.

parent_id string or null

Move the channel into this category, or out of its category with null.

topic ChannelTopic or null

Text channels only. Null or an empty string clears the topic.

user_limit integer

Voice channels only (voice_setting_not_allowed otherwise). 0, the default, means no limit; invalid_user_limit outside 0 to 99.

at least 0; at most 99

bitrate integer

Voice channels only (voice_setting_not_allowed otherwise). Defaults to 64000; invalid_bitrate outside 8000 to 96000.

at least 8000; at most 96000

age_restricted boolean

Text and voice channels only (age_restriction_not_allowed otherwise). Needs the sensitive_media flag on for the community (sensitive_media_disabled otherwise). Recorded in the moderation log with changes.age_restricted on an update.

archived boolean

Threads only. Archive or unarchive. The owner or Manage Threads can archive; unarchiving needs Manage Threads when the thread is locked.

locked boolean

Threads only. Needs Manage Threads.

auto_archive_duration integer

Threads only. The owner or Manage Threads.

One of 60, 1440, 4320, 10080

invitable boolean

Private threads only. Needs Manage Threads.

Example UpdateChannelRequest
{
  "name": "string",
  "parent_id": "string",
  "topic": "string",
  "user_limit": 0,
  "bitrate": 8000,
  "age_restricted": false,
  "archived": false,
  "locked": false,
  "auto_archive_duration": 60,
  "invitable": false
}

UpdateCommunityRequest

Type: object

Fields of UpdateCommunityRequest
FieldTypeDescription
name string

Trimmed, then 1 to 100 characters with no control or invisible formatting characters.

default_notification_level DefaultNotificationLevel
bot_presence_allowed boolean

Whether bots with the presence intent receive this community's presence.

icon string or null

A finalized community_icon upload's ID, or null to remove the icon.

icon_dark string or null

A finalized community_icon_dark upload's ID, or null to remove the dark mode icon. Needs Manage Server, like icon.

banner string or null

A finalized community_banner upload's ID, or null to remove the banner.

Example UpdateCommunityRequest
{
  "name": "string",
  "default_notification_level": "all",
  "bot_presence_allowed": false,
  "icon": "string",
  "icon_dark": "string",
  "banner": "string"
}

UpdateCurrentUserRequest

Type: object

Fields of UpdateCurrentUserRequest
FieldTypeDescription
display_name string or null

Trimmed, then at most 64 characters with no control or invisible formatting characters. Null or an empty string goes back to the username.

bio AboutMe or null
pronouns Pronouns or null
banner_color BannerColor or null
avatar string or null

A finalized avatar upload's ID, or null to remove the avatar. Omit to keep it.

avatar_dark string or null

A finalized avatar_dark upload's ID, or null to remove the dark mode avatar. Omit to keep it.

banner string or null

A finalized banner upload's ID, or null to remove it. Omit to keep it.

Example UpdateCurrentUserRequest
{
  "display_name": "string",
  "bio": "string",
  "pronouns": "string",
  "banner_color": 0,
  "avatar": "string",
  "avatar_dark": "string",
  "banner": "string"
}

UpdateMemberRequest

Type: object

Fields of UpdateMemberRequest
FieldTypeDescription
nickname string or null

Trimmed, then at most 32 characters with no control or invisible formatting characters. Null or an empty string clears the nickname.

avatar string or null

A finalized member_avatar upload's ID made for this community, or null to remove it.

avatar_dark string or null

A finalized member_avatar_dark upload's ID made for this community, or null to remove it. For another member, only null is accepted (Manage Nicknames).

banner string or null

A finalized member_banner upload's ID made for this community, or null to remove it.

bio AboutMe or null
pronouns Pronouns or null
Example UpdateMemberRequest
{
  "nickname": "string",
  "avatar": "string",
  "avatar_dark": "string",
  "banner": "string",
  "bio": "string",
  "pronouns": "string"
}

UpdateMessageRequest

Type: object

Give content, attachments or both.

Fields of UpdateMessageRequest
FieldTypeDescription
content string

Same rules as when sending.

attachments array of object

The attachments to keep, by ID; the others are removed. Attachments cannot be added.

attachments[].idRequired ID
Example UpdateMessageRequest
{
  "content": "string",
  "attachments": [
    {
      "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A"
    }
  ]
}

UpdateMyVoiceStateRequest

Type: object

Fields of UpdateMyVoiceStateRequest
FieldTypeDescription
self_mute boolean
self_deaf boolean
Example UpdateMyVoiceStateRequest
{
  "self_mute": false,
  "self_deaf": false
}

UpdatePublicWebRequest

Type: object

Fields of UpdatePublicWebRequest
FieldTypeDescription
enabled boolean
name_display string

One of member, display_name

invite_code string or null
Example UpdatePublicWebRequest
{
  "enabled": false,
  "name_display": "member",
  "invite_code": "string"
}

UpdateRoleRequest

Type: object

Fields of UpdateRoleRequest
FieldTypeDescription
name string

Same rules as when creating.

color integer or null

Null removes the color.

at least 0; at most 16777215

permissions Permissions
hoist boolean
mentionable boolean
Example UpdateRoleRequest
{
  "name": "string",
  "color": 0,
  "permissions": "2748678791",
  "hoist": false,
  "mentionable": false
}

Upload

Type: object

Fields of Upload
FieldTypeDescription
idRequired ID
purposeRequired string

One of attachment, avatar, avatar_dark, banner, community_icon, community_icon_dark, community_banner, member_avatar, member_avatar_dark, member_banner

stateRequired string

One of ready, used

filenameRequired string
sizeRequired integer
content_typeRequired string
channel_idRequired string or null
community_idRequired string or null
widthRequired integer or null
heightRequired integer or null
placeholderRequired string or null
animatedRequired boolean
expires_atRequired string (date-time)

Use the upload before this, or it is deleted.

Example Upload
{
  "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "purpose": "attachment",
  "state": "ready",
  "filename": "string",
  "size": 0,
  "content_type": "string",
  "channel_id": "string",
  "community_id": "string",
  "width": 0,
  "height": 0,
  "placeholder": "string",
  "animated": false,
  "expires_at": "2026-10-15T09:00:00Z"
}

UploadFile

Type: object

Fields of UploadFile
FieldTypeDescription
filenameRequired string

The original name; any path is removed.

sizeRequired integer

The exact size in bytes.

at least 1

content_typeRequired string

The type the client believes the file has. The upload must be sent with exactly this Content-Type. The server checks image, video and audio types against the content.

Example UploadFile
{
  "filename": "string",
  "size": 1,
  "content_type": "string"
}

UploadSlot

Type: object

Fields of UploadSlot
FieldTypeDescription
idRequired ID
filenameRequired string
sizeRequired integer
content_typeRequired string
upload_urlRequired string

Where to send the bytes.

upload_methodRequired string

One of PUT

upload_headersRequired map of string

Send exactly these headers with the upload, and no Authorization.

upload_expires_atRequired string (date-time)

When upload_url stops accepting the bytes: 15 minutes after the slot was created with S3 storage, the slot's expires_at with disk storage. Request a new slot after that.

expires_atRequired string (date-time)

When the slot expires; finalize before then.

Example UploadSlot
{
  "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "filename": "string",
  "size": 0,
  "content_type": "string",
  "upload_url": "string",
  "upload_method": "PUT",
  "upload_headers": {
    "key": "string"
  },
  "upload_expires_at": "2026-10-15T09:00:00Z",
  "expires_at": "2026-10-15T09:00:00Z"
}

UploadSlotList

Type: object

Fields of UploadSlotList
FieldTypeDescription
attachmentsRequired array of UploadSlot
Example UploadSlotList
{
  "attachments": [
    {
      "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "filename": "string",
      "size": 0,
      "content_type": "string",
      "upload_url": "string",
      "upload_method": "PUT",
      "upload_headers": {
        "key": "string"
      },
      "upload_expires_at": "2026-10-15T09:00:00Z",
      "expires_at": "2026-10-15T09:00:00Z"
    }
  ]
}

UserKind

Type: string

Bots are accounts driven by a program rather than a person.

One of user, bot

UserUpdate

Type: object

The user_update gateway payload: a user changed their global profile. Sent to their own connections, to every community they are in, to their friends and to everyone they share a direct message with.

Fields of UserUpdate
FieldTypeDescription
idRequired ID
usernameRequired string
display_nameRequired string
kindRequired UserKind
avatarRequired ImageHash or null
avatar_darkRequired ImageHash or null

The optional dark mode avatar (same avatars kind as avatar). Clients show it instead of avatar when the viewer uses a dark theme; null means use avatar.

bannerRequired ImageHash or null
bioRequired string

at most 190 characters

pronounsRequired string

at most 40 characters

banner_colorRequired BannerColor or null
Example UserUpdate
{
  "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "username": "string",
  "display_name": "string",
  "kind": "user",
  "avatar": "string",
  "avatar_dark": "string",
  "banner": "string",
  "bio": "string",
  "pronouns": "string",
  "banner_color": 0
}

VanityInvite

Type: object

Fields of VanityInvite
FieldTypeDescription
community_idRequired ID
codeRequired string

Lowercase; the link is /invite/<code>.

usesRequired integer
created_atRequired string (date-time)
lapsed_atRequired string (date-time) or null

When the tier stopped including the perk. The code keeps working for 14 days.

release_atRequired string (date-time) or null

When a lapsed code is released unless the tier comes back.

Example VanityInvite
{
  "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "code": "string",
  "uses": 0,
  "created_at": "2026-10-15T09:00:00Z",
  "lapsed_at": "2026-10-15T09:00:00Z",
  "release_at": "2026-10-15T09:00:00Z"
}

VoiceJoin

Type: object

Fields of VoiceJoin
FieldTypeDescription
urlRequired string

The LiveKit server to connect to (wss://).

tokenRequired string

The LiveKit access token. Secret to the caller; never log it.

expires_atRequired string (date-time)
voice_stateRequired VoiceState
bitrateRequired integer

The channel's audio bitrate, for publishing the microphone.

can_speakRequired boolean

Speak, and not server muted or deafened. Without it no audio can be published: neither the microphone nor a screen share's audio.

can_videoRequired boolean

Video. Without it the camera and screen share cannot be published. A screen share carries audio only when can_speak is true too.

voice_activityRequired boolean

Use Voice Activity. Without it the client must use push to talk, as on Discord.

priority_speakerRequired boolean

Priority Speaker. Clients lower other people while this member speaks.

Example VoiceJoin
{
  "url": "string",
  "token": "string",
  "expires_at": "2026-10-15T09:00:00Z",
  "voice_state": {
    "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
    "channel_id": "string",
    "user_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
    "session_id": "string",
    "mute": false,
    "deaf": false,
    "self_mute": false,
    "self_deaf": false,
    "self_video": false,
    "self_stream": false,
    "joined_at": "2026-10-15T09:00:00Z"
  },
  "bitrate": 0,
  "can_speak": false,
  "can_video": false,
  "voice_activity": false,
  "priority_speaker": false
}

VoiceState

Type: object

A user's voice state in a server, the voice_state_update payload. channel_id is null when the user left voice. mute and deaf are server mute and deafen, set by moderators. self_video and self_stream come from LiveKit: whether a camera or a screen share is being published.

Fields of VoiceState
FieldTypeDescription
community_idRequired ID
channel_idRequired string or null
user_idRequired ID
session_idRequired string

Changes on every join; empty after leaving.

muteRequired boolean
deafRequired boolean
self_muteRequired boolean
self_deafRequired boolean
self_videoRequired boolean
self_streamRequired boolean
joined_atRequired string (date-time) or null

When the user joined this channel; null after leaving.

Example VoiceState
{
  "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "channel_id": "string",
  "user_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "session_id": "string",
  "mute": false,
  "deaf": false,
  "self_mute": false,
  "self_deaf": false,
  "self_video": false,
  "self_stream": false,
  "joined_at": "2026-10-15T09:00:00Z"
}

Webhook

Type: object

Fields of Webhook
FieldTypeDescription
idRequired ID
channel_idRequired ID
community_idRequired ID
nameRequired string
created_byRequired ID or null

Who created it; null once that account is gone.

created_atRequired string (date-time)
Example Webhook
{
  "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "channel_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "name": "string",
  "created_by": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
  "created_at": "2026-10-15T09:00:00Z"
}

WebhookList

Type: object

Fields of WebhookList
FieldTypeDescription
webhooksRequired array of Webhook
Example WebhookList
{
  "webhooks": [
    {
      "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "channel_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "name": "string",
      "created_by": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
      "created_at": "2026-10-15T09:00:00Z"
    }
  ]
}

WebhookNameRequest

Type: object

Fields of WebhookNameRequest
FieldTypeDescription
nameRequired string

1-80 characters, the same rules as other names.

Example WebhookNameRequest
{
  "name": "string"
}

WebhookWithToken

Type: object

Fields of WebhookWithToken
FieldTypeDescription
webhookRequired Webhook
tokenRequired string

The token for POST /webhooks/{id}/{token}. Only ever returned here.

pattern ^palloo_wh_

Example WebhookWithToken
{
  "webhook": {
    "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
    "channel_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
    "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
    "name": "string",
    "created_by": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
    "created_at": "2026-10-15T09:00:00Z"
  },
  "token": "palloo_wh_..."
}