campaign/post
Tool: create
Create a new campaign in Draft status.
Creates the campaign record only. No sequence is created automatically — but a sequence (campaign/post_sequences_by_id) is optional, needed only if you want followups. A sequence-less, one-email campaign starts and sends fine (campaign/start_by_id with sequenceCount: 0): the first email is this campaign's own subject/body (below) — sequence/post_followups_by_id only adds later touches on top of that first send. Returns the full campaign object on 201.
Template fields (
subject,body) take personalization variables such as{{FIRST_NAME}}, but only the names in a closed list — a variable is not the upper-cased field name, socustom1is{{CUSTOM_1}}and{{CUSTOM1}}is invalid. Full vocabulary: personalization-variables.subjectandbodyalso accept spintax ({|Hi|Hello|}) to vary the copy per recipient — see spintax, which also explains why a literal{or}cannot be written directly. Nothing is checked here; every name is validated at campaign/start_by_id, which 422s and names each bad one.
Set
fromEmailsto a connected sender. It defaults to the account's login email, which is usually not a valid sender — the campaign will start but never send. Use an address returned by sender/get. End-to-end flow: sending-a-campaign.
Conditional — shown while this account's documentation includes the Outreach Playbook
This call is the last step of a chain of decisions — who is on the list, what you are offering, and only then the copy. Campaign planning workflow puts the seven steps in order and makes the case for launching to 50-100 contacts first — a batch that size tests whether the machinery works, not the copy. For the first email's subject/body, Offer design explains why outreach most often fails on the offer rather than the wording, with four tests for whether yours is real.
Arguments
| name | type | req | notes |
|---|---|---|---|
| (none) |
Body
| field | type | req | constraints | description |
|---|---|---|---|---|
| name | string | ✓ | ≤256 chars | Campaign display name |
| description | string | – | ≤512 chars | Optional description |
| folderId | integer | – | ≥1 | Folder to organize campaigns |
| fromEmails | string | – | Comma-separated sender email addresses, e.g. "a@x.com,b@x.com" (a literal string, not a JSON array — an array here 422s) — must be connected senders (sender/get); defaults to the account login email, which usually cannot send |
|
| fromName | string | – | ≤128 chars | From display name |
| replyToEmail | string | – | ≤128 chars | Reply-to address |
| subject | string | – | ≤4000 chars | Initial email subject line |
| body | string | – | HTML email body | |
| textOnlyEmails | boolean | – | Controls outbound MIME type at send time only — body must always be HTML (e.g. wrapped in <p> tags) regardless of this setting |
|
| ccEmails | string | – | Comma-separated CC addresses | |
| bccEmails | string | – | Comma-separated BCC addresses | |
| replyBccEmails | string | – | BCC on prospect replies (internal tracking) | |
| replyCcEmails | string | – | CC on prospect replies (internal tracking) | |
| sendUnsubscribeListHeader | boolean | – | Include List-Unsubscribe header | |
| deactivateIfMissingPlaceholder | boolean | – | If true, a prospect with no value for a variable the copy uses is deactivated (status MissingPlaceholder) instead of mailed |
|
| stopCoworkersOnReply | boolean | – | Stop coworker sends to same prospect on reply | |
| trackOpens | boolean | – | default false | Pixel-based open tracking |
| trackClicks | boolean | – | default false | URL-rewrite click tracking |
| prospectValue | integer | – | ≥0 | Estimated value per conversion |
| dailyLimit | integer | – | 1–10000, default 50 | Max emails per day |
| dailyLimitPer | string | – | default "Campaign" | one of: Sender, Campaign |
| dailyLimitIncrease | boolean | – | Enable progressive daily limit increase | |
| dailyLimitIncreaseToMax | integer | – | 0–10000 | Target max for progressive increase |
| dailyLimitIncreasePercent | integer | – | 0–10000 | Daily % increase step |
| dailyLimitOnDate | string | – | date-time | Calculated limit on a specific date |
| dailyLimitPrioritize | string | – | default "Followup" | one of: Initial, Followup |
| dailyLimitInitial | integer | – | 1–10000 | Separate limit for initial emails |
| dailyLimitInitialEnabled | boolean | – | Enable separate initial email limit | |
| dailyLimitWhichEmailsCount | string | – | default "All" | one of: All, Initial |
| scheduleSending | boolean | – | Enable day-of-week send scheduling | |
| scheduleTimeZone | string | – | ≤64 chars, default "UTC" | Timezone for scheduled sends |
| useProspectsTimeZone | boolean | – | default false | Use prospect's timezone when available |
| scheduleSendOnDate | string | – | date-time | Start date for scheduled send |
| scheduleSendOnDateEnabled | boolean | – | Enable start-on-date feature | |
| scheduleSendOnDateHours | integer | – | 0–23, default 10 | Hour to start on scheduled date |
| scheduleSendOnDateMinutes | integer | – | 0–1439, default 10 | Minute offset to start on scheduled date |
| delayMinSeconds | integer | – | 1–290 | Min gap between consecutive sends, in seconds, so the default 30 is 30 seconds. Throttles between-sends, not the first send — see schemas/campaign |
| espMatchEnabled | boolean | – | Match sender ESP to prospect's provider | |
| espMatchType | string | – | one of: None, MatchSender, MatchDomain | |
| espLimitEnabled | boolean | – | Restrict sends to specific ESP providers | |
| espLimitToMicrosoft | boolean | – | Include Microsoft (Outlook/Hotmail) | |
| espLimitToGoogle | boolean | – | Include Google (Gmail/G Suite) | |
| espLimitToOther | boolean | – | Include other providers | |
| sendMon | boolean | – | default true | Send on Monday |
| sendMonAfter | integer | – | 0–1439 | Monday send start (mins after midnight) |
| sendMonBefore | integer | – | 0–1439 | Monday send end (mins after midnight) |
| sendTue | boolean | – | default true | Send on Tuesday |
| sendTueAfter | integer | – | 0–1439 | Tuesday send start |
| sendTueBefore | integer | – | 0–1439 | Tuesday send end |
| sendWed | boolean | – | default true | Send on Wednesday |
| sendWedAfter | integer | – | 0–1439 | Wednesday send start |
| sendWedBefore | integer | – | 0–1439 | Wednesday send end |
| sendThu | boolean | – | default true | Send on Thursday |
| sendThuAfter | integer | – | 0–1439 | Thursday send start |
| sendThuBefore | integer | – | 0–1439 | Thursday send end |
| sendFri | boolean | – | default true | Send on Friday |
| sendFriAfter | integer | – | 0–1439 | Friday send start |
| sendFriBefore | integer | – | 0–1439 | Friday send end |
| sendSat | boolean | – | default true | Send on Saturday |
| sendSatAfter | integer | – | 0–1439 | Saturday send start |
| sendSatBefore | integer | – | 0–1439 | Saturday send end |
| sendSun | boolean | – | default true | Send on Sunday |
| sendSunAfter | integer | – | 0–1439 | Sunday send start |
| sendSunBefore | integer | – | 0–1439 | Sunday send end |
Response
201 — Campaign created; object: see schemas/campaign. Deltas: none.
Errors: 400, 401, 406, 409, 415, 422, 429, 500 — shared schema: schemas/errors.
Invoke
Call create with name: "campaign/post".