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
Code example
{
"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:
Code example
{
"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 WhatsApp events.
Next steps
- How receiving works: the inbound envelope, media fetching, and the whatsapp.received webhook
- WhatsApp sticker messages: the send side of the same arm
- Unsupported message types: orders, system notices, and the rest of what arrives unmodelled
- WhatsApp events: the full event list, over the API or webhooks
Related resources
Continue with the documentation, guides and examples for this topic. Resources are in English.
Watch the guideConnecting WhatsApp to Bird: from buying a number to a live channelUnderstand the conceptWhat is the 24-hour customer service window on WhatsApp?Use the toolWhatsApp message builderExplore the capabilityWhatsApp
Try the practice and get an implementation brief