Update a campaign
Wizard patch: name, ICP and notes, goal, cadence, tracking, limits, launch mode, mailboxes.
PATCH/api/v1/campaigns/{id}
Parameters
Path
| Name | In | Description |
|---|---|---|
idrequired | path | The record's id. |
Body
A JSON object. Fields not listed are ignored.
| Name | In | Description |
|---|---|---|
name | body | Name. |
icp_profile_id | body | ICP profile. |
theme | body, object | What the copy sells and cites: {offer_ids, proof_point_ids, document_ids, framework_ids}; framework_ids limits the writer to those frameworks for this campaign (routing still picks between them). |
icp_notes | body | Notes for the writer. |
goal | body | Goal. |
cadence_text | body | Cadence. |
build_notes | body | A note on the structure for the writer: what worked last time, what is a template and what is written per person. |
daily_limit | body, integer | Sends per day. |
send_delay_mins | body, integer | Gap between sends. |
track_opens | body, boolean | Open pixel. |
track_clicks | body, boolean | Click tracking. |
ignore_other_campaigns | body, boolean | Leave out leads live in another campaign (default true). Turning it off brings them back in. |
launch_mode | body | now or scheduled. |
scheduled_at | body | ISO time when scheduled. |
mailbox_ids | body, array | Mailboxes to send from. |
signature | body | Signature appended after the copy on every step, plain text or HTML; null clears it. Pasted base64 images are hosted on save. |
signature_format | body | plain, html or template. |
signature_fields | body, object | Template fields: sign_off, title, photo_url, linkedin_url, site_label, site_url; the name and email come from the sending inbox. Empty drops the line. |
audience_filters | body, object | Leads step filters, kept on the campaign: { icp: ""|80|70|60|50|below50, tier, email: ""|valid|catch_all|invalid|none, in: ""|in|out }. |
schedule_timezone | body | IANA time zone the scheduled start is picked in, such as America/New_York. |
schedule_days | body, array | Send days, 1 Monday to 7 Sunday; null uses each mailbox's days. |
window_start_min | body, integer | Sending window start, minutes from midnight in schedule_timezone (540 = 09:00). |
window_end_min | body, integer | Sending window end, minutes from midnight (1080 = 18:00). |
max_new_leads_per_day | body, integer | Most new leads (first emails) a day for this campaign. |
wizard_step_reached | body, integer | 1 to 8. |
Example
curl
curl -X PATCH "https://crm.ashwanth.dev/api/v1/campaigns/{id}" \
-H "Authorization: Bearer $SALES_ENGINE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "",
"icp_profile_id": "",
"theme": {},
"icp_notes": "",
"goal": "",
"cadence_text": "",
"build_notes": "",
"daily_limit": 0,
"send_delay_mins": 0,
"track_opens": false,
"track_clicks": false,
"ignore_other_campaigns": false,
"launch_mode": "",
"scheduled_at": "",
"mailbox_ids": [],
"signature": "",
"signature_format": "",
"signature_fields": {},
"audience_filters": {},
"schedule_timezone": "",
"schedule_days": [],
"window_start_min": 0,
"window_end_min": 0,
"max_new_leads_per_day": 0,
"wizard_step_reached": 0
}'CLI
sales-engine campaigns update <id>The JSON above lists every documented field with a typed placeholder; send only the ones you mean.
Response
A 200 with the result under data, on creation too. Errors come back as an error object with a stable code; see Errors.
Shape
{
"data": { ... }
}Run it below to see the live shape for your workspace.
Try it
Runs against this server, as the workspace behind the key. Kept in this page while you browse the docs, gone on reload, never stored. Signed in to the app? Leave it blank and the call runs as you.
Path
requiredThe record's id.
Every documented field is listed above; leave out the ones you do not need.
Request
PATCH /api/v1/campaigns/%7Bid%7D
Fill the path first.