profiles and settings
profile changes cover the complete Profile page except username. settings changes exclude profile, testing, stickers and account.
profile fields
GET /me/profile needs profile.read_self; GET /profiles/{user} needs the matching self/others read grant and ordinary profile visibility. PATCH /me/profile needs profile.write and returns changed fields plus id and revision. a write-only bot can get its concurrency revision from /me/profile/revision without reading the profile. writable fields are display_name, about, pronouns, avatar_asset_id, banner_asset_id, background_gradient, profile_art, nameplate_name_color, nameplate_background_color, online_indicator_color, nameplate_art and announcement_pack. null clears optional photo/banner/art/color fields. username, email, phone, badges, roles, points and counters are rejected even under administrator.
profile validation and artwork
display_name follows the current 20-character weighted limit; about is at most 200 weighted characters and six lines; pronouns are at most 40 weighted characters. background_gradient is {top,bottom} with validated #rrggbb colors. nameplate and indicator colors use the existing palette IDs or theme default. announcement_pack is an available catalogue ID (the empty string selects the default pack). artwork uses the existing ProfileArt v2 schema: strokes plus positioned emoji/sticker items; profile canvas is 428×549 within a 440×561 card, nameplate canvas is 280×64. profile limits are 1,500 strokes/40 items/180,000 total points/1,500,000 encoded characters; nameplate limits are 400 strokes/8 emoji-only items/24,000 total points/240,000 characters. profile writes allow 1,756,384 JSON bytes; other JSON requests retain their normal cap. preserve current palette, geometry, safety and ownership validation. modifying a profile never downloads private sticker bytes without its corresponding access.
allowed settings
GET /me/settings and PATCH /me/settings require settings.write. expose only allowlisted setting fields; do not return reports, contact details, sessions, export data or account/security controls. account settings include online/typing visibility, incoming friend/shared-group DM preferences, quiet-hour schedule and timed pause. appearance includes theme and current account appearance preferences. instance settings include push/in-app/category alerts and previews, ringtone, text size/spacing, motion, autoplay/load-media/subtle-drawing preferences, enter-to-send, quick reaction/emoji preference where supported, audio mode, device choices, join-muted, feedback sounds, volume and own-camera-preview preference. GET /limits lists every supported account and instance field with its constraints.
device-specific settings
instance-only changes require an explicit opaque target_id obtained from GET /me/settings/targets. targets expose a device label and known device_choices, never session tokens, IP addresses or raw hardware IDs. only already-known device choices can be selected; bots cannot trigger microphone/camera capture or OS permission dialogs. account writes do not overwrite every device implicitly. removed targets return 404; changing theme does not change profile artwork. blocks require user.blocks.write, chat mutes require chats.mute and friend-request actions need their own grants.
profile and settings routes
profile and settings patches are atomic, use If-Match, retain existing cooldowns and return field errors without partial saves. GET /limits provides supported field enums, numerical bounds and current remaining quota, so a developer can validate before making a write.
scroll the table horizontally to see all columns.
| method and path | request | result |
|---|---|---|
| GET /me/profile | none; permission 18 | Profile + ETag |
| GET /profiles/{user} | none; permission 18/19 | visible Profile + ETag |
| PATCH /me/profile | allowlisted Profile patch; If-Match; permission 20 | changed fields + id + revision |
| GET /me/profile/revision | permission 20 | {id,revision}; no profile contents |
| GET /profiles/{user}/assets/{asset} | profile access grant | authorized image/art bytes |
| GET /announcement-packs | permission 20 | {id,name} catalogue; no private account data |
| GET /me/settings | target_id?; permission 21 | allowed settings + ETag |
| GET /me/settings/targets | cursor, limit; permission 21 | opaque settings target IDs + labels + permitted values |
| PATCH /me/settings | target_id? and allowlisted patch; If-Match; permission 21 | changed settings + revision |
| GET /chats/{chat}/mute | permission 22 | {muted,revision} |
| PUT /chats/{chat}/mute | muted:boolean; If-Match; permission 22 | {muted,revision} |