Skip to the documentation
API

Broadcast statistics

How the broadcast performed: copies sent, delivered, bounced, reported as spam and failed, and how many people opened, clicked and unsubscribed, as totals and as a series cut to `grain`.

GETapi.openemail.uk/broadcasts/{id}/stats

Runs the real call against your workspace, with your own key.

GET /broadcasts/{id}/stats

How the broadcast performed: copies sent, delivered, bounced, reported as spam and failed, and how many people opened, clicked and unsubscribed, as totals and as a series cut to grain.

Parameters

idstringrequired
In the path. A `brd_` id from `POST /broadcasts` or `GET /broadcasts`.
grainstring
Bucket width of the series: `minute`, `hour` or `day`. Defaults to `hour`.
offsetMinutesinteger
Minutes east of UTC to cut the buckets in, from -840 to 840. Defaults to 0. Pass `-new Date().getTimezoneOffset()` for the local zone.

Example

Needs emails:read.

curl
curl "$OE/broadcasts/brd_5a8c1e3f7b2d94a06c8e1f3b/stats?grain=day" -H "$AUTH"
Response
{  "object": "broadcast_stats",  "broadcastId": "brd_5a8c1e3f7b2d94a06c8e1f3b",  "grain": "day",  "totals": {    "recipients": 412,    "pending": 0,    "sent": 410,    "delivered": 404,    "bounced": 4,    "complained": 1,    "failed": 2,    "opened": 187,    "clicked": 52,    "unsubscribed": 3,    "opens": 296,    "clicks": 71  },  "series": [    { "bucket": "2026-09-23", "delivered": 404, "opened": 161, "clicked": 45, "unsubscribed": 3 },    { "bucket": "2026-09-24", "delivered": 0, "opened": 26, "clicked": 7, "unsubscribed": 0 }  ]}

opened, clicked and unsubscribed count people, while opens and clicks count events. pending counts the copies still queued, scheduled or sending, and failed the copies that failed or were cancelled.

series is sparse and oldest first: one bucket per grain in which something happened. It counts each person once, at the first time it happened to them, so it adds up to the totals.

bucket is YYYY-MM-DD, YYYY-MM-DDTHH or YYYY-MM-DDTHH:MM, in the offset asked for.

Refusals

StatusCodeWhen
400invalid_cursorOn the recipients list, a cursor that list did not hand out.
403insufficient_scopeThe key does not hold emails:read.
404broadcast_not_foundThe id names no broadcast in this workspace, or the key is limited to particular addresses or domains and the broadcast was sent from one it does not hold.
404recipient_not_foundOn GET /broadcasts/{id}/recipients/{emailId}, an emailId that is not a copy of this broadcast.