---
title: "Create a broadcast draft"
method: POST
path: "/broadcasts"
tags: ["Campaigns"]
---

# Create a broadcast draft

`POST /broadcasts`

## Request

- Base URL: `https://sendhq.cc/api/v1`
- URL: `https://sendhq.cc/api/v1/broadcasts`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/sendhq/apis/sendhq-api/docs/broadcasts/post.ts> (a function with typed inputs; its response is checked against the schema)

Create a draft for one list: `from` on a verified domain, `subject`, optional `preview_text`, and content as `html` and/or `text`, `markdown`, a block document in `content`, or a published hosted `template` ({id or key, optional version_id}). Markdown and block content are rendered with the workspace design (newsletter settings). Raw content supports merge tags such as `{{first_name}}`, `{{fields.plan}}`, and fallbacks like `{{first_name | there}}`; HTML values are escaped. `audience` narrows who gets it: `segment_id` (only list members matching a segment), `limit` (at most this many people), and `order` (`signup`, or `engaged` for most engaged first). `tracking` turns open and click tracking on or off (both on by default). `web.enabled` publishes the issue on the list's newsletter site once it is sent. To send later, create the draft, then call POST /broadcasts/{id}/schedule; `scheduled_at` is not accepted here.

## Request body

- object
  - `name` string
  - `list_id` string
  - `from` string: Sender on a verified workspace domain.
  - `reply_to` string
  - `subject` string
  - `preview_text` string
  - `html` string
  - `text` string
  - `markdown` string: Markdown body, converted to a block document rendered with the workspace design. Not combinable with `html` or `content`.
  - `editor` 'html' | 'blocks'
  - `content` object, nullable: Block document ({ type: 'doc', content: [...] }) as the dashboard editor stores it. Without `html`, it is rendered with the workspace design.
  - `template` object, nullable
    - `id` string
    - `key` string
    - `version_id` string
  - `audience` object
    - `segment_id` string, nullable: Only list members matching this segment.
    - `order` 'signup' | 'engaged': Who goes first when `limit` is set: signup order, or most engaged first.
    - `limit` integer, nullable: Send to at most this many people; null for everyone.
  - `tracking` object
    - `opens` boolean
    - `clicks` boolean
  - `track_opens` boolean
  - `track_clicks` boolean
  - `web` object
    - `enabled` boolean: Publish this issue on the list's newsletter site once it is sent.
    - `slug` string, nullable: Issue address; defaults to the subject.
    - `pinned` boolean

## Response `201`

Successful response

- object
  - `id` string, required
  - `name` string, required
  - `status` string, required
  - `listId` string, required
  - `from` string, required
  - `replyTo` unknown, required
  - `subject` string, required
  - `previewText` string, required
  - `html` string, required
  - `text` unknown, required
  - `template` unknown, required
  - `audience` object, required
    - `segmentId` unknown, required
    - `order` string, required
    - `limit` unknown, required
  - `tracking` object, required
    - `opens` boolean, required
    - `clicks` boolean, required
  - `editor` string, required
  - `content` unknown, required
  - `testSentAt` unknown, required
  - `web` object, required
    - `enabled` boolean, required
    - `slug` unknown, required
    - `pinned` boolean, required
    - `publishedAt` unknown, required
  - `scheduledAt` unknown, required
  - `startedAt` unknown, required
  - `completedAt` unknown, required
  - `nextAttemptAt` unknown, required
  - `lastError` unknown, required
  - `createdAt` string, date-time, required
  - `updatedAt` string, date-time, required

## Other responses

- `400`: Invalid request
- `401`: Missing or invalid authentication
- `402`: A paid entitlement is required for this recipient or feature
- `403`: The workspace, domain, policy, or suppression state forbids the operation
- `404`: Tenant-scoped resource not found
- `409`: Resource state or idempotency conflict
- `413`: Attachment count or bytes exceed the accepted limit
- `422`: Request validation or suppression check failed
- `423`: Sending is paused for this sender identity or workspace; the message gives the reason and how to appeal
- `429`: A monthly, daily, or trial usage limit was reached
- `500`: Unexpected server error
- `502`: An upstream provider operation failed
- `503`: A required provider or signing configuration is unavailable
- `default`: An error response using SendHQ's standard JSON envelope

---

[API](https://skmtc.dev/sendhq/apis/sendhq-api.md) - [All operations](https://skmtc.dev/sendhq/apis/sendhq-api/llms.txt) - [OpenAPI document](https://skmtc.dev/sendhq/apis/sendhq-api/revisions/98e39e48cb9a?raw)
