Overview
A broadcast is one email (or, for a webinar session, one text) sent once to an audience: everyone with an email address, a saved segment, or a webinar session’s registrants. Broadcasts are scheduled through the API, never sent immediately, and committing one takes two calls:- Plan —
POST /v1/broadcasts/{broadcast_id}/planwith asend_atshows exactly what would happen: how many people it reaches, when it goes out, who it is from, the body as one real recipient receives it, and every check that would stop or surprise the send. When nothing blocks, it returns aplan_token. - Schedule —
POST /v1/broadcasts/{broadcast_id}/schedulewith thatplan_tokencommits the plan. If anything the plan covered has changed since (content, variables, sender, audience, a segment’s filters, timing), the plan is over an hour old, or the send time is now less than an hour away, it is refused and you plan again.
POST /v1/broadcasts/{broadcast_id}/unschedule, or Unschedule on the broadcast in the dashboard. Everything before /schedule is safe to call freely; drafts and plans reach no one.
Authentication
Variables
Broadcasts use Flywheel’s variable system — the same one the dashboard editor saves and workflow messages use. The body holds{{var_<id>}} placeholders, and variables says what fills each one:
GET /v1/broadcasts/variables lists what variables can read: the recipient’s fields, your organization’s custom properties (by key), and — on a broadcast tied to a webinar — the session: webinar_title, webinar_start_time, join_url (the recipient’s personal link) and add-to-calendar links.
Where placeholders can go, matching what the dashboard editor keeps when someone edits the broadcast there:
- Email text:
{{var_<id>}}. - A link: the whole
hrefis a{{link_var_<id>}}whosevariableis exactly one path —<a href="{{link_var_join}}">Join</a>. A linked image is an<a href>around the<img>. - Texts:
{{var_<id>}}anywhere; texts are plain, so put a URL variable in the text.
javascript: links. Variables the body does not use are dropped.
Create a Broadcast
POST /v1/broadcasts
Keep the email HTML to what the dashboard editor can reopen —
p, h1–h3, strong, em, a, ul/ol/li, img, hr, br — since your organization’s email layout (logo, footer, unsubscribe link) wraps it at send. A broadcast created here appears in the dashboard’s Broadcasts list and opens in its editor like any other.
Plan
POST /v1/broadcasts/{broadcast_id}/plan
send_atmust be at least an hour from now (and at most a year). A webinar broadcast timed from its session (webinar_offset_minutes) plans for that time instead and takes nosend_at.recipientsis counted the way the sender counts, now; the audience is resolved again when it sends, and people who opted out, bounced or complained are skipped then.delivery.paced_over_hours: sends to a list are spread over three hours fromsend_at; webinar broadcasts go out at once.checkswithlevel: "error"block scheduling (noplan_tokenis issued) — for examplesend_at_required,send_at_too_soon,subject_missing,sender_missing,sender_domain_unverified,variable_missing,webinar_canceled,allowance_used_up.warningchecks don’t block but are worth reading:everyone(the broadcast goes to your whole list),no_recipients_yet,allowance_short,variable_unresolvable,gmail_clipping,sent_before.
Schedule
POST /v1/broadcasts/{broadcast_id}/schedule
409 if the broadcast changed since it was planned or the plan expired — plan again — and 400 if something now blocks it, including a send time that is less than an hour away.
Unschedule
POST /v1/broadcasts/{broadcast_id}/unschedule
Takes a scheduled broadcast back to draft, up to the moment it starts sending. Refused once sending has begun.
Read, Edit and Delete
Any change to a broadcast invalidates an earlier plan. Plan again after editing, and review it before scheduling.