Skip to content

User settings

User settings cover the account-wide preferences and the notification settings kept for each guild and for private channels.

Every route on this page requires a user session. A valid bot token is rejected with 403 ACCESS_DENIED.

Route Purpose
GET /users/@me/settings Get current user settings
PATCH /users/@me/settings Modify current user settings (PUT is an alias)
PUT /users/@me/settings/voice-activity-sharing Modify voice activity sharing
GET /users/@me/guilds/settings List guild notification settings
GET /users/@me/guilds/{guild_id}/settings Get guild notification settings
PATCH /users/@me/guilds/{guild_id}/settings Modify guild notification settings

Presence status values

Value Description
online Presented as online
dnd Presented as do not disturb
idle Presented as idle
invisible Presented as offline to everyone else while staying connected

offline describes an account with no active session and cannot be stored.

Theme values

Value Description
dark Dark theme
dark_legacy Previous generation of the dark theme
coal Coal theme
light Light theme
system Follow the operating system
ash Ash theme

Notification levels

Value Name Description
0 ALL_MESSAGES Notify for every message
1 ONLY_MENTIONS Notify only for mentions
2 NO_MESSAGES Do not notify for messages
3 INHERIT Inherit the parent setting

Mute configuration object

Field Type Description
end_time ?ISO8601 timestamp When the temporary mute ends, or null for no expiry
selected_time_window ?integer The mute duration the client selected, returned unchanged

When no mute configuration is stored, responses contain {"end_time": null, "selected_time_window": null}. An end_time in the past no longer mutes but can remain in the response.

Channel notification override object

Notification settings for one channel.

Field Type Description
collapsed ?boolean Whether the channel category is collapsed (display only)
message_notifications ?integer Notification level
muted ?boolean Whether the channel is muted
mute_config mute configuration object The channel's mute configuration
unread_badges ?integer Notification level for unread badges, or null to inherit

Fields that were never written are returned as null.

User guild settings object

Notification settings for one guild, or for all direct messages and group DMs when guild_id is null.

Field Type Description
guild_id ?snowflake The guild ID, or null for the private channel settings
message_notifications integer Default notification level; 0 when never set
muted boolean Whether the guild (or all private channels) is muted
mute_config mute configuration object The mute configuration
mobile_push boolean Whether push notifications are delivered, default true
suppress_everyone boolean Whether @everyone and @here mentions are suppressed
suppress_roles boolean Whether role mentions are suppressed
hide_muted_channels boolean Whether muted channels are hidden (display only)
channel_overrides ?map[snowflake, channel notification override object] Per-channel overrides, or null when none were ever written
unread_badges ?integer Default notification level for unread badges, or null to follow message_notifications
version integer Row revision, 0 for settings that were never written. It increases on every write, so a client can discard a stale USER_GUILD_SETTINGS_UPDATE
{
  "guild_id": null,
  "message_notifications": 1,
  "muted": false,
  "mute_config": { "end_time": null, "selected_time_window": null },
  "mobile_push": true,
  "suppress_everyone": false,
  "suppress_roles": false,
  "hide_muted_channels": false,
  "channel_overrides": null,
  "unread_badges": null,
  "version": 4
}

Guild settings update fields

The body of Modify guild notification settings. Every field is optional, and an omitted field is left unchanged.

Field Type Description
message_notifications? integer Default notification level
muted? boolean Whether the guild is muted
mute_config? mute configuration input object New mute configuration. Null leaves the stored value unchanged
mobile_push? boolean Whether push notifications are delivered
suppress_everyone? boolean Whether @everyone and @here mentions are suppressed
suppress_roles? boolean Whether role mentions are suppressed
hide_muted_channels? boolean Whether muted channels are hidden
channel_overrides? ?map[snowflake, channel override input object] The complete override map. It replaces the stored map; null or {} clears every override
unread_badges? ?integer Default unread badge level, or null to reset it

Mute configuration input object

Field Type Description
end_time? ?string RFC 3339 timestamp when the mute ends, or null for no expiry. An invalid timestamp returns 400
selected_time_window? ?integer The duration the client selected, stored verbatim

Channel override input object

Field Type Description
collapsed? boolean Whether the category is collapsed
message_notifications? integer Notification level
muted? boolean Whether the channel is muted
mute_config? mute configuration input object The channel's mute configuration
unread_badges? integer Unread badge level

Map keys must be channel IDs; a non-numeric key returns 400.

User settings update object

The body of Modify current user settings. Every field is optional. An omitted field is left unchanged; a field that is present is validated and written, and an invalid value fails the whole request with 400 (TEBHOS never silently skips a field). The fields may also be wrapped as {"settings": {...}}.

Field Type Description
status? string Presence status
status_resets_at? ?string RFC 3339 timestamp when the client should reset status, or null to clear it
status_resets_to? ?string Presence status to apply at status_resets_at, or null
theme? string Theme value
locale? ?string One of the locale codes below, or null to fall back to the browser language
restricted_guilds? array[snowflake] Guilds where member DMs are restricted (max 200). An empty array clears the set
bot_restricted_guilds? array[snowflake] Guilds where bot DMs are restricted (max 200)
default_guilds_restricted? boolean Add newly joined guilds to restricted_guilds
bot_default_guilds_restricted? boolean Add newly joined guilds to bot_restricted_guilds
inline_attachment_media? boolean Show attachment media inline
inline_embed_media? boolean Show embed media inline
gif_auto_play? boolean Play GIFs automatically
render_embeds? boolean Render embeds
render_reactions? boolean Render reactions
animate_emoji? boolean Animate custom emoji
animate_stickers? integer Sticker animation setting, 0-2
render_spoilers? integer Spoiler rendering setting, 0-2
message_display_compact? boolean Compact message display
friend_source_flags? integer Friend source flags. Unknown bits return 400
flags? integer Legacy alias of friend_source_flags; friend_source_flags wins when both are sent
incoming_call_flags? integer Incoming call flags, normalised before storing
group_dm_add_permission_flags? integer Group DM add permission flags, normalised before storing
guild_folders? array[guild folder input object] The complete guild folder layout (max 200 folders). Replaces the stored layout
guild_positions? array[snowflake] Legacy guild ordering
custom_status? ?custom status input object The custom status, or null to clear it
afk_timeout? integer Idle seconds before the account shows as away; must not be negative
time_format? integer Time format setting, 0-2
developer_mode? boolean Developer mode
explicit_content_filter? integer Legacy media filter value, 0-2
trusted_domains? array[string] Trusted link domains (max 1000, each 1-253 characters). * trusts every domain and cannot be combined with other entries. An empty array clears the set
default_hide_muted_channels? boolean Hide muted channels in newly joined guilds
sensitive_content_friend_dm_filter? integer Sensitive media filter, 0-2
sensitive_content_non_friend_dm_filter? integer Sensitive media filter, 0-2
sensitive_content_guild_filter? integer Sensitive media filter, 0-2
profile_privacy? integer Profile privacy level, 0-2
synced_preferences? ?string Base64 synced preferences snapshot, or null / "" to clear it
suppress_unprivileged_self_mentions? boolean Staff only
suppress_unprivileged_self_mentions_bypass_user_ids? ?array[snowflake] Staff only
staff_dm_access_user_ids? ?array[snowflake] Staff only

Snowflake arrays accept string or numeric IDs; duplicates are removed.

Staff-only fields

The three staff-only fields are always validated. For an account without the STAFF flag, every settings update resets them to false, empty and empty, whether or not the body names them.

Not writable here

default_share_voice_activity is ignored; use Modify voice activity sharing.

Locale codes: ar, bg, cs, da, de, el, en-GB, en-US, es-ES, es-419, fi, fr, he, hi, hr, hu, id, it, ja, ko, lt, nl, no, pl, pt-BR, ro, ru, sv-SE, th, tr, uk, vi, zh-CN, zh-TW. The TEBHOS web client is currently translated into en-US and tr; see Locales.

Guild folder input object

Field Type Description
id integer Folder identifier; -1 is the uncategorised folder
name? ?string Folder name, up to 100 characters
color? integer Folder colour as packed 24-bit RGB; stored as 0 when omitted
flags? integer Guild folder flags; 0 when omitted
icon? string Guild folder icon; folder when omitted. Unknown values return 400
guild_ids? array[string] Guild IDs in display order, as strings

When the submitted layout has no uncategorised folder, an empty one is prepended. A guild ID that appears more than once is kept in only one place: a folder with a non-blank name beats an unnamed one, an ordinary folder beats the uncategorised folder, and the earliest occurrence wins a tie. Keep guild IDs you cannot render in the array; anything you leave out is removed from the stored layout.

Custom status input object

Field Type Description
text? ?string Status text, up to 128 characters. "" is treated as null
emoji_id? ?snowflake Custom emoji to show. When set, emoji_name is ignored
emoji_name? ?string Unicode emoji to show, 1-32 characters
expires_at? ?string RFC 3339 expiry timestamp, or null for no expiry

An object with neither text nor emoji clears the status. The emoji ID is stored as given and is not resolved.

Initial settings

TEBHOS does not write a settings record at sign-up; a field that was never written is returned with this value.

Setting Initial value
status online
theme system
locale Taken from the browser's Accept-Language at registration (en-US or tr); null for older accounts
Rendering GIF autoplay, embeds, reactions, animated emoji and inline media on; animate_stickers 0; render_spoilers 1 (on click)
friend_source_flags 7 (mutual friends, mutual guilds and anyone)
incoming_call_flags / group_dm_add_permission_flags 8 (friends only)
Guild DM restrictions Unrestricted for members and bots
guild_folders Empty array
afk_timeout 600
time_format 0 (automatic)
developer_mode false
trusted_domains Empty
Sensitive media filters Show in friend DMs, block in non-friend DMs, blur in guilds
profile_privacy 0 (all shared guilds)
default_share_voice_activity true
synced_preferences ""

Get current user settings

GET /users/@me/settings

Returns the user settings object. An account that never changed a setting receives the initial values.

Rate limit

40 requests per 10 seconds per user, bucket user:settings:get, shared with Get current user.

curl https://tebhos.com/api/v1/users/@me/settings \
  -H "Authorization: Bearer $TEBHOS_TOKEN"

Modify current user settings

PATCH /users/@me/settings

Applies the user settings update object and returns the complete user settings object. PUT behaves the same way.

Response

Status Body Condition
200 user settings object Settings were applied
400 error A field has the wrong type or an invalid value, trusted_domains combines * with a domain, or synced_preferences is invalid

Side effects

The caller's sessions receive USER_SETTINGS_UPDATE with the full settings object, even when nothing changed. The Gateway applies the custom status to the caller's presence. A status of invisible switches every session of the caller to invisible, and a later online, idle or dnd reverses that. See Gateway events.

Rate limit

20 requests per 10 seconds per user, bucket user:settings:update, shared with Modify voice activity sharing.

curl -X PATCH https://tebhos.com/api/v1/users/@me/settings \
  -H "Authorization: Bearer $TEBHOS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"status": "dnd", "custom_status": {"text": "Focusing", "emoji_name": "🎧"}}'

Modify voice activity sharing

PUT /users/@me/settings/voice-activity-sharing

Sets the default voice activity sharing value, applies it to the caller's side of every friendship, and returns the caller's user object.

JSON body

Field Type Description
share_voice_activity boolean Whether voice activity is shared with friends

Cooldown

The value can change once every 24 hours. A request inside the window, including one that repeats the current value, fails with 429 and a Retry-After header holding the remaining seconds. last_voice_activity_sharing_change_at on the user object records the last accepted change.

Response

Status Body Condition
200 user object Value applied
429 error Cooldown still active, or rate limited

Side effects

For every friendship, the caller and the friend each receive RELATIONSHIP_UPDATE. The caller receives USER_UPDATE, and USER_SETTINGS_UPDATE when the stored default changed.

Rate limit

20 requests per 10 seconds per user, bucket user:settings:update.

List guild notification settings

GET /users/@me/guilds/settings

Returns an array of every stored user guild settings object, including the private channel settings when they were written.

Get guild notification settings

GET /users/@me/guilds/{guild_id}/settings

Returns the user guild settings object for one guild. Use @me (or 0) as guild_id for direct message and group DM settings. Settings that were never written are returned with their defaults and version 0.

Modify guild notification settings

PATCH /users/@me/guilds/{guild_id}/settings

Applies the guild settings update fields and returns the resulting user guild settings object. Use @me (or 0) as guild_id for the private channel settings, which are returned with guild_id null. Settings are created with defaults when absent.

No membership check

The route does not check that the guild exists or that you are a member.

Side effects

The caller's sessions receive USER_GUILD_SETTINGS_UPDATE with the settings object plus user_id, on every successful write.

Rate limit

30 requests per 10 seconds per user, bucket user:guild_settings:update.

curl -X PATCH https://tebhos.com/api/v1/users/@me/guilds/1501314428688998100/settings \
  -H "Authorization: Bearer $TEBHOS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"message_notifications": 1, "suppress_everyone": true}'
Legacy PUT form

PUT /users/@me/guilds/{guild_id}/settings is an older form used by earlier client code. It takes muted, mute_until (RFC 3339), message_notifications as "all", "mentions" or "nothing", suppress_everyone, suppress_roles, mobile_push, and mute_channels (an array of channel IDs to mute; other overrides that are muted become unmuted). guild_id must be numeric. It returns {"ok": true} and emits the same USER_GUILD_SETTINGS_UPDATE. Rate limit: 30 per 10 seconds, bucket user:guild_settings:update. Prefer PATCH.

Legacy settings views

The TEBHOS web client's older settings tabs read and write compatibility views of the same settings record. New integrations should use the routes above.

Route View
GET / PATCH /auth/me/privacy Friend request, DM, call and group DM policies, sensitive media filters
GET / PATCH /auth/me/notifications Notification and sound preferences
GET / PATCH /auth/me/appearance Theme, accent colour and other appearance preferences
GET / PATCH /auth/me/language Locale and time format

A change through one of these views updates the mapped fields of the user settings object and emits USER_SETTINGS_UPDATE.