Skip to main content
PATCH
Update a campaign's settings

Authorizations

Authorization
string
header
required

Your API token (af_…) as the Basic-auth username, with an empty password.

Path Parameters

campaignId
string
required

The campaign's id (24-character hex ObjectId), as returned by POST /business/campaigns or as the campaignId of a GET /business/campaigns row.

Body

application/json
campaignName
string

New display name (1-200 characters, trimmed).

Required string length: 1 - 200
campaignStartDate
string

New ISO 8601 start date-time; the first step's still-pending sends are rescheduled to it.

timezone
string

New time zone in which the daily sending window and emailDays are evaluated. Accepted values are IANA time zone names, for example America/New_York, Europe/Berlin, Asia/Kolkata or UTC. Do not send an abbreviation: EST is in the tz database but resolves to a fixed UTC-5 zone that never observes daylight saving, so name the region instead. A name the tz database does not know is rejected rather than silently evaluated as UTC.

emailDays
enum<string>[]

Replacement set of weekdays on which sends may go out. One of exactly: Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday — capitalised English names, nothing else. The days are OR-joined: a send that comes due is pushed forward to the next day named in the set, so a weekday you leave out is never used. 1-7 unique names; naming all seven removes the weekday restriction.

Minimum array length: 1

An English weekday name with a capital first letter (Monday ... Sunday).

Available options:
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
listIds
string[]

Replacement set of 1-10 source list ids; rewrites the campaign's source-list set but does not by itself enroll a newly added list's contacts into an already running campaign. Take the ids from GET /business/lists with entityType=contactList — a campaign enrolls contacts. The lists are OR-joined into a deduplicated union: they are read in the order given and a contact that sits in two of them is enrolled once, up to the campaign's 10000-contact cap, after which the remaining lists are skipped. This endpoint stores the ids without an ownership check (create answers 404 LIST_NOT_FOUND for one it cannot resolve), so an id that is not one of your lists is accepted here and simply contributes nobody. Like create, the lists together must have at least one contact with an enriched professional email for an email step and one with a LinkedIn profile for a LinkedIn step, else 422 LIST_INCOMPATIBLE_WITH_CHANNELS. The check reads the campaign's actual steps, so an ai-generated campaign whose initializationStatus is not yet completed or failed answers 409 CAMPAIGN_INITIALIZING; poll and retry.

Required array length: 1 - 10 elements

A Fuse list id (24-character hex ObjectId), as the id of a GET /business/lists row.

excludeLists
string[]

Replacement set of up to 10 people-list ids whose members are excluded from future enrollment. Take the ids from GET /business/lists with entityType=contactList. The lists are OR-joined: a contact is skipped when it appears in any one of them, matched on contact id, email address (case-insensitively) or LinkedIn URL. These ids are stored without an ownership check, so an id that is not one of your lists is accepted and silently excludes nobody — and a companyList here excludes nobody either, use excludeCompanyLists for that.

Maximum array length: 10

A Fuse list id (24-character hex ObjectId), as the id of a GET /business/lists row.

excludeCompanyLists
string[]

Replacement set of up to 20 company or people list ids whose companies' contacts are skipped at enrollment. Take the ids from GET /business/lists — either entityType: a companyList contributes its companies, a contactList contributes the companies its contacts work at. The lists are OR-joined: a contact is skipped when its company appears in any one of them, matched by company id and by the company's web domain (personal-email domains are never used). Unlike excludeLists these ids are checked, so one that is unknown, archived or not your team's answers 422 EXCLUDE_COMPANY_LISTS_INVALID.

Maximum array length: 20

A Fuse list id (24-character hex ObjectId), as the id of a GET /business/lists row.

excludeContacted
enum<string>

Skips contacts your campaigns already reached: none keeps them, ever excludes anyone ever messaged, last_1_month / last_3_months / last_6_months / last_1_year exclude those messaged within that window; contacts with a pending send in an active campaign are always excluded. Applies to future enrollment only.

Available options:
none,
ever,
last_1_month,
last_3_months,
last_6_months,
last_1_year
excludeEngagedContacts
boolean

When true, contacts who have already replied to one of your campaigns are excluded from enrollment. Applies to future enrollment only.

isDynamic
boolean

When true, contacts added to the source lists after activation are enrolled automatically by a background refresh.

useLinkedinPosts
boolean

When true, each contact's recent LinkedIn posts are fetched at activation and fed to AI personalization (needs a LinkedIn URL on the contact).

When true, every email step appends a one-click unsubscribe footer (email channel only).

openRateTrackingEnabledAt
string | null

ISO 8601 timestamp from which the open-tracking pixel is added to outgoing emails, or null to switch open tracking off.

sendOnlyToValidatedEmailsEnabledAt
string | null

ISO 8601 timestamp from which enrollment only accepts contacts whose email verified as valid (catch-all and never-verified uploaded addresses skipped), or null to also allow both. Applies to future enrollment only.

delegates
string[]

Replacement list of teammate user ids allowed to view and edit this campaign in the app; [] revokes every delegate. Take each id from the id of a GET /business/team/members row (a row whose id is null has no linked user account and cannot be a delegate). Access is OR-joined — any one of the listed users gets it — and there is no cap on how many you list. Nothing checks the ids against your team on the way in, and the app's delegate test is a plain membership check on this array that runs ahead of every team rule, so an id belonging to any real Fuse user — teammate or not — grants that user the access the owner has: opening the campaign, editing its settings and steps, activating it so it sends, and seeing it in their own campaign list. Only a well-formed id that matches no user grants nobody anything. The grant stops at the app: every campaign endpoint here resolves the token owner's own campaigns, so a delegate calling with their own key still gets 404.

A Fuse user id (24-character hex ObjectId) of a teammate, as the id of a GET /business/team/members row.

New call-to-action link, or null / an empty string to clear it; queued sends that already carry the old link are rewritten to the new one. Accepted values: one absolute URL whose scheme is http:// or https:// (up to 2000 characters); anything else, a bare domain or a mailto: link included, is rejected. The URL is inserted verbatim wherever a step's text uses {CTA Link} or one of its aliases {Calendar Link}, {cta_link}, {calendar_link}, {{calendarLink}}.

Maximum string length: 2000

Response

Success

campaign
object
required