Skip to content

Create Campaign

POST
/api/public/campaign

Creates one campaign for each flight in the request.

Create Campaign
curl --request POST \
--url https://backend.podscribe.ai/api/public/campaign \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "name": "example", "publisher": "example", "advertiser": "example", "type": "Baked-in", "flights": [ { "startDate": "2026-04-15T12:00:00Z", "endDate": "2026-04-15T12:00:00Z", "expectedDate": "2026-04-15T12:00:00Z", "totalCost": 1, "cpm": 1, "currency": "USD", "expectedImpressions": 1 } ], "externalId": "example", "itunesOrYtId": "example", "geo": "GLOBAL", "expectedUnits": [ { "position": "pre", "length": 1 } ], "promo": "example", "expectedLandingUrl": "https://example.com", "product": "example", "initiative": "example", "expectedTalkingPoints": [ "example" ], "disallowedTalkingPoints": [ "example" ], "mediaType": "podcast", "tags": [ "example" ], "scriptUrl": "https://example.com", "teamMembers": [ "example" ], "creativeIds": [ "example" ], "billToPublisher": false, "weekdaysTime": [ "MTuWThF (09:00 AM-05:30 PM)", "Sa (10:00 PM-02:00 AM)" ] }'
Media typeapplication/json
name
required

Campaign name

string
publisher

Publisher name (lookup). Optional when itunesOrYtId is provided; then the publisher is inferred from the show.

string
advertiser
required

Advertiser name

string
type
required

Campaign type. The allowed values depend on mediaType.

  • DAI: each flight needs startDate and endDate. Not available for youtube or rumble.
  • Baked-in: each flight needs expectedDate. Not for streaming, sai, ott_ctv, display, video, display_video or radio.
  • story, reel, feed: Instagram formats, only for mediaType instagram. Each flight needs expectedDate.
Allowed values: Baked-in DAI story reel feed
flights
required

Flights of the campaign

Array<{startDate,endDate,expectedDate,4 more}>
startDate

Start of the flight in ISO format. Required for DAI.

string<date-time>
endDate

End of the flight in ISO format. Required for DAI.

string<date-time>
expectedDate

Expected air date in ISO format. Required for Baked-in, story, reel and feed.

string<date-time>
totalCost

Rate of the campaign

number
cpm

Cpm rate of the campaign

number
currency

Currency code (USD, EUR, GBP).

Default value: USD
Allowed values: USD EUR GBP
expectedImpressions

Expected impressions of the campaign

number
externalId

External ID of the campaign

string
itunesOrYtId

Podcast iTunes ID, YouTube channel or playlist ID, or Rumble channel name (rumble.com/c/<name>) for rumble. See mediaType for other platforms.

string
geo

Country

Default value: GLOBAL
Allowed values: GLOBAL US GB CA AU DE FR MX IE JP ES IN BR IT AR KR SA AE ID EG AT NL DK FI IL NO NZ SE TR RU
25 moreLess
expectedUnits

Expected units of the campaign

Array<{position,length}>
position
required

Ad position

Allowed values: pre mid post feed drop
length
required

Ad length in seconds

number
promo

The discount code

string
expectedLandingUrl

Expected landing URL of the campaign

string<uri>
product

Product metadata

string
initiative

Initiative metadata

string
expectedTalkingPoints

Expected talking points

Array<string>
disallowedTalkingPoints

Disallowed talking points

Array<string>
mediaType

Where the ad runs, and the type values it takes.

  • podcast: podcast ad. DAI or Baked-in.
  • youtube: YouTube video ad. Baked-in only.
  • simulcast: podcast ad also run on its linked channels. DAI or Baked-in. Send the podcast’s iTunes ID. Adds a campaign per channel; the response lists only the podcast’s.
  • streaming: streaming audio ad. DAI only.
  • sai: Spotify SAI (Streaming Ad Insertion) ad. DAI only.
  • ott_ctv: CTV / OTT ad. DAI only.
  • display: display ad. DAI only.
  • video: video ad. DAI only.
  • display_video: legacy combined display and video; use display or video. DAI only.
  • radio: radio ad. DAI only. Needs weekdaysTime and publisher; no station selection.
  • rumble: Rumble video ad. Baked-in only.
  • twitter: Twitter post. DAI or Baked-in.
  • twitch: Twitch stream ad. DAI or Baked-in.
  • tiktok: TikTok post. DAI or Baked-in.
  • instagram: Instagram post. story, reel or feed.
  • spotify: Spotify podcast ad. DAI or Baked-in.
  • spotifyvideo: Spotify video ad. DAI or Baked-in.
  • dailywire: Daily Wire ad. DAI or Baked-in.
  • radio_show: radio show ad. DAI or Baked-in.

For youtube, twitter, twitch, tiktok, instagram: send a podcast iTunes ID; the campaign goes to its linked channel or account there, else to the podcast. youtube also takes a channel or playlist ID.

For rumble: send a Rumble channel name, or a podcast iTunes ID to use its linked Rumble channel; no linked channel returns 400.

Every mediaType takes itunesOrYtId for one show, or only publisher to run across that publisher’s network.

Default value: podcast
Allowed values: podcast youtube simulcast streaming sai ott_ctv display video twitter twitch tiktok instagram rumble spotify spotifyvideo dailywire display_video radio radio_show
14 moreLess
tags

Tags

Array<string>
scriptUrl

Script URL of the campaign

string<uri>
teamMembers

Team members metadata

Array<string>
creativeIds

Creative IDs metadata

Array<string>
billToPublisher

Bill the campaign to the publisher’s billing account. Not allowed for publisher accounts.

boolean
Default value: false
weekdaysTime

Radio ad days and hours. Required for radio, not allowed for other media types. Format: weekdays in Su M Tu W Th F Sa order, then a 12-hour range, e.g. MTuWThF (09:00 AM-05:30 PM).

Array<string>
Allowed length: (non-empty)
Example
[
"MTuWThF (09:00 AM-05:30 PM)",
"Sa (10:00 PM-02:00 AM)"
]
Media typeapplication/json
campaigns
required

The created campaigns, one per flight, in the order of flights.

Array
id
required

ID of the campaign

string<uuid>
externalId

External ID of the campaign

string nullable
Response example
{
"campaigns": [
{
"id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"externalId": "example"
}
]
}