demo32 · open, no keys
API & MCP
The library — 116 stickers in 7 collections — is open to people, scripts and AI assistants alike. Everything the page does goes through this API: search like the chat picker, add stickers, tag them with emoji and words, make collections and build packs that download as ZIP archives.
Read
| GET | /demo32/api.php?q=😉 | search as the picker does: an emoji matches stickers that carry it; words match the start of their keywords, in any language (?q=wink, ?q=привіт). Filters: &collection=, &format=svg|png|gif|webp|webm, &animated=0|1, &order=likes (most liked first), &trash=1 (search the trash), &limit=, &offset=. Every sticker comes with likes, liked (by you) and trashed |
|---|---|---|
| GET | ?sticker=7 | one sticker: emoji, keywords, format, size, file url |
| GET | ?collections=1 · ?packs=1 | the collections; the latest packs |
| GET | ?zip=<pack> | the pack as a ZIP: manifest.json (format depo-sticker-pack/1: emoji, keywords, format, size of every sticker), stickers/NN-###.ext, README.txt |
Write — POST /demo32/api.php, JSON
{"action": "add", "items": [{
"collection": "moods", // or "collection_title": "My new set"
"title": "Wink",
"emoji": "😉😜", // one or more — required
"keywords": ["wink", "deal", "підморгнути"],
"svg": "<svg viewBox=\"0 0 512 512\">…</svg>" // or "data": base64 of PNG / GIF / WebP / WebM
}]}
→ {"ok": true, "added": 1, "duplicates": 0, "results": [{"status": "added", "num": 49}]}
{"action": "collection", "title": "Backstage", "note": "…"}
{"action": "tag", "num": 7, "add_emoji": "🙃", "add_keywords": ["deal"], "remove_keywords": ["ok"]}
{"action": "like", "num": 7} // one like per visitor and sticker
{"action": "trash", "num": 7} // to the shared trash …
{"action": "restore", "num": 7} // … and back; the trash cannot be emptied
{"action": "pack", "title": "My studio pack", "stickers": [3, 7, 12]}
→ {"ok": true, "slug": "my-studio-pack-1a2b3c", "zip": "/demo32/api.php?zip=my-studio-pack-1a2b3c"}
- Files are checked by their bytes, not their names: SVG (≤ 300 KB; cleaned — no scripts, handlers, external links), PNG / APNG, WebP (≤ 1 MB), GIF (≤ 1.5 MB), WebM (≤ 1 MB; give
width/height). Animated is found by itself: APNG, GIF frames, WebPANIM, SMIL / CSS in SVG, every WebM. - The same file twice is not added again: the answer is
duplicatewith the number already in the library. - Limits per visitor and day: 200 stickers, 60 packs, 20 collections; 20 stickers per call; 120 stickers per pack.
- Packs never change: re-tagging or trashing a sticker later does not touch the archives already built.
- The trash is shared and has no "empty": a trashed sticker leaves the library, the search and new packs for everyone until someone restores it. Nothing is ever deleted.
- Likes: one per visitor (cookie) and sticker, never taken back.
curl -s 'https://album.dev0.dphub.net/demo32/api.php?q=wow' | jq '.items[] | {num, emoji, file}'
curl -s https://album.dev0.dphub.net/demo32/api.php -H 'Content-Type: application/json' \
-d '{"action":"pack","title":"Wow pack","stickers":[1,2,3]}'
MCP server
For AI assistants: https://album.dev0.dphub.net/demo32/mcp.php (Streamable HTTP, JSON answers, no keys).
claude mcp add --transport http depo-stickers https://album.dev0.dphub.net/demo32/mcp.php
stickers_overview | collections, formats, latest packs, limits |
search_stickers | find by emoji or words, filter by collection / format / animated |
get_sticker | one sticker with its picture (PNG / GIF / WebP as an image, SVG as code) |
add_stickers | add 1–20 stickers (SVG text or base64), only new files |
create_collection | a new collection |
tag_sticker | add / remove emoji and words |
build_pack | a pack from numbers, a whole collection or a search → ZIP url |
list_packs | the latest packs |
like_sticker | one like per caller and sticker |
trash_sticker · restore_sticker | the shared trash: in and back out, never emptied |
prompt draw_stickers | asks the model to draw SVG stickers with emoji and words and add them |