---
title: "Update a broadcast"
method: POST
path: "/api/broadcasts.update"
---

# Update a broadcast

`POST /api/broadcasts.update`

Updates an existing broadcast. Only broadcasts in draft, scheduled, or paused status can be updated.

## Request body

- UpdateBroadcastRequest
  - `workspace_id` string, required — The ID of the workspace
  - `id` string, required — ID of the broadcast to update
  - `name` string, required — Name of the broadcast
  - `audience` AudienceSettings, required
    - `list` string, required — List ID to send to
    - `segments` string[] — Optional segment IDs to filter recipients
    - `exclude_unsubscribed` boolean — Whether to exclude unsubscribed contacts
  - `schedule` ScheduleSettings — Schedule settings for a broadcast. Note: When a broadcast is first created, these fields are empty/false. Use the /api/broadcasts.schedule endpoint to configure scheduling.
    - `is_scheduled` boolean — Whether the broadcast is scheduled (false after creation, set via broadcasts.schedule)
    - `scheduled_date` string — Scheduled date in YYYY-MM-DD format
    - `scheduled_time` string — Scheduled time in HH:MM format
    - `timezone` string — IANA timezone
    - `use_recipient_timezone` boolean — Send at scheduled time in each recipient's timezone
  - `test_settings` BroadcastTestSettings
    - `enabled` boolean — Whether A/B testing is enabled
    - `sample_percentage` integer — Percentage of audience to use for testing
    - `auto_send_winner` boolean — Automatically send winning variation to remaining audience
    - `auto_send_winner_metric` 'open_rate' | 'click_rate' — Metric used to determine the winner
    - `test_duration_hours` integer — Duration of the test in hours (max 7 days)
    - `variations` BroadcastVariation[] — Test variations (2-8 variations allowed)
      - `variation_name` string — Name of this variation
      - `template_id` string, required — Template ID for this variation
      - `metrics` VariationMetrics
        - `recipients` integer — Number of recipients
        - `delivered` integer — Number of delivered messages
        - `opens` integer — Number of opens
        - `clicks` integer — Number of clicks
        - `bounced` integer — Number of bounces
        - `complained` integer — Number of complaints
        - `unsubscribed` integer — Number of unsubscribes
      - `template` object, nullable — Full template object (populated when with_templates=true)
  - `tracking_enabled` boolean — Enable click and open tracking
  - `utm_parameters` UTMParameters
    - `source` string — UTM source parameter
    - `medium` string — UTM medium parameter
    - `campaign` string — UTM campaign parameter
    - `term` string — UTM term parameter
    - `content` string — UTM content parameter
  - `data_feed` DataFeedSettings — Configuration for external data feeds
    - `global_feed` GlobalFeedSettings
      - `enabled` boolean — Whether the global data feed is enabled
      - `url` string — URL endpoint to fetch global data from (must be HTTPS)
      - `headers` DataFeedHeader[] — Custom HTTP headers to include in the request
        - `name` string, required — HTTP header name
        - `value` string, required — HTTP header value
    - `global_feed_data` object — Cached data from the global feed (populated after fetch)
    - `global_feed_fetched_at` string, date-time, nullable — When the global feed was last fetched
    - `recipient_feed` RecipientFeedSettings
      - `enabled` boolean — Whether the per-recipient data feed is enabled
      - `url` string — URL endpoint to fetch per-recipient data from (must be HTTPS)
      - `headers` DataFeedHeader[] — Custom HTTP headers to include in the request
        - `name` string, required — HTTP header name
        - `value` string, required — HTTP header value
  - `metadata` object — Custom metadata for the broadcast

## Response `200`

Broadcast updated successfully

- object
  - `broadcast` Broadcast
    - `id` string — Unique identifier for the broadcast
    - `workspace_id` string — The ID of the workspace
    - `name` string — Name of the broadcast
    - `channel_type` string — Communication channel type
    - `status` 'draft' | 'scheduled' | 'processing' | 'paused' | 'processed' | 'cancelled' | 'failed' | 'testing' | 'test_completed' | 'winner_selected' — Current status of the broadcast
    - `audience` AudienceSettings
      - `list` string, required — List ID to send to
      - `segments` string[] — Optional segment IDs to filter recipients
      - `exclude_unsubscribed` boolean — Whether to exclude unsubscribed contacts
    - `schedule` ScheduleSettings — Schedule settings for a broadcast. Note: When a broadcast is first created, these fields are empty/false. Use the /api/broadcasts.schedule endpoint to configure scheduling.
      - `is_scheduled` boolean — Whether the broadcast is scheduled (false after creation, set via broadcasts.schedule)
      - `scheduled_date` string — Scheduled date in YYYY-MM-DD format
      - `scheduled_time` string — Scheduled time in HH:MM format
      - `timezone` string — IANA timezone
      - `use_recipient_timezone` boolean — Send at scheduled time in each recipient's timezone
    - `test_settings` BroadcastTestSettings
      - `enabled` boolean — Whether A/B testing is enabled
      - `sample_percentage` integer — Percentage of audience to use for testing
      - `auto_send_winner` boolean — Automatically send winning variation to remaining audience
      - `auto_send_winner_metric` 'open_rate' | 'click_rate' — Metric used to determine the winner
      - `test_duration_hours` integer — Duration of the test in hours (max 7 days)
      - `variations` BroadcastVariation[] — Test variations (2-8 variations allowed)
        - `variation_name` string — Name of this variation
        - `template_id` string, required — Template ID for this variation
        - `metrics` VariationMetrics
          - `recipients` integer — Number of recipients
          - `delivered` integer — Number of delivered messages
          - `opens` integer — Number of opens
          - `clicks` integer — Number of clicks
          - `bounced` integer — Number of bounces
          - `complained` integer — Number of complaints
          - `unsubscribed` integer — Number of unsubscribes
        - `template` object, nullable — Full template object (populated when with_templates=true)
    - `utm_parameters` UTMParameters
      - `source` string — UTM source parameter
      - `medium` string — UTM medium parameter
      - `campaign` string — UTM campaign parameter
      - `term` string — UTM term parameter
      - `content` string — UTM content parameter
    - `data_feed` DataFeedSettings — Configuration for external data feeds
      - `global_feed` GlobalFeedSettings
        - `enabled` boolean — Whether the global data feed is enabled
        - `url` string — URL endpoint to fetch global data from (must be HTTPS)
        - `headers` DataFeedHeader[] — Custom HTTP headers to include in the request
          - `name` string, required — HTTP header name
          - `value` string, required — HTTP header value
      - `global_feed_data` object — Cached data from the global feed (populated after fetch)
      - `global_feed_fetched_at` string, date-time, nullable — When the global feed was last fetched
      - `recipient_feed` RecipientFeedSettings
        - `enabled` boolean — Whether the per-recipient data feed is enabled
        - `url` string — URL endpoint to fetch per-recipient data from (must be HTTPS)
        - `headers` DataFeedHeader[] — Custom HTTP headers to include in the request
          - `name` string, required — HTTP header name
          - `value` string, required — HTTP header value
    - `metadata` object — Custom metadata for the broadcast
    - `winning_template` string, nullable — ID of the winning template variation
    - `test_sent_at` string, date-time, nullable — When the A/B test was sent
    - `winner_sent_at` string, date-time, nullable — When the winning variation was sent
    - `enqueued_count` integer — Number of emails added to the queue by orchestrator
    - `test_phase_recipient_count` integer — Number of recipients in test phase
    - `winner_phase_recipient_count` integer — Number of recipients in winner phase
    - `created_at` string, date-time — When the broadcast was created
    - `updated_at` string, date-time — When the broadcast was last updated
    - `started_at` string, date-time, nullable — When the broadcast started sending
    - `completed_at` string, date-time, nullable — When the broadcast completed sending
    - `cancelled_at` string, date-time, nullable — When the broadcast was cancelled
    - `paused_at` string, date-time, nullable — When the broadcast was paused
    - `pause_reason` string, nullable — Reason for pausing the broadcast

## Other responses

- `400` — Bad request - validation failed
- `401` — Unauthorized - invalid or missing authentication token
- `404` — Broadcast not found
- `500` — Internal server error

## Changes

- **2026-02-08** `b6f612d3daaa` — 2 info
  - added the new optional request property `data_feed`
  - added the optional property `broadcast/data_feed` to the response with the `200` status
- **2025-12-31** `e42f05599d8a` — 2 warning, 3 info
  - added the new `processed` enum value to the `broadcast/status` response property for the response status `200`
  - added the new `processing` enum value to the `broadcast/status` response property for the response status `200`
  - added the optional property `broadcast/enqueued_count` to the response with the `200` status
  - removed the `sending` enum value from the `broadcast/status` response property for the response status `200`
  - …1 more
- **2025-11-29** `c39acad12e49` — 2 breaking, 4 warning, 1 info
  - added the new required request property `audience/list`
  - removed the required property `broadcast/audience/lists` from the response with the `200` status
  - removed the request property `audience/lists`
  - removed the request property `audience/skip_duplicate_emails`
  - …3 more
- **2025-11-14** `6f682a51f76f` — 2 breaking, 1 warning, 4 info
  - added the new required request property `audience/lists`
  - removed the required property `broadcast/audience/list` from the response with the `200` status
  - removed the request property `audience/list`
  - added the new optional request property `audience/skip_duplicate_emails`
  - …3 more
- **2025-11-14** `940c5636d0b4` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/pierre-b/apis/notifuse-api/changes/api/broadcasts.update/post.md)

---

[API](https://skmtc.dev/pierre-b/apis/notifuse-api.md) · [All operations](https://skmtc.dev/pierre-b/apis/notifuse-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/pierre-b/notifuse-api/revisions/d26605f2fc47/schema)
