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

# Update Campaign Settings

`PATCH /api/v1/campaigns/{campaign_id}/settings`

## Request

- Base URL: `http://localhost:3009`
- URL: `http://localhost:3009/api/v1/campaigns/{campaign_id}/settings`
- Auth: HTTP bearer

Updates a campaign's sending window, reply behaviour, bounce protection, and the mailboxes it sends from.

**Only what you pass changes** — omitted keys are left alone, and `null` clears a key back to its default. Omit `send_from` to leave the sender selection untouched.

`send_from.mode` picks one sender strategy and clears the other: `team_members` pools every mailbox owned by the named teammates (including any they connect later, sends spread evenly across the team), while `specific_mailboxes` uses exactly the named mailboxes. Ids and emails that aren't live in your organization are dropped rather than rejected.

**Changing `send_from` requires the campaign to be paused** — the pool re-resolves on every send, so a mid-flight change would reroute in-sequence leads. Everything else can be changed while the campaign is running.

To set the priority of tasks created on reply, patch the answering send step's `config.replyTaskPriority` — it is per-step, not a campaign setting.

Read current values from `settings` on Get Campaign and from Get Campaign Mailboxes.

## Path parameters

- `campaign_id` string, required

## Request body

- object
  - `sending_window_start` string, nullable: Earliest send time as `HH:MM` (24h, campaign timezone). `null` sends anytime — leave both window keys null for no restriction.
  - `sending_window_end` string, nullable: Latest send time as `HH:MM` (24h, campaign timezone). `null` sends anytime.
  - `timezone` string: IANA timezone the sending window is measured in.
  - `remove_on_reply` boolean: Stop a lead's sequence as soon as they reply. Defaults to true.
  - `create_task_on_reply` boolean: Create a task when a lead replies. Defaults to true.
  - `bounce_rate_limit` number, nullable: Auto-pause the campaign when the share of contacted leads whose emails bounce reaches this percentage. `0` turns protection off; otherwise 1–5. Lower is stricter and protects sender reputation sooner. `null` restores the default (5).
  - `send_from` object: Who the campaign sends from. Requires the campaign to be paused. Omit to leave unchanged.
    - `mode` 'team_members' | 'specific_mailboxes', required: Which sender strategy to use. The other selection is cleared.
    - `member_emails` string[]: Teammates to pool. Required (non-empty) when `mode` is `team_members`.
    - `mailbox_ids` string[]: Mailboxes to send from — ids from Get Campaign Mailboxes. Required (non-empty) when `mode` is `specific_mailboxes`.

## Response `200`

Default Response

- object
  - `status` integer
  - `message` string
  - `data` object
    - `campaign_id` string
    - `settings` object: The merged settings
    - `send_from` object: The campaign's sender selection after the update
      - `mode` 'team_members' | 'specific_mailboxes' | 'none'
      - `mailbox_ids` string[]
      - `member_emails` string[]

## Other responses

- `400`: Unknown or invalid settings key, or an empty sender selection
- `401`: Unauthorized — missing or invalid API key
- `403`: Forbidden. `code` says which permission refused: ROLE_FORBIDDEN (your role), INSUFFICIENT_SCOPE (the API key's scopes), WORKFLOW_FORBIDDEN (no access to the workflow), KEY_WORKFLOW_FORBIDDEN (the API key's workflow restriction).
- `404`: Campaign not found
- `409`: Campaign is active — pause it before changing `send_from`
- `429`: Too Many Requests — rate limit exceeded. Check `Retry-After` header for seconds until the limit resets.

---

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