Update Campaign
Updates a campaign’s dates, cost, units and other details.
const url = 'https://backend.podscribe.ai/api/public/campaign/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0';const options = { method: 'PUT', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"type":"Baked-in","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,"itunesOrYtId":"example","geo":"GLOBAL","expectedUnits":[[{"position":"pre","length":1}]],"promo":"example","expectedLandingUrl":"https://example.com","product":"example","initiative":"example","mediaType":"podcast","tags":["example"],"teamMembers":["example"],"creativeIds":["example"],"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/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0"
payload = { "type": "Baked-in", "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, "itunesOrYtId": "example", "geo": "GLOBAL", "expectedUnits": [[ { "position": "pre", "length": 1 } ]], "promo": "example", "expectedLandingUrl": "https://example.com", "product": "example", "initiative": "example", "mediaType": "podcast", "tags": ["example"], "teamMembers": ["example"], "creativeIds": ["example"], "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.put(url, json=payload, headers=headers)
print(response.json())curl --request PUT \ --url https://backend.podscribe.ai/api/public/campaign/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0 \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "type": "Baked-in", "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, "itunesOrYtId": "example", "geo": "GLOBAL", "expectedUnits": [ [ { "position": "pre", "length": 1 } ] ], "promo": "example", "expectedLandingUrl": "https://example.com", "product": "example", "initiative": "example", "mediaType": "podcast", "tags": [ "example" ], "teamMembers": [ "example" ], "creativeIds": [ "example" ], "weekdaysTime": [ "MTuWThF (09:00 AM-05:30 PM)", "Sa (10:00 PM-02:00 AM)" ] }'Path Parameters
Section titled “Path Parameters”Campaign ID
Request Bodyrequired
Section titled “Request Bodyrequired”Campaign type. When type or mediaType changes, the new pair must follow these rules.
DAI: dated bystartDateandendDate. Not available foryoutubeorrumble.Baked-in: dated byexpectedDate. Not forstreaming,sai,ott_ctv,display,video,display_videoorradio.story,reel,feed: Instagram formats, only formediaTypeinstagram. Dated byexpectedDate.
Start of the campaign in ISO format, for DAI.
End of the campaign in ISO format, for DAI.
Expected air date in ISO format, for Baked-in, story, reel and feed.
Rate of the campaign. When currency is omitted, the amount is read in the stored currency, not USD.
CPM rate of the campaign. When currency is omitted, the amount is read in the stored currency, not USD.
Currency code (USD, EUR, GBP). When sent, the exchange rate is calculated automatically. When omitted, the stored currency and exchange rate are left unchanged.
Expected impressions 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. Radio uses only length. Leaving radio without them clears positions.
Array<Array<{position,length}>>
Ad position
Ad length in seconds
The discount code
Expected landing URL of the campaign
Product metadata
Initiative metadata
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. Switching adds a campaign per channel.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. Switching to it needsweekdaysTime.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: the campaign goes to the show’s linked channel or account there, else stays on the show.
For rumble, itunesOrYtId also takes a Rumble channel name. Changing mediaType or show to one without a linked Rumble channel returns 400.
When itunesOrYtId is omitted, the campaign’s current show is used.
Tags
Team members metadata
Creative IDs metadata
Radio ad days and hours. Radio only; required when switching to radio. Omit to keep current slots. 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)"]