List events for a WhatsApp message
GET
/v1/whatsapp/messages/{message_id}/events
const { data } = await bird.whatsapp.listEvents("wa_abc123");
for (const event of data) console.log(event.type, event.occurred_at);events = client.whatsapp.list_events("wa_abc123")
for event in events.data:
print(event.type, event.occurred_at)events, err := client.Whatsapp.ListEvents(context.Background(), "wam_01krdgeqcxet5s7t44vh8rt9mg", bird.WhatsappListEventsParams{})
if err != nil {
log.Fatal(err)
}
for _, e := range events.Data {
fmt.Println(e.Id, e.Type)
}$events = $bird->whatsapp->listEvents('wamid_01krdgeqcxet5s7t44vh8rt9mg');
foreach ($events->getData() ?? [] as $event) {
echo $event->getType(), ' ', $event->getId(), "\n";
}bird whatsapp list-events <message-id>curl -X GET "https://us1.platform.bird.com/v1/whatsapp/messages/{message_id}/events" \
-H "Authorization: Bearer $TOKEN"Antwort200
{
"data": [
{
"id": "ev_01kya19f8p2hs5w1y7k4cmqrtv",
"type": "whatsapp.sent",
"occurred_at": "2026-09-15T14:03:11Z"
},
{
"id": "ev_01kya19f2m8xqe4v0t6r3bnpcd",
"type": "whatsapp.delivered",
"occurred_at": "2026-09-15T14:03:12Z",
"recipient": {
"phone_number": "+15550002222",
"bsuid": "US.AbC1"
}
}
]
}
Returns a WhatsApp message's lifecycle events in chronological order, one entry per delivery transition (whatsapp.accepted, whatsapp.sent, whatsapp.delivered, whatsapp.read, whatsapp.failed). The timeline is bounded and returned in full, so this list is not paginated; an unknown message ID returns 404. For the message's current state in a single field, use Get a WhatsApp message instead.
Parameter
message_id
string
ID of the message, as returned in the send response's id field.
Abfrageparameter
type
string
Keep only events of this exact type (for example whatsapp.delivered or whatsapp.failed). Omit for the full timeline.
Possible values (may grow over time): whatsapp.accepted, whatsapp.delivered, whatsapp.failed, whatsapp.read, whatsapp.received, whatsapp.rejected, whatsapp.sent
Antwort-Payload
data
array of object
erforderlich
Timeline events for this WhatsApp message, in chronological order. The timeline is bounded and returned in full; this list is not paginated.
Untergeordnete Attribute anzeigen
data.id
string
erforderlich
ID of the event, unique within the message's timeline.
data.type
string
erforderlich
Message timeline event type:
- whatsapp.accepted: The API accepted the request.
- whatsapp.sent: The message reached the WhatsApp network.
- whatsapp.delivered: Delivery to the recipient's device was confirmed.
- whatsapp.read: The message was read. On an outbound message the recipient opened it; on an inbound one Bird acknowledged it to WhatsApp for the business, which is what a read receipt records.
- whatsapp.failed: Delivery failed permanently.
- whatsapp.rejected: The message was refused before sending and not charged.
- whatsapp.received: An inbound message arrived from the contact.
This is an open enum. Accept unrecognized values.
Possible values (may grow over time): whatsapp.accepted, whatsapp.delivered, whatsapp.failed, whatsapp.read, whatsapp.received, whatsapp.rejected, whatsapp.sent
data.occurred_at
string
erforderlich
When this event occurred.
data.recipient
object
The participant this confirmation is about, on a group message. Present only on whatsapp.delivered and whatsapp.read, the two events a group send fans out: one per participant, so a group of eight produces up to eight of each. The rest describe the message as a whole and carry no recipient, because there is one hand-off to the WhatsApp network and one way for that to be refused. Absent on a one-to-one message, whose to already names its recipient. Never carries group_id: the group belongs to the message's to, not to a participant.
Untergeordnete Attribute anzeigen
data.recipient.phone_number
string
Phone number in E.164 format, when known.
data.recipient.bsuid
string
Business-scoped user ID, Meta's identifier for the WhatsApp user. Present only on the WhatsApp-user side of the message.
data.recipient.group_id
string
The group this address was addressed as, or reached through. It appears on a message's to and nowhere else: never on from, and never on an event's recipient. Outbound, it stands in for the recipient, because a group send names no single phone number. Inbound, it qualifies one: to carries the business phone_number that received the message and the group it arrived through, while from stays the participant who wrote it. Its presence on to is what tells a group message from a one-to-one one, in either direction.
data.recipient.username
string
Present only on a message received from a WhatsApp user, on from; never on an outbound send's to, where the profile is not known. Absent when the contact has not adopted one, and on a message received before this workspace started recording them. Same form as a number's own username (WhatsAppNumberProfile.username), without a leading @; a message cannot be addressed by it.
data.recipient.display_name
string
Present only on a message received from a WhatsApp user, on from; never on an outbound send's to, where the profile is not known. Absent when the message carries no profile, and on a message received before this workspace started recording them.
data.error
nullable object
Failure detail. Present only on whatsapp.failed and whatsapp.rejected events.
Untergeordnete Attribute anzeigen
data.error.code
string
erforderlich
Standardized failure reason:
- insufficient_balance: The workspace wallet could not fund the send.
- price_not_found: No price was configured for the destination and template.
- internal_error: An unexpected service failure occurred.
- undeliverable: The recipient could not be reached.
- service_window_expired: The 24-hour service window closed; send a template.
- rate_limited: The send was throttled.
- recipient_suppressed: The recipient is on the workspace suppression list.
- media_rejected: WhatsApp could not fetch the media URL, or refused the file it found there; description carries its reason.
This is an open enum. Accept unrecognized values.
Possible values (may grow over time): insufficient_balance, price_not_found, internal_error, undeliverable, service_window_expired, rate_limited, recipient_suppressed, media_rejected
data.error.description
string
erforderlich
Human-readable explanation of the failure.
data.error.meta_error_code
nullable string
Raw error code from the WhatsApp Cloud API, when available, for low-level debugging.
data.error.occurred_at
string
erforderlich
When the failure occurred.
Verwandte Ressourcen
Weiter mit der Dokumentation, Anleitungen und Beispielen zu diesem Thema. Die Ressourcen sind auf Englisch.
Anleitung ansehenConnecting WhatsApp to Bird: from buying a number to a live channelDas Konzept verstehenWhat is the 24-hour customer service window on WhatsApp?Das Tool verwendenWhatsApp message builderDie Funktion erkundenWhatsApp
Übung ausprobieren und ein Implementierungs-Briefing erhalten