email-broadcasts

List events for a broadcast

Returns the per-recipient delivery timeline for a broadcast, oldest first, as a cursor page. Each entry is one event, such as a send, an open, a click, or a bounce.

get/v1/email/broadcasts/{broadcast_id}/events

Request

  • Base URL: https://us1.platform.bird.com
  • URL: https://us1.platform.bird.com/v1/email/broadcasts/{broadcast_id}/events
  • Auth: one of:
    • HTTP bearer
    • API key in cookie bird_session

Path parameters

broadcast_idstring required

ID of the broadcast whose event timeline to read.

Query parameters

limitinteger

Maximum number of items to return per page.

starting_afterstring

Cursor from the next_cursor field of a previous list response. Returns items immediately after the cursor position in the current sort order.

ending_beforestring

Cursor from the prev_cursor or refresh_cursor field of a previous list response. Returns items immediately before the cursor position in the current sort order. prev_cursor returns the preceding page. refresh_cursor anchors at the first row of that response, which on a newest-first sort is how to fetch the items that have appeared since.

typestring

Type of an event in a message's per-recipient delivery timeline.

  • email.scheduled: We accepted a send scheduled for a future time. Fires once for each message regardless of its recipient count.
  • email.accepted: We accepted the send and are getting ready to deliver it. Fires once per requested recipient.
  • email.processed: We queued the message for delivery to the recipient's mail server.
  • email.deferred: The recipient's mail server temporarily refused the message. Delivery remains pending and is retried. Can fire more than once per recipient.
  • email.delivered: The recipient's mail server accepted the message.
  • email.bounced: Delivery permanently failed at the recipient's mail server.
  • email.out_of_band_bounce: A bounce notification arrived after the message had already been accepted for delivery.
  • email.rejected: We rejected the message before attempting delivery, for example because the recipient is suppressed.
  • email.canceled: A scheduled send was canceled before it fired. Fires once for each message regardless of its recipient count.
  • email.opened: The recipient opened the message. Can fire more than once per recipient.
  • email.clicked: The recipient clicked a tracked link in the message. Can fire more than once per recipient.
  • email.unsubscribed: The recipient opted out through a tracked unsubscribe link in the message.
  • email.list_unsubscribed: The recipient opted out through the one-click unsubscribe control in their mail client.
  • email.complained: The recipient reported the message as spam through their mailbox provider.

We can add new event types to this list over time, so treat a value you do not recognize as a new type rather than as an error.

Example:email.delivered

Filter by event type, for example email.bounced or email.opened. A broadcast timeline is recipient-scoped, so email.scheduled and email.canceled never appear on it; a canceled broadcast reports that in its own status.

Headers

X-Workspace-Idstring

Workspace context for the request. Required for dashboard authentication and master keys. Workspace keys and access tokens already identify their workspace; send that workspace or omit the header. A different one is rejected.

X-Organization-Idstring

Organization context for the request. Required for dashboard authentication. An API key or access token carries its own organization, so send either that organization or no header at all; a different one is rejected.

Response

Paginated event timeline for this broadcast.

next_cursorstring nullable required

Cursor for the next page. Pass back as starting_after to advance forward. null when no next page exists.

prev_cursorstring nullable required

Cursor for the previous page. Pass back as ending_before to step backward. null when no previous page exists.

refresh_cursorstring nullable required

Refresh anchor, the first row of this response. Pass back as ending_before to fetch what precedes it in the current sort order. On a newest-first sort those are the items that have appeared since; on any other sort they are the items that sort earlier, so refreshing such a list means re-fetching it instead. Non-null whenever data is non-empty; null only on an empty page. Distinct from prev_cursor.

Example response

{
  "data": [
    {
      "id": "ev_01krdgeqcxet5s7t44vh8rt9mg",
      "type": "email.delivered",
      "occurred_at": "2026-07-01T12:00:03Z",
      "recipient_id": "er_01krdgeqcxet5s7t44vh8rt9mg",
      "bounce_code": "5.1.1",
      "link_name": "Faster exports, docs",
      "country": "US"
    }
  ],
  "next_cursor": "eyJ2IjoxLCJzIjoiXCIyMDI2LTA1LTI1VDE0OjAzOjEwWlwiIiwiaSI6IjAxOTJmM2IxLTRjN2UtN2EyYi05ZDYxLThmM2E1YzJlN2I0MCJ9",
  "refresh_cursor": "eyJ2IjoxLCJzIjoiXCIyMDI2LTA1LTI1VDE2OjQyOjAxWlwiIiwiaSI6IjAxOTJmM2IxLTllMDQtN2NkMy1iODE3LTJhNmY0ZDFjOGUwOSJ9"
}

Changes

No recorded changes to this operation across all 2 revisions of this API.