---
title: "Create campaign"
method: POST
path: "/campaigns"
tags: ["Campaigns"]
---

# Create campaign

`POST /campaigns`

Creates a campaign and linked email from at most one of prompt, HTML, Sequenzy blocks, or an existing template. Omit all content sources to create an empty draft. Optional From/Reply-To inputs create or select profiles; From addresses require a verified sending domain. Defaults to draft. Use status `sent` only to archive an imported/already-sent campaign.

## Request body

- object
  - `name` string, required
  - `subject` string — Required with HTML, blocks, or templateId; optional with prompt, where it overrides the generated subject.
  - `previewText` string, nullable — Optional inbox preview text saved on the linked email.
  - `preheaderText` string, nullable — Compatibility alias for previewText.
  - `trackingCode` string, nullable — Optional campaign tracking code available to UTM templates as `{{campaign.trackingCode}}`. Empty strings are stored as null.
  - `status` 'draft' | 'sent' — Initial status. Defaults to draft. Use sent only for imported/already-sent campaigns.
  - `sentAt` string, date-time, nullable — ISO date-time for an imported/already-sent campaign. Only valid with status sent; defaults to now when omitted.
  - `html` string — Raw HTML body. Mutually exclusive with blocks.
  - `blocks` object[] — Sequenzy email blocks. Mutually exclusive with html. Put visual styling under styles; top-level style keys such as backgroundColor, backgroundOpacity, borderColor, borderWidth, and borderRadius are normalized into styles.
  - `prompt` string — Natural-language request for branded native campaign blocks.
  - `style` string — Generation style; valid only with prompt.
  - `tone` string — Generation tone; valid only with prompt.
  - `campaignData` object, nullable
  - `computedLists` object[]
  - `labels` string[] — Label names to assign. Missing labels are created automatically.
  - `label` string[] — Compatibility alias for labels.
  - `templateId` string — Company-owned email template to copy into the campaign. Mutually exclusive with prompt, HTML, and blocks.
  - `segmentId` string — Shorthand for targeting one saved segment. Equivalent to `targetLists` `{"type":"segment","segmentId":"seg_123"}`. Mutually exclusive with targetLists.
  - `targetLists` object — Campaign audience saved on the draft. Omit to leave targeting unset and choose it when scheduling. Examples: {"type":"all"}, {"type":"lists","listIds":["list_123"]}, {"type":"segment","segmentId":"seg_123"}, {"type":"filtered","filters":[],"filterJoinOperator":"and"}, {"type":"rules","include":[],"exclude":[]}. Mutually exclusive with segmentId.
  - `fromEmail` string, email — Campaign From address. Its domain must be configured and verified.
  - `fromName` string — Display name for a newly created sender profile. Requires fromEmail; omit it when using senderProfileId, which already carries its own display name.
  - `senderProfileId` string — Existing sender profile ID. It already supplies both the From address and display name, so send it on its own and omit fromEmail and fromName.
  - `replyTo` string, email — Campaign Reply-To address. A reply profile is created when needed.
  - `replyToName` string — Display name for a newly created reply profile. Requires replyTo; omit it when using replyProfileId, which already carries its own display name.
  - `replyProfileId` string — Existing reply profile ID. It already supplies both the Reply-To address and display name, so send it on its own and omit replyTo and replyToName.

## Response `200`

Campaign created

- object
  - `success` boolean
  - `campaign` object
    - `id` string
    - `name` string
    - `subject` string
    - `status` string
    - `sentAt` string, date-time, nullable — Present when the campaign is created as an imported/already-sent campaign.
    - `trackingCode` string, nullable — Campaign tracking code available to UTM templates as `{{campaign.trackingCode}}`.
    - `labels` string[]
    - `targetLists` object, nullable — Saved campaign audience, or null when targeting is still unset.
    - `senderProfileId` string
    - `fromName` string
    - `fromEmail` string, email
    - `replyProfileId` string, nullable
    - `replyToName` string, nullable
    - `replyToEmail` string, email, nullable
    - `url` string, uri
    - `previewUrl` string, uri
  - `warnings` string[] — Non-blocking advisories about the blocks that were written. The write succeeded. Present when a field was not part of the block schema and was discarded, or when a supported field does not control what its name suggests for that block type - for example styles.backgroundColor on a button colors the band behind the button while the fill comes from buttonColor. Each message names the offending path and the fields that block does accept. A sequence email step update also reports the blocks the step's existing Style > Format added back on top of the submitted blocks, because the response echoes node config rather than the stored blocks. Absent when there is nothing to report.

## Other responses

- `400` — Validation error or missing sender profile
- `401` — Unauthorized
- `500` — Campaign could not be created

## Changes

- **2026-08-02** `36f92fc0caa2` — 3 breaking
  - the response property `success` became optional for the status `400`
  - the response property `success` became optional for the status `401`
  - the response property `success` became optional for the status `500`
- **2026-07-29** `d03612b5fabd` — 1 info
  - added the optional property `warnings` to the response with the `200` status
- **2026-07-25** `b58891ac1cde` — 2 info
  - added the new optional request property `targetLists`
  - added the optional property `campaign/targetLists` to the response with the `200` status
- **2026-07-12** `d103f2b71fca` — 1 breaking, 16 info
  - the `templateId` request property's minLength was increased from `0` to `1`
  - added the new optional request property `fromEmail`
  - added the new optional request property `fromName`
  - added the new optional request property `prompt`
  - …13 more
- **2026-07-02** `f4df432f0a85` — 2 info
  - added the new optional request property `preheaderText`
  - added the new optional request property `previewText`

[Full history](https://skmtc.dev/sequenzy/apis/sequenzy-api/changes/campaigns/post.md)

---

[API](https://skmtc.dev/sequenzy/apis/sequenzy-api.md) · [All operations](https://skmtc.dev/sequenzy/apis/sequenzy-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/sequenzy/sequenzy-api/revisions/36f92fc0caa2/schema)
