Skip to main content
Partial update of a campaign’s configuration. Only the keys you send are changed; everything else is left alone. Editing a running campaign is allowed and takes effect at the next evaluation, roughly within a minute — you do not have to pause first. Terminal campaigns (completed, stopped, archived) can no longer be edited and return 400. Required scope: campaigns:manage.

Path parameters

Writable fields

The same allowlist as POST /campaigns, all optional here. Ranges, defaults and guidance are on the create page. Unknown keys are rejected with 400, and so is every engine-owned field (status, spent_cents, last_tick_result, total_leads, …). Status changes go through the transition endpoints — POST /campaigns/{id}/launch, /pause, /resume, /stop — and never through PATCH. An empty body, or a body containing no writable field, is a 400 rather than a no-op.

Editing a live campaign

  • Stop rules apply forward only. Adding a disposition to stop_disposition_ids retires contacts that land it from now on; it does not retroactively retire contacts already called. Removing one never resurrects a contact that was already retired.
  • Raising max_attempts does not revive exhausted contacts. They stay terminal.
  • Lowering pacing takes effect immediately — a smaller max_calls_per_day than today’s daily_admitted_count simply stops the campaign for the rest of the day.
  • Changing agent_id or from_phone_number_id affects the next call, not calls already in flight. Pointing at an inactive number or an agent with no duration cap will pause the campaign as paused_config at the next evaluation.
  • Raising budget_cents on a paused_budget campaign does not resume it. Call POST /campaigns/{id}/resume.

Example request

Example response

The complete campaign after the update, same shape as GET /campaigns/{id}:
Trimmed for brevity — the real response contains every field listed on GET /campaigns/{id}.

Errors