# 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

```json
{
  "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](/docs/guides/whatsapp/receiving-whatsapp#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:

```json
{
  "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 modelled as content and arrives as an [unsupported type](/docs/guides/whatsapp/receiving-whatsapp/unsupported) with `type: "reaction"`.

## Next steps

- [How receiving works](/docs/guides/whatsapp/receiving-whatsapp): the inbound envelope, media fetching, and the `whatsapp.received` webhook
- [WhatsApp sticker messages](/docs/guides/whatsapp/message-types/stickers): the send side of the same arm
- [Unsupported message types](/docs/guides/whatsapp/receiving-whatsapp/unsupported): reactions, orders, and the rest of what arrives unmodelled
- [WhatsApp events](/docs/guides/whatsapp/events): the full event list, over the API or webhooks