Update a campaign
Changes only the fields you send. status can’t be set here, and direction changes only in draft.
config merges shallowly: a key you send replaces the stored value, null deletes it, and nested objects such as analysis_schema are replaced whole. A key outside CampaignConfig returns 400 (unrecognized_keys), even as null. So does a change that makes a valid config invalid.
lead_list_ids and config.knowledge_base_ids replace the attached set ([] detaches all). Config changes reach calls queued after the update, not ones already queued.
Authorizations
Use Authorization: Bearer tc_live_xxxxx
Headers
Makes a retry safe. A 2xx response is stored for 24 hours per account, and a retry with the same key gets it back with Idempotent-Replay: true instead of running again. Errors aren't stored, so a retry after one runs fresh. The key isn't tied to a path or body: use a new key for every different request. A malformed key gets 400.
8 - 255^[A-Za-z0-9_-]+$"a1b2c3d4-e5f6-7890-abcd-ef0123456789"
Path Parameters
Campaign UUID
Body
Send only the fields you change. An empty body returns 400, and so does status: use start, pause, resume and stop instead. Config changes apply to calls queued after the update. Calls already queued keep the old config.
1Changes only while the campaign is draft, otherwise 409 (campaign_not_draft). Switching to outbound returns 409 (campaign_has_inbound_routes) while a phone number still routes inbound calls to it.
outbound, inbound IANA timezone for the dispatch hours
Local time dialing may begin, HH:MM or HH:MM:SS.
^([01]\d|2[0-3]):[0-5]\d(:[0-5]\d)?$Local time dialing stops, HH:MM or HH:MM:SS.
^([01]\d|2[0-3]):[0-5]\d(:[0-5]\d)?$Days dialing is allowed, 1 (Monday) to 7 (Sunday).
1 <= x <= 7Per-day dispatch windows that replace the default hours, keyed by weekday "1" to "7". An empty array makes that day off.
x >= 1x >= 1Same rules as on create. Send null to clear the schedule.
Replaces the attached lead lists. [] detaches all. An id outside your account returns 400.
Merged shallowly into the stored config: a sent key replaces its value (nested objects whole), an omitted key stays, null deletes it. A key that isn't a CampaignConfig field returns 400, even as null. The merged result is validated too: {"mode": "live"} returns 400 while the stored config keeps a legacy-only field or a model outside live.llm in GET /v1/models.
Response
Campaign updated
A campaign as list, get, create and update return it. Only list and get include inbound_phone_numbers.
draft, scheduled, running, paused, completed, failed, cancelled outbound campaigns dial their leads. inbound campaigns are never dialled; they answer on a routed number only while running.
outbound, inbound Your active or verified numbers with inbound routing on and pointed at this campaign. Full inbound settings are on GET /v1/phone-numbers.
IANA timezone for the dispatch hours. schedule_time is always UTC.
Daily start of the dispatch window, HH:MM:SS local time.
Daily end of the dispatch window, HH:MM:SS local time.
Days dispatch may run. 1 is Monday, 7 is Sunday.
1 <= x <= 7Windows for specific weekdays, keyed "1" to "7". An empty list makes that day a day off.
Dispositions that count toward success_count. Set in the dashboard; the API doesn't accept it.
Maps raw call outcomes to dispositions. Set in the dashboard. Expect an object, an empty array [] (the default) or null.
Why the campaign is paused: manual from the pause endpoint, or an automatic reason such as quota_exceeded, payment_failed or phone_number_deleted.
Attached lead lists.
Configuration for every call the campaign places.