Skip to content

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.

  1. POST /servers/{guild_id}/stickers/upload-url with {"filename": string, "content_type": string, "size": integer}. size may be at most 512000. Returns upload_url (a presigned URL valid for 300 seconds), storage_key, url and expires_in.
  2. PUT the bytes to upload_url, then POST /servers/{guild_id}/stickers/confirm with {"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.