---
title: "Read audience growth"
description: "How many contacts joined each audience over a window that ends now, counted by day, hour or minute: the growth chart on the audiences page. An audience records when somebody joined and never when they left, so every figure counts the people still in the list today by the date they joined, and a line never falls."
url: "https://openemail.uk/docs/api/audiences/growth"
area: "API"
category: "Mailbox"
---

# Read audience growth

How many contacts joined each audience over a window that ends now, counted by day, hour or minute: the growth chart on the audiences page. An audience records when somebody joined and never when they left, so every figure counts the people still in the list today by the date they joined, and a line never falls.

`GET /audiences/growth`

## GET /audiences/growth

How many contacts joined each audience over a window that ends now, counted by day, hour or minute: the growth chart on the audiences page. An audience records when somebody joined and never when they left, so every figure counts the people still in the list today by the date they joined, and a line never falls.

## Example

Needs `audiences:read`. Leave `audienceIds` out for every audience, or name up to 50 separated by commas. The window is `days` (1 to 1095) or `minutes` (1 to 1576800, which wins when both are sent), 30 days by default. `grain` is `day`, `hour` or `minute`, `day` by default, and `offsetMinutes` (-840 to 840) is the viewer's offset from UTC, so day buckets start at their local midnight.

**curl**

```
curl "$OE/audiences/growth?days=30" -H "$AUTH"
```

**Response**

```
{
  "object": "audience_growth",
  "since": "2026-08-25T00:00:00.000Z",
  "until": "2026-09-23T12:00:00.000Z",
  "grain": "day",
  "offsetMinutes": 0,
  "totals": {
    "contacts": 412,
    "memberships": 415,
    "added": 37,
    "lists": 2,
    "busiest": "2026-09-18"
  },
  "series": [
    {
      "id": "aud_9f2c4b7e1a0d63d84c5f2e7b",
      "name": "All contacts",
      "builtin": true,
      "total": 412,
      "before": 378,
      "added": 34,
      "buckets": [
        { "bucket": "2026-09-14", "added": 9 },
        { "bucket": "2026-09-18", "added": 25 }
      ]
    },
    {
      "id": "aud_4c1b8e2a7d9f05c36b4e8a71",
      "name": "Product updates",
      "builtin": false,
      "total": 3,
      "before": 0,
      "added": 3,
      "buckets": [{ "bucket": "2026-09-18", "added": 3 }]
    }
  ]
}
```

> `total` is the members now, `before` the ones among them who joined before `since`, and `added` the ones who joined inside the window, so `before` plus `added` is `total`. A contact who joined and later left is in none of them.

> `totals.contacts` counts each person once however many lists they are in, while `totals.memberships` adds the lists up, so a person counts once for every list read that holds them, and the default audience holds everyone. `totals.busiest` is the bucket with the most joins across the lists, or null when nobody joined.

> Bucket keys are `YYYY-MM-DD` by day, `YYYY-MM-DDTHH` by hour and `YYYY-MM-DDTHH:MM` by minute, in the local time `offsetMinutes` names. Only buckets with a join are listed, so fill the gaps with zero when you draw them. `series` is sorted by `total`, largest first, then by name, and `builtin` is true on the default audience.

> An id in `audienceIds` that is not an audience in this workspace is a `404` `audience_not_found`, and more than 50 ids is a `422` `invalid_parameter`. The window starts at the beginning of its first bucket, so `since` can fall a little earlier than exactly `days` ago.
