---
title: "Update a Campaign"
method: PATCH
path: "/v1/campaigns/{campaign_id}"
tags: ["Campaigns"]
---

# Update a Campaign

`PATCH /v1/campaigns/{campaign_id}`

## Request

- Base URL: `https://api.monaco.com`
- URL: `https://api.monaco.com/v1/campaigns/{campaign_id}`
- Auth: none declared

Updates a campaign's content fields and/or transitions its lifecycle via `status`. Returns the refreshed campaign.

To attach or detach audiences, use `add_audiences_to_campaign` / `remove_audiences_from_campaign`.

## Path parameters

- `campaign_id` string, uuid, required

## Request body

- UpdateCampaignRequest: Content edits and status transitions for a campaign. Any combination of content fields may be supplied. When ``status`` is set it is routed to the matching lifecycle transition (pause / resume / complete / archive).
  - `name` string, nullable: New name for the campaign; must be unique within the organization
  - `end_date` string, date, nullable: New end date; must not be in the past
  - `audience_ids` string[], nullable: Deprecated — use `add_audiences_to_campaign` / `remove_audiences_from_campaign` instead. The complete set of audiences for this campaign; REPLACES the current set, and any audience you omit is detached (tearing down in-flight sequences for its contacts).
  - `distribution` union: Replacement send distribution. Only reassigns contacts who haven't been sent to yet (queued/pending review); contacts already receiving sends keep their original sender permanently — this never reassigns in place.
    - PercentageDistribution: Split sends across named senders by fixed percentages that sum to 100.
      - `mode` 'percentage', required: Distribution mode discriminator
      - `sender_ids` string[], required: IDs of the users sending on this campaign
      - `percentages` SenderPercentage[], required: Per-sender percentages; must cover every sender_id and sum to 100
        - `sender_id` string, uuid, required: ID of the sending user
        - `percentage` integer, required: Share of sends routed to this sender; must be non-negative
    - AccountOwnerDistribution: Route each contact's sends to the owner of its account. A contact's sends go to its account owner when that owner is one of ``sender_ids``; otherwise they fall back to ``fallback_sender_id``.
      - `mode` 'account_owner', required: Distribution mode discriminator
      - `sender_ids` string[], required: IDs of the users eligible to send on this campaign; a contact is routed to its account owner only when the owner appears in this list
      - `fallback_sender_id` string, uuid, required: Sender used whenever a contact's account is unassigned or its owner is not in `sender_ids`. Required for `account_owner` mode.
  - `rules_of_engagement` PublicRulesOfEngagementInput: Per-rule overrides layered on the org's default rules of engagement. Only the rules you include are overridden, rules you omit keep their org default.
    - `do_not_contact` PublicToggleRule: A rule controlled by a single on/off switch.
      - `enabled` boolean, required: Whether this rule is enforced for the campaign
    - `allow_sequence_stop_on_meeting_booked` PublicToggleRule: A rule controlled by a single on/off switch.
      - `enabled` boolean, required: Whether this rule is enforced for the campaign
    - `contact_cooldown` PublicCooldownRule: Suppress re-contacting the same contact or account within a cooldown window.
      - `enabled` boolean, required: Whether the cooldown is enforced
      - `days` integer: Length of the cooldown window in days
    - `account_cooldown` PublicCooldownRule: Suppress re-contacting the same contact or account within a cooldown window.
      - `enabled` boolean, required: Whether the cooldown is enforced
      - `days` integer: Length of the cooldown window in days
    - `max_contacts_in_sequence` PublicMaxContactsInSequenceRule: Cap how many contacts from one account can be active in sequences at once.
      - `enabled` boolean, required: Whether the cap is enforced
      - `max_contacts` integer: Maximum contacts per account allowed in sequences simultaneously
    - `allow_non_account_owner_campaigns` PublicToggleRule: A rule controlled by a single on/off switch.
      - `enabled` boolean, required: Whether this rule is enforced for the campaign
    - `allow_stop_and_dismiss_on_account_status` PublicStopAndDismissRule: Stop and dismiss a contact's active sequences when its account transitions into one of the configured statuses.
      - `enabled` boolean, required: Whether to stop and dismiss a contact's active sequences when its account transitions into one of the trigger statuses
      - `statuses` AccountStatusEnum[], nullable: Account statuses whose transition triggers stop-and-dismiss; omit to inherit the org's default set
    - `exclude_sequences_on_account_status` PublicStopAndDismissRule: Stop and dismiss a contact's active sequences when its account transitions into one of the configured statuses.
      - `enabled` boolean, required: Whether to stop and dismiss a contact's active sequences when its account transitions into one of the trigger statuses
      - `statuses` AccountStatusEnum[], nullable: Account statuses whose transition triggers stop-and-dismiss; omit to inherit the org's default set
  - `autopilot_settings` PublicAutopilotSettings: Senders on autopilot for this campaign and their daily send-release cap. Senders omitted here (but present in `distribution`) require manual approval before each send starts. An empty list moves every sender to supervised.
    - `sender_rates` SenderAutopilotRate[]
      - `sender_id` string, uuid, required: ID of the sending user
      - `daily_rate_target` integer, required: Daily cap on auto-released sends for this sender; must be positive
  - `prioritized` boolean, nullable: Whether this campaign moves to the front of the organization's send queue, ahead of every non-prioritized campaign. Applies to sends already waiting in the queue as well as future ones. Reserve it for time-sensitive sends, such as an upcoming conference. Prioritizing many campaigns at once dilutes the effect.
  - `status` 'active' | 'paused' | 'completed' | 'archived': Lifecycle statuses settable via the public API's update-campaign endpoint. Subset of `campaigns.models._campaign_enums.CampaignStatus` — excludes `draft` (internal-only authoring state).

## Response `200`

Successful Response

- PublicItemResponseCampaignDetailResponse
  - `data` CampaignDetailResponse, required: Full campaign resource, as returned by `get_campaign`, `create_campaign`, and `update_campaign`.
    - `id` string, required: Unique identifier for the campaign
    - `name` string, required: Name of the campaign
    - `status` 'active' | 'paused' | 'completed' | 'draft' | 'archived', required: Lifecycle status of a campaign.
    - `prioritized` boolean, required: Whether this campaign takes priority over non-prioritized campaigns
    - `end_date` string, date, nullable: Date the campaign stops enrolling
    - `template_id` string, required: ID of the template enrolled contacts are placed on
    - `template_name` string, nullable: Title of the template
    - `audiences` CampaignAudienceRef[]: Audiences enrolled in this campaign
      - `id` string, required: Unique identifier for the audience
      - `name` string, required: Name of the audience
    - `enrollment_status` 'pending' | 'running' | 'enriching' | 'completed' | 'failed', required: Progress of the async audience-enrollment task behind create/update. ``enriching``: the sequences exist and are listed, but their contacts' emails are still being found and verified. Edits are rejected until it completes.
    - `created_at` string, date-time, required: Date and time the campaign was created
    - `updated_at` string, date-time, required: Date and time the campaign was last updated
    - `distribution` union: How sends are routed across senders (percentage or account_owner)
      - PercentageDistribution: Split sends across named senders by fixed percentages that sum to 100.
        - `mode` 'percentage', required: Distribution mode discriminator
        - `sender_ids` string[], required: IDs of the users sending on this campaign
        - `percentages` SenderPercentage[], required: Per-sender percentages; must cover every sender_id and sum to 100
          - `sender_id` string, uuid, required: ID of the sending user
          - `percentage` integer, required: Share of sends routed to this sender; must be non-negative
      - AccountOwnerDistribution: Route each contact's sends to the owner of its account. A contact's sends go to its account owner when that owner is one of ``sender_ids``; otherwise they fall back to ``fallback_sender_id``.
        - `mode` 'account_owner', required: Distribution mode discriminator
        - `sender_ids` string[], required: IDs of the users eligible to send on this campaign; a contact is routed to its account owner only when the owner appears in this list
        - `fallback_sender_id` string, uuid, required: Sender used whenever a contact's account is unassigned or its owner is not in `sender_ids`. Required for `account_owner` mode.
    - `rules_of_engagement` PublicRulesOfEngagementOutput: Per-rule overrides layered on the org's default rules of engagement. Only the rules you include are overridden, rules you omit keep their org default.
      - `do_not_contact` PublicToggleRule: A rule controlled by a single on/off switch.
        - `enabled` boolean, required: Whether this rule is enforced for the campaign
      - `allow_sequence_stop_on_meeting_booked` PublicToggleRule: A rule controlled by a single on/off switch.
        - `enabled` boolean, required: Whether this rule is enforced for the campaign
      - `contact_cooldown` PublicCooldownRule: Suppress re-contacting the same contact or account within a cooldown window.
        - `enabled` boolean, required: Whether the cooldown is enforced
        - `days` integer: Length of the cooldown window in days
      - `account_cooldown` PublicCooldownRule: Suppress re-contacting the same contact or account within a cooldown window.
        - `enabled` boolean, required: Whether the cooldown is enforced
        - `days` integer: Length of the cooldown window in days
      - `max_contacts_in_sequence` PublicMaxContactsInSequenceRule: Cap how many contacts from one account can be active in sequences at once.
        - `enabled` boolean, required: Whether the cap is enforced
        - `max_contacts` integer: Maximum contacts per account allowed in sequences simultaneously
      - `allow_non_account_owner_campaigns` PublicToggleRule: A rule controlled by a single on/off switch.
        - `enabled` boolean, required: Whether this rule is enforced for the campaign
      - `allow_stop_and_dismiss_on_account_status` PublicStopAndDismissRule: Stop and dismiss a contact's active sequences when its account transitions into one of the configured statuses.
        - `enabled` boolean, required: Whether to stop and dismiss a contact's active sequences when its account transitions into one of the trigger statuses
        - `statuses` AccountStatusEnum[], nullable: Account statuses whose transition triggers stop-and-dismiss; omit to inherit the org's default set
      - `exclude_sequences_on_account_status` PublicStopAndDismissRule: Stop and dismiss a contact's active sequences when its account transitions into one of the configured statuses.
        - `enabled` boolean, required: Whether to stop and dismiss a contact's active sequences when its account transitions into one of the trigger statuses
        - `statuses` AccountStatusEnum[], nullable: Account statuses whose transition triggers stop-and-dismiss; omit to inherit the org's default set
    - `autopilot_mode` 'autopilot' | 'supervised' | 'hybrid', required
    - `autopilot_settings` PublicAutopilotSettings, required: Senders on autopilot for this campaign and their daily send-release cap. Senders omitted here (but present in `distribution`) require manual approval before each send starts. An empty list moves every sender to supervised.
      - `sender_rates` SenderAutopilotRate[]
        - `sender_id` string, uuid, required: ID of the sending user
        - `daily_rate_target` integer, required: Daily cap on auto-released sends for this sender; must be positive
  - `meta` ResponseMeta
    - `timestamp` string, date-time: Server timestamp of the response

## Other responses

- `400`: Invalid campaign update
- `404`: Campaign not found
- `409`: Campaign is being processed and can't be updated right now
- `4XX`: Client error

## Changes

- **2026-11-03** `fc720ada2a81`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/monaco/apis/monaco-public-api/changes/v1/campaigns/:campaign_id/patch.md)

---

[API](https://skmtc.dev/monaco/apis/monaco-public-api.md) - [All operations](https://skmtc.dev/monaco/apis/monaco-public-api/llms.txt) - [OpenAPI document](https://skmtc.dev/monaco/apis/monaco-public-api/revisions/fc720ada2a81?raw)
