Skip to content
API PlatformDevelopers
GET/v1/reports/broadcastsbeta

Broadcasts report

Needs
Read your data (mcp:read)
Plan
Any plan with API access
Limits
300 a minute per key
Undo
Nothing to undo: this only reads.

Broadcasts created in a period, newest first, each with audience, sent, delivered, read, failed and opted-out counts. Test sends are left out unless you ask.

A metric this workspace cannot answer is null and listed in unavailable[] with the reason. Never read `null` as zero.

Try it

Query (7)

A named period. Default `last_7_days`. Weeks start on Monday.

First day, YYYY-MM-DD. Give `from` and `to` together; they override `preset`. Up to 186 days.

Last day (inclusive), YYYY-MM-DD.

IANA time zone, e.g. `Asia/Dubai`. Default: your workspace time zone.

Include test broadcasts.

The `next_cursor` from the previous page. Cursors expire after 24 hours.

How many items per page (1–100).

This only reads. It uses your real data and changes nothing.

Code and response

curl -X GET 'https://mcp.wa-api.cloud/v1/reports/broadcasts?preset=this_month' \
  -H "Authorization: Bearer $API_KEY"

The code reads your key from $API_KEY.

Parameters

Parameters
FieldTypeWhat it is
presetstring · queryA named period. Default last_7_days. Weeks start on Monday.one of: today, yesterday, last_7_days, last_14_days, last_30_days, this_month, last_month, this_week, last_week
fromstring · queryFirst day, YYYY-MM-DD. Give from and to together; they override preset. Up to 186 days.pattern ^\d{4}-\d{2}-\d{2}$
tostring · queryLast day (inclusive), YYYY-MM-DD.pattern ^\d{4}-\d{2}-\d{2}$
timezonestring · queryIANA time zone, e.g. Asia/Dubai. Default: your workspace time zone.1–64 characters
include_sandboxboolean · queryInclude test broadcasts.default false
cursorstring · queryThe next_cursor from the previous page. Cursors expire after 24 hours.1–2048 characters
limitinteger · queryHow many items per page (1–100).1–100 · default 25

Headers

Headers
FieldTypeWhat it is
AuthorizationrequiredheaderBearer $API_KEY — your API key.
Api-VersionheaderThe API version to use, e.g. 2026-10-01. Default: the version your key is pinned to.one of: 2026-10-01 · pattern ^\d{4}-\d{2}-\d{2}$

Response 200

A page of broadcasts.

Response fields
FieldTypeWhat it is
rangerequiredobjectThe range and timezone these numbers were counted in — always state it when reporting them.
fromrequiredstringFirst local day (YYYY-MM-DD), inclusive.
torequiredstringLast local day (YYYY-MM-DD), inclusive.
daysrequiredintegerNumber of local days in the range.-9007199254740991–9007199254740991
timezonerequiredstringIANA timezone the days were counted in.
started_atrequiredstringRange start as a UTC instant (ISO-8601).
ended_atrequiredstringRange end as a UTC instant (ISO-8601), exclusive.
presetrequiredstring or nullThe named range used, if any.
totalsrequiredobject
broadcastsrequiredinteger-9007199254740991–9007199254740991
audiencerequiredinteger-9007199254740991–9007199254740991
sentrequiredinteger-9007199254740991–9007199254740991
deliveredrequiredinteger-9007199254740991–9007199254740991
readrequiredinteger-9007199254740991–9007199254740991
failedrequiredinteger-9007199254740991–9007199254740991
opted_outrequiredinteger-9007199254740991–9007199254740991
delivery_raterequirednumber or null
read_raterequirednumber or null
datarequiredarray of objectOne page of broadcasts, newest first.
idrequiredstring
namerequiredstring or null
statusrequiredstring or null
created_atrequiredstring or null
sandboxrequiredbooleantrue = a test send, not real traffic.
channelrequiredobject or null
idrequiredstring or null
namerequiredstring or null
templaterequiredobject or null
namerequiredstring or null
languagerequiredstring or null
statsrequiredobject
audiencerequiredintegerRecipients in the audience (summary total, or the estimate before sending started).-9007199254740991–9007199254740991
sentrequiredinteger-9007199254740991–9007199254740991
deliveredrequiredinteger-9007199254740991–9007199254740991
readrequiredintegerMarked read — depends on the recipient having read receipts on.-9007199254740991–9007199254740991
failedrequiredinteger-9007199254740991–9007199254740991
pendingrequiredinteger-9007199254740991–9007199254740991
opted_outrequiredintegerSkipped because the contact is on do-not-disturb / opted out.-9007199254740991–9007199254740991
respondedrequiredinteger-9007199254740991–9007199254740991
delivery_raterequirednumber or null
read_raterequirednumber or null
scannedrequiredintegerBroadcasts inspected while walking the list to cover the range.-9007199254740991–9007199254740991
truncatedrequiredbooleantrue = the walk stopped early (page budget or time); older broadcasts in the range may be missing and the totals are a lower bound.
notesrequiredarray of string
next_cursorrequiredstring or nullPass as "cursor" for the next page; null when there are no more.
unavailablerequiredarray of objectMetrics that are UNKNOWN (missing data source), not zero. Say so when reporting; do not fill them in with 0.
metricrequiredstringWhich metric or section is missing, e.g. "messages.read".
reasonrequiredstringWhy it is missing (not supported by this server version, service not configured, forbidden, temporarily unavailable…).

Errors

Errors are application/problem+json. Branch on code.

StatusCodeWhen
400invalid_input

A field is missing or has the wrong format. errors[] points at each field. The range is reversed, in the future, longer than 186 days, or the time zone is unknown.

401unauthenticated

The Authorization header is missing, the key is unknown, expired or revoked.

403entitlement_required

The workspace's plan does not include API access (api_access).

403insufficient_scope

The key does not have the permission this operation needs.

429rate_limited

The key or workspace went over its rate limit. Wait for Retry-After seconds.

503upstream_unavailable

A service behind the API is briefly unavailable. Safe to retry with backoff.

Examples

This month

Response 200

{
  "data": [
    {
      "id": "8812",
      "name": "September sale",
      "status": "COMPLETED",
      "created_at": "2026-09-15T07:00:00Z",
      "channel": {
        "id": "301",
        "name": "Main WhatsApp"
      },
      "template": {
        "name": "sept_sale",
        "language": "en_US"
      },
      "stats": {
        "audience": 5300,
        "sent": 5210,
        "delivered": 5096,
        "read": 3920,
        "failed": 44,
        "opted_out": 18,
        "pending": -9007199254740991,
        "responded": -9007199254740991,
        "delivery_rate": null,
        "read_rate": null
      },
      "sandbox": false
    }
  ],
  "next_cursor": null,
  "range": {
    "from": "2026-09-01",
    "to": "2026-09-23",
    "days": 23,
    "timezone": "Asia/Dubai",
    "started_at": "2026-09-16T20:00:00Z",
    "ended_at": "2026-09-23T20:00:00Z",
    "preset": "this_month"
  },
  "unavailable": [],
  "totals": {
    "broadcasts": -9007199254740991,
    "audience": -9007199254740991,
    "sent": -9007199254740991,
    "delivered": -9007199254740991,
    "read": -9007199254740991,
    "failed": -9007199254740991,
    "opted_out": -9007199254740991,
    "delivery_rate": null,
    "read_rate": null
  },
  "scanned": -9007199254740991,
  "truncated": false,
  "notes": []
}

Operation path

The same operation is also at POST /v1/ops/reports_broadcasts, with every field in the JSON body.