Updates any subset of a campaign's writable fields: name, status
(set active to start sending, paused to stop), the sender pool
(linkedinAccountIds), the outreach sequence, the send schedule,
aiInterestEnabled, the email unsubscribe line and tracking, and the lead-exclusion rules (excludeListIds plus
the exclude* flags). sequence and schedule are replaced wholesale —
send the complete object you want, not a partial patch of it.
A full sequence replacement can update the content of any step or A/B
variant. For variant A, keep the step's legacy flat copy/media fields
identical to the corresponding values in config.variants[0]; conflicting
values are rejected with 400. Updating a later variant only requires
changing that variant object. For a single existing step or variant,
prefer PATCH /campaigns/{id}/sequence/{stepId} so unrelated sequence
structure cannot be overwritten.
Once a campaign has leads in progress, the sequence may only be edited
safely: you can change step messages and delays and append new steps, but
removing, reordering or retyping existing steps is rejected with 400
(a lead's progress is pinned to a step id). Duplicate the campaign to
rework its sequence from scratch.
An active campaign must keep at least one sender: sending an empty
linkedinAccountIds while the campaign is (or is being set) active
is rejected with 400.
Authorization
bearerAuth An API key created under Settings → API & Webhooks.
In: header
Path Parameters
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Any subset of these fields. For a copy-only change to an existing
sequence step, use PATCH /campaigns/{id}/sequence/{stepId}.
If a full sequence contains both legacy flat content fields and
config.variants, their variant-A copy and media values must agree.
Response Body
application/json
application/json
application/json
application/json
curl -X PATCH "https://example.com/campaigns/string" \ -H "Content-Type: application/json" \ -d '{ "status": "active" }'{ "data": { "id": "string", "name": "string", "status": "draft", "stats": { "total": 0, "done": 0, "failed": 0 }, "aiInterestEnabled": true, "unsubscribe": { "enabled": true, "text": "string" }, "tracking": { "opens": "mailbox", "clicks": "mailbox" }, "linkedinAccountIds": [ "string" ], "emailAccountIds": [ "string" ], "excludeListIds": [ "string" ], "listId": "string", "excludeOtherCampaigns": true, "excludeOtherSenders": true, "excludeSameSenderOtherCampaigns": true, "schedule": { "startDate": "2019-08-24T14:15:22Z", "endDate": "2019-08-24T14:15:22Z", "timezone": "string", "activeHours": { "from": "string", "to": "string" }, "activeDays": [ 0 ] }, "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z", "sequence": { "steps": [ { "id": "string", "type": "if_connected", "parent": "string", "branch": "yes", "config": {}, "nextDelayHours": 0, "branchDelays": { "yes": 0, "no": 0 } } ] } }}Rebalance a sender's leads POST
Move a paused or failed sender's not-yet-contacted leads in this campaign onto the campaign's other available senders, evenly. Leads the sender already contacted stay pinned to it. Returns how many leads `moved` and how many `receivers` took them; `receivers: 0` means no other sender was available and nothing moved (still `200`). `422` when the account is not in the campaign's sender pool.
Update one campaign sequence step PATCH
Partially updates one existing sequence step's copy and/or media while preserving its id, wiring, delays and other A/B variants. Use the step and variant ids returned by `GET /campaigns/{id}`. When `variantId` is omitted, variant A is updated; pass another existing `variantId` to update that variant without changing variant A. This endpoint is preferred over replacing the full sequence for copy, attachment and recorded-voice edits, except for a recorded voice note that records per sender: those recordings are replaced through the campaign's sequence.