Skip to main content
PATCH
Update a marketing campaign. While sending, content, sender and sending

Authorizations

X-API-Key
string
header
required

Company API key - scoped to a specific company. Generate from the Integrations page in your dashboard.

Path Parameters

campaignId
string
required

Body

application/json

Fields to update (include only fields you want to change)

Request body for updating a marketing campaign (only include fields to change). While sending, name, subject, fromName, replyTo, bodyHtml, bodyDocument, senderProfileId, timezone, and scheduleSettings are editable; recipients and poll definitions are locked. Full editing is available in draft, scheduled, cancelled, or failed status. Sent campaigns are locked.

name
string

Internal campaign name

subject
string

Email subject line

fromName
string

Display name shown in the From: header

replyTo
string

Optional Reply-To email address. Must be a valid email if provided.

bodyHtml
string

HTML email body. Supply without bodyDocument for HTML-based campaigns. On update, nonblank HTML replaces the previous body and clears the previous visual-builder document. Empty HTML preserves existing content. For an inline poll, supply the poll field and style anchors with href="{{pollUrl0}}", href="{{pollUrl1}}", etc., one for every option. Use {{pollQuestion}} and {{pollOption0}} etc. for text. See poll for the complete contract.

bodyDocument
string

Visual-builder JSON document for the email body. When supplied, the server renders bodyHtml from this document and it takes precedence over HTML input. Alternatively, supply bodyHtml without a document. Envelope: {"subject": string, "subTitle": string, "content": }. Every node is {"type": string, "attributes": {MJML attributes as string values, e.g. "padding": "10px 25px 10px 25px", "background-color": "#ffffff", "color": "#333333", "font-size": "16px", "align": "center", "width": "600px", "href", "src"}, "data": {"value": {...}}, "children": [...]}; attribute values must be strings (numbers are dropped). Tree: page -> (wrapper | section) -> section -> column -> content blocks. Content block types: "text" (data.value.content = inline HTML string), "image" (attributes.src, alt, href, width), "button" (data.value.content = label, attributes.href), "divider", "spacer" (attributes.height), "social" (data.value.elements = [{src, href, content, target}]), "navbar" (data.value.links = [{href, content}]), "raw" (data.value.content = raw MJML/HTML), plus "hero", "group", "accordion", "carousel" and "table". Each also has an "advanced_" variant (e.g. "advanced_text"), which is what the builder palette inserts; advanced content blocks placed directly under the page or a wrapper are auto-wrapped in a section/column. For a visual poll, insert one marketing_poll block: {"type": "marketing_poll", "data": {"value": {"question": "Your question?", "options": ["Answer one", "Answer two"]}}, "attributes": {}, "children": []}. Its attributes support padding, font-family, font-size, font-weight, color, background-color, button-background-color, button-text-color, button-font-size, and border-radius. The server derives the campaign poll from this block; do not maintain a separate poll definition. Page node: {"type": "page", "attributes": {"background-color": "#efeeea", "width": "600px"}, "data": {"value": {"breakpoint": "480px", "font-family": string, "font-size": "14px", "line-height": "1.7", "font-weight": "400", "text-color": "#000000", "content-background-color": string (optional), "headStyles": [{"content": css, "inline": bool}], "fonts": [{"name", "href"}], "headAttributes": "", "responsive": true}}}. Always set "responsive": true — a missing flag renders a fixed-width layout. Merge tokens pass through rendering untouched: {{content}} inside a text block marks where content-engine output is inserted when content is published as a campaign from this template; Smart-list merge tokens use the matching header normalized to camelCase: for example, First Name becomes {{firstName}} and Company Name becomes {{companyName}}. Tokens are replaced per recipient from the smart-list row; {{unsubscribe}} becomes the per-recipient unsubscribe link.

poll
object

For HTML-only campaigns, this field is the source of truth for the poll: {"question": "Your question?", "options": ["Answer one", "Answer two"]}. Require a non-empty question and two to six non-empty option strings. In bodyHtml, place {{pollQuestion}} and anchors such as {{pollOption0}} [blocked]. Indices are zero-based and follow options order. Include a quoted href="{{pollUrlN}}" for every option when using any poll token; partial inline polls are rejected. Question/option tokens are replaced with escaped text; URL tokens become per-recipient voting links when sending. Leave tokens intact: never invent or reuse recipient voting URLs. Inline polls suppress the default footer poll. With no poll tokens, a default poll is appended. Update poll and bodyHtml together when changing option count/order; literal HTML labels are not synchronized, so prefer text tokens. Set poll to null and remove all poll tokens from bodyHtml in the same update to remove an HTML poll. A poll-managed bodyDocument takes precedence and derives this field automatically; edit its marketing_poll block instead. Test-email links do not record votes.

senderProfileId
string

Sender profile ID

listId
string

Smart list ID whose rows become recipients

fieldMappings
object

Field mapping for resolving recipient email from a list row

scheduleType
string

Schedule type (one of: now, scheduled)

scheduledAt
string

ISO timestamp at which to send

timezone
string

IANA timezone name

scheduleSettings
object

Sending windows: timezone (IANA name), plus monday through sunday, each with enabled, startTime and endTime (HH:MM). May be updated while sending; changes apply on the next sending cycle.

Response

The updated marketing campaign

Marketing campaign object

id
string

Campaign ID

companyId
string

Company this campaign belongs to

uid
string

User ID that created the campaign

name
string

Internal campaign name

subject
string

Email subject line

fromName
string

Display name shown in the From: header

replyTo
string

Reply-To email address used on outgoing emails

bodyHtml
string

HTML body of the email; rendered from bodyDocument when a document is supplied

bodyDocument
string

Visual-builder JSON document for the email body. When supplied, the server renders bodyHtml from this document and it takes precedence over HTML input. Alternatively, supply bodyHtml without a document. Envelope: {"subject": string, "subTitle": string, "content": }. Every node is {"type": string, "attributes": {MJML attributes as string values, e.g. "padding": "10px 25px 10px 25px", "background-color": "#ffffff", "color": "#333333", "font-size": "16px", "align": "center", "width": "600px", "href", "src"}, "data": {"value": {...}}, "children": [...]}; attribute values must be strings (numbers are dropped). Tree: page -> (wrapper | section) -> section -> column -> content blocks. Content block types: "text" (data.value.content = inline HTML string), "image" (attributes.src, alt, href, width), "button" (data.value.content = label, attributes.href), "divider", "spacer" (attributes.height), "social" (data.value.elements = [{src, href, content, target}]), "navbar" (data.value.links = [{href, content}]), "raw" (data.value.content = raw MJML/HTML), plus "hero", "group", "accordion", "carousel" and "table". Each also has an "advanced_" variant (e.g. "advanced_text"), which is what the builder palette inserts; advanced content blocks placed directly under the page or a wrapper are auto-wrapped in a section/column. For a visual poll, insert one marketing_poll block: {"type": "marketing_poll", "data": {"value": {"question": "Your question?", "options": ["Answer one", "Answer two"]}}, "attributes": {}, "children": []}. Its attributes support padding, font-family, font-size, font-weight, color, background-color, button-background-color, button-text-color, button-font-size, and border-radius. The server derives the campaign poll from this block; do not maintain a separate poll definition. Page node: {"type": "page", "attributes": {"background-color": "#efeeea", "width": "600px"}, "data": {"value": {"breakpoint": "480px", "font-family": string, "font-size": "14px", "line-height": "1.7", "font-weight": "400", "text-color": "#000000", "content-background-color": string (optional), "headStyles": [{"content": css, "inline": bool}], "fonts": [{"name", "href"}], "headAttributes": "", "responsive": true}}}. Always set "responsive": true — a missing flag renders a fixed-width layout. Merge tokens pass through rendering untouched: {{content}} inside a text block marks where content-engine output is inserted when content is published as a campaign from this template; Smart-list merge tokens use the matching header normalized to camelCase: for example, First Name becomes {{firstName}} and Company Name becomes {{companyName}}. Tokens are replaced per recipient from the smart-list row; {{unsubscribe}} becomes the per-recipient unsubscribe link.

poll
string

Optional one-click email poll definition and current response totals.

senderProfileId
string

Sender profile ID

listId
string

Smart list ID whose rows become recipients

fieldMappings
object

Field mapping for resolving recipient email from a list row

scheduleType
string

Schedule type (now, scheduled)

scheduledAt
string

ISO timestamp at which sending begins (for scheduled campaigns)

timezone
string

IANA timezone used to interpret scheduledAt

status
string

Campaign status (draft, scheduled, sending, sent, failed, cancelled)

sentCount
integer

Number of recipients the email has been sent to

failedCount
integer

Number of recipients that failed to send

skippedCount
integer

Number of list rows skipped (missing email, duplicate, etc.)

totalRecipients
integer

Total rows in the associated smart list at read time

startedAt
string

ISO timestamp when sending started

completedAt
string

ISO timestamp when sending completed

created_date
string

ISO timestamp when the campaign was created

updated_date
string

ISO timestamp when the campaign was last updated

smartList
object

Summary of the associated smart list

senderProfile
object

Summary of the sender profile