---
title: "Update a campaign"
method: PATCH
path: "/campaigns/{id}"
tags: ["Campaigns"]
---

# Update a campaign

`PATCH /campaigns/{id}`

## Request

- Base URL: `https://warmysender.com/api/v1`
- URL: `https://warmysender.com/api/v1/campaigns/{id}`
- Auth: HTTP bearer

Updates campaign settings. Only allowed while the campaign is in draft or paused status.

Required scope: `campaigns:write`.

The create, read and update responses carry opt_out_effective: the opt-out this campaign will actually print, after the per-campaign override falls back to your workspace setting field by field. style_source and text_source say which of the two each half came from; company_address is the postal address the footer prints (company_address_source: campaign, workspace or none).

Custom wording changes what the opt-out says, never whether one appears — every cold email carries one.

## Path parameters

- `id` string, required

## Request body

- object
  - `name` string: Campaign name.
  - `description` string: Description.
  - `dailySendLimit` integer: Daily send cap.
  - `sendingWindowStart` integer: Window start hour.
  - `sendingWindowEnd` integer: Window end hour.
  - `scheduleDays` integer[]: Days of the week this campaign may send on. Numbers use 0=Sunday, 1=Monday, 2=Tuesday, 3=Wednesday, 4=Thursday, 5=Friday, 6=Saturday (Sunday is 0, not Monday). Day names such as "mon" or "monday" are accepted too and are the safest choice. Order and repeats do not matter. Leave it out for Monday–Friday [1,2,3,4,5]; an empty list is refused because a campaign with no sending days could never send.
  - `stopOnReply` boolean: Stop on reply.
  - `stopOnBounce` boolean: Stop on bounce.
  - `stopOnUnsubscribe` boolean: Stop on unsubscribe.
  - `trackOpens` boolean: Track opens.
  - `trackClicks` boolean: Track clicks.
  - `opt_out_style` 'link' | 'reply', nullable: This applies to THIS campaign only — useful when one campaign writes to people in a different language from the rest of your outreach. Leave it out and the campaign keeps using your workspace setting; send null (or an empty string) to go back to following it. The choice itself works the same way it does for your workspace: How people opt out of your cold email. "link": The footer carries an Unsubscribe link — on your own verified tracking domain when you have one, otherwise on a shared WarmySender domain. "reply": The footer reads “Reply "unsubscribe" to opt out” and points back at the sending mailbox — no third-party link at all. Either way, a reply asking to unsubscribe is honored automatically and that person is never contacted again. Writing your own sentence? Put the word in quotes — like Reply “stop” — and a reply of just that word is honored too.
  - `opt_out_text` string, nullable: This applies to THIS campaign only — useful when one campaign writes to people in a different language from the rest of your outreach. Leave it out and the campaign keeps using your workspace setting; send null (or an empty string) to go back to following it. The wording rules are the same as your workspace setting: The sentence recipients click or reply to in order to opt out — written in your own words, 4–120 characters, one line. Send an empty string to go back to the default for your opt-out style ("Unsubscribe" for link, "Reply "unsubscribe" to opt out" for reply). Put {{opt_out}} inside an email or signature to place the sentence yourself.
  - `company_address` string, nullable: The postal address shown in the footer of THIS campaign's emails — useful when you run campaigns for several companies from one workspace. Leave it out and the campaign keeps using your workspace address; send null (or an empty string) to go back to it.
  - `startDate` string, date-time, nullable: Scheduled start, or null.
  - `endDate` string, date-time, nullable: End date, or null.

## Response `200`

Success

## Other responses

- `400`: `invalid_status` — Campaign isn't in draft/paused status.; `validation_error` — opt_out_text was too short, too long, or worded in a way that would not read as an opt-out.; `unsupported_field` — The opt-out setting was sent as optOutStyle / optOutText. Use opt_out_style / opt_out_text — the same names your workspace settings use. Nothing was changed.
- `401`: `unauthorized` — Missing or invalid API key.
- `403`: `insufficient_scope` — The API key lacks the scope this endpoint requires.
- `404`: `not_found` — Campaign not found.
- `429`: `rate_limited` — Too many requests — slow down and retry after the Retry-After delay.

---

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