Change a draft broadcast

Change a draft broadcast's name, sender, subject, preview text, body, audience (contactBookId, segmentId), reply-to, cc or bcc.

PATCHhttps://app.usenotix.dev/api/v1/broadcasts/{broadcastId}

Needs a full access key. Sending access keys cannot call this. Key permissions lists the extra rules some calls have.

Change a draft broadcast's name, sender, subject, preview text, body, audience (contactBookId, segmentId), reply-to, cc or bcc. Send only the fields to change. Moving to another contact book drops the segment unless you name one of the new book.

The body

content is a Notix editor document (JSON, as a string), checked the way the dashboard's editor checks it (a javascript: or data: link, style CSS, an unknown node or a document deeper than 64 levels answers 400) and rendered to HTML. html replaces the editor document, which is cleared, and makes the draft an API broadcast: the dashboard then shows its body read-only and only the API can change it. Either way the body must keep an unsubscribe link ({{notix_unsubscribe_url}}).

Drafts only

Only a DRAFT broadcast changes through the API; any other answers 409 CONFLICT. The change is saved only over the draft as you read it: if it was edited again or scheduled while your change was being saved, the answer is 409 CONFLICT and nothing is written. Read it again and retry.

Nothing here sends. Scheduling runs every send check again, and the key's approval policy applies: an approval covers the content it was given for, so a draft changed after approval needs a new one.

Who can call it

A full access key, whoever on the team made it (as for creating a broadcast; on the dashboard any member edits broadcasts), or a live AI key. Every refusal is 403:

CodeWhy
SCOPE_DENIEDA send-only or read-only key.
FORBIDDENA live AI key changing a broadcast it did not create itself, or setting cc, bcc, or a reply-to off its domain; or a sender on a domain the key may not send from.

A key limited to one domain sees only broadcasts that send from its domain (any other answers 404), and keeps the sender on that domain. The team can make 60 of these changes a minute; when Notix cannot count them the answer is 503 SERVICE_UNAVAILABLE (try again shortly), never a 429.

Path parameters

broadcastIdstringrequired

Body parameters

namestring

At most 255 characters.

fromstring

The sender, on a verified domain of the team (and the key's own, for a key limited to one).

At least 3 characters. At most 320 characters.

subjectstring

At most 998 characters.

previewTextstring

At most 500 characters. Can be null.

contentstring

The body as a Notix editor document (JSON, as a string), checked the way the dashboard's editor checks it. Replaces html, which is rendered from it.

At most 2,000,000 characters.

htmlstring

The body as HTML. Replaces the editor document, which is cleared, and makes the draft an API campaign: the dashboard then shows its body read-only. Must include an unsubscribe link ({{notix_unsubscribe_url}}).

At most 2,000,000 characters.

contactBookIdstring

Send to this contact book. Moving to another book drops the segment unless you name one.

segmentIdstring

Send only to this segment of the contact book; null sends to the whole book.

Can be null.

topicIdstring

Send only to contacts subscribed to this topic; null sends regardless of topics.

Can be null.

replyTostring (email) or string (email)[]
ccstring (email) or string (email)[]
bccstring (email) or string (email)[]

Headers

Authorizationstringrequired

Bearer followed by your API key.

Errors

400

The body is not valid: an unknown field, a bad editor document, no unsubscribe link, a contact book or segment the team does not have.

403

`SCOPE_DENIED`: a send-only or read-only key. `FORBIDDEN`: a live AI key changing a campaign it did not create, or a sender the key may not send from.

404

No campaign (or template) with this id for the calling team (or, for a key limited to one domain, on its domain).

409

The campaign is not a draft, or it changed (was edited or scheduled) while this edit was being saved.

429

The team changed campaigns 60 times in the last minute.

503

The call could not be counted just now. Try again shortly.

Every error has the same shape. See all error codes.

curl -X PATCH "https://app.usenotix.dev/api/v1/broadcasts/<broadcastId>" \
  -H "Authorization: Bearer $NOTIX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Acme",
  "from": "Acme <news@acme.com>",
  "subject": "Your receipt for order 4471",
  "previewText": "Thanks for your order.",
  "content": "string",
  "html": "<p>Thanks for your order.</p>",
  "contactBookId": "cm1x8f3k20001qz7v5b9d2e4a",
  "segmentId": "cm1x8f3k20001qz7v5b9d2e4a",
  "topicId": "cm1x8f3k20001qz7v5b9d2e4a",
  "replyTo": "customer@example.com",
  "cc": "customer@example.com",
  "bcc": "customer@example.com"
}'
Response200
{
  "id": "cm1x8f3k20001qz7v5b9d2e4a",
  "name": "Acme",
  "from": "Acme <receipts@acme.com>",
  "subject": "Your receipt for order 4471",
  "previewText": "Thanks for your order.",
  "contactBookId": "cm1x8f3k20001qz7v5b9d2e4a",
  "segmentId": "cm1x8f3k20001qz7v5b9d2e4a",
  "html": "<p>Thanks for your order.</p>",
  "content": "string",
  "status": "string",
  "scheduledAt": "2026-10-01T09:00:00Z",
  "batchSize": 1,
  "batchWindowMinutes": 1,
  "total": 1,
  "maxRecipients": 1,
  "sent": 1,
  "delivered": 1,
  "opened": 1,
  "clicked": 1,
  "unsubscribed": 1,
  "bounced": 1,
  "hardBounced": 1,
  "complained": 1,
  "replyTo": [
    "string"
  ],
  "cc": [
    "string"
  ],
  "bcc": [
    "string"
  ],
  "createdAt": "2026-10-01T09:00:00Z",
  "updatedAt": "2026-10-01T09:00:00Z"
}
Open in ClaudeOpen in ChatGPT