---
title: "Create a new broadcast ad"
method: POST
path: "/measurement/campaigns/{campaign_id}/broadcast_ads"
tags: ["Broadcast ads"]
---

# Create a new broadcast ad

`POST /measurement/campaigns/{campaign_id}/broadcast_ads`

## Request

- Base URL: `https://api.magellan.ai/v2`
- URL: `https://api.magellan.ai/v2/measurement/campaigns/{campaign_id}/broadcast_ads`
- Auth: API key in header `Authorization`

Generates a tag to be fired when the broadcast exposure occurs. Ads are part of a Campaign. If an ad with the provided `orderIds` already exists within the same campaign, the existing ad is returned rather than creating a new one.

## Path parameters

- `campaign_id` string, required

## Request body

- object: Provide the ad payload under `measurementBroadcastAd`. The `measurementDynamicAd` key is accepted for backwards compatibility but deprecated.
  - `measurementBroadcastAd` BroadcastAdCreateAttributes
    - `name` string, required: The name of the ad.
    - `uid` string: The unique identifier for the ad.
    - `defaultAdServer` 'acast' | 'adarcade' | 'adswizz' | 'amperwave' | 'art19' | 'audioboom' | 'audiohook' | 'audiomeans' | 'barstool' | 'basis' | 'beeswax' | 'beeswax_pod' | 'beeswax_stream' | 'dax' | 'dovetail' | 'dv_360' | 'frequency_ads' | 'gam' | 'gt_impression' | 'iheart_pd' | 'iheart_stream' | 'mediamath' | 'megaphone' | 'omny' | 'podbean' | 'redcircle' | 'sas' | 'simplecast' | 'soundcast' | 'soundstack' | 'spgam' | 'spotify' | 'spreaker' | 'tap' | 'transistor' | 'triton' | 'triton_pd' | 'triton_streaming' | 'ttd' | 'xandr' | 'xandr_pod' | 'xandr_stream'
    - `orderIds` integer[], required: The Salesforce order ID(s) for this ad. Must be provided as an array; only the first value will be processed.
    - `source` 'national' | 'market', required
  - `measurementDynamicAd` BroadcastAdCreateAttributes
    - `name` string, required: The name of the ad.
    - `uid` string: The unique identifier for the ad.
    - `defaultAdServer` 'acast' | 'adarcade' | 'adswizz' | 'amperwave' | 'art19' | 'audioboom' | 'audiohook' | 'audiomeans' | 'barstool' | 'basis' | 'beeswax' | 'beeswax_pod' | 'beeswax_stream' | 'dax' | 'dovetail' | 'dv_360' | 'frequency_ads' | 'gam' | 'gt_impression' | 'iheart_pd' | 'iheart_stream' | 'mediamath' | 'megaphone' | 'omny' | 'podbean' | 'redcircle' | 'sas' | 'simplecast' | 'soundcast' | 'soundstack' | 'spgam' | 'spotify' | 'spreaker' | 'tap' | 'transistor' | 'triton' | 'triton_pd' | 'triton_streaming' | 'ttd' | 'xandr' | 'xandr_pod' | 'xandr_stream'
    - `orderIds` integer[], required: The Salesforce order ID(s) for this ad. Must be provided as an array; only the first value will be processed.
    - `source` 'national' | 'market', required

## Response `200`

OK — An ad with the provided `orderIds` already exists within this campaign; the existing ad is returned.

- object
  - `measurementBroadcastAd` BroadcastAdResponseBody
    - `id` string
    - `name` string
    - `uid` string
    - `adServer` 'acast' | 'adarcade' | 'adswizz' | 'amperwave' | 'art19' | 'audioboom' | 'audiohook' | 'audiomeans' | 'barstool' | 'basis' | 'beeswax' | 'beeswax_pod' | 'beeswax_stream' | 'dax' | 'dovetail' | 'dv_360' | 'frequency_ads' | 'gam' | 'gt_impression' | 'iheart_pd' | 'iheart_stream' | 'mediamath' | 'megaphone' | 'omny' | 'podbean' | 'redcircle' | 'sas' | 'simplecast' | 'soundcast' | 'soundstack' | 'spgam' | 'spotify' | 'spreaker' | 'tap' | 'transistor' | 'triton' | 'triton_pd' | 'triton_streaming' | 'ttd' | 'xandr' | 'xandr_pod' | 'xandr_stream'
    - `streaming` boolean: Whether this ad is a streaming ad.
    - `cohorts` AdCohort[]: The cohorts and sub-cohorts currently assigned to this ad's line item.
      - `cohortName` string, required: Name of the cohort (shown as a Group in the dashboard), unique within the ad's campaign. Created on first use if no cohort of this name exists for the campaign.
      - `subCohortName` string, required: Name of the sub-cohort (shown as a Sub-group in the dashboard), unique within the cohort. Created on first use if no sub-cohort of this name exists in the cohort.
    - `campaign` CampaignWithParent
      - `id` string
      - `name` string
      - `startDate` string, date
      - `endDate` string, date
      - `attributionMethodology` 'last_touch' | 'equal_credit'
      - `operativeId` string
      - `salesforceId` string
      - `customEvents` CustomViewEvent[]
        - `id` integer: Magellan AI's ID for the custom view event.
        - `label` string
        - `pattern` string
      - `pixel` Pixel
        - `id` string
        - `name` string
        - `brand` object
          - `crmBrandId` string
          - `name` string
          - `domain` string, nullable: The domain from the pixel owner's CRM brand sync for this brand (the value the owning client sent to `POST /crm_brand_syncs`). Null when the owning client has no CRM brand sync for the brand.
    - `flights` object[]
      - `startDate` string, date, required
      - `endDate` string, date, required
      - `expectedImpressions` integer
      - `impressionCap` integer
      - `cpm` number
      - `costPerSpot` number
      - `uid` string
  - `measurementDynamicAd` BroadcastAdResponseBody
    - `id` string
    - `name` string
    - `uid` string
    - `adServer` 'acast' | 'adarcade' | 'adswizz' | 'amperwave' | 'art19' | 'audioboom' | 'audiohook' | 'audiomeans' | 'barstool' | 'basis' | 'beeswax' | 'beeswax_pod' | 'beeswax_stream' | 'dax' | 'dovetail' | 'dv_360' | 'frequency_ads' | 'gam' | 'gt_impression' | 'iheart_pd' | 'iheart_stream' | 'mediamath' | 'megaphone' | 'omny' | 'podbean' | 'redcircle' | 'sas' | 'simplecast' | 'soundcast' | 'soundstack' | 'spgam' | 'spotify' | 'spreaker' | 'tap' | 'transistor' | 'triton' | 'triton_pd' | 'triton_streaming' | 'ttd' | 'xandr' | 'xandr_pod' | 'xandr_stream'
    - `streaming` boolean: Whether this ad is a streaming ad.
    - `cohorts` AdCohort[]: The cohorts and sub-cohorts currently assigned to this ad's line item.
      - `cohortName` string, required: Name of the cohort (shown as a Group in the dashboard), unique within the ad's campaign. Created on first use if no cohort of this name exists for the campaign.
      - `subCohortName` string, required: Name of the sub-cohort (shown as a Sub-group in the dashboard), unique within the cohort. Created on first use if no sub-cohort of this name exists in the cohort.
    - `campaign` CampaignWithParent
      - `id` string
      - `name` string
      - `startDate` string, date
      - `endDate` string, date
      - `attributionMethodology` 'last_touch' | 'equal_credit'
      - `operativeId` string
      - `salesforceId` string
      - `customEvents` CustomViewEvent[]
        - `id` integer: Magellan AI's ID for the custom view event.
        - `label` string
        - `pattern` string
      - `pixel` Pixel
        - `id` string
        - `name` string
        - `brand` object
          - `crmBrandId` string
          - `name` string
          - `domain` string, nullable: The domain from the pixel owner's CRM brand sync for this brand (the value the owning client sent to `POST /crm_brand_syncs`). Null when the owning client has no CRM brand sync for the brand.
    - `flights` object[]
      - `startDate` string, date, required
      - `endDate` string, date, required
      - `expectedImpressions` integer
      - `impressionCap` integer
      - `cpm` number
      - `costPerSpot` number
      - `uid` string
  - `notice` string: Runtime deprecation notice for `measurementDynamicAd`. Present on all broadcast-ad responses while the deprecated alias is still returned.

## Other responses

- `201`: Created
- `400`: The request body is missing its top-level resource key, such as `measurementCampaign`, or that key is empty.
- `401`: Unauthorized. When the access token is missing, invalid, expired or revoked, the body is empty. When the token is valid but its user may not access the resource, the body is an `Error`.
- `403`: The access token has a scope, such as an MCP token. The v2 API only accepts unscoped tokens.
- `404`: Not Found
- `422`: Unprocessable Content

## Changes

- **2026-11-03** `beceb462c707`: 1 warning, 13 info
  - removed the optional property `message` from the response with the `422` status
  - added the media type `application/json` for the response with the status `401`
  - added the media type `application/json` for the response with the status `404`
  - added the non-success response with the status `400`
  - …10 more

[Operation history](https://skmtc.dev/magellan/apis/magellan-ai-api/changes/measurement/campaigns/:campaign_id/broadcast_ads/post.md)

---

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