Guild stickers¶
A sticker is an image a guild stores for its members to send with a message. Each sticker belongs to one guild. Get sticker metadata and Get sticker resolve a sticker without membership of its guild.
All routes are relative to https://tebhos.com/api/v1, require authentication and accept both user sessions and bot tokens. A caller who is not a member of the guild, or lacks the required permission, receives 403 FORBIDDEN. Error bodies follow Errors.
Sticker IDs¶
A sticker id is a snowflake string, unique across all guilds. Like emojis, stickers also carry a legacy_id UUID from the earlier identifier scheme, and every route that takes a sticker_id accepts either form. See Emoji IDs.
Guild sticker object¶
| Field | Type | Description |
|---|---|---|
| id | snowflake | The ID of the sticker |
| legacy_id | ?string | The legacy UUID identifier |
| guild_id | snowflake | The ID of the guild that owns the sticker |
| name | string | The sticker name |
| description | string | The description, or an empty string |
| tags | array[string] | Search tags |
| animated | boolean | true when the stored image is a GIF |
| nsfw | boolean | Always false |
| image_url | string | The URL of the stored image |
| created_at | ISO8601 timestamp | When the sticker was created |
| user? | partial user object | The account that uploaded the sticker. Only List guild stickers includes it |
Only the name, description and tags can change after creation. To replace the image, create a new sticker.
{
"id": "1501314428688998183",
"legacy_id": "7a1d2c3e-4b5f-4a6b-8c7d-9e0f1a2b3c4d",
"guild_id": "1489002177550843904",
"name": "shipit",
"description": "Ship it",
"tags": ["ship", "deploy"],
"animated": false,
"nsfw": false,
"image_url": "https://cdn.tebhos.com/stickers/1489002177550843904/2b9d6f41-0a3c-4e5b-8d7f-1c2e3a4b5c6d/c41f0a9e2d.png",
"created_at": "2026-09-14T09:12:44+00:00"
}
The Gateway Guild Stickers Update event carries the guild's complete sticker list. Its items have id, legacy_id, guild_id, name, description, image_url, tags, animated, nsfw, created_by, created_at, creator_name and creator_avatar.
Limits¶
| Limit | Value |
|---|---|
| Stickers per guild | 5, or 30 when the uploading member has TEBHOS Pro |
| Image size | 500 KiB (512000 bytes) decoded |
| Image formats | PNG, JPEG, GIF and WebP, detected from the file content |
| Name | 1-32 bytes after trimming, any characters. Unique within the guild |
| Description | At most 100 bytes |
| Tags | At most 5, each 1-32 bytes |
Lengths are counted in UTF-8 bytes, so a name with non-ASCII letters holds fewer than 32 characters. The per-guild limit is checked each time a sticker is created and depends on whether the member creating it has TEBHOS Pro.
Sticker create object¶
| Field | Type | Description |
|---|---|---|
| name | string | The sticker name |
| description? | ?string | The description |
| tags? | array[string] | Search tags (default empty) |
| image | string | The image as raw base64 or a data: URL |
{
"name": "shipit",
"description": "Ship it",
"tags": ["ship", "deploy"],
"image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAAAAAA6fptVAAAACklEQVR4nGMAAQAABQABDQottAAAAABJRU5ErkJggg=="
}
List guild stickers¶
GET /guilds/{guild_id}/stickers
Returns every guild sticker object of the guild, each with user. Requires membership; no permission is checked. There is no pagination.
Rate limit: guild:sticker:list, 60 per 10 seconds per account and guild.
Create guild sticker¶
POST /guilds/{guild_id}/stickers
Creates a sticker from a sticker create object and returns its guild sticker object (without user) with status 200. Requires CREATE_EXPRESSIONS. The guild receives Guild Stickers Update, and a STICKER_CREATE audit log entry is recorded. The request body may be at most 2 MiB.
Rate limit: guild:sticker:create, 10 per 30 seconds per account and guild.
| Status | Code | Condition |
|---|---|---|
| 400 | INVALID_FORM_BODY |
The name, description or tags break the limits |
| 400 | BAD_REQUEST |
The image is empty, not valid base64, larger than 500 KiB or not an accepted format, or the guild is at its sticker limit |
| 403 | FORBIDDEN |
CREATE_EXPRESSIONS is missing |
| 409 | CONFLICT |
The guild already has a sticker with that name |
curl -X POST https://tebhos.com/api/v1/guilds/1489002177550843904/stickers \
-H "Authorization: Bot $TEBHOS_BOT_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "shipit", "tags": ["ship"], "image": "data:image/png;base64,iVBORw0KGgo..."}'
Bulk create guild stickers¶
POST /guilds/{guild_id}/stickers/bulk
Tries to create 1-50 stickers and returns {"success": [...], "failed": [...]}. Requires CREATE_EXPRESSIONS. The request body may be at most 40 MiB.
Rate limit: guild:sticker:bulk_create, 6 per 60 seconds per account and guild.
| Field | Type | Description |
|---|---|---|
| stickers | array[sticker create object] | The stickers to create, 1-50 items, attempted in order |
Each item is handled independently. success holds the created guild sticker objects; failed holds {"name": string, "error": string} for each rejected item, where error is a human-readable message. The response is 200 even when every item failed. An empty array or more than 50 items returns 400 INVALID_FORM_BODY. When at least one sticker was created, the guild receives one Guild Stickers Update.
Clone guild sticker¶
POST /guilds/{guild_id}/stickers/clone
Copies a sticker from any guild into this guild and returns the new guild sticker object. Requires CREATE_EXPRESSIONS in the target guild; membership of the source guild is not needed. The copy gets a new ID, the caller as uploader, and the source image, description and tags.
Rate limit: guild:sticker:clone, 10 per 30 seconds per account and guild.
| Field | Type | Description |
|---|---|---|
| source_sticker_id | string | The ID (snowflake or legacy UUID) of the sticker to copy |
| name? | string | A name for the copy. Defaults to the source name |
| Status | Code | Condition |
|---|---|---|
| 403 | FORBIDDEN |
CREATE_EXPRESSIONS is missing, or the source guild has the CLONE_STICKER_DISABLED feature |
| 404 | NOT_FOUND |
The source sticker does not exist |
| 409 | CONFLICT |
The target guild already has a sticker with that name |
The target guild's sticker limit applies. The copy records a STICKER_CREATE audit entry and dispatches Guild Stickers Update in the target guild.
Modify guild sticker¶
PATCH /guilds/{guild_id}/stickers/{sticker_id}
Updates a sticker and returns its guild sticker object. The member who uploaded the sticker needs CREATE_EXPRESSIONS; anyone else needs MANAGE_EXPRESSIONS.
Rate limit: guild:sticker:update, 20 per 10 seconds per account and guild.
| Field | Type | Description |
|---|---|---|
| name? | string | The new name |
| description? | string | The new description |
| tags? | array[string] | The new complete tag list. Omit it to keep the current tags |
An omitted field keeps its value. The same limits apply. A sticker that is not in this guild returns 404 NOT_FOUND, and a name used by another sticker of the guild returns 409 CONFLICT. The request records a STICKER_UPDATE audit entry and dispatches Guild Stickers Update.
Delete guild sticker¶
DELETE /guilds/{guild_id}/stickers/{sticker_id}
Deletes a sticker and returns 204. The uploader needs CREATE_EXPRESSIONS; anyone else needs MANAGE_EXPRESSIONS.
Rate limit: guild:sticker:delete, 10 per 30 seconds per account and guild.
The deletion frees one sticker slot, records a STICKER_DELETE audit entry and dispatches Guild Stickers Update. Messages that already show the sticker are not changed. A sticker that is not in this guild returns 404 NOT_FOUND.
Upload flow¶
The TEBHOS web app uploads sticker images directly to storage instead of sending base64. Both steps are user-only (a bot token receives 403 ACCESS_DENIED) and require membership and CREATE_EXPRESSIONS.
POST /servers/{guild_id}/stickers/upload-urlwith{"filename": string, "content_type": string, "size": integer}.sizemay be at most 512000. Returnsupload_url(a presigned URL valid for 300 seconds),storage_key,urlandexpires_in.PUTthe bytes toupload_url, thenPOST /servers/{guild_id}/stickers/confirmwith{"storage_key": string, "name": string, "description"?: string, "tags"?: [string]}.
The confirmation returns {"id", "guild_id", "name", "description", "image_url", "tags", ...}, records a STICKER_CREATE audit entry and dispatches Guild Stickers Update.