Documentation
Sign inGet started

WhatsApp events

Bird records events for inbound and outbound WhatsApp messages. An outbound timeline shows what happened after a send returned 202: acceptance, handoff to WhatsApp, delivery, reading, or failure. An inbound timeline records when Bird received the message.

The event envelope

Public outbound delivery events use the standard webhook envelope: a type, a timestamp, and a type-specific data object.
Exemple de code
{
  "data": {
    "direction": "outbound",
    "from": { "phone_number": "+13124495569" },
    "metadata": { "session_id": "sess_4821" },
    "tags": [{ "name": "flow", "value": "login-otp" }],
    "to": { "phone_number": "+14155550100" },
    "whatsapp_id": "wam_01ky7qbvswf3fvyaw3az90391c",
    "workspace_id": "ws_01ky7m235keycbnwyajabe1a6b"
  },
  "timestamp": "2026-07-23T14:51:39.913Z",
  "type": "whatsapp.delivered"
}
Each public WhatsApp webhook payload carries whatsapp_id, workspace_id, direction, from, to, tags, and metadata. An address can include an E.164 phone_number, a Meta business-scoped user ID in bsuid, or both. tags and metadata are null when the send carried none.
The events API returns leaner timeline records with an id, type, and occurred_at timestamp. The message ID is already in the request URL.

Lifecycle events

Events appear in chronological order. An outbound message can stop at whatsapp.failed or whatsapp.rejected, and whatsapp.read appears only if the recipient opens the message. An inbound message has a single whatsapp.received timeline event.
EventMeaningPublic webhook
whatsapp.acceptedBird accepted the send request. This is what the 202 reported.Yes
whatsapp.sentBird handed the message to the WhatsApp network.Yes
whatsapp.deliveredWhatsApp confirmed delivery to the recipient's device.Yes
whatsapp.readThe recipient opened the message.Yes
whatsapp.failedWhatsApp did not deliver the message.Yes
whatsapp.rejectedBird refused the message before sending it. It was not charged.Yes
whatsapp.receivedBird received an inbound message from a contact.No
whatsapp.read does not change the message status. A delivered message stays delivered; the message also records the read in read_at.
The event type list is open: new types may be added over time, so treat an unrecognized value as a future event rather than an error.

Failure events

whatsapp.failed and whatsapp.rejected are terminal. A rejection means Bird stopped the message before sending it to WhatsApp, so it was not charged. Causes include a suppressed recipient, insufficient wallet balance, or a destination without a configured price. A failure means WhatsApp refused or could not deliver the message. meta_error_code contains WhatsApp's code when available.
Both events contain an error object with a stable Bird code, a human-readable description, an optional meta_error_code, and occurred_at. The object appears in API records and webhook payloads only for these event types.

Reading events from the API

GET /v1/whatsapp/messages/{message_id}/events returns the timeline in chronological order. The bounded list is not paginated. Reading events requires an API key with whatsapp:read:
const { data } = await bird.whatsapp.listEvents("wa_abc123");
for (const event of data) console.log(event.type, event.occurred_at);
A message that was accepted, sent, delivered, and read returns four events:
Exemple de code
{
  "data": [
    {
      "id": "ev_01ky7q6a1fejfbvs0myn41hj41",
      "occurred_at": "2026-07-23T14:48:34.71Z",
      "type": "whatsapp.accepted"
    },
    {
      "id": "ev_01ky7q6a2denvtd6jg1vqwmg13",
      "occurred_at": "2026-07-23T14:48:35.671Z",
      "type": "whatsapp.sent"
    },
    {
      "id": "ev_01ky7q6a2zff9r2qm74mmg1g6z",
      "occurred_at": "2026-07-23T14:48:36.642Z",
      "type": "whatsapp.delivered"
    },
    {
      "id": "ev_01ky7q6c21frssf0vj8h50qysw",
      "occurred_at": "2026-07-23T14:48:38.65Z",
      "type": "whatsapp.read"
    }
  ]
}
Pass type to return one exact public event type, such as ?type=whatsapp.failed or ?type=whatsapp.read. Omit it for the full timeline.
The same timeline is what the WhatsApp log page renders when you open a message.
The WhatsApp message detail sheet in the Bird dashboard, opened for a delivered bird_order_confirmation message: the Events tab showing the per-message lifecycle timeline of Accepted, Sent, Delivered, and Read, each with its timestamp, over the dimmed message list

Webhooks

Subscribe to whatsapp.accepted, whatsapp.sent, whatsapp.delivered, whatsapp.read, whatsapp.failed, and whatsapp.rejected from the Webhooks page or the webhooks API. Bird does not expose whatsapp.received as a public webhook event. Use the message list, message timeline, or dashboard inbound metrics to monitor received messages. The Webhooks guide covers endpoints, signatures, and retries.

Next steps