Publishing puts an episode out and decides which channels release it, and when.
List channels
GET /podcasts/:podcast_id/channels
The response is an array of active channels. Each includes an id (a string), name, channel_type (public_rss or private_rss), status, default_timing_mode, default_release_delay_seconds, default_release_local_time, and auto_add_new_episodes. Use the id values in publish requests. Legacy podcasts return [].
A channel is somewhere an episode is published. A feed is the RSS document a public or private channel produces.
Publish now or schedule
POST /podcasts/:podcast_id/episodes/:id/publish
Content-Type: application/json
{"published_at":"2026-11-01T09:00:00-04:00"}
published_at must be an ISO 8601 timestamp with an offset. Omit it to use the server’s current time. Future times make the episode scheduled; a time that has arrived makes it published. Audio must be ready before this request.
If you omit channels, each active channel applies its normal default, including its auto_add_new_episodes setting. For a legacy podcast, omit channels.
Choose a complete channel list
When you send channels, it is the complete list for the episode. Every active channel not in the list is excluded. An empty list publishes the episode without releasing it on a channel.
{
"published_at": "2026-11-01T09:00:00-04:00",
"channels": [
{ "id": "OnDt15" },
{ "id": "kZr4Pa", "released_at": "2026-11-02T06:00:00-05:00" },
{ "id": "Wq8Lme", "timing_mode": "delay", "delay_seconds": 86400 },
{ "id": "Bx3Nvd", "timing_mode": "local_time", "local_time": "06:00" }
]
}
| Entry | Release time |
|---|---|
{"id":"OnDt15"} | The channel’s configured default. |
released_at | An exact ISO 8601 override. |
timing_mode: "delay" | delay_seconds after the episode’s publish time. |
timing_mode: "local_time" | The next occurrence of HH:MM in the podcast’s time zone. |
A channel selected explicitly is included even if its auto_add_new_episodes setting is off. A local_time release needs the podcast’s time zone to be confirmed; check time_zone_confirmed in GET /podcasts/:id before using it. An unknown, inactive, or repeated channel ID returns 422 invalid with a param such as channels[0].id.
Retime and unpublish
Call POST /podcasts/:podcast_id/episodes/:id/publish again to change an upcoming release. A release that is already live cannot be moved; the API returns immutable_live_release.
POST /podcasts/:podcast_id/episodes/:id/unpublish
Unpublish returns the episode to draft, clears its channel releases, and returns the updated episode object. You can publish it again later.
Legacy podcasts support publish and unpublish, but sending channels returns channels_unsupported. They continue to publish through their legacy RSS feed when the episode’s publish time arrives.
Plan limits
A plan can limit how many episodes each show publishes a month and how long an episode can be. A publish that would go over returns 422 plan_limit_reached, and the episode stays a draft. The message says which limit applied, for example “Your plan includes 2 published episodes per show a month.” or “Your plan publishes episodes up to 60 minutes.” Episodes that are already out aren’t affected.