Discord Public Stickers and Emoji Asset Scraper
Discord Public Stickers and Emoji Asset Scraper
Scrape Discord's public sticker packs and guild widget data from the official Discord REST API. No bot token required. Returns sticker name, format (PNG, APNG, Lottie, GIF), animated flag, direct CDN URL, pack metadata, tags, and for guild widgets the live presence count.
Discord Asset Scraper Features
- Pulls every official Discord sticker pack in a single API call — one record per sticker
- Resolves sticker
format_typeintegers into readable strings (png,apng,lottie,gif) - Builds the direct
cdn.discordapp.comasset URL with the correct file extension per format - Flags animated stickers (APNG / GIF) with a proper boolean instead of making you compute it
- Optional guild widget mode — supply guild IDs and get presence count + widget metadata for servers with the widget enabled
- Auth-less — no bot token, no OAuth, no proxy. Discord's public endpoints handle the load.
Who Uses Discord Sticker Data?
- Discord brand-monitoring SaaS — Track which official packs are live and how the catalog changes over releases
- IP and content moderation teams — Build asset reference sets to detect re-uploads of official stickers outside Discord
- Community ops — Pull presence counts for monitored guilds without standing up a bot
- Researchers and game studios — Study sticker design trends, format adoption (Lottie vs APNG), and naming conventions across packs
How the Discord Asset Scraper Works
- Pick a mode —
sticker_packspulls the full public sticker catalog.guild_widgetqueries the widget endpoint for IDs you supply.bothruns both. - Sticker packs — Hits
GET /api/v9/sticker-packsonce. Discord returns every public pack in a single payload, which is then flattened to one record per sticker. - Guild widgets — For each guild ID, hits
GET /api/v9/guilds/<id>/widget.json. Guilds without the widget enabled return Discord error 50004 and are skipped cleanly. - Export — Records land in your Apify dataset as JSON. Use the
asset_typefield to filter stickers vs widgets.
Input
All public sticker packs
{
"mode": "sticker_packs",
"maxItems": 0
}
Guild widget info
{
"mode": "guild_widget",
"guildIds": ["613425648685547541", "267624335836053506"],
"maxItems": 0
}
Both at once
{
"mode": "both",
"guildIds": ["613425648685547541"],
"maxItems": 500
}
| Field | Type | Default | Description |
|---|---|---|---|
| mode | string | sticker_packs |
sticker_packs, guild_widget, or both. |
| guildIds | array | — | Discord guild IDs (snowflake strings). Required for widget modes. |
| maxItems | integer | 15 | Cap on records. 0 = unlimited. |
Discord Asset Scraper Output Fields
The output schema is shared between modes. Sticker-only fields are empty for widget records; widget-only fields are empty for stickers. Use asset_type to split.
Sticker record
{
"asset_type": "sticker",
"asset_id": "749054660769218631",
"guild_id": "",
"guild_name": "",
"name": "Wave",
"format": "apng",
"animated": true,
"asset_url": "https://cdn.discordapp.com/stickers/749054660769218631.png",
"sticker_pack_id": "847199849233514549",
"sticker_pack_name": "Wumpus Beyond",
"tags": "wave, hello, hi, greeting",
"description": "Wumpus waving hello",
"sort_value": 1,
"presence_count": null
}
Guild widget record
{
"asset_type": "guild_widget",
"asset_id": "613425648685547541",
"guild_id": "613425648685547541",
"guild_name": "Apify Community",
"name": "Apify Community",
"format": "",
"animated": false,
"asset_url": "",
"sticker_pack_id": "",
"sticker_pack_name": "",
"tags": "",
"description": "",
"sort_value": null,
"presence_count": 124
}
| Field | Type | Description |
|---|---|---|
| asset_type | string | sticker or guild_widget |
| asset_id | string | Discord ID — sticker ID or guild ID |
| guild_id | string | Pack guild (stickers) or queried guild (widget mode) |
| guild_name | string | Guild name (widget mode only) |
| name | string | Asset name |
| format | string | png, apng, lottie, or gif (stickers only) |
| animated | boolean | True for APNG or GIF stickers |
| asset_url | string | Direct CDN URL to the asset file |
| sticker_pack_id | string | Pack ID the sticker belongs to |
| sticker_pack_name | string | Pack display name |
| tags | string | Comma-separated tags from the pack manifest |
| description | string | Asset description |
| sort_value | integer | Sticker sort order within its pack |
| presence_count | integer | Online member count (widget mode) |
FAQ
How do I scrape Discord stickers without a bot token?
Discord Asset Scraper hits the public /api/v9/sticker-packs endpoint, which Discord exposes without authentication. Set mode to sticker_packs, run, and you get one record per sticker with the direct CDN URL.
Can this actor extract custom server emoji?
Discord Asset Scraper does not extract custom emoji. Discord's widget endpoint does not expose emoji data (verified directly against the API), and authenticated emoji enumeration requires a bot token with the right scopes — out of scope for an auth-less actor. Sticker assets are the supported asset type.
How much does this actor cost to run?
Discord Asset Scraper uses pay-per-event pricing on the default_2603_basic profile at a 1.0x coefficient. The full public sticker catalog (a few hundred stickers) costs less than a cent in platform fees. No proxy required.
What sticker formats are returned?
Discord Asset Scraper resolves Discord's format_type integer into a readable string: png, apng, lottie, or gif. The animated boolean is set for APNG and GIF formats. CDN URLs use the correct extension automatically (.png for PNG/APNG, .json for Lottie, .gif for GIF).
Does this actor need proxies?
Discord Asset Scraper runs proxy-free. Discord's public API accepts unauthenticated traffic at the volumes this actor produces. The included JSON-API client respects Discord's rate-limit headers and backs off when asked.
Need More Features?
Need bot-token authentication for custom guild emoji, sticker download to local storage, or webhook-driven incremental scraping? Open an issue or get in touch.
Why Use Discord Asset Scraper?
- Auth-less — No bot token, no OAuth dance. Two public endpoints, one actor.
- Resolved formats — Sticker format integers and CDN extensions are converted into the values you actually want, instead of making you map them downstream.
- Two endpoints, one schema — Sticker and widget records share a flat schema with a discriminator field, so storage and downstream code stay simple.