---
title: "Update campaign (draft status only)"
method: PATCH
path: "/campaigns/{id}"
tags: ["Campaigns"]
---

# Update campaign (draft status only)

`PATCH /campaigns/{id}`

## Request

- Base URL: `https://api.omnisend.com/api`
- URL: `https://api.omnisend.com/api/campaigns/{id}`
- Auth: one of:
  - OAuth 2
    - Client credentials
    - Token URL: `https://app.omnisend.com/oauth2/token` scopes: `campaigns.write`
  - API key in header `Authorization`

Update a campaign draft. Only campaigns in 'draft' status can be updated; any other status returns 409.
To change a campaign that is no longer a draft, copy it and edit the new draft copy.

**Scopes:**
`campaigns.write`

**Rate Limiting:**
This endpoint is rate limited to 400 requests per minute.

## Path parameters

- `id` string, required

## Headers

- `Omnisend-Version` string, required

## Request body

- UpdateCampaignRequest: Campaign update request
  - `abTest` UpdateABTest: A/B test update block. Full replacement semantics.
    - `settings` UpdateABTestSettings: A/B test settings for update
      - `decisionTime` UpdateABTestDecisionTime: Decision time for A/B test winner selection
        - `amount` integer, required: Amount of time units
        - `unit` 'h' | 'd', required: Time unit: "h" (hours, 1–168) or "d" (days, 1–7)
      - `testSizePercent` integer: Percentage of audience used for the test (10–100)
      - `winningMetric` 'openRate' | 'clickRate': Metric used to determine the winner
    - `variants` UpdateABTestVariants: Per-variant content for A/B test update
      - `a` UpdateABTestVariant: Content fields for a single A/B variant. Email fields live under `content.email`.
        - `content` UpdateABTestVariantContent: Variant content grouped by channel for update.
          - `email` UpdateABTestVariantEmail: Email content fields for an A/B test variant update.
            - `preheader` string: Email preheader text
            - `replyToEmail` string: Reply-to email address. Omit it to keep the current value; send an empty string to clear it, which makes replies go to the sender address. Any address set must be verified for the brand, and verification status is not exposed here, so an address that is guessed, or copied from another campaign, is rejected.
            - `senderEmail` string: Sender email address. Omit it to keep the current sender, which the brand may already send from. Set it only when switching to a specific required address: which addresses a brand may send from follows from its sender setup and is not exposed here, so an address that is guessed, or copied from another campaign, is rejected.
            - `senderName` string: Sender display name
            - `subject` string: Email subject line
      - `b` UpdateABTestVariant: Content fields for a single A/B variant. Email fields live under `content.email`.
        - `content` UpdateABTestVariantContent: Variant content grouped by channel for update.
          - `email` UpdateABTestVariantEmail: Email content fields for an A/B test variant update.
            - `preheader` string: Email preheader text
            - `replyToEmail` string: Reply-to email address. Omit it to keep the current value; send an empty string to clear it, which makes replies go to the sender address. Any address set must be verified for the brand, and verification status is not exposed here, so an address that is guessed, or copied from another campaign, is rejected.
            - `senderEmail` string: Sender email address. Omit it to keep the current sender, which the brand may already send from. Set it only when switching to a specific required address: which addresses a brand may send from follows from its sender setup and is not exposed here, so an address that is guessed, or copied from another campaign, is rejected.
            - `senderName` string: Sender display name
            - `subject` string: Email subject line
  - `audience` Audience: Campaign audience
    - `excludedCountries` string[]: Countries excluded from the SMS audience, as ISO 3166-1 alpha-2 codes (e.g. "US"). Only applicable to SMS campaigns. Recipients in these countries are not sent to.
    - `excludedSegmentIDs` string[]: Segments to exclude from the audience
    - `includedSegmentIDs` string[]: Segments to include. Empty includes all subscribers
  - `boosterSettings` UpdateBoosterSettings: Booster-specific settings for campaign update.
    - `delay` UpdateBoosterDelay: Delay settings for booster campaign
      - `amount` integer, required: Amount of time units. Minimum 0 (SMS booster only — means "send together with parent"). Maximum 240 hours (or 10 days)
      - `unit` 'h' | 'd', required: Time unit: "h" for hours, "d" for days
    - `sendTo` 'nonOpeners' | 'nonClickers': Which recipients to target: "nonOpeners" or "nonClickers"
  - `content` UpdateContent: Campaign content for update
    - `email` UpdateEmail: Email content for campaign update
      - `preheader` string: Email preheader text
      - `replyToEmail` string: Reply-to email address for recipient responses. Omit it to keep the current value; send an empty string to clear it, which makes replies go to the sender address. Any address set must be verified for the brand, and verification status is not exposed here, so an address that is guessed, or copied from another campaign, is rejected.
      - `senderEmail` string: Sender email address. Omit it to keep the current sender, which the brand may already send from. Set it only when switching to a specific required address: which addresses a brand may send from follows from its sender setup and is not exposed here, so an address that is guessed, or copied from another campaign, is rejected.
      - `senderName` string: Sender display name shown in the recipient's inbox
      - `subject` string: Email subject line
    - `sms` UpdateSMS: SMS content for campaign update
      - `compliance` UpdateSMSCompliance: SMS compliance text settings for update
        - `stopKeywordText` string: STOP keyword text for US/CA recipients
        - `unsubscribeLinkText` string: Unsubscribe link text for non-US/CA recipients
      - `imageID` string: Image ID obtained from the Images API. When set, the message is delivered as MMS to US/CA recipients; other countries receive SMS without the image. Image must be JPEG, JPG, PNG, or GIF and not exceed 500 KB
      - `isLinkShorteningEnabled` boolean: Auto-shorten links in message body
      - `message` string: SMS message body. When sent as SMS, the message (including the appended compliance text and unsubscribe link/keyword) must not exceed 9 SMS segments for either US/CA or other-country recipients. When sent as MMS, the message (including the appended compliance text) must not exceed 1600 characters for US/CA recipients.
  - `language` string: Campaign language locale in xx_XX format. Must be a supported language
  - `name` string: Campaign name
  - `sendingSettings` UpdateSendingSettings: Sending settings for campaign update. Full object replacement - provide all fields applicable to the selected strategy (for personalized: strategy, scheduledAt, optimizeFor; omit isTZOptimizationEnabled)
    - `isTZOptimizationEnabled` boolean: Whether timezone optimization is enabled. Only available with immediate or scheduled strategy, and only in email campaigns
    - `optimizeFor` 'opens' | 'clicks' | 'orders': Optimization objective for personalized sends. Required when strategy is "personalized", must not be set otherwise
    - `respectQuietHours` boolean: Whether personalized sends avoid contact-local hours from 22:00 through 06:59. If omitted, retains the existing personalized value; defaults to true only when no value exists. Must not be set for other strategies
    - `scheduledAt` string: Campaign scheduled send time in RFC 3339 format. Required when strategy is "scheduled" or "personalized", must not be set for "immediate". For "scheduled" it must be in the future and within one year from now. For "personalized" only the calendar date in the brand timezone is used, not the time-of-day: the value is normalized to the start of that day in the brand timezone. A date resolving to today starts the STO window at the next whole hour when the campaign is sent; a future date (within one year) starts it at brand-local midnight. Per-contact send times are then chosen within the following 24 hours. Responses store the start as brand-local midnight, which can appear as the previous UTC calendar date
    - `strategy` 'immediate' | 'scheduled' | 'personalized': Sending strategy. "personalized" enables send time optimization and is only available for regular email campaigns in stores whose plan includes personalized send times and that are eligible for them

## Response `200`

Updated campaign

- Campaign: Campaign resource. When `type` is `booster`, the `boosterSettings` field is populated, identifying the parent campaign and the conditions under which the booster targets recipients of that parent.
  - `abTest` ABTest: A/B test configuration. Variants are keyed by "a" and "b"; the parent campaign's `content` field is omitted because variants carry their own content. `result` is populated once a winner is selected and is `null` otherwise.
    - `result` ABTestResult: A/B test result (read-only).
      - `isManuallySelected` boolean: Whether the winner was manually selected (read-only)
      - `selectedAt` string: When the winner was selected (read-only)
      - `winnerVariantID` string: Campaign ID of the winning variant (read-only). Matches variants.a.id or variants.b.id.
    - `settings` ABTestSettings: A/B test settings.
      - `decisionTime` ABTestDecisionTime: Decision time before selecting a winner. Same shape as booster delay.
        - `amount` integer: Amount of time units to wait
        - `unit` 'h' | 'd': Time unit: "h" for hours, "d" for days
      - `testSizePercent` integer: Percentage of audience for the test phase (10-100)
      - `winningMetric` 'openRate' | 'clickRate': Winner determination metric
    - `variants` ABTestVariants: A/B test variants object with keys "a" and "b".
      - `a` ABTestVariant: A/B test variant. Email-specific fields live under `content.email`.
        - `content` ABTestVariantContent: A/B test variant content grouped by channel.
          - `email` ABTestVariantEmail: Email content fields for an A/B test variant.
            - `contentID` string: Email content unique identifier referencing the variant's email design
            - `preheader` string: Preheader text
            - `replyToEmail` string: Reply-to email address
            - `senderEmail` string: Sender email address
            - `senderName` string: Sender display name
            - `subject` string: Email subject line
        - `id` string: Variant campaign ID (read-only). Used for reporting API access.
      - `b` ABTestVariant: A/B test variant. Email-specific fields live under `content.email`.
        - `content` ABTestVariantContent: A/B test variant content grouped by channel.
          - `email` ABTestVariantEmail: Email content fields for an A/B test variant.
            - `contentID` string: Email content unique identifier referencing the variant's email design
            - `preheader` string: Preheader text
            - `replyToEmail` string: Reply-to email address
            - `senderEmail` string: Sender email address
            - `senderName` string: Sender display name
            - `subject` string: Email subject line
        - `id` string: Variant campaign ID (read-only). Used for reporting API access.
  - `audience` Audience: Campaign audience
    - `excludedCountries` string[]: Countries excluded from the SMS audience, as ISO 3166-1 alpha-2 codes (e.g. "US"). Only applicable to SMS campaigns. Recipients in these countries are not sent to.
    - `excludedSegmentIDs` string[]: Segments to exclude from the audience
    - `includedSegmentIDs` string[]: Segments to include. Empty includes all subscribers
  - `boosterSettings` BoosterSettings: Booster-specific settings.
    - `campaignID` string, required: Parent campaign ID this booster follows up on
    - `delay` BoosterDelay: Delay between the parent campaign send and the booster send.
      - `amount` integer: Amount of time units before the booster is sent
      - `unit` 'h' | 'd': Time unit: "h" for hours, "d" for days
    - `sendTo` 'nonOpeners' | 'nonClickers', required: Audience selector. The booster targets recipients of the parent who did NOT perform the implied action (`nonOpeners` did not open; `nonClickers` did not click).
  - `brandID` string: Brand unique identifier (read-only)
  - `channel` 'email' | 'push' | 'sms': Campaign message channel
  - `content` Content: Campaign content
    - `email` Email: Email content
      - `contentID` string: Email content unique identifier referencing the campaign's email design
      - `preheader` string: Email preheader text displayed after the subject line in the recipient's inbox
      - `replyToEmail` string: Reply-to email address for recipient responses
      - `senderEmail` string: Sender email address shown in the recipient's inbox
      - `senderName` string: Sender display name shown in the recipient's inbox
      - `subject` string: Email subject line displayed in the recipient's inbox
    - `sms` SMS: SMS message content
      - `compliance` SMSCompliance: SMS compliance text settings
        - `stopKeywordText` string: STOP keyword text for US/CA recipients. Max 250 chars
        - `unsubscribeLinkText` string: Unsubscribe link text for non-US/CA recipients. Max 250 chars
      - `imageID` string: Image ID obtained from the Images API. When set, the message is delivered as MMS to US/CA recipients; other countries receive SMS without the image. Image must be JPEG, JPG, PNG, or GIF and not exceed 500 KB
      - `isLinkShorteningEnabled` boolean: Auto-shorten links in message body
      - `message` string: SMS message body. When sent as SMS, the message (including the appended compliance text and unsubscribe link/keyword) must not exceed 9 SMS segments for either US/CA or other-country recipients. When sent as MMS, the message (including the appended compliance text) must not exceed 1600 characters for US/CA recipients.
      - `senderName` string: Sender display name. Max 250 chars
  - `createdAt` string: Campaign creation timestamp (read-only)
  - `endedAt` string: Campaign end timestamp (read-only)
  - `id` string: Campaign unique identifier (read-only)
  - `language` string: Campaign language locale in xx_XX format
  - `name` string: Campaign name
  - `sendingSettings` SendingSettings: Campaign sending settings
    - `isTZOptimizationEnabled` boolean: Whether timezone optimization is enabled. Only available with immediate or scheduled strategy, and only in email campaigns
    - `optimizeFor` 'opens' | 'clicks' | 'orders': Optimization objective for personalized sends. Present when strategy is personalized
    - `respectQuietHours` boolean: Whether personalized sends avoid contact-local hours from 22:00 through 06:59
    - `scheduledAt` string: Scheduled send time in RFC 3339 format. Present when strategy is scheduled or personalized
    - `strategy` 'immediate' | 'scheduled' | 'personalized': Sending strategy
  - `startedAt` string: Campaign start timestamp (read-only)
  - `status` 'draft' | 'scheduled' | 'started' | 'sent' | 'error' | 'canceled' | 'paused' | 'onHold' | 'expired' | 'stopped': Campaign status
  - `type` 'regular' | 'abTest' | 'booster': Campaign type
  - `updatedAt` string: Campaign last update timestamp (read-only)
  - `url` string: Link to the campaign in the Omnisend app (read-only): the settings page of a draft campaign (for a booster, the parent campaign's booster page) or the report of a started, sent, canceled, stopped or expired campaign. Omitted for scheduled, paused, on-hold and error campaigns.

## Other responses

- `400`: Request contains invalid or missing fields
- `401`: Authentication is missing or invalid
- `403`: Insufficient permissions for this operation
- `404`: Campaign not found
- `409`: Campaign state does not allow modification
- `410`: API version has been retired
- `429`: Rate limit exceeded
- `500`: Unexpected error occurred

---

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