> ## Documentation Index
> Fetch the complete documentation index at: https://www.vobiz.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Update a broadcast

> Changes a `draft` broadcast. Send only the fields you want to change; fields you leave out, or send as `null`, keep their value, except `scheduledAt`, where `null` or `""` clears a scheduled start.



## OpenAPI

````yaml openapi-sms.yaml PUT /broadcasts/{id}
openapi: 3.0.3
info:
  title: Vobiz Messaging API
  description: >
    Send and receive SMS, MMS and RCS messages, buy messaging numbers, register
    for

    US 10DLC and toll-free, run broadcasts, manage conversations, opt-outs and
    webhooks.


    **Base URL:** `https://api.vobiz.ai/api/v1/sms`


    **Authentication:** every request needs the `X-Auth-ID` and `X-Auth-Token`
    headers.

    The account is taken from your credentials; you never put an account ID in a
    path or body.

    Field names in this API are camelCase.
  version: '1.0'
  contact:
    email: support@vobiz.ai
    url: https://vobiz.ai
servers:
  - url: https://api.vobiz.ai/api/v1/sms
    description: Production
security:
  - AuthID: []
    AuthToken: []
tags:
  - name: Messages
    description: Send messages and inspect their delivery state.
  - name: Numbers
    description: >-
      Messaging-capable numbers on your account, inventory search, purchase and
      release.
  - name: Coverage
    description: Where you can send, per country.
  - name: Conversations
    description: Two-way threads between one of your numbers and a contact.
  - name: Opt-outs
    description: Numbers that must not receive messages on a channel.
  - name: Webhooks
    description: Subscriptions that deliver message and broadcast events to your server.
  - name: Broadcasts
    description: Bulk sends from an uploaded recipient list.
  - name: RCS Senders
    description: RCS sender (agent) identities and their message templates.
  - name: 10DLC Brands
    description: US 10DLC brand registration.
  - name: 10DLC Campaigns
    description: US 10DLC campaigns, toll-free verification and supporting documents.
paths:
  /broadcasts/{id}:
    parameters:
      - name: id
        in: path
        required: true
        description: >-
          The broadcast's `id` (UUID), as returned by `POST /broadcasts` or `GET
          /broadcasts`. An id that is not a UUID, or that belongs to another
          account, returns `404` with `broadcast not found`.
        schema:
          type: string
          format: uuid
        example: 3f8d2a6e-5b1c-4e7f-a9d0-2c4b6e8f1a35
    put:
      tags:
        - Broadcasts
      summary: Update a broadcast
      description: >-
        Changes a `draft` broadcast. Send only the fields you want to change;
        fields you leave out, or send as `null`, keep their value, except
        `scheduledAt`, where `null` or `""` clears a scheduled start. The same
        validation as create applies, so `name` and `from` cannot be set to an
        empty string. A broadcast in any other status returns `409` with `cannot
        edit a broadcast that is <status>`.
      operationId: update-broadcast
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BroadcastUpdateInput'
            examples:
              template:
                summary: Change the template
                value:
                  template: Hi {{name}}, your refund of {{amount}} has been issued.
              clearSchedule:
                summary: Clear a scheduled start
                value:
                  scheduledAt: null
      responses:
        '200':
          description: The updated broadcast.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Broadcast'
              example:
                id: 3f8d2a6e-5b1c-4e7f-a9d0-2c4b6e8f1a35
                accountId: MA_XXXXXXXX
                name: October pricing update
                from: '+14155550100'
                channel: sms
                template: Hi {{name}}, your refund of {{amount}} has been issued.
                status: draft
                scheduledAt: null
                ratePerSecond: 5
                tag: pricing-oct
                dltEntityId: ''
                dltHeaderId: ''
                dltTemplateId: ''
                columns:
                  - phone
                  - name
                  - amount
                stats:
                  total: 3
                  pending: 3
                  sent: 0
                  delivered: 0
                  failed: 0
                  optedOut: 0
                  skipped: 0
                createdAt: '2026-10-12T10:30:00Z'
                updatedAt: '2026-10-12T10:42:00Z'
                startedAt: null
                completedAt: null
        '400':
          description: A field is invalid. Same messages as `POST /broadcasts`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error: ratePerSecond must be between 1 and 50
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          description: The broadcast does not exist on your account.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error: broadcast not found
        '409':
          description: The broadcast is no longer a draft.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error: cannot edit a broadcast that is running
      x-codeSamples:
        - lang: typescript
          label: Node SDK
          source: >
            import { VobizClient } from "@vobiz/sdk";


            const client = new VobizClient({ apiKey: "MA_XXXXXXXX", authToken:
            "YOUR_AUTH_TOKEN" });


            await client.sms.broadcasts.updateBroadcast({
                id: "3f8d2a6e-5b1c-4e7f-a9d0-2c4b6e8f1a35",
                body: {
                    template: "Hi {{name}}, your refund of {{amount}} has been issued."
                }
            })
        - lang: python
          label: Python SDK
          source: |
            from vobiz import Vobiz

            client = Vobiz(api_key="MA_XXXXXXXX", auth_token="YOUR_AUTH_TOKEN")

            client.sms.broadcasts.update_broadcast(
                id="3f8d2a6e-5b1c-4e7f-a9d0-2c4b6e8f1a35",
                template="Hi {{name}}, your refund of {{amount}} has been issued.",
            )
        - lang: go
          label: Go SDK
          source: |
            import (
                "context"

                vobiz "github.com/vobiz-ai/Vobiz-Go-SDK"
                "github.com/vobiz-ai/Vobiz-Go-SDK/client"
                "github.com/vobiz-ai/Vobiz-Go-SDK/option"
                "github.com/vobiz-ai/Vobiz-Go-SDK/sms"
            )

            c := client.NewClient(
                option.WithAPIKey("MA_XXXXXXXX"),
                option.WithAuthToken("YOUR_AUTH_TOKEN"),
            )

            request := &sms.UpdateBroadcastRequest{
                    ID: "3f8d2a6e-5b1c-4e7f-a9d0-2c4b6e8f1a35",
                    Body: &sms.BroadcastUpdateInput{
                        Template: vobiz.String(
                            "Hi {{name}}, your refund of {{amount}} has been issued.",
                        ),
                    },
                }
            c.Sms.Broadcasts.UpdateBroadcast(
                    context.TODO(),
                    request,
                )
        - lang: java
          label: Java SDK
          source: |
            import com.vobiz.api.VobizApiClient;

            VobizApiClient client = VobizApiClient
                .builder()
                .apiKey("MA_XXXXXXXX")
                .authToken("YOUR_AUTH_TOKEN")
                .build();

            client.sms().broadcasts().updateBroadcast(
                "3f8d2a6e-5b1c-4e7f-a9d0-2c4b6e8f1a35",
                UpdateBroadcastRequest
                    .builder()
                    .body(
                        BroadcastUpdateInput
                            .builder()
                            .template("Hi {{name}}, your refund of {{amount}} has been issued.")
                            .build()
                    )
                    .build()
            );
        - lang: ruby
          label: Ruby SDK
          source: >
            require 'vobiz'


            client = Vobiz::Client.new(api_key: 'MA_XXXXXXXX', auth_token:
            'YOUR_AUTH_TOKEN')


            client.sms.broadcasts.update_broadcast(
              id: "3f8d2a6e-5b1c-4e7f-a9d0-2c4b6e8f1a35",
              template: "Hi {{name}}, your refund of {{amount}} has been issued."
            )
        - lang: csharp
          label: C# SDK
          source: |
            using Vobiz;
            using Vobiz.Sms;

            var client = new VobizApiClient("YOUR_AUTH_TOKEN", "MA_XXXXXXXX");

            await client.Sms.Broadcasts.UpdateBroadcastAsync(
                new UpdateBroadcastRequest
                {
                    Id = "3f8d2a6e-5b1c-4e7f-a9d0-2c4b6e8f1a35",
                    Body = new BroadcastUpdateInput
                    {
                        Template = "Hi {{name}}, your refund of {{amount}} has been issued.",
                    },
                }
            );
        - lang: php
          label: PHP SDK
          source: >
            <?php


            require 'vendor/autoload.php';


            use Vobiz\VobizClient;


            $client = new VobizClient(apiKey: 'MA_XXXXXXXX', authToken:
            'YOUR_AUTH_TOKEN');


            $client->sms->broadcasts->updateBroadcast(
                '3f8d2a6e-5b1c-4e7f-a9d0-2c4b6e8f1a35',
                new UpdateBroadcastRequest([
                    'body' => new BroadcastUpdateInput([
                        'template' => 'Hi {{name}}, your refund of {{amount}} has been issued.',
                    ]),
                ]),
            );
components:
  schemas:
    BroadcastUpdateInput:
      type: object
      description: >-
        Broadcast fields you can change on a draft. Every field is optional;
        fields you leave out keep their value, and the same validation as create
        applies.
      properties:
        name:
          type: string
          maxLength: 255
          description: >-
            A label for the broadcast in the console and in listings, 1 to 255
            characters. Required on create; on update it cannot be set to an
            empty string.
          example: October pricing update
        from:
          type: string
          description: >-
            The sender every message goes out from: an SMS number on your
            account in E.164 format, a short code of up to 8 digits, or an
            alphanumeric sender ID of 1 to 11 letters, digits and spaces that
            starts with a letter or digit. Spaces, hyphens and brackets in phone
            numbers are removed before storing. Launch checks that a
            phone-number sender is an SMS number on your account. Required on
            create.
          example: '+14155550100'
        channel:
          type: string
          enum:
            - sms
          default: sms
          description: >-
            The channel the broadcast sends on. Broadcasts send SMS, so the only
            value is `sms` (matched case-insensitively), which is also the
            default.
        template:
          type: string
          maxLength: 5000
          description: >-
            Message body, up to 5,000 characters, with `{{variable}}`
            placeholders filled per recipient from the columns of your upload.
            Placeholder names are matched case-insensitively and trimmed, so `{{
            Name }}` matches a `name` column. Launch requires a non-empty
            template.
          example: Hi {{name}}, your refund of {{amount}} is on its way.
        scheduledAt:
          type: string
          format: date-time
          nullable: true
          description: >-
            RFC 3339 timestamp at which sending starts after you launch, for
            example `2026-11-01T09:00:00Z`; offsets are converted to UTC. Omit
            it, or pass `null` or `""`, to send as soon as you launch. On
            update, `null` clears a previous value.
          example: '2026-10-15T09:00:00Z'
        ratePerSecond:
          type: integer
          minimum: 1
          maximum: 50
          default: 5
          description: >-
            Maximum messages sent per second while the broadcast runs, an
            integer from 1 to 50. Defaults to 5, and `0` also selects the
            default. Lower it to spread load on your own systems or replies.
          example: 5
        tag:
          type: string
          maxLength: 255
          description: >-
            Your own label of up to 255 characters, copied onto every message
            the broadcast sends so you can find them with the `tag` filter on
            `GET /messages`.
          example: pricing-oct
        dltEntityId:
          type: string
          maxLength: 64
          description: >-
            India (TRAI DLT). The Principal Entity ID you registered on a TRAI
            DLT portal, up to 64 characters. Pass it when the list contains
            Indian numbers; it is copied onto every message.
        dltHeaderId:
          type: string
          maxLength: 64
          description: >-
            India (TRAI DLT). The sender header ID you registered on a TRAI DLT
            portal, up to 64 characters. Copied onto every message.
        dltTemplateId:
          type: string
          maxLength: 64
          description: >-
            India (TRAI DLT). The content template ID you registered on a TRAI
            DLT portal, up to 64 characters. Your template text must match the
            registered template with the variables filled.
    Broadcast:
      type: object
      description: >-
        A bulk SMS send that renders one template for every recipient of an
        uploaded list and sends at a controlled rate. Its `status` moves from
        `draft` through `scheduled` or `running` to `completed`, `cancelled` or
        `failed`, and `stats` counts recipients by state.
      properties:
        id:
          type: string
          format: uuid
          example: 3f8d2a6e-5b1c-4e7f-a9d0-2c4b6e8f1a35
          description: >-
            Unique identifier of the broadcast (UUID). Use it in every
            `/broadcasts/{id}` path.
        accountId:
          type: string
          description: Your Vobiz account ID (`MA_...`) that owns the broadcast.
          example: MA_XXXXXXXX
        name:
          type: string
          example: October pricing update
          description: >-
            The label you gave the broadcast, shown in the console and in
            listings.
        from:
          type: string
          description: >-
            The sender every message goes out from, as stored: an E.164 number,
            a short code or an alphanumeric sender ID.
          example: '+14155550100'
        channel:
          type: string
          enum:
            - sms
          example: sms
          description: The channel the broadcast sends on. Always `sms`.
        template:
          type: string
          description: >-
            The message body with `{{variable}}` placeholders, filled per
            recipient from the columns of the upload. Empty until you set it.
          example: Hi {{name}}, your refund of {{amount}} is on its way.
        status:
          type: string
          enum:
            - draft
            - scheduled
            - running
            - paused
            - completed
            - cancelled
            - failed
          description: >-
            Lifecycle state. `draft` until you launch, then `scheduled` (waiting
            for `scheduledAt`) or `running`. `paused` after a pause call or when
            `pauseReason` is set; `completed` once every recipient is processed;
            `cancelled` after a cancel call; `failed` when the run stopped on an
            error.
          example: draft
        pauseReason:
          type: string
          enum:
            - insufficient_balance
          description: >-
            Present only while the broadcast is paused for a reason other than
            your own pause call. `insufficient_balance` means the balance ran
            out; top up and call `POST /broadcasts/{id}/resume`.
        scheduledAt:
          type: string
          format: date-time
          nullable: true
          description: >-
            When sending starts after launch, in UTC (ISO 8601). `null` means
            sending starts as soon as you launch.
          example: null
        ratePerSecond:
          type: integer
          description: Maximum messages sent per second while running, from 1 to 50.
          example: 5
        tag:
          type: string
          description: >-
            Your label, copied onto every message the broadcast sends. Empty
            string when not set.
          example: ''
        dltEntityId:
          type: string
          description: >-
            India (TRAI DLT). The Principal Entity ID copied onto every message.
            Empty string when not set.
          example: ''
        dltHeaderId:
          type: string
          description: >-
            India (TRAI DLT). The registered sender header ID copied onto every
            message. Empty string when not set.
          example: ''
        dltTemplateId:
          type: string
          description: >-
            India (TRAI DLT). The registered content template ID copied onto
            every message. Empty string when not set.
          example: ''
        columns:
          type: array
          nullable: true
          description: >-
            Column names from the latest recipient upload, as written in your
            file header. The first is the phone column and the rest are
            available as template variables. Empty until you upload recipients.
          items:
            type: string
          example: null
        stats:
          allOf:
            - $ref: '#/components/schemas/BroadcastStats'
          description: Recipient counts by state, recounted on every read.
        createdAt:
          type: string
          format: date-time
          example: '2026-10-12T10:30:00Z'
          description: When the broadcast was created (ISO 8601, UTC).
        updatedAt:
          type: string
          format: date-time
          example: '2026-10-12T10:30:00Z'
          description: >-
            When the broadcast last changed, including status changes (ISO 8601,
            UTC).
        startedAt:
          type: string
          format: date-time
          nullable: true
          description: When sending began (ISO 8601, UTC). `null` until the broadcast runs.
          example: null
        completedAt:
          type: string
          format: date-time
          nullable: true
          description: >-
            When the broadcast finished, either because the last recipient was
            processed or because it was cancelled (ISO 8601, UTC). `null` until
            then.
          example: null
    Error:
      type: object
      description: >-
        The body of every error response: a flat object with one `error` string
        that explains what went wrong. Use the HTTP status code to decide how to
        handle the error, and log `error` for diagnosis.
      required:
        - error
      properties:
        error:
          type: string
          example: 'recipient has opted out: +14155550123'
          description: >-
            Human-readable explanation of the error, for example `phoneNumber is
            required` or `recipient has opted out: +14155550123`. Branch on the
            HTTP status code rather than on this text.
    BroadcastStats:
      type: object
      description: >-
        Counts of the broadcast's stored recipients by state, recounted every
        time you read the broadcast.
      properties:
        total:
          type: integer
          description: >-
            Recipients stored on the broadcast, including opted-out ones.
            Invalid rows and duplicates from the upload are not stored and not
            counted.
          example: 3
        pending:
          type: integer
          description: Recipients still waiting to be sent.
          example: 0
        sent:
          type: integer
          example: 3
          description: >-
            Recipients whose message was accepted for sending and has no
            delivery report yet.
        delivered:
          type: integer
          example: 0
          description: Recipients whose message was reported delivered.
        failed:
          type: integer
          example: 0
          description: Recipients whose message failed. Their `errorCode` says why.
        optedOut:
          type: integer
          description: >-
            Recipients excluded because the number opted out of SMS from you.
            They are never sent.
          example: 0
        skipped:
          type: integer
          description: Recipients that were still pending when the broadcast was cancelled.
          example: 0
  responses:
    Unauthorized:
      description: Missing or invalid `X-Auth-ID` / `X-Auth-Token`.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: missing or invalid credentials
  securitySchemes:
    AuthID:
      type: apiKey
      in: header
      name: X-Auth-ID
      description: Your Vobiz account Auth ID (`MA_XXXXXXXX`).
    AuthToken:
      type: apiKey
      in: header
      name: X-Auth-Token
      description: Your Vobiz account Auth Token.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.