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.
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.