---
title: "Broadcast analytics"
description: "How the broadcasts sent over a window that ends now did, added up and counted by day, hour or minute, with one row per broadcast to compare them: the Analytics tab of the Broadcasts page."
url: "https://openemail.uk/docs/api/broadcasts/analytics"
area: "API"
category: "Mailbox"
---

# Broadcast analytics

How the broadcasts sent over a window that ends now did, added up and counted by day, hour or minute, with one row per broadcast to compare them: the Analytics tab of the Broadcasts page.

`GET /broadcasts/analytics`

## GET /broadcasts/analytics

How the broadcasts sent over a window that ends now did, added up and counted by day, hour or minute, with one row per broadcast to compare them: the Analytics tab of the Broadcasts page.

## Example

Needs `emails:read`. Leave `broadcastIds` out for every broadcast, 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.

**curl**

```
curl "$OE/broadcasts/analytics?days=30" -H "$AUTH"
```

**Response**

```
{
  "object": "broadcast_analytics",
  "since": "2026-08-25T00:00:00.000Z",
  "until": "2026-09-23T12:00:00.000Z",
  "grain": "day",
  "offsetMinutes": 0,
  "broadcastIds": [],
  "totals": {
    "broadcasts": 2,
    "recipients": 530,
    "pending": 0,
    "sent": 527,
    "delivered": 519,
    "bounced": 6,
    "complained": 1,
    "failed": 3,
    "opened": 241,
    "clicked": 66,
    "unsubscribed": 4,
    "opens": 377,
    "clicks": 90
  },
  "series": [
    { "bucket": "2026-09-09", "sent": 117, "delivered": 115, "opened": 54, "clicked": 14, "unsubscribed": 1 },
    { "bucket": "2026-09-23", "sent": 410, "delivered": 404, "opened": 187, "clicked": 52, "unsubscribed": 3 }
  ],
  "broadcasts": [
    {
      "id": "brd_5a8c1e3f7b2d94a06c8e1f3b",
      "subject": "The September release is out",
      "status": "sent",
      "sentAt": "2026-09-23T12:00:00.000Z",
      "recipients": 412,
      "sent": 410,
      "delivered": 404,
      "opened": 187,
      "clicked": 52,
      "unsubscribed": 3
    },
    {
      "id": "brd_2e7d9b4c1a8f60e35d2c7b91",
      "subject": "What changed in August",
      "status": "sent",
      "sentAt": "2026-09-09T09:30:00.000Z",
      "recipients": 118,
      "sent": 117,
      "delivered": 115,
      "opened": 54,
      "clicked": 14,
      "unsubscribed": 1
    }
  ]
}
```

> A copy counts when it was sent inside the window, and everything that happened to it afterwards counts with it. Test mode broadcasts are left out.

> `totals` and `series` add up the broadcasts in `broadcastIds`, or every one when it is empty. `broadcasts` always lists every broadcast in the window, newest first, with the same counts as `totals`, shortened here, so you can compare them or pick ids.

> `opened`, `clicked` and `unsubscribed` count people, while `opens` and `clicks` count events. `series` is sparse and oldest first, and counts each person once, at the first time it happened to them.

> More than 50 ids is a `422` `invalid_parameter`, and an id with no copy in the window adds nothing. A key limited to particular addresses or domains reads only the broadcasts sent from an address or domain it holds.
