Broadcasts

One message to a whole audience. Dashboard-session endpoints.

Create a broadcast

POST /broadcasts

FieldTypeDescription
audience_idrequiredstringThe audience to send to.
namerequiredstringInternal name.
fromstringSender — domain must be verified before sending.
subjectstringMay contain {{email}} {{first_name}} {{last_name}} and any custom {{property}}.
html / textstringBody; same placeholders available.
segment_idstringSend only to contacts matching this segment (must belong to the audience).
topic_idstringTag with a topic: opted-out contacts are skipped and the unsubscribe link is topic-scoped.

List / retrieve / update / delete

GET /broadcasts

GET /broadcasts/:id

PUT /broadcasts/:id

DELETE /broadcasts/:id

Only draft broadcasts can be edited.

Send

POST /broadcasts/:id/send

Validates the from-domain, subject, body, and that the audience has subscribed contacts; checks quota for the full recipient count; then sends in the background while sent_count ticks up. Unsubscribed and suppressed contacts are skipped, and an unsubscribe footer + List-Unsubscribe header are added automatically.

A failed broadcast can be sent again safely — the run resumes where it left off, skipping contacts who already received the message.

Schedule

POST /broadcasts/:id/send

POST /broadcasts/:id/unschedule

Pass {"scheduled_at": "2026-08-01T09:00:00Z"} (ISO 8601, future) in the send body to schedule instead of sending now. All validation and the quota check run at scheduling time. POSTing /send again with a new time reschedules; with no scheduled_at it sends immediately. /unschedule returns the broadcast to draft.