---
title: "POST /podcast-bot/podcasts/recording/create"
method: POST
path: "/podcast-bot/podcasts/recording/create"
tags: ["Podcast Bot"]
---

# POST /podcast-bot/podcasts/recording/create

`POST /podcast-bot/podcasts/recording/create`

## Request

- Base URL: `https://api.zeno.fm`
- URL: `https://api.zeno.fm/podcast-bot/podcasts/recording/create`
- Auth: none declared
- TypeScript: <https://skmtc.dev/zeno/apis/aggregators-api-service/docs/podcast-bot/podcasts/recording/create/post.ts> (a function with typed inputs; its response is checked against the schema)

Create recording podcast

## Request body

- PBCreateRecordingPodcast: Create Recording Podcast model
  - `podcast` PBPodcast, required: Podcast model
    - `key` string
    - `title` string, required
    - `coverArtUrl` string
    - `summary` string
    - `description` string, required
    - `author` string
    - `ownerName` string, required
    - `ownerEmail` string, required
    - `categories` string[], required
    - `language` string, required
    - `link` string
    - `explicit` boolean
    - `rssFeed` string
    - `interviewPodcastKey` string
  - `recordingConfig` PBPodcastRecordingConfig, required: Podcast Recording Config model
    - `streamUrl` string, required: Recording audio stream
    - `recordingSchedule` PBPodcastRecordingSchedule, required: Podcast Recording Schedule model
      - `frequency` 'weekly' | 'monthly', required
      - `daysOfWeek` string[]: Required when frequency is weekly
      - `daysOfMonth` integer[]: Required when frequency is monthly
      - `startTime` string, required: Recording start time HH:mm
      - `durationMinutes` integer, required
      - `timezone` string, required: Timezone identifier e.g. UTC, America/New_York, Asia/Tokyo
      - `enabled` boolean: Enable/disable this schedule
    - `introAudioUrl` string: Edit based on intro audio. Required if outro is specified.
    - `outroAudioUrl` string: Edit based on outro audio. Required if intro is specified.
  - `processingPresets` PBPodcastProcessingPresets: Podcast Processing Presets model
    - `removeBackgroundMusic` boolean
    - `introAudioUrl` string: Add intro audio to recorded episode
    - `outroAudioUrl` string: Add outro audio to recorded episode
    - `aiTitleSummary` boolean: Generate episode title and summary
    - `customPromptTitle` string: Custom prompt for generating episode title
    - `customPromptDescription` string: Custom prompt for generating episode description
  - `aiAdsConfig` PBPodcastAiAdsConfig: Podcast AI Ads Config model
    - `removeAds` boolean
    - `insertProgrammaticAds` boolean
    - `adsFrequency` integer: Required if insertProgrammaticAds is enabled
  - `interviewConfig` PBPodcastInterviewConfig: Podcast Interview Config model
    - `extractInterviews` boolean: Enable Interview Extraction
    - `interviewPodcastName` string: Interview Podcast Name. Required if interview extraction is enabled
    - `interviewMinLengthMinutes` integer: Minimum Interview Length (minutes). Required if interview extraction is enabled
    - `customPromptInterviewTitle` string: Custom prompt for generating interview title
    - `customPromptInterviewDescription` string: Custom prompt for generating interview description
  - `videoConfig` PBVideoConfig: Video rendering config (CREATE_VIDEO renderer) — used by CREATE_VIDEO and AUTO_CLIP jobs
    - `style` 'waveformBars' | 'equalizer' | 'radialPulse' | 'hostSplit' | 'hostCentered' | 'podcastCardDotted': Template design
    - `font` 'inter' | 'oswald' | 'bebasNeue' | 'montserrat' | 'anton' | 'poppins': Font family
    - `showEqualizer` boolean: Show the audio-reactive visualizer
    - `fps` integer: Frames per second; 24/30 typical
    - `colors` Colors
      - `accent` string: Accent color (hex). Default "#D0021B"
      - `background` string: Background color (hex). Default "#F7F7F8"
      - `text` string: Text / caption color (hex). Default "#111111"
      - `barGradientFrom` string: Bar gradient start color (hex). Default "#D0021B"
      - `barGradientTo` string: Bar gradient end color (hex). Default "#8A0000"
    - `text` Text
      - `episodeLabel` string: Episode label, e.g. "EPISODE 42"
      - `title` string: Main title
      - `subtitle` string: Subtitle, e.g. guest name
      - `caption` string: Static caption line; shown when captions.synced == false. Ignored in synced mode.
    - `assets` Assets
      - `primaryLogo` string: Square podcast artwork
      - `secondaryLogo` string: Wordmark / corner logo
      - `hostPhoto` string: Host photo, used by hostSplit / hostCentered
    - `captions` Captions
      - `show` boolean: Master on/off for captions
      - `synced` boolean: true = word-timed karaoke captions synced to audio; false = show the static text.caption line the whole time. Only takes effect when show == true.
      - `embedded_srt_file` boolean: true = burn captions into the video frames; false = don't burn (SRT sidecar still uploaded). Applies to synced captions when show == true.
    - `aspect_ratios` string[]: One output MP4 per ratio
  - `autoClipConfig` PBAutoClipConfig: Podcast Auto-Clip Configuration model. A config without `clip_groups` is run as a single unnamed group whose count comes from `max_clips`; with `clip_groups` each group is cut separately and the flat fields act as its fallbacks.
    - `video` PBVideoConfig: Video rendering config (CREATE_VIDEO renderer) — used by CREATE_VIDEO and AUTO_CLIP jobs
      - `style` 'waveformBars' | 'equalizer' | 'radialPulse' | 'hostSplit' | 'hostCentered' | 'podcastCardDotted': Template design
      - `font` 'inter' | 'oswald' | 'bebasNeue' | 'montserrat' | 'anton' | 'poppins': Font family
      - `showEqualizer` boolean: Show the audio-reactive visualizer
      - `fps` integer: Frames per second; 24/30 typical
      - `colors` Colors
        - `accent` string: Accent color (hex). Default "#D0021B"
        - `background` string: Background color (hex). Default "#F7F7F8"
        - `text` string: Text / caption color (hex). Default "#111111"
        - `barGradientFrom` string: Bar gradient start color (hex). Default "#D0021B"
        - `barGradientTo` string: Bar gradient end color (hex). Default "#8A0000"
      - `text` Text
        - `episodeLabel` string: Episode label, e.g. "EPISODE 42"
        - `title` string: Main title
        - `subtitle` string: Subtitle, e.g. guest name
        - `caption` string: Static caption line; shown when captions.synced == false. Ignored in synced mode.
      - `assets` Assets
        - `primaryLogo` string: Square podcast artwork
        - `secondaryLogo` string: Wordmark / corner logo
        - `hostPhoto` string: Host photo, used by hostSplit / hostCentered
      - `captions` Captions
        - `show` boolean: Master on/off for captions
        - `synced` boolean: true = word-timed karaoke captions synced to audio; false = show the static text.caption line the whole time. Only takes effect when show == true.
        - `embedded_srt_file` boolean: true = burn captions into the video frames; false = don't burn (SRT sidecar still uploaded). Applies to synced captions when show == true.
      - `aspect_ratios` string[]: One output MP4 per ratio
    - `generate_chapters` boolean: Detect YouTube-style chapter boundaries via LLM and upload chapters.json
    - `clip_generation` string: Clip generation mode. "highlights" = top viral/engaging moments; "chapters" = one clip per chapter boundary; "segments" = named broadcast blocks (Weather, Sports, Traffic, etc.); "none" = skip clip generation, produce chapters only. Every mode but "none" produces an audio clip, a transcript and, when `video` is set, a video per clip. Fallback value for groups that omit it.
    - `max_clips` integer: Max number of clips to produce. Used as the count of the single group a config without `clip_groups` is run as; ignored when `clip_groups` is set.
    - `min_clip_duration` number, double: Minimum clip length in seconds. Clips shorter than this are padded to center. Applies to highlights mode only. Fallback for groups that omit it.
    - `max_clip_duration` number, double: Maximum clip length in seconds. Clips longer than this are trimmed from the end. Fallback for groups that omit it.
    - `padding_seconds` number, double: Extra seconds added before/after each clip
    - `segment_types` string[]: List of broadcast segment names to look for (segments mode only). If empty, LLM infers from content. Fallback value for groups.
    - `clip_groups` PbClip[]: List of clip group configs, each cut separately with its own mode, count and duration window. When set, `max_clips` is ignored and the other flat fields are only fallbacks. One group per mode is the way to tag each clip with the mode that produced it.
      - `label` string: Filename prefix for clips in this group, also reported back as the clip's `group` (e.g. `"long"`, `"short"`, or the mode name). Defaults to `"g1"`, `"g2"`, ...
      - `video` PBVideoConfig: Video rendering config (CREATE_VIDEO renderer) — used by CREATE_VIDEO and AUTO_CLIP jobs
        - `style` 'waveformBars' | 'equalizer' | 'radialPulse' | 'hostSplit' | 'hostCentered' | 'podcastCardDotted': Template design
        - `font` 'inter' | 'oswald' | 'bebasNeue' | 'montserrat' | 'anton' | 'poppins': Font family
        - `showEqualizer` boolean: Show the audio-reactive visualizer
        - `fps` integer: Frames per second; 24/30 typical
        - `colors` Colors
          - `accent` string: Accent color (hex). Default "#D0021B"
          - `background` string: Background color (hex). Default "#F7F7F8"
          - `text` string: Text / caption color (hex). Default "#111111"
          - `barGradientFrom` string: Bar gradient start color (hex). Default "#D0021B"
          - `barGradientTo` string: Bar gradient end color (hex). Default "#8A0000"
        - `text` Text
          - `episodeLabel` string: Episode label, e.g. "EPISODE 42"
          - `title` string: Main title
          - `subtitle` string: Subtitle, e.g. guest name
          - `caption` string: Static caption line; shown when captions.synced == false. Ignored in synced mode.
        - `assets` Assets
          - `primaryLogo` string: Square podcast artwork
          - `secondaryLogo` string: Wordmark / corner logo
          - `hostPhoto` string: Host photo, used by hostSplit / hostCentered
        - `captions` Captions
          - `show` boolean: Master on/off for captions
          - `synced` boolean: true = word-timed karaoke captions synced to audio; false = show the static text.caption line the whole time. Only takes effect when show == true.
          - `embedded_srt_file` boolean: true = burn captions into the video frames; false = don't burn (SRT sidecar still uploaded). Applies to synced captions when show == true.
        - `aspect_ratios` string[]: One output MP4 per ratio
      - `clip_generation` string: Clip generation mode for this group. If omitted, falls back to top-level `clip_generation`. "highlights" = top viral/engaging moments; "chapters" = one clip per chapter boundary; "segments" = named broadcast blocks (Weather, Sports, Traffic, etc.)
      - `count` integer: Number of clips to generate for this group. Overrides top-level max_clips
      - `min_clip_duration` number, double: Minimum clip length in seconds for this group. If omitted, falls back to top-level `min_clip_duration`.
      - `max_clip_duration` number, double: Maximum clip length in seconds for this group. If omitted, falls back to top-level `max_clip_duration`.
      - `segment_types` string[]: Segment type hints for this group (segments mode only)

## Response `200`

Podcast created

- PBPodcast: Podcast model
  - `key` string
  - `title` string, required
  - `coverArtUrl` string
  - `summary` string
  - `description` string, required
  - `author` string
  - `ownerName` string, required
  - `ownerEmail` string, required
  - `categories` string[], required
  - `language` string, required
  - `link` string
  - `explicit` boolean
  - `rssFeed` string
  - `interviewPodcastKey` string

## Other responses

- `400`: Invalid podcast config
- `404`: Account not found

## Changes

- **2026-09-23** `8eb322809483`: 1 info
  - added the new optional request property `autoClipConfig`
- **2026-08-21** `6cebdc059200`: 1 breaking, 3 info
  - removed the media type `*/*` for the response with the status `200`
  - added the media type `application/json` for the response with the status `200`
  - added the non-success response with the status `400`
  - added the non-success response with the status `404`
- **2026-08-13** `2b9463d67e6d`: 1 info
  - added the new optional request property `videoConfig`
- **2026-07-13** `104d35bf8984`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/zeno/apis/aggregators-api-service/changes/podcast-bot/podcasts/recording/create/post.md)

---

[API](https://skmtc.dev/zeno/apis/aggregators-api-service.md) - [All operations](https://skmtc.dev/zeno/apis/aggregators-api-service/llms.txt) - [OpenAPI document](https://skmtc.dev/zeno/apis/aggregators-api-service/revisions/e6ef499b4111?raw)
