broadcasts:write to start and control broadcasts, and
broadcasts:read to follow them (see Keys and scopes).
Starting one
POST /v1/broadcasts takes the channel, a name, the channel’s content, and the audience:preparing; the audience is read and checked on OMNI’s side, however
large it is. Send an Idempotency-Key header so a retried request starts it only once.
What each channel sends
content is the channel’s own, with the same names
messages with failover
use. {{tags}} in it are filled for each person.
Who it goes to
Give one kind of audience:recipients— up to 10,000 numbers, each with thevaluesfor its{{tags}}. The way to send what your own system has worked out per person.contacts,segmentsandnumbers— your saved contacts (up to 500 by id), whole segments (up to 50), and up to 500 more numbers. A contact’s name, number and fields fill the tags:{{name}},{{msisdn}},{{city}}…audience— one of your saved audiences, with Customer data.
{{tag}} nothing in the audience can fill is refused before anything is sent — it is
almost always a typo, and a blank would reach everyone.
Who is left out
Every number is checked the way the panel checks a broadcast:- Numbers that aren’t valid, and repeats, are skipped.
- People who asked never to be contacted, or opted out, are skipped — of marketing when
purposeismarketing(the default), of everything when they stopped everything. - On RCS, a number whose country has no route, or whose bot hasn’t approved the template, is skipped.
counts.skipped says how many; the rest are sent.
Following it
GET /v1/broadcasts/{broadcast_id} gives its status and counts — skipped, sent, delivered, failed, waiting — and its messages say how each one ended. GET /v1/broadcasts lists them all, the panel’s too. Rather than asking, subscribe a webhook endpoint to:
Each carries the broadcast, as
broadcast, in the shape GET answers. Each message also
sends its own channel_message.* events, with the broadcast’s id in campaign.
Pausing, resuming and canceling
Asking for one at the wrong moment — pausing a finished broadcast, say — is refused with
invalid_state (409), and the message says why.
An account sends a few broadcasts at a time; others wait their turn,
queued. A
broadcast’s messages are charged like any other send.