---
title: "Get audience membership statistics"
method: GET
path: "/v1/audiences/{audience_id}/membership-statistics"
tags: ["email-audiences"]
---

# Get audience membership statistics

`GET /v1/audiences/{audience_id}/membership-statistics`

## Request

- Base URL: `https://us1.platform.bird.com`
- URL: `https://us1.platform.bird.com/v1/audiences/{audience_id}/membership-statistics`
- Auth: one of:
  - HTTP bearer
  - API key in cookie `bird_session`

Returns the first successful observation for each requested UTC date, in chronological order. Changes between observations are unobserved. A missing observation has null total and observed_at; a successful empty audience has zero members. History retains today and the preceding 364 UTC dates; older requested dates are gaps. No history is reconstructed before observation began.

Only daily UTC observations are supported. Period data_as_of is always null because samples do not establish continuous freshness; each point carries its actual observed_at. Future, reversed, invalid or longer-than-365-date windows return 422. For the current exact count, use [Get audience membership](/docs/api/reference/get-audience-membership).

Returns 421 when the workspace's organization is served from a different region from the API host. Retry against that workspace's regional host.

## Path parameters

- `audience_id` string, required

## Query parameters

- `from` string, date
- `to` string, date

## Headers

- `X-Workspace-Id` string
- `X-Organization-Id` string

## Response `200`

Daily membership observations for the requested period.

- AudienceMembershipStatisticsResponse: Daily membership observations in ascending UTC date order. Missing observations are explicit null gaps; changes between samples are unobserved.
  - `period` AudienceMembershipStatisticsPeriod, required: Inclusive UTC date window for daily membership observations. Snapshots do not establish continuous freshness; data_as_of is always null.
    - `from` string, date, required: Inclusive first UTC date.
    - `to` string, date, required: Inclusive last UTC date.
    - `data_as_of` string, date-time, nullable, required: Always null. Use each point's observed_at for its actual observation instant.
  - `data` AudienceMembershipStatisticsPoint[], required: One point for every requested date, including gaps.
    - `bucket` string, date, required: UTC date of the observation, or the requested date for a gap.
    - `total` integer, nullable, required: Exact number of all members at observation time, or null for a gap.
    - `observed_at` string, date-time, nullable, required: Actual source observation instant, or null for a gap. This is not a day-close count.

## Other responses

- `400`: Bad request
- `401`: Authentication required
- `403`: Insufficient permissions
- `404`: Resource not found
- `421`: The request reached the wrong regional endpoint. The organization or API key belongs to a different region; reissue the request against the regional host named in the error message.
- `422`: The request has invalid field values, violates a business rule, or carries a query parameter the endpoint does not declare. Field validation errors use `type: validation_error` and include the affected fields in `details`. Business-rule errors identify the failed rule in `type`.
- `429`: Rate limit exceeded
- `500`: Internal server error
- `503`: The service is temporarily unavailable. If `Retry-After` is present, wait for that delay before retrying; otherwise, retry with exponential backoff. Reuse the same idempotency key and request when retrying a mutation.

---

[API](https://skmtc.dev/messagebird/apis/bird-api.md) · [All operations](https://skmtc.dev/messagebird/apis/bird-api/llms.txt) · [OpenAPI document](https://skmtc.dev/messagebird/apis/bird-api/revisions/3e2a50466454?raw)
