Receiving WhatsApp stickers
A sticker a contact taps from their tray arrives as an inbound message carrying sticker: a WebP file reference, plus an animated flag.
What an inbound sticker carries
{
"id": "wam_01kye7t1rgyw9u5l8p2zaf7sid",
"direction": "inbound",
"from": { "phone_number": "+14155550100" },
"to": { "phone_number": "+13124495569" },
"status": "received",
"sticker": {
"id": "waf_01kye6r7as0zkv3g1q6suy9whc",
"url": "https://platform.bird.com/v1/whatsapp/messages/wam_01kye7t1rgyw9u5l8p2zaf7sid/media/waf_01kye6r7as0zkv3g1q6suy9whc",
"mime_type": "image/webp",
"animated": false
},
"created_at": "2026-08-25T09:19:37Z"
}| Field | What it carries |
|---|---|
id | The stored file, to pass as media_id when fetching the bytes |
url | A Bird URL, fetched with your API key |
mime_type | The media type WhatsApp reported, image/webp for a sticker |
animated | Whether the sticker animates; present only on an inbound sticker |
The arm carries no caption in either direction, and no name for the sticker or the pack it came from. A sticker is the whole message.
animated distinguishes an animated WebP from a static one, which matters when you render the file yourself: an animated sticker is a multi-frame WebP that a still-image renderer flattens to its first frame.
Fetching the bytes
Pass the message ID and the media id to the channel's media method. The hub's fetching inbound media carries that call in every language, along with the redirect and header rules it follows, and owns the retention window the file lives in.
Most integrations never fetch a sticker. It usually carries sentiment rather than information, so an agent inbox can show a placeholder and an automated flow can treat the message as a window-resetting acknowledgement without downloading anything.
The webhook payload
whatsapp.received carries the sticker arm on the event envelope:
{
"type": "whatsapp.received",
"timestamp": "2026-08-25T09:19:37.882Z",
"data": {
"whatsapp_id": "wam_01kye7t1rgyw9u5l8p2zaf7sid",
"workspace_id": "ws_01ky7m235keycbnwyajabe1a6b",
"direction": "inbound",
"from": { "phone_number": "+14155550100" },
"to": { "phone_number": "+13124495569" },
"sticker": {
"id": "waf_01kye6r7as0zkv3g1q6suy9whc",
"url": "https://platform.bird.com/v1/whatsapp/messages/wam_01kye7t1rgyw9u5l8p2zaf7sid/media/waf_01kye6r7as0zkv3g1q6suy9whc",
"mime_type": "image/webp",
"animated": false
},
"tags": null,
"metadata": null
}
}Things to watch
- A sticker still resets the service window. It is an inbound message like any other, so it buys another 24 hours of free-form replies even though it carries no text to act on.
- A sticker is not a reaction. An emoji reaction a contact adds to one of your messages is not an inbound message at all: it is recorded in that message's own reaction log, and reading it is covered in Reaction events.
Next steps
- How receiving works: the inbound envelope, media fetching, and the
whatsapp.receivedwebhook - WhatsApp sticker messages: the send side of the same arm
- Unsupported message types: orders, system notices, and the rest of what arrives unmodelled
- WhatsApp webhooks: every event you can subscribe to
Related resources
Continue with the documentation, guides and examples for this topic.