Sign inGet Started

List webhook endpoints

GET
/v1/webhooks
for await (const endpoint of bird.webhooks.list()) {
  console.log(endpoint.id, endpoint.url, endpoint.status);
}
Response200
{
  "data": [
    {
      "id": "whk_01krdgeqcxet5s7t44vh8rt9mg",
      "url": "https://example.com/webhook",
      "description": "Production webhook endpoint",
      "filter": null,
      "events": [
        "email.delivered",
        "email.bounced"
      ],
      "status": "active",
      "destination": {
        "type": "webhook"
      },
      "created_at": "2026-05-20T09:14:52Z",
      "updated_at": "2026-05-25T16:42:01Z"
    }
  ],
  "next_cursor": "eyJ2IjoxLCJzIjoiXCIyMDI2LTA1LTI1VDE0OjAzOjEwWlwiIiwiaSI6IjAxOTJmM2IxLTRjN2UtN2EyYi05ZDYxLThmM2E1YzJlN2I0MCJ9",
  "prev_cursor": null,
  "refresh_cursor": "eyJ2IjoxLCJzIjoiXCIyMDI2LTA1LTI1VDE2OjQyOjAxWlwiIiwiaSI6IjAxOTJmM2IxLTllMDQtN2NkMy1iODE3LTJhNmY0ZDFjOGUwOSJ9"
}

Returns the workspace's webhook endpoints as a cursor-paginated list, newest first by default. Endpoint objects never include the signing secret; to inspect a single endpoint, use Get a webhook endpoint.

Query Parameters

sortstring

Possible values: created_at, url

orderstring

Sort direction. Defaults to desc, which sorts from newest to oldest or largest to smallest, depending on the selected sort field.

Possible values: asc, desc

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.

include_totalboolean

When true, the response includes a total field with the total number of items matching the request's filters across all pages.

urlstring

Only endpoints delivering to exactly this URL. Several endpoints can share a URL, so this finds matches for a setup to reuse; it does not prevent a duplicate.

Response Payload

data
array of object
required
Show child attributes
data.id
string
required

Unique identifier for the endpoint (whk_ prefix). Accepted as webhook_id by every /v1/webhooks/{webhook_id} operation.

data.url
string
required

HTTPS URL where the API delivers events for this endpoint.

data.description
string

Human-readable label for the endpoint.

data.filter
nullable object
required

Mailbox scope configured through filter, or null.

Show child attributes
data.filter.mailbox_id
string
required

Mailbox to receive events for. Must belong to this workspace; a mailbox outside it returns 422.

data.events
array of string
required

Event types this endpoint is subscribed to; only matching events are delivered. Change the set with Update a webhook endpoint.

data.status
string
required

Delivery state of the endpoint.

  • active: The initial state; events are being delivered normally.
  • degraded: Recent deliveries are failing. We keep delivering and retrying, and the endpoint returns to active automatically once deliveries succeed again.
  • paused: All delivery is stopped, either because an update set status to paused or automatically after sustained delivery failures. A paused endpoint never resumes on its own: re-enable it with Update a webhook endpoint, then Replay failed deliveries to recover the deliveries that failed before the pause. Events that arrived while it was paused were never attempted, so a replay does not reach them.

Possible values: active, degraded, paused

data.destination
object

How each delivery to the endpoint is built.

Show child attributes

Posts the signed event to the endpoint's url unchanged.

data.destination.type
string
required

Value: webhook

data.created_at
string
required
data.updated_at
string
required
next_cursor
nullable string
required

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

prev_cursor
nullable string
required

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

refresh_cursor
nullable string
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.

total
nullable integer

Total number of items matching the request's filters across all pages. Present only when include_total=true was passed; otherwise null.