Create Campaign
Creates one campaign for each flight in the request.
const url = 'https://backend.podscribe.ai/api/public/campaign';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"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)"]}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}import requests
url = "https://backend.podscribe.ai/api/public/campaign"
payload = { "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)"]}headers = { "Authorization": "Bearer <token>", "Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.json())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)" ] }'Request Bodyrequired
Section titled “Request Bodyrequired”Campaign name
Publisher name (lookup). Optional when itunesOrYtId is provided; then the publisher is inferred from the show.
Advertiser name
Campaign type. The allowed values depend on mediaType.
DAI: each flight needsstartDateandendDate. Not available foryoutubeorrumble.Baked-in: each flight needsexpectedDate. Not forstreaming,sai,ott_ctv,display,video,display_videoorradio.story,reel,feed: Instagram formats, only formediaTypeinstagram. Each flight needsexpectedDate.
Flights of the campaign
Array<{startDate,endDate,expectedDate,4 more}>
Start of the flight in ISO format. Required for DAI.
End of the flight in ISO format. Required for DAI.
Expected air date in ISO format. Required for Baked-in, story, reel and feed.
Rate of the campaign
Cpm rate of the campaign
Currency code (USD, EUR, GBP).
Expected impressions of the campaign
External ID of the campaign
Podcast iTunes ID, YouTube channel or playlist ID, or Rumble channel name (rumble.com/c/<name>) for rumble. See mediaType for other platforms.
Country
Expected units of the campaign
Array<{position,length}>
Ad position
Ad length in seconds
The discount code
Expected landing URL of the campaign
Product metadata
Initiative metadata
Expected talking points
Disallowed talking points
Where the ad runs, and the type values it takes.
podcast: podcast ad.DAIorBaked-in.youtube: YouTube video ad.Baked-inonly.simulcast: podcast ad also run on its linked channels.DAIorBaked-in. Send the podcast’s iTunes ID. Adds a campaign per channel; the response lists only the podcast’s.streaming: streaming audio ad.DAIonly.sai: Spotify SAI (Streaming Ad Insertion) ad.DAIonly.ott_ctv: CTV / OTT ad.DAIonly.display: display ad.DAIonly.video: video ad.DAIonly.display_video: legacy combined display and video; usedisplayorvideo.DAIonly.radio: radio ad.DAIonly. NeedsweekdaysTimeandpublisher; no station selection.rumble: Rumble video ad.Baked-inonly.twitter: Twitter post.DAIorBaked-in.twitch: Twitch stream ad.DAIorBaked-in.tiktok: TikTok post.DAIorBaked-in.instagram: Instagram post.story,reelorfeed.spotify: Spotify podcast ad.DAIorBaked-in.spotifyvideo: Spotify video ad.DAIorBaked-in.dailywire: Daily Wire ad.DAIorBaked-in.radio_show: radio show ad.DAIorBaked-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.
Tags
Script URL of the campaign
Team members metadata
Creative IDs metadata
Bill the campaign to the publisher’s billing account. Not allowed for publisher accounts.
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).
Example
[ "MTuWThF (09:00 AM-05:30 PM)", "Sa (10:00 PM-02:00 AM)"]Response Body
Section titled “Response Body”The created campaigns, one per flight, in the order of flights.
ID of the campaign
External ID of the campaign
{ "campaigns": [ { "id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "externalId": "example" } ]}