schemas/campaign
The Campaign object returned by campaign/get, campaign/get_by_id, and mutation responses.
| field | type | constraints | description |
|---|---|---|---|
| campaignId | integer | Unique identifier. | |
| createdAt | string | date-time | When the campaign was created. |
| folderId | integer | Folder for organizing campaigns. | |
| status | string | observed: Draft, Running, Paused, Completed, Archived | Current campaign status. Not a validated enum — see the lifecycle note below. |
| name | string | max 256 | Display name. |
| description | string | max 512 | Optional purpose description. |
| fromEmails | string | Comma-separated sender email addresses. | |
| fromName | string | max 128 | From display name in outgoing emails. |
| replyToEmail | string | email, max 128 | Reply-to address for prospect responses. |
| subject | string | max 4000 | Initial email subject line. |
| body | string | HTML email body for the initial message. In a list response, a body over 1,500 characters arrives as a plain-text preview unless you pass fullBodies: true — see schemas/pagination. |
|
| textOnlyEmails | boolean | Controls the outbound MIME type at send time only — body is always supplied as HTML regardless. When true, formatting and embedded images are stripped at send (and open tracking stops working, since it needs an image) — see writing-emails. |
|
| ccEmails | string | Comma-separated CC addresses on all campaign emails. | |
| bccEmails | string | Comma-separated BCC addresses on all campaign emails. | |
| replyBccEmails | string | BCC on prospect reply emails (internal tracking). | |
| replyCcEmails | string | CC on prospect reply emails (internal tracking). | |
| sendUnsubscribeListHeader | boolean | Include List-Unsubscribe header for compliance. | |
| deactivateIfMissingPlaceholder | boolean | if true, a prospect with no value for a personalization variable the copy uses is deactivated instead of mailed, and carries sendingStatus: MissingPlaceholder (see schemas/prospect); if false, the send goes ahead. Either way, a default: fallback keeps incomplete records in the send with copy that still reads — personalization-variables. |
|
| stopCoworkersOnReply | boolean | Stop co-worker campaigns targeting same prospect on reply. | |
| trackOpens | boolean | Enable pixel-based open tracking. | |
| trackClicks | boolean | Enable link-click tracking via redirects. | |
| prospectValue | integer | Estimated value per conversion for ROI tracking. | |
| dailyLimit | integer | 1–10000 | Max emails per day for this campaign. |
| dailyLimitPer | string | one of: Sender, Campaign | Whether limit applies per sender or across the campaign. |
| dailyLimitIncrease | boolean | Progressively increase the daily limit. | |
| dailyLimitIncreaseToMax | integer | 0–10000 | Target maximum when progressive increase is enabled. |
| dailyLimitIncreasePercent | integer | 0–10000 | Daily % increase for progressive ramp. |
| dailyLimitOnDate | string | date-time | Calculated current daily limit after progressive increases. |
| dailyLimitPrioritize | string | one of: Initial, Followup | Which email type gets priority near the daily limit. |
| dailyLimitInitial | integer | 1–10000 | Separate daily limit for initial emails only. |
| dailyLimitInitialEnabled | boolean | Enable the separate initial-email daily limit. | |
| dailyLimitWhichEmailsCount | string | one of: All, Initial | Which email types count toward the daily limit. |
| scheduleSending | boolean | Enable scheduled send windows. | |
| scheduleTimeZone | string | max 64 | IANA timezone for send scheduling (e.g. America/New_York). |
| useProspectsTimeZone | boolean | Use each prospect's detected timezone when available. | |
| scheduleSendOnDate | string | date-time | Start date when scheduled sending begins. |
| scheduleSendOnDateMinutes | integer | 0–1439 | Start time in minutes-after-midnight on the scheduled date. |
| scheduleSendOnDateEnabled | boolean | Enable the specific start-date feature. | |
| scheduleSendOnDateHours | integer | 0–23 | Hour of day to start sending on the scheduled date. |
| delayMinSeconds | integer | 1–290 | Minimum gap between consecutive sends, in seconds — not minutes; see the note under the table. |
| espMatchType | string | one of: None, MatchSender, MatchDomain | ESP matching strategy for deliverability. |
| espMatchEnabled | boolean | Enable ESP matching. | |
| espLimitEnabled | boolean | Restrict sends to specific email providers. | |
| espLimitToMicrosoft | boolean | Include Microsoft (Outlook/Hotmail/Live) when ESP limiting. | |
| espLimitToGoogle | boolean | Include Google (Gmail/GSuite) when ESP limiting. | |
| espLimitToOther | boolean | Include other providers when ESP limiting. | |
| sendMon | boolean | Send on Monday. | |
| sendMonAfter | integer | 0–1439 | Monday send window start (minutes after midnight). |
| sendMonBefore | integer | 0–1439 | Monday send window end (minutes after midnight). |
| sendTue | boolean | Send on Tuesday. | |
| sendTueAfter | integer | 0–1439 | Tuesday send window start. |
| sendTueBefore | integer | 0–1439 | Tuesday send window end. |
| sendWed | boolean | Send on Wednesday. | |
| sendWedAfter | integer | 0–1439 | Wednesday send window start. |
| sendWedBefore | integer | 0–1439 | Wednesday send window end. |
| sendThu | boolean | Send on Thursday. | |
| sendThuAfter | integer | 0–1439 | Thursday send window start. |
| sendThuBefore | integer | 0–1439 | Thursday send window end. |
| sendFri | boolean | Send on Friday. | |
| sendFriAfter | integer | 0–1439 | Friday send window start. |
| sendFriBefore | integer | 0–1439 | Friday send window end. |
| sendSat | boolean | Send on Saturday. | |
| sendSatAfter | integer | 0–1439 | Saturday send window start. |
| sendSatBefore | integer | 0–1439 | Saturday send window end. |
| sendSun | boolean | Send on Sunday. | |
| sendSunAfter | integer | 0–1439 | Sunday send window start. |
| sendSunBefore | integer | 0–1439 | Sunday send window end. |
| prospectCount | integer | Total prospects enrolled. | |
| activeProspectCount | integer | Prospects currently active. | |
| sentCount | integer | Total emails sent across all followups. | |
| openCount | integer | Total opens across all emails. | |
| clickCount | integer | Total link clicks across all emails. | |
| bounceCount | integer | Total bounces received. | |
| replyCount | integer | Total replies received. | |
| initialOpenCount | integer | Opens from the initial email only. | |
| initialClickCount | integer | Clicks from the initial email only. | |
| initialReplyCount | integer | Replies from the initial email only. | |
| initialBounceCount | integer | Bounces from the initial email only. | |
| initialInterestedCount | integer | Interested prospects from the initial email only. | |
| interestedCount | integer | Total prospects marked Interested. | |
| conversionCount | integer | Total conversions tracked. | |
| initialConversionCount | integer | Conversions from the initial email only. | |
| tags | array | Embedded tag refs; see schemas/tag-ref. Omitted when none. |
delayMinSecondsis seconds. A campaign returning140paces sends about 140 seconds apart, not 140 minutes; the default30means 30 seconds. The accepted range is 1–290 — values outside it are rejected. For "how long will this list take?", the sender's daily limit is the real constraint, not this delay, which only spaces consecutive sends. The sender-leveldelayMinMinutes(schemas/sender) is a different field and really is minutes.
Single-item responses (POST/GET-by-id) omit some fields the list returns — read the list operation to verify those (upstream shape drift); the followup and sequence objects have the same quirk, named on their own pages. There is no completedAt — createdAt is creation time, not completion.
Status lifecycle
Draft → Running → Paused. Pausing is the only operation that stops a running campaign. No operation leads back to Draft once a campaign has been started. Completed, Archived, Warning, Blocked, Scheduled, and Preparing are terminal or system-managed states; only the five in the table above appear in observed data. A status outside the observed five is not an error and not a stuck campaign — report it as the state it is rather than as a failure. As a campaign/get filter, status is not validated — an unrecognized value returns an empty 200 rather than an error (call-contract).