OrbTop

Discord Public Stickers and Emoji Asset Scraper

OTHERBUSINESSDEVELOPER TOOLS

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_type integers into readable strings (png, apng, lottie, gif)
  • Builds the direct cdn.discordapp.com asset 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

  1. Pick a modesticker_packs pulls the full public sticker catalog. guild_widget queries the widget endpoint for IDs you supply. both runs both.
  2. Sticker packs — Hits GET /api/v9/sticker-packs once. Discord returns every public pack in a single payload, which is then flattened to one record per sticker.
  3. 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.
  4. Export — Records land in your Apify dataset as JSON. Use the asset_type field 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.