Skip to content
Micup API

Cosmetics

A cosmetic is an image an account wears next to its avatar, over its profile, or behind its name. The catalog lists the items on offer; the Admin API adds and changes them. An account wears at most one item of each type, and at most one of an avatar decoration and an ultra decoration: wearing one takes the other off, and a request that puts both on keeps the ultra decoration.

Every route on this page is user-only, requires no permission, and acts on the caller’s own account.

ValueDescription
avatar_decorationA frame drawn around the avatar
avatar_ultraA large decoration drawn behind or in front of the avatar on supported surfaces
profile_effectAn effect played over the profile card
nameplateA background behind the name in member and direct message lists
room_characterA 3D character that shows the account inside 3D voice rooms
room_faceThe face and expression of the modular room character
room_hairThe hair of the modular room character
room_topThe shirt or jacket of the modular room character
room_bottomThe trousers or shorts of the modular room character
room_shoesThe shoes or socks of the modular room character
room_costumeA costume of the modular room character, worn instead of the top and the bottom
room_hatThe hat of the modular room character
room_glassesThe glasses of the modular room character
room_accessoryAn accessory of the modular room character, such as headphones

The nine room_<slot> types are the parts of the modular room character, one slot each. An account dresses it with Dress my room character.

ValueDescription
freeEvery account can wear it
premiumAccounts with premium can wear it, and so can an account that owns it
ownedOnly accounts that own it can wear it
FieldTypeDescription
idsnowflakeThe ID of the item
typestringThe cosmetic item type
namestringThe display name of the item (1-64 characters)
description?stringA short description of the item (1-256 characters)
asset1?stringThe hash of the item image
availabilitystringThe cosmetic availability
ultra_layout2?ultra layout objectThe sizes of an ultra decoration on each surface
ultra_front3?ultra front objectThe images of an ultra decoration drawn in front of the avatar
effect_layers?4?effect layers objectThe HD intro and loop of a profile effect
model_key5?stringThe character model or preset of a room character, or the part of a room character part

1 Eight hexadecimal characters, prefixed with a_ when the image is animated. The media proxy serves the image at /branding/cosmetic-{type}-{id}/{asset}.webp on the instance’s media endpoint, with size between 128 and 480 and animated=true for the moving image. Null for a room character part without its own image: the client shows the preview its part manifest names

2 Null for every other type, and for an ultra decoration the admin gave no sizes, which then uses the fixed sizes

3 Null for every other type, and for an ultra decoration drawn behind the avatar

4 Null or absent when no layers are available, and null for every other type. An incomplete stored set or an invalid intro duration is returned as null

5 Present on a room_character item and on the room_<slot> items, absent on every other type. The client draws the character and its parts from its own copy of the models, so a key this client does not know shows the default outfit, or leaves that slot to the default outfit

{
"id": "1501314428688998182",
"type": "avatar_decoration",
"name": "Gold ring",
"description": null,
"asset": "a_1a2b3c4d",
"availability": "premium",
"ultra_layout": null,
"ultra_front": null,
"effect_layers": null
}

The sizes an admin gave an ultra decoration, one entry for each surface. A client that does not read it draws the fixed sizes, and so does a client whose request for it fails.

FieldTypeDescription
compact?ultra layout surface objectThe size in chat and in the member list, null for the fixed size
voice?ultra layout surface objectThe size on voice tiles, null for the fixed size
profile?ultra layout surface objectThe size on the profile card, null for the fixed size

Every value is a multiple of the avatar diameter, on the scale of the fixed sizes 2.30, 3.20 and 3.40. Micup keeps three decimal places.

FieldTypeDescription
widthnumberThe width of the decoration (0.5-6)
heightnumberThe height of the decoration (0.5-6)
offset_xnumberThe horizontal shift from the centre of the avatar (-3 to 3)
offset_ynumberThe vertical shift from the centre of the avatar (-3 to 3)

The images an admin gave an ultra decoration to draw it in front of the avatar. Each one is the left half of the decoration, twice as tall as it is wide, and a client draws the right half as its mirror image.

FieldTypeDescription
closedstringThe hash of the still image shown while the decoration is closed
openarray[string]The hashes of the still opening frames in order, 2 to 30 of them
idlestringThe hash of the animated loop played while the decoration is open, prefixed with a_

The media proxy serves each image like asset, under the same item path. A client asks for them with size up to 600, since an image can be 576 pixels tall.

A client that reads it draws the decoration over the avatar in a square 3.468 times the avatar diameter on every surface, and ultra_layout applies only to drawing behind. The decoration rests on closed. When the avatar is interacted with, such as on hover, on keyboard focus, or when a profile opens, the opening frames play forward at 30 frames per second and idle loops. Letting go plays the frames back from the one showing. With reduced motion or data saving on, the decoration stays closed.

A client loads the frames and the loop on the first open and replays every later open from what it loaded. It draws no ultra decoration before it has read the item through List cosmetic items by ID, so a decoration never jumps from behind the avatar to the front. A client that does not read it, or whose request for the item fails, draws asset behind the avatar.

The high-resolution layers an admin gave a profile effect. They belong to the cosmetic item, including items in owned, and are not copied into cosmetic asset data, partial users, profiles or Gateway events. A client reads them through List cosmetic items by ID.

FieldTypeDescription
introstringThe hash of the animated intro, prefixed with a_
loopstringThe hash of the animated loop, prefixed with a_
intro_msintegerThe intro duration in milliseconds (250-30000)

The media proxy serves both WebP images under /branding/cosmetic-profile_effect-{id}/{hash}.webp, using size=1024&animated=true. Each side is 128 through 1024 pixels. Each layer is at most 3000000 bytes, and the pair is at most 4500000 bytes.

A supported client uses the layers only on open profiles: the profile modal, mobile sheet, profile page and popouts. It loads both layers before playing the intro, then starts the loop after intro_ms. Each profile opening restarts the intro. Shop, settings and previews use the main image in asset. When animation is disabled or reduced motion is enabled, the client uses a still main image. A client without layer support, with no layers, or whose layer download fails uses the main image.

The item an account wears, as it appears on the partial user and the profile. A field that carries it is always present and is null when the account wears nothing of that type.

FieldTypeDescription
asset1stringThe hash of the image the account put on
item_idsnowflakeThe ID of the worn item

1 Copied when the item is put on, so an account keeps the image it put on after the item’s image changes. The ultra front images and effect layers are not copied: a client reads them from the item, so a new set reaches every account that wears it

The partial user carries avatar_decoration_data, avatar_ultra_data and nameplate_data. The profile carries profile_effect_data.

GET/v1/cosmetics/catalog

Returns the items on offer. An item taken off sale is not listed.

FieldTypeDescription
type?stringOnly return items of this cosmetic item type
StatusBodyCondition
200array[cosmetic item object]Catalog was returned

Each API process keeps the catalog for up to 60 seconds, so a catalog change can take that long to appear.

30 requests per minute for each authenticated user, on the cosmetics:catalog bucket.

GET/v1/cosmetics/items

Returns up to 50 items by ID, including items taken off sale, as an array of cosmetic item objects. A client uses it to draw what other accounts wear, such as the sizes and in-front images of an ultra decoration, with one request for every batch of new items it sees. An unknown ID is left out, and a repeated ID is returned once.

FieldTypeDescription
idsstringComma separated item IDs, 1 to 50 of them
StatusBodyCondition
200array[cosmetic item object]The known items were returned
400error responseMore than 50 IDs, or an ID that is not a positive 64-bit integer, returned as INVALID_FORM_BODY

Each API process keeps an item for up to 60 seconds, and at most 5,000 items, so a change an admin makes can take that long to appear.

30 requests per minute for each authenticated user, on the cosmetics:items bucket.

GET/v1/users/@me/cosmetics

Returns the items the current account owns and the items it wears.

FieldTypeDescription
ownedarray[cosmetic item object]The items the account owns, including items taken off sale
equippedequipped cosmetics objectThe items the account wears
StatusBodyCondition
200response bodyItems were returned

30 requests per minute for each authenticated user, on the cosmetics:list_own bucket.

FieldTypeDescription
avatar_decoration_id?snowflakeThe avatar decoration being worn
avatar_ultra_id?snowflakeThe ultra decoration being worn
profile_effect_id?snowflakeThe profile effect being worn
nameplate_id?snowflakeThe nameplate being worn
room_face_id1?snowflakeThe room character face being worn
room_hair_id1?snowflakeThe room character hair being worn
room_top_id1?snowflakeThe room character top being worn
room_bottom_id1?snowflakeThe room character bottom being worn
room_shoes_id1?snowflakeThe room character shoes being worn
room_costume_id1?snowflakeThe room character costume being worn
room_hat_id1?snowflakeThe room character hat being worn
room_glasses_id1?snowflakeThe room character glasses being worn
room_accessory_id1?snowflakeThe room character accessory being worn
room_character_id1?snowflakeThe room character being worn, null for the default character or the worn parts
room_character_shirt1?integerThe shirt colour of the default character and its parts as 0xRRGGBB, null when the server derives it from the account ID

1 Returned by List my cosmetics only. Wear or take off cosmetics neither reads nor changes them; Choose a room character and Dress my room character do

PUT/v1/users/@me/cosmetics/equipped

Puts items on and takes them off. Returns the equipped cosmetics object.

FieldTypeDescription
avatar_decoration_id??snowflakeThe avatar decoration to wear, or null to take it off
avatar_ultra_id??snowflakeThe ultra decoration to wear, or null to take it off
profile_effect_id??snowflakeThe profile effect to wear, or null to take it off
nameplate_id??snowflakeThe nameplate to wear, or null to take it off

An omitted field leaves that type as it is.

StatusBodyCondition
200equipped cosmetics objectItems were put on or taken off
403error responseCOSMETIC_NOT_OWNED: an item is unknown, is not of the field’s type, or the account may not wear it

When a worn item changes, the account’s sessions receive User Update with the current user object. A changed avatar decoration, ultra decoration or nameplate also reaches every guild the account is in as Guild Member Update. A request that changes nothing writes nothing and emits nothing.

5 requests per 10 minutes for each authenticated user, on the cosmetics:equip bucket.

PUT/v1/users/@me/cosmetics/room-character

Sets the character the account shows as inside 3D voice rooms. Returns the worn character and shirt.

The default character is worn when item_id is null. Its shirt colour comes from a fixed palette of 16 colours: shirt picks one, and null lets the server derive one from the account ID. Every other character wears its own colours, and the server keeps shirt with the account, so going back to the default character brings the colour back.

FieldTypeDescription
item_id?snowflakeThe ID of the room character item to wear, or null to wear the default character
shirt?integerA colour of the shirt palette as 0xRRGGBB, or null to derive it from the account ID; default character only

Both fields are required. A shirt outside the palette returns 400 INVALID_FORM_BODY.

FieldTypeDescription
room_character_id?snowflakeThe room character being worn, null for the default character
room_character_shirt?integerThe shirt colour the account chose, null when it derives from the account ID
StatusBodyCondition
200response bodyThe character was put on
400error responseshirt is not in the palette, returned as INVALID_FORM_BODY
403error responseThe item is unknown, is not a room character, or the account may not wear it, returned as COSMETIC_NOT_OWNED
403error responseRoom characters are switched off, returned as FEATURE_TEMPORARILY_DISABLED

When the character or the shirt changes, the account’s own sessions receive User Update. Nothing reaches the guilds the account is in. A request that changes nothing writes nothing and emits nothing. A voice room shows the new character once the client sends Refresh my voice room character.

10 requests per minute for each authenticated user, on the cosmetics:room_character bucket.

PUT/v1/users/@me/cosmetics/room-outfit

Puts room character parts on and takes them off inside 3D voice rooms, all in one write, and sets their shirt colour. Returns the room outfit the account wears.

A slot the account leaves empty shows the part of the default outfit. A part goes on together with the parts it fits with: a part takes off the worn parts it excludes and the worn parts that exclude it, so a costume takes off the top and the bottom and a top takes off the costume. Wearing a part takes the room character off.

FieldTypeDescription
face_id??snowflakeThe room_face item to wear, or null to take it off
hair_id??snowflakeThe room_hair item to wear, or null to take it off
top_id??snowflakeThe room_top item to wear, or null to take it off
bottom_id??snowflakeThe room_bottom item to wear, or null to take it off
shoes_id??snowflakeThe room_shoes item to wear, or null to take it off
costume_id??snowflakeThe room_costume item to wear, or null to take it off
hat_id??snowflakeThe room_hat item to wear, or null to take it off
glasses_id??snowflakeThe room_glasses item to wear, or null to take it off
accessory_id??snowflakeThe room_accessory item to wear, or null to take it off
shirt??integerA colour of the shirt palette as 0xRRGGBB, or null to derive it from the account ID

An omitted field stays as it is. The shirt colour paints the parts that take the wearer’s colour. A shirt outside the palette returns 400 INVALID_FORM_BODY.

FieldTypeDescription
room_face_id?snowflakeThe room character face being worn
room_hair_id?snowflakeThe room character hair being worn
room_top_id?snowflakeThe room character top being worn
room_bottom_id?snowflakeThe room character bottom being worn
room_shoes_id?snowflakeThe room character shoes being worn
room_costume_id?snowflakeThe room character costume being worn
room_hat_id?snowflakeThe room character hat being worn
room_glasses_id?snowflakeThe room character glasses being worn
room_accessory_id?snowflakeThe room character accessory being worn
room_character_id?snowflakeThe room character being worn, null once a part is worn
room_character_shirt?integerThe shirt colour the account chose, null when it derives from the account ID
StatusBodyCondition
200room outfit objectThe parts were put on or taken off
400error responseINVALID_FORM_BODY: two parts of the request exclude each other, or shirt is not in the palette
403error responseCOSMETIC_NOT_OWNED: a part is unknown, of another slot or family, or the account may not wear it
403error responseRoom characters are switched off, returned as FEATURE_TEMPORARILY_DISABLED

A part is also refused with COSMETIC_NOT_OWNED when its key is not a part of its slot in the part manifest this server version ships. Of two parts that exclude each other, the error names the later slot.

When a part, the room character or the shirt changes, the account’s own sessions receive User Update. Nothing reaches the guilds the account is in. A request that changes nothing writes nothing and emits nothing. A voice room shows the new outfit once the client sends Refresh my voice room character.

10 requests per minute for each authenticated user, on the cosmetics:room_character bucket shared with Choose a room character.