Broadcasts
One message to a whole audience. Dashboard-session endpoints.
Create a broadcast
POST /broadcasts
| Field | Type | Description |
|---|---|---|
| audience_idrequired | string | The audience to send to. |
| namerequired | string | Internal name. |
| from | string | Sender — domain must be verified before sending. |
| subject | string | May contain {{email}} {{first_name}} {{last_name}} and any custom {{property}}. |
| html / text | string | Body; same placeholders available. |
| segment_id | string | Send only to contacts matching this segment (must belong to the audience). |
| topic_id | string | Tag 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.
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.