--- # SPDX-License-Identifier: AGPL-3.0-or-later title: Expressions description: Cross-guild lookup of a custom emoji or sticker by its own ID. --- import RouteHeader from '@/components/RouteHeader.astro'; An expression is a custom emoji or a sticker that one guild owns. The routes here resolve an expression from its own identifier, without membership of the owning guild. | Object | Route | Owning resource | | --- | --- | --- | | [Emoji metadata](#emoji-metadata-object) | [Get emoji metadata](#get-emoji-metadata) | [Guild emojis](/http-api/guild-emojis/) | | [Sticker metadata](#sticker-metadata-object) | [Get sticker metadata](#get-sticker-metadata) | [Guild stickers](/http-api/guild-stickers/) | Both routes are read-only, and neither writes an audit entry or emits a [Gateway Dispatch](/gateway/events/). Each one returns the metadata even when the owning guild has [UNAVAILABLE_FOR_EVERYONE](/http-api/guilds/#guild-features). When an identifier names no stored expression, Fluxer returns 404 `UNKNOWN_EMOJI` or 404 `UNKNOWN_STICKER`. A stored expression whose guild no longer exists returns 404 `UNKNOWN_GUILD`. :::note[Tags and the uploader need a guild-scoped operation] Tags, the uploader, and the adult content classification come from the guild-scoped operations, which require membership of the owning guild. ::: ## Emoji metadata object One custom emoji, readable from outside its guild. It adds the owning guild to the [guild emoji object](/http-api/guild-emojis/#guild-emoji-object) and drops the adult content classification and the uploader. ### Structure | Field | Type | Description | | --- | --- | --- | | id1 | snowflake | The ID of the emoji | | guild_id2 | snowflake | The ID of the guild that owns the emoji | | name3 | string | The name of the emoji (2-32 characters) | | animated4 | boolean | Whether the stored image is animated | | allow_cloning5 | boolean | Whether the owning guild permits the emoji to be copied | 1 Unique across every guild, so the emoji is addressable without its guild 2 This resource has no guild name and no guild icon 3 [Create guild emoji](/http-api/guild-emojis/#create-guild-emoji) restricts the value to ASCII letters, digits, and underscore, and cloning copies it unchanged 4 Fluxer detects this from the submitted image at creation, and the value never changes 5 True exactly when the owning guild has [CLONE_EMOJI_ENABLED](/http-api/guilds/#guild-features), and false for every other guild Every member is always present, and no member is nullable. ### Example ```json { "id": "1501314428688998182", "guild_id": "1489002177550843904", "name": "party_parrot", "animated": true, "allow_cloning": true } ``` ## Sticker metadata object One sticker, readable from outside its guild. It adds the owning guild to the [guild sticker object](/http-api/guild-stickers/#guild-sticker-object) and drops the description, the tags, the adult content classification, and the uploader. ### Structure | Field | Type | Description | | --- | --- | --- | | id1 | snowflake | The ID of the sticker | | guild_id2 | snowflake | The ID of the guild that owns the sticker | | name3 | string | The name of the sticker (2-30 characters) | | animated4 | boolean | Whether the stored image is animated | | allow_cloning5 | boolean | Whether the owning guild permits the sticker to be copied | 1 Unique across every guild, so the sticker is addressable without its guild 2 This resource has no guild name and no guild icon 3 The value accepts any character 4 Fluxer detects this from the submitted image at creation, and the value never changes 5 True exactly when the owning guild has [CLONE_STICKER_ENABLED](/http-api/guilds/#guild-features), and false for every other guild Every member is always present, and no member is nullable. ### Example ```json { "id": "1501314428688998183", "guild_id": "1489002177550843904", "name": "shipit", "animated": false, "allow_cloning": false } ``` ## Get emoji metadata Returns the [emoji metadata object](#emoji-metadata-object) of any guild emoji. The route requires no membership of the owning guild and evaluates no permission. ### Path parameters | Field | Type | Description | | --- | --- | --- | | emoji_id | snowflake | The ID of the emoji | ### Response | Status | Body | Condition | | --- | --- | --- | | 200 | [emoji metadata](#emoji-metadata-object) object | Metadata was returned | | 4041 | [error response](/http-api/#error-response) | Emoji does not exist, or its owning guild no longer exists | 1 The [error code](/http-api/errors/) is `UNKNOWN_EMOJI` for a missing emoji and `UNKNOWN_GUILD` when the emoji record survives but its guild does not :::caution[Cloning reads the emoji's guild again] [Clone guild emoji](/http-api/guild-emojis/#clone-guild-emoji) resolves the source emoji and the source guild again. When the source guild drops `CLONE_EMOJI_ENABLED` between the two calls, the clone fails with 403 `MISSING_ACCESS`. ::: ### Rate limit 60 requests per 10 seconds for each authenticated user, on the `guild:emoji:metadata::user_id` bucket, and every emoji the account looks up draws on that one budget. ## Get sticker metadata Returns the [sticker metadata object](#sticker-metadata-object) of any guild sticker. The route requires no membership of the owning guild and evaluates no permission. ### Path parameters | Field | Type | Description | | --- | --- | --- | | sticker_id | snowflake | The ID of the sticker | ### Response | Status | Body | Condition | | --- | --- | --- | | 200 | [sticker metadata](#sticker-metadata-object) object | Metadata was returned | | 4041 | [error response](/http-api/#error-response) | Sticker does not exist, or its owning guild no longer exists | 1 The [error code](/http-api/errors/) is `UNKNOWN_STICKER` for a missing sticker and `UNKNOWN_GUILD` when the sticker record survives but its guild does not :::caution[Cloning reads the sticker's guild again] [Clone guild sticker](/http-api/guild-stickers/#clone-guild-sticker) resolves the source sticker and the source guild again. When the source guild drops `CLONE_STICKER_ENABLED` between the two calls, the clone fails with 403 `MISSING_ACCESS`. ::: ### Rate limit 60 requests per 10 seconds for each authenticated user, on the `guild:sticker:metadata::user_id` bucket, and every sticker the account looks up draws on that one budget.