Skip to main content

Endpoints

A blast is a one-time send of an email to an audience. The typical workflow is:
  1. Create a draft blast
  2. Attach an audience with PUT .../audience
  3. Attach an email with PUT .../email
  4. Schedule it or send it now
Blast status moves through draftscheduledsendingsent, with failed, cancelled, and archived as side exits. The audience and email are only editable while the blast is a draft.

Create a Blast

Returns 201 Created with the blast object.

Set the Audience

Reference an existing contact list, or create a new list and attach it in one call. This replaces any previously attached audience. Returns 200 OK with the updated blast object.

Existing List

Inline Static List

Inline Dynamic List

Audience Rules

Dynamic audiences are defined by a rule tree of groups and conditions. Rule objects use camelCase keys, unlike the rest of the public API — they pass through to the segment engine verbatim.
Each condition reads one source: Groups combine children with operator: "and" (default) or "or" and can nest up to 5 levels deep, with at most 100 nodes per tree. Shorthand operator aliases (eq, neq, gt, gte, lt, lte, member_of, occurred, …) are accepted. email_step conditions are not allowed in audiences — they only work inside flow condition steps.

Set the Email

Reference an existing email with {"source": "existing", "email_id": "..."}, or create one inline: Omit both template_id and html for a blank branded scaffold. Returns 200 OK with the updated blast object.
The attached email must be approved before the blast can be scheduled or sent. Inline emails start as drafts — take the email.email_id from the response and approve it via POST /v1/emails/{emailId}/approve.

Approval Readiness

GET /v1/email-blasts/{blastId} on a draft includes an approval_readiness object listing what still blocks sending:
Scheduling or sending a blast that is not ready returns 400 Bad Request with error_code: "campaign_not_ready" and the same approval_readiness details.

Schedule a Blast

Returns 200 OK with the blast in scheduled status. Use POST .../unschedule to cancel a scheduled send and return the blast to draft.
Setting operational: true marks the send as transactional: unsubscribed contacts are not suppressed and the unsubscribe footer is skipped. Only use it for non-marketing mail such as receipts and service notices.
Free plan: scheduling always succeeds, but the limits are re-checked when the schedule fires. If at send time the blast’s recipient count exceeds what remains of the day’s 100-email allotment — or the workspace is over its 1,000-contact allowance — the blast is automatically cancelled instead of sent: status becomes cancelled, cancelled_reason is set to daily_email_limit or contact_allowance, no emails go out, and scheduled_at keeps the originally scheduled time. A/B test deliveries are guarded the same way at their send moments. Pro and Max sends are never auto-cancelled.

Send Now

Accepts the same optional operational flag and starts the send immediately through the async pipeline. Returns 202 Accepted with the blast in sending status; poll GET /v1/email-blasts/{blastId} for progress counters. On the Free plan, a send that would exceed the remaining daily 100-email allotment (or a workspace over its 1,000-contact allowance) is rejected up front with 403 Forbidden and error_code: "free_plan_email_limit" — the blast stays an editable draft, nothing is cancelled:

Blast Object

200 OK
cancelled_at is stamped on every cancelled blast. cancelled_reason stays null for user-initiated cancels; it is daily_email_limit or contact_allowance when the platform auto-cancelled a scheduled Free-plan blast at send time (see Schedule a Blast) — those blasts sent nothing and keep their original scheduled_at.

List Blasts

Responses contain blasts and a pagination object with page, limit, total, and totalPages.

Recipients and Engagement

Page through a blast’s contacts by engagement category: recipients (everyone prepared for the send, the default), sent, delivered, opened, clicked, bounced, unsubscribed, or spam. Also accepts page, limit, search, sort (engagement *_at timestamps sort contacts without that event last), and order. Responses contain contacts and a pagination object:

Export to CSV

Starting an export returns 202 Accepted with an export job. Poll the job until status is completed, then fetch the file from its download_url:

Rename, Archive, Delete

  • PATCH /v1/email-blasts/{blastId} updates name and/or description.
  • POST /v1/email-blasts/{blastId}/archive archives a blast that is not mid-send.
  • DELETE /v1/email-blasts/{blastId} deletes it and returns {"blast_id": "...", "deleted": true}. Scheduled blasts must be unscheduled first, and archived blasts cannot be deleted.

Common Errors

Next: Manage Triggered Flows

Automate multi-step email journeys that enroll contacts on triggers.