---
title: "Create content item"
method: POST
path: "/projects/{project_id}/content"
tags: ["Content"]
---

# Create content item

`POST /projects/{project_id}/content`

Creates a content item in your project and queues it for audio and/or video generation.

## Request body

- union
  - RequestBodyContentCreateAutoSegment — Create content with auto segment type
    - `type` 'auto_segment', required — The content type. Possible values are `auto_segment`, `manual_segment` or `audio_upload`
    - `title` string — The content title
    - `summary` string — The content summary
    - `body` string, required — The content body
    - `title_enabled` boolean — When true, generates audio for the title segment
    - `body_enabled` boolean — When true, generates audio for the body text segments
    - `summary_enabled` boolean — When true, generates audio for the summary content
    - `summary_title_enabled` boolean — When true, includes title text and audio in generated summaries
    - `source_id` string, nullable — The externally-provided source identifier of the content
    - `source_url` string, uri, nullable — The URL that contains the source content
    - `author` string, nullable — The author of the content
    - `tags` string[] — Arbitrary tags associated with the content, used for playlist filtering
    - `image_url` string, uri, nullable — The feature image URL of the content
    - `metadata` object, nullable — The arbitrary metadata associated with content
    - `published` boolean, nullable — Whether the content will appear in the BeyondWords players and podcast feeds
    - `video_published` boolean, nullable — Whether the content will appear in the BeyondWords video players and podcast video feeds
    - `publish_date` string, date-time, nullable — Time at which the content was published or is scheduled to be published (ISO 8601)
    - `ads_enabled` boolean, nullable — Whether adverts will play for this content in the BeyondWords players
    - `auto_segment_updates_enabled` boolean, nullable — Whether the media files will be regenerated when the text content is updated with `auto_segment`
    - `title_voice_id` integer, nullable — The id of the voice used to generate the audio of the title text.
    - `summary_voice_id` integer, nullable — The id of the voice used to generate the audio of the summary text.
    - `body_voice_id` integer, nullable — The id of the voice used to generate the audio of the body text.
    - `ai_summary_updates_enabled` boolean — Whether the summary segments will be regenerated
    - `language` string, nullable — The default language of the content, format is ISO 639-1 (with underscore delimiter like en_GB)
    - `background_track` object, nullable
      - `enabled` boolean — When true, background music is enabled for this content
      - `track` object
        - `id` integer — The track id
    - `summarization_settings` RequestBodySummarizationSettings
      - `enabled` boolean — When true, AI-powered summarization is enabled
      - `model` 'gpt-5-nano' | 'gpt-5-mini' | 'gpt-5' | 'gpt-5.1'
      - `prompt` string, nullable — Custom prompt for AI summarization generation
      - `temperature` number, nullable — Controls randomness in AI summarization (0.0 = deterministic, 2.0 = very random)
      - `limit_token_usage` integer, nullable — Maximum number of tokens to use for AI summarization
      - `template` object, nullable
        - `id` integer
        - `slug` string — The summarization settings template slug
    - `video_settings` RequestBodyVideoSettings — Video generation settings for this content item. When provided, these settings replace the content-level video settings entirely — they are not merged with project defaults. If you omit `variants` or `sizes`, they default to the project's video settings. To use only project-level settings, omit `video_settings` entirely.
      - `enabled` boolean — When true, video generation is enabled for this content or project
      - `logo_image_url` string, uri, nullable — The logo that should appear in the corner of the video. Defaults to the BeyondWords logo.
      - `logo_image_position` 'top-left' | 'top-right' — The position of the logo that appears in the corner of the video.
      - `background_color` string — The background color of the video when there is no image. Supports CSS colors including linear-gradient(to right, ...)
      - `text_transform` 'none' | 'uppercase' | 'lowercase' | 'titlecase' — Text transformation to apply to captions
      - `text_background_color` string — The background color to show behind text. Supports CSS colors including linear-gradient(to right, ...)
      - `text_background_radius` number — Border radius of the text background
      - `text_color` string — The foreground color of text. Supports CSS colors including linear-gradient(to right, ...)
      - `text_secondary_color` string, nullable — Color of the text captions to show on every other scene. (CSS color format)
      - `text_highlight_color` string, nullable — The foreground color of text whilst the word is being read out. Supports CSS colors including linear-gradient(to right, ...)
      - `text_highlight_secondary_color` string, nullable — Color of highlighted text to show on every other scene. Supports CSS colors including linear-gradient(to right, ...)
      - `text_highlight_background_color` string — Color of the background behind the highlighted text (CSS color format, supports linear-gradient(to right, ...))
      - `text_highlight_secondary_background_color` string, nullable — Color of the background behind the highlighted text to show on every other scene (CSS color format, supports linear-gradient(to right, ...))
      - `text_highlight_background_radius` number — Border radius of the highlight text background
      - `text_shadow` string — Text shadow of non-highlighted words (CSS format, supports linear-gradient(to right, ...))
      - `text_highlight_shadow` string, nullable — Text shadow of highlighted words (CSS format, supports linear-gradient(to right, ...))
      - `text_stroke` string — Text outline of non-highlighted words (CSS format, supports linear-gradient(to right, ...) and inside/center/outside)
      - `text_highlight_stroke` string, nullable — Text outline of highlighted words (CSS format, supports linear-gradient(to right, ...) and inside/center/outside)
      - `text_fonts` string[] — A list of fonts to use. Fonts will be prioritized automatically based on glyph coverage for the text. The default fonts are built-in, but you can include remote URLs to custom fonts in .ttf or .otf format.
      - `text_font_size` integer — Font size for text captions (30-90).
      - `text_width` number — Maximum width of text as a ratio of the frame width.
      - `text_lines` integer, nullable — The maximum number of lines of text to show at once. Must be between 1 and 5. If not specified, text_lines will default to landscape=4, square=5, portrait=5.
      - `text_words` integer, nullable — Maximum number of words to show per line
      - `text_horizontal_align` 'start' | 'center' | 'end' — The horizontal alignment of text lines, either 'start', 'center', or 'end'. A value of 'start' aligns the text to the left for left-to-right languages, right otherwise. A value of 'end' aligns the text to the right for left-to-right languages, left otherwise.
      - `text_vertical_align` 'start' | 'center' | 'end' — The vertical alignment of text lines, either 'start' (top), 'center', or 'end' (bottom).
      - `text_horizontal_offset` number — The horizontal offset of text relative to the frame width, between -1.0 and 1.0
      - `text_vertical_offset` number — The vertical offset of text relative to the frame height, between -1.0 and 1.0
      - `text_animation` 'classic' | 'reveal' | 'karaoke' | 'pop' — The text animation to show
      - `entrance_animation` 'none' | 'fade' | 'zoom-in' | 'zoom-out' | 'slide-up' | 'slide-down' | 'slide-left' | 'slide-right' | 'pop' — The entrance animation for image and video segments
      - `exit_animation` 'none' | 'fade' | 'zoom-in' | 'zoom-out' | 'slide-up' | 'slide-down' | 'slide-left' | 'slide-right' | 'pop' — The exit animation for image and video segments
      - `waveform_color` string — The color of the audio waveform bars. Supports CSS colors including linear-gradient(to right, ...)
      - `content_image_enabled` boolean — When true, uses the content's featured image as video background
      - `image_extraction_enabled` boolean — When true, automatically extracts images from HTML content. Alternatively, set the data-beyondwords-image='true' attribute.
      - `pan_and_zoom_enabled` boolean — When true, applies pan and zoom effects to background images
      - `audio_and_waveform_enabled` boolean — When true, video includes audio and animated waveform visualization
      - `text_captions_enabled` boolean — When true, displays text captions overlaid on the video
      - `playback_mode` 'cycle' | 'space-evenly' | 'follow-article' — The playback mode for images in the video. There are three available options. A value of 'cycle' will cycle through images, potentially repeating them according to cycle_time. A value of 'space-evenly' will space images evenly throughout the video without repeating them. A value of 'follow-article' will show images at the point when they appear in the article. Note that 'follow-article' is not applicable for summaries which have different text.
      - `cycle_time` integer — The time in milliseconds to show each image when playback_mode is set to 'cycle'.
      - `variants` string[]
      - `sizes` object[] — Output video sizes. Each entry should include a `description` (used by the dashboard). If omitted, inherits from project settings.
        - `name` string, required
        - `description` string — Human-readable label for this size (for example, "Articles, YouTube")
        - `width` integer, required
        - `height` integer, required
        - `enabled` boolean
      - `template` object, nullable
        - `id` integer
        - `slug` string — The video settings template slug
    - `feature_image` object
      - `url` string
      - `video_settings` object
        - `enabled` boolean
        - `crop_coordinates` object
          - `16:9` number[]
          - `9:16` number[]
    - `feature_video` object
      - `url` string
      - `video_settings` object
        - `enabled` boolean
        - `volume` integer
        - `plays_in_background` boolean — When true, this video segment plays in the background behind other scenes
        - `hides_background_images` boolean — When true, background images are hidden while this video segment plays
        - `crop_coordinates` object
          - `16:9` number[]
          - `9:16` number[]
  - RequestBodyContentCreateManualSegment — Create content with manual segment type
    - `type` 'manual_segment', required — The content type. Possible values are `auto_segment`, `manual_segment` or `audio_upload`
    - `title_enabled` boolean — When true, generates audio for the title segment
    - `body_enabled` boolean — When true, generates audio for the body text segments
    - `summary_enabled` boolean — When true, generates audio for the summary content
    - `summary_title_enabled` boolean — When true, includes title text and audio in generated summaries
    - `source_id` string, nullable — The externally-provided source identifier of the content
    - `source_url` string, nullable — The URL that contains the source content
    - `author` string, nullable — The author of the content
    - `tags` string[] — Arbitrary tags associated with the content, used for playlist filtering
    - `image_url` string, nullable — The feature image URL of the content
    - `metadata` object, nullable — The arbitrary metadata associated with content
    - `segments` object[], required — The array of segments in the content
      - `id` integer, nullable — Unique identifier for the object
      - `marker` string, nullable — Custom marker for segment identification and playback control
      - `section` 'title' | 'summary' | 'body', nullable — Content section type: `title` for headlines, `summary` for summaries, or `body` for main content
      - `content_type` 'text' | 'audio' | 'image' | 'video' — Segment content type: `text` for text-to-speech, `audio` for pre-recorded audio, `image` for visual content in videos, or `video` for background video segments
      - `text` string, nullable — Plain text content for text-to-speech conversion. Required when content_type is `text`
      - `audio_url` string, nullable — URL to pre-recorded audio file. Required when content_type is `audio`
      - `image_url` string, nullable — URL to image file for visual content. Required when content_type is `image`
      - `video_url` string, nullable — URL to video file for visual content. Required when content_type is `video`
      - `start_time` integer, nullable — Start time of this segment in the generated audio/video (milliseconds). May differ from calculated duration due to audio processing
      - `duration` integer, nullable — Duration of this segment in milliseconds
      - `voice` object, nullable
        - `id` integer — Unique identifier for the voice
      - `language` object, nullable
        - `code` string — The language of the segment, format is ISO 639-1 (with underscore delimiter like en_GB)
      - `preprocessing_settings` object, nullable
        - `ai_preprocessing_enabled` boolean
      - `xpath` string, nullable — XPath selector for locating this segment in the original HTML document
      - `md5` string, nullable — MD5 hash of the segment text to support per-segment playback
      - `video_settings` object, nullable
        - `enabled` boolean
        - `volume` integer
        - `plays_in_background` boolean — When true, this video segment plays in the background behind other scenes
        - `hides_background_images` boolean — When true, background images are hidden while this video segment plays
        - `crop_coordinates` object
          - `16:9` number[]
          - `9:16` number[]
      - `pauses` object[]
        - `time` number
        - `index` number
    - `published` boolean, nullable — Whether the content will appear in the BeyondWords players and podcast feeds
    - `video_published` boolean, nullable — Whether the content will appear in the BeyondWords video players and podcast video feeds
    - `publish_date` string, nullable — Time at which the content was published or is scheduled to be published (ISO 8601)
    - `ads_enabled` boolean, nullable — Whether adverts will play for this content in the BeyondWords players
    - `auto_segment_updates_enabled` boolean, nullable — Whether the media files will be regenerated when the text content is updated with `auto_segment`
    - `ai_summary_updates_enabled` boolean — Whether the summary segments will be regenerated
    - `language` string, nullable — The default language of the content, format is ISO 639-1 (with underscore delimiter like en_GB)
    - `background_track` object, nullable
      - `enabled` boolean
      - `track` object
        - `id` integer — The track id
    - `summarization_settings` RequestBodySummarizationSettings
      - `enabled` boolean — When true, AI-powered summarization is enabled
      - `model` 'gpt-5-nano' | 'gpt-5-mini' | 'gpt-5' | 'gpt-5.1'
      - `prompt` string, nullable — Custom prompt for AI summarization generation
      - `temperature` number, nullable — Controls randomness in AI summarization (0.0 = deterministic, 2.0 = very random)
      - `limit_token_usage` integer, nullable — Maximum number of tokens to use for AI summarization
      - `template` object, nullable
        - `id` integer
        - `slug` string — The summarization settings template slug
    - `video_settings` RequestBodyVideoSettings — Video generation settings for this content item. When provided, these settings replace the content-level video settings entirely — they are not merged with project defaults. If you omit `variants` or `sizes`, they default to the project's video settings. To use only project-level settings, omit `video_settings` entirely.
      - `enabled` boolean — When true, video generation is enabled for this content or project
      - `logo_image_url` string, uri, nullable — The logo that should appear in the corner of the video. Defaults to the BeyondWords logo.
      - `logo_image_position` 'top-left' | 'top-right' — The position of the logo that appears in the corner of the video.
      - `background_color` string — The background color of the video when there is no image. Supports CSS colors including linear-gradient(to right, ...)
      - `text_transform` 'none' | 'uppercase' | 'lowercase' | 'titlecase' — Text transformation to apply to captions
      - `text_background_color` string — The background color to show behind text. Supports CSS colors including linear-gradient(to right, ...)
      - `text_background_radius` number — Border radius of the text background
      - `text_color` string — The foreground color of text. Supports CSS colors including linear-gradient(to right, ...)
      - `text_secondary_color` string, nullable — Color of the text captions to show on every other scene. (CSS color format)
      - `text_highlight_color` string, nullable — The foreground color of text whilst the word is being read out. Supports CSS colors including linear-gradient(to right, ...)
      - `text_highlight_secondary_color` string, nullable — Color of highlighted text to show on every other scene. Supports CSS colors including linear-gradient(to right, ...)
      - `text_highlight_background_color` string — Color of the background behind the highlighted text (CSS color format, supports linear-gradient(to right, ...))
      - `text_highlight_secondary_background_color` string, nullable — Color of the background behind the highlighted text to show on every other scene (CSS color format, supports linear-gradient(to right, ...))
      - `text_highlight_background_radius` number — Border radius of the highlight text background
      - `text_shadow` string — Text shadow of non-highlighted words (CSS format, supports linear-gradient(to right, ...))
      - `text_highlight_shadow` string, nullable — Text shadow of highlighted words (CSS format, supports linear-gradient(to right, ...))
      - `text_stroke` string — Text outline of non-highlighted words (CSS format, supports linear-gradient(to right, ...) and inside/center/outside)
      - `text_highlight_stroke` string, nullable — Text outline of highlighted words (CSS format, supports linear-gradient(to right, ...) and inside/center/outside)
      - `text_fonts` string[] — A list of fonts to use. Fonts will be prioritized automatically based on glyph coverage for the text. The default fonts are built-in, but you can include remote URLs to custom fonts in .ttf or .otf format.
      - `text_font_size` integer — Font size for text captions (30-90).
      - `text_width` number — Maximum width of text as a ratio of the frame width.
      - `text_lines` integer, nullable — The maximum number of lines of text to show at once. Must be between 1 and 5. If not specified, text_lines will default to landscape=4, square=5, portrait=5.
      - `text_words` integer, nullable — Maximum number of words to show per line
      - `text_horizontal_align` 'start' | 'center' | 'end' — The horizontal alignment of text lines, either 'start', 'center', or 'end'. A value of 'start' aligns the text to the left for left-to-right languages, right otherwise. A value of 'end' aligns the text to the right for left-to-right languages, left otherwise.
      - `text_vertical_align` 'start' | 'center' | 'end' — The vertical alignment of text lines, either 'start' (top), 'center', or 'end' (bottom).
      - `text_horizontal_offset` number — The horizontal offset of text relative to the frame width, between -1.0 and 1.0
      - `text_vertical_offset` number — The vertical offset of text relative to the frame height, between -1.0 and 1.0
      - `text_animation` 'classic' | 'reveal' | 'karaoke' | 'pop' — The text animation to show
      - `entrance_animation` 'none' | 'fade' | 'zoom-in' | 'zoom-out' | 'slide-up' | 'slide-down' | 'slide-left' | 'slide-right' | 'pop' — The entrance animation for image and video segments
      - `exit_animation` 'none' | 'fade' | 'zoom-in' | 'zoom-out' | 'slide-up' | 'slide-down' | 'slide-left' | 'slide-right' | 'pop' — The exit animation for image and video segments
      - `waveform_color` string — The color of the audio waveform bars. Supports CSS colors including linear-gradient(to right, ...)
      - `content_image_enabled` boolean — When true, uses the content's featured image as video background
      - `image_extraction_enabled` boolean — When true, automatically extracts images from HTML content. Alternatively, set the data-beyondwords-image='true' attribute.
      - `pan_and_zoom_enabled` boolean — When true, applies pan and zoom effects to background images
      - `audio_and_waveform_enabled` boolean — When true, video includes audio and animated waveform visualization
      - `text_captions_enabled` boolean — When true, displays text captions overlaid on the video
      - `playback_mode` 'cycle' | 'space-evenly' | 'follow-article' — The playback mode for images in the video. There are three available options. A value of 'cycle' will cycle through images, potentially repeating them according to cycle_time. A value of 'space-evenly' will space images evenly throughout the video without repeating them. A value of 'follow-article' will show images at the point when they appear in the article. Note that 'follow-article' is not applicable for summaries which have different text.
      - `cycle_time` integer — The time in milliseconds to show each image when playback_mode is set to 'cycle'.
      - `variants` string[]
      - `sizes` object[] — Output video sizes. Each entry should include a `description` (used by the dashboard). If omitted, inherits from project settings.
        - `name` string, required
        - `description` string — Human-readable label for this size (for example, "Articles, YouTube")
        - `width` integer, required
        - `height` integer, required
        - `enabled` boolean
      - `template` object, nullable
        - `id` integer
        - `slug` string — The video settings template slug
    - `feature_image` object
      - `url` string
      - `video_settings` object
        - `enabled` boolean
        - `crop_coordinates` object
          - `16:9` number[]
          - `9:16` number[]
    - `feature_video` object
      - `url` string
      - `video_settings` object
        - `enabled` boolean
        - `volume` integer
        - `plays_in_background` boolean — When true, this video segment plays in the background behind other scenes
        - `hides_background_images` boolean — When true, background images are hidden while this video segment plays
        - `crop_coordinates` object
          - `16:9` number[]
          - `9:16` number[]
  - RequestBodyContentCreateAudioUpload — Create content with audio upload type
    - `type` 'audio_upload', required — The content type. Possible values are `auto_segment`, `manual_segment` or `audio_upload`
    - `title` string, required — The content title
    - `body` string, required — The content body
    - `source_id` string, nullable — The externally-provided source identifier of the content
    - `source_url` string, nullable — The URL that contains the source content
    - `author` string, nullable — The author of the content
    - `tags` string[] — Arbitrary tags associated with the content, used for playlist filtering
    - `image_url` string, nullable — The feature image URL of the content
    - `metadata` object, nullable — The arbitrary metadata associated with content
    - `segments` object[], nullable, required — The array of segments in the content
      - `id` integer, nullable — Unique identifier for the object
      - `marker` string, nullable — Custom marker for segment identification and playback control
      - `section` 'title' | 'summary' | 'body', nullable — Content section type: `title` for headlines, `summary` for summaries, or `body` for main content
      - `content_type` 'text' | 'audio' | 'image' | 'video' — Segment content type: `text` for text-to-speech, `audio` for pre-recorded audio, `image` for visual content in videos, or `video` for background video segments
      - `text` string, nullable — Plain text content for text-to-speech conversion. Required when content_type is `text`
      - `audio_url` string, nullable — URL to pre-recorded audio file. Required when content_type is `audio`
      - `image_url` string, nullable — URL to image file for visual content. Required when content_type is `image`
      - `video_url` string, nullable — URL to video file for visual content. Required when content_type is `video`
      - `start_time` integer, nullable — Start time of this segment in the generated audio/video (milliseconds). May differ from calculated duration due to audio processing
      - `duration` integer, nullable — Duration of this segment in milliseconds
      - `video_settings` object, nullable
        - `enabled` boolean
        - `volume` integer
        - `plays_in_background` boolean — When true, this video segment plays in the background behind other scenes
        - `hides_background_images` boolean — When true, background images are hidden while this video segment plays
        - `crop_coordinates` object
          - `16:9` number[]
          - `9:16` number[]
      - `pauses` object[]
        - `time` number
        - `index` number
    - `published` boolean, nullable — Whether the content will appear in the BeyondWords players and podcast feeds
    - `video_published` boolean, nullable — Whether the content will appear in the BeyondWords video players and podcast video feeds
    - `publish_date` string, nullable — Time at which the content was published or is scheduled to be published (ISO 8601)
    - `ads_enabled` boolean, nullable — Whether adverts will play for this content in the BeyondWords players
    - `auto_segment_updates_enabled` boolean, nullable — Whether the media files will be regenerated when the text content is updated with `auto_segment`
    - `background_track` object, nullable
      - `enabled` boolean
      - `track` object
        - `id` integer — The track id
    - `summarization_settings` RequestBodySummarizationSettings
      - `enabled` boolean — When true, AI-powered summarization is enabled
      - `model` 'gpt-5-nano' | 'gpt-5-mini' | 'gpt-5' | 'gpt-5.1'
      - `prompt` string, nullable — Custom prompt for AI summarization generation
      - `temperature` number, nullable — Controls randomness in AI summarization (0.0 = deterministic, 2.0 = very random)
      - `limit_token_usage` integer, nullable — Maximum number of tokens to use for AI summarization
      - `template` object, nullable
        - `id` integer
        - `slug` string — The summarization settings template slug
    - `video_settings` RequestBodyVideoSettings — Video generation settings for this content item. When provided, these settings replace the content-level video settings entirely — they are not merged with project defaults. If you omit `variants` or `sizes`, they default to the project's video settings. To use only project-level settings, omit `video_settings` entirely.
      - `enabled` boolean — When true, video generation is enabled for this content or project
      - `logo_image_url` string, uri, nullable — The logo that should appear in the corner of the video. Defaults to the BeyondWords logo.
      - `logo_image_position` 'top-left' | 'top-right' — The position of the logo that appears in the corner of the video.
      - `background_color` string — The background color of the video when there is no image. Supports CSS colors including linear-gradient(to right, ...)
      - `text_transform` 'none' | 'uppercase' | 'lowercase' | 'titlecase' — Text transformation to apply to captions
      - `text_background_color` string — The background color to show behind text. Supports CSS colors including linear-gradient(to right, ...)
      - `text_background_radius` number — Border radius of the text background
      - `text_color` string — The foreground color of text. Supports CSS colors including linear-gradient(to right, ...)
      - `text_secondary_color` string, nullable — Color of the text captions to show on every other scene. (CSS color format)
      - `text_highlight_color` string, nullable — The foreground color of text whilst the word is being read out. Supports CSS colors including linear-gradient(to right, ...)
      - `text_highlight_secondary_color` string, nullable — Color of highlighted text to show on every other scene. Supports CSS colors including linear-gradient(to right, ...)
      - `text_highlight_background_color` string — Color of the background behind the highlighted text (CSS color format, supports linear-gradient(to right, ...))
      - `text_highlight_secondary_background_color` string, nullable — Color of the background behind the highlighted text to show on every other scene (CSS color format, supports linear-gradient(to right, ...))
      - `text_highlight_background_radius` number — Border radius of the highlight text background
      - `text_shadow` string — Text shadow of non-highlighted words (CSS format, supports linear-gradient(to right, ...))
      - `text_highlight_shadow` string, nullable — Text shadow of highlighted words (CSS format, supports linear-gradient(to right, ...))
      - `text_stroke` string — Text outline of non-highlighted words (CSS format, supports linear-gradient(to right, ...) and inside/center/outside)
      - `text_highlight_stroke` string, nullable — Text outline of highlighted words (CSS format, supports linear-gradient(to right, ...) and inside/center/outside)
      - `text_fonts` string[] — A list of fonts to use. Fonts will be prioritized automatically based on glyph coverage for the text. The default fonts are built-in, but you can include remote URLs to custom fonts in .ttf or .otf format.
      - `text_font_size` integer — Font size for text captions (30-90).
      - `text_width` number — Maximum width of text as a ratio of the frame width.
      - `text_lines` integer, nullable — The maximum number of lines of text to show at once. Must be between 1 and 5. If not specified, text_lines will default to landscape=4, square=5, portrait=5.
      - `text_words` integer, nullable — Maximum number of words to show per line
      - `text_horizontal_align` 'start' | 'center' | 'end' — The horizontal alignment of text lines, either 'start', 'center', or 'end'. A value of 'start' aligns the text to the left for left-to-right languages, right otherwise. A value of 'end' aligns the text to the right for left-to-right languages, left otherwise.
      - `text_vertical_align` 'start' | 'center' | 'end' — The vertical alignment of text lines, either 'start' (top), 'center', or 'end' (bottom).
      - `text_horizontal_offset` number — The horizontal offset of text relative to the frame width, between -1.0 and 1.0
      - `text_vertical_offset` number — The vertical offset of text relative to the frame height, between -1.0 and 1.0
      - `text_animation` 'classic' | 'reveal' | 'karaoke' | 'pop' — The text animation to show
      - `entrance_animation` 'none' | 'fade' | 'zoom-in' | 'zoom-out' | 'slide-up' | 'slide-down' | 'slide-left' | 'slide-right' | 'pop' — The entrance animation for image and video segments
      - `exit_animation` 'none' | 'fade' | 'zoom-in' | 'zoom-out' | 'slide-up' | 'slide-down' | 'slide-left' | 'slide-right' | 'pop' — The exit animation for image and video segments
      - `waveform_color` string — The color of the audio waveform bars. Supports CSS colors including linear-gradient(to right, ...)
      - `content_image_enabled` boolean — When true, uses the content's featured image as video background
      - `image_extraction_enabled` boolean — When true, automatically extracts images from HTML content. Alternatively, set the data-beyondwords-image='true' attribute.
      - `pan_and_zoom_enabled` boolean — When true, applies pan and zoom effects to background images
      - `audio_and_waveform_enabled` boolean — When true, video includes audio and animated waveform visualization
      - `text_captions_enabled` boolean — When true, displays text captions overlaid on the video
      - `playback_mode` 'cycle' | 'space-evenly' | 'follow-article' — The playback mode for images in the video. There are three available options. A value of 'cycle' will cycle through images, potentially repeating them according to cycle_time. A value of 'space-evenly' will space images evenly throughout the video without repeating them. A value of 'follow-article' will show images at the point when they appear in the article. Note that 'follow-article' is not applicable for summaries which have different text.
      - `cycle_time` integer — The time in milliseconds to show each image when playback_mode is set to 'cycle'.
      - `variants` string[]
      - `sizes` object[] — Output video sizes. Each entry should include a `description` (used by the dashboard). If omitted, inherits from project settings.
        - `name` string, required
        - `description` string — Human-readable label for this size (for example, "Articles, YouTube")
        - `width` integer, required
        - `height` integer, required
        - `enabled` boolean
      - `template` object, nullable
        - `id` integer
        - `slug` string — The video settings template slug
    - `feature_image` object
      - `url` string
      - `video_settings` object
        - `enabled` boolean
        - `crop_coordinates` object
          - `16:9` number[]
          - `9:16` number[]
    - `feature_video` object
      - `url` string
      - `video_settings` object
        - `enabled` boolean
        - `volume` integer
        - `plays_in_background` boolean — When true, this video segment plays in the background behind other scenes
        - `hides_background_images` boolean — When true, background images are hidden while this video segment plays
        - `crop_coordinates` object
          - `16:9` number[]
          - `9:16` number[]

## Response `201`

successful

- ContentModel
  - `id` string, nullable — Unique identifier for the content. Can be either a UUID or an externally provided source_id
  - `status` 'draft' | 'queued' | 'processing' | 'processed' | 'skipped' | 'error' — The current status of the content processing operation. This value will change as the content is processed.
  - `type` 'auto_segment' | 'manual_segment' | 'audio_upload' — The content type. Possible values are `auto_segment`, `manual_segment` or `audio_upload`
  - `title` string, nullable — The content title
  - `summary` string, nullable — The content summary
  - `body` string, nullable — The content body
  - `title_enabled` boolean — The flag to enable title segments in audio
  - `body_enabled` boolean — The flag to enable body segments in audio
  - `summary_enabled` boolean — The flag to enable summary audio
  - `summary_title_enabled` boolean — The flag to include title text and audio segments in summaries
  - `source_id` string, nullable — The externally-provided source identifier of the content
  - `source_url` string, nullable — The URL that contains the source content
  - `author` string, nullable — The author of the content
  - `tags` string[] — Arbitrary tags associated with the content, used for playlist filtering
  - `image_url` string, nullable — The feature image URL of the content
  - `metadata` object, nullable — The arbitrary metadata associated with content
  - `audio` ContentAudioModel[] — The array of audio files for the entire content
    - `id` integer — Unique identifier for the object
    - `variant` 'article' | 'summary' — The variant type of the audio content
    - `video_size` object, nullable
      - `name` string
      - `description` string, nullable
      - `width` integer
      - `height` integer
    - `content_type` 'audio/mpeg' | 'application/x-mpegURL', nullable — MIME type of the audio file (MP3 or HLS playlist)
    - `url` string, uri, nullable — Direct URL to the audio file
    - `duration` integer, nullable — Duration of the audio file in milliseconds
    - `base64_file` string, nullable — Base64-encoded content of HLS playlist metadata files
  - `video` ContentVideoModel[] — The array of video files for the entire content
    - `id` integer — Unique identifier for the object
    - `variant` 'article' | 'summary' — The variant type of the video content
    - `video_size` object, nullable
      - `name` string
      - `description` string, nullable
      - `width` integer
      - `height` integer
    - `content_type` 'video/mp4' | 'application/x-mpegURL', nullable — MIME type of the video file (MP4 or HLS playlist)
    - `url` string, nullable — Direct URL to the video file
    - `duration` integer, nullable — Duration of the video file in milliseconds
    - `base64_file` string, nullable — The content of the media file encoded as base64. Only present for .m3u8 metadata files
  - `audio_with_intro_outro` ContentAudioModel[]
    - `id` integer — Unique identifier for the object
    - `variant` 'article' | 'summary' — The variant type of the audio content
    - `video_size` object, nullable
      - `name` string
      - `description` string, nullable
      - `width` integer
      - `height` integer
    - `content_type` 'audio/mpeg' | 'application/x-mpegURL', nullable — MIME type of the audio file (MP3 or HLS playlist)
    - `url` string, uri, nullable — Direct URL to the audio file
    - `duration` integer, nullable — Duration of the audio file in milliseconds
    - `base64_file` string, nullable — Base64-encoded content of HLS playlist metadata files
  - `summarization` object
    - `audio` ContentAudioModel[] — The array of summary audio files for the entire content
      - `id` integer — Unique identifier for the object
      - `variant` 'article' | 'summary' — The variant type of the audio content
      - `video_size` object, nullable
        - `name` string
        - `description` string, nullable
        - `width` integer
        - `height` integer
      - `content_type` 'audio/mpeg' | 'application/x-mpegURL', nullable — MIME type of the audio file (MP3 or HLS playlist)
      - `url` string, uri, nullable — Direct URL to the audio file
      - `duration` integer, nullable — Duration of the audio file in milliseconds
      - `base64_file` string, nullable — Base64-encoded content of HLS playlist metadata files
    - `video` ContentVideoModel[] — The array of summary video files for the entire content
      - `id` integer — Unique identifier for the object
      - `variant` 'article' | 'summary' — The variant type of the video content
      - `video_size` object, nullable
        - `name` string
        - `description` string, nullable
        - `width` integer
        - `height` integer
      - `content_type` 'video/mp4' | 'application/x-mpegURL', nullable — MIME type of the video file (MP4 or HLS playlist)
      - `url` string, nullable — Direct URL to the video file
      - `duration` integer, nullable — Duration of the video file in milliseconds
      - `base64_file` string, nullable — The content of the media file encoded as base64. Only present for .m3u8 metadata files
  - `segments` object[], nullable — The array of segments in the content
    - `id` integer, nullable — Unique identifier for the segment
    - `marker` string, nullable — Custom marker for segment identification and playback control
    - `xpath` string, nullable — XPath selector for locating this segment in the original HTML document
    - `md5` string, nullable — MD5 hash of the segment text to support per-segment playback
    - `section` 'title' | 'summary' | 'body' — Content section type: `title` for headlines, `summary` for summaries, or `body` for main content
    - `content_type` 'text' | 'audio' | 'image' | 'video' — Segment content type: `text` for text-to-speech, `audio` for pre-recorded audio, `image` for visual content in videos, or `video` for background video segments
    - `text` string, nullable — Plain text content for text-to-speech conversion. Required when content_type is `text`
    - `audio_url` string, uri, nullable — URL to pre-recorded audio file. Required when content_type is `audio`
    - `image_url` string, uri, nullable — URL to image file for visual content. Required when content_type is `image`
    - `video_url` string, uri, nullable — URL to video file for visual content. Required when content_type is `video`
    - `preprocessing_settings` object, nullable
      - `ai_preprocessing_enabled` boolean
    - `start_time` integer, nullable — Start time of this segment in the generated audio/video (milliseconds). May differ from calculated duration due to audio processing
    - `duration` integer, nullable — Duration of this segment in milliseconds
    - `created` string, date-time, nullable — Time at which the object was created (ISO 8601)
    - `updated` string, date-time, nullable — Time at which the object was updated (ISO 8601)
    - `video_settings` object, nullable
      - `enabled` boolean
      - `volume` integer
      - `plays_in_background` boolean — When true, this video segment plays in the background behind other scenes
      - `hides_background_images` boolean — When true, background images are hidden while this video segment plays
      - `crop_coordinates` object
        - `16:9` number[]
        - `9:16` number[]
    - `pauses` object[]
      - `time` number
      - `index` number
  - `published` boolean — Whether the content will appear in the BeyondWords players and podcast feeds
  - `video_published` boolean — Whether the content will appear in the BeyondWords video players and podcast video feeds
  - `publish_date` string, nullable — Time at which the content was published or is scheduled to be published (ISO 8601)
  - `ads_enabled` boolean — Whether adverts will play for this content in the BeyondWords players
  - `ai_summary_prompt` string, nullable — The last used AI prompt for summary generation
  - `ai_summary_updates_enabled` boolean — Whether the summary segments will be regenerated when the text content is updated
  - `auto_segment_updates_enabled` boolean — Whether the media files will be regenerated when the text content is updated with `auto_segment`
  - `background_track` object, nullable
    - `enabled` boolean
    - `track` object, nullable
      - `id` integer
      - `name` string
      - `custom` boolean
      - `volume` integer
      - `url` string
  - `feature_image` object, nullable
    - `url` string
    - `video_settings` object
      - `enabled` boolean
      - `crop_coordinates` object
        - `16:9` number[]
        - `9:16` number[]
  - `feature_video` object, nullable
    - `url` string
    - `video_settings` object
      - `enabled` boolean
      - `volume` integer
      - `crop_coordinates` object
        - `16:9` number[]
        - `9:16` number[]
  - `summarization_settings` SummarizationSettingsModel
    - `enabled` boolean — When true, AI-powered summarization is enabled
    - `prompt` string, nullable — Custom prompt for AI summarization generation
    - `model` 'gpt-5-nano' | 'gpt-5-mini' | 'gpt-5' | 'gpt-5.1', nullable
    - `temperature` number, nullable — Controls randomness in AI summarization (0.0 = deterministic, 2.0 = very random)
    - `limit_token_usage` integer, nullable — Maximum number of tokens to use for AI summarization
    - `template` SummarizationSettingsTemplateModel[]
      - `id` integer
      - `slug` string — Unique identifier for the object
      - `name` string
      - `model` 'gpt-5-nano' | 'gpt-5-mini' | 'gpt-5' | 'gpt-5.1', nullable
      - `prompt` string, nullable — Custom prompt for AI summarization generation
      - `temperature` number, nullable — Controls randomness in AI summarization (0.0 = deterministic, 2.0 = very random)
      - `limit_token_usage` integer, nullable — Maximum number of tokens to use for AI summarization
  - `video_settings` object, nullable
    - `enabled` boolean — When true, video generation is enabled for this content
    - `audio_and_waveform_enabled` boolean — When true, video includes audio and animated waveform visualization
    - `background_color` string
    - `content_image_enabled` boolean — When true, uses the content's featured image as video background
    - `image_extraction_enabled` boolean — When true, automatically extracts images from HTML content for video backgrounds
    - `logo_image_position` 'top-left' | 'top-right'
    - `logo_image_url` string, uri
    - `pan_and_zoom_enabled` boolean — When true, applies pan and zoom effects to background images
    - `text_transform` 'none' | 'uppercase' | 'lowercase' | 'titlecase' — Text transformation to apply to captions
    - `text_background_color` string — Background color for text captions (CSS color format)
    - `text_background_radius` number — Border radius of the text background
    - `text_captions_enabled` boolean — When true, displays text captions overlaid on the video
    - `text_color` string — Color of the text captions (CSS color format)
    - `text_secondary_color` string — Color of the text captions to show on every other scene (CSS color format)
    - `text_highlight_color` string, nullable — Color of highlighted text during playback (CSS color format)
    - `text_highlight_secondary_color` string, nullable — Color of highlighted text to show on every other scene (CSS color format)
    - `text_highlight_background_color` string — Color of the background behind the highlighted text (CSS color format, supports linear-gradient(to right, ...))
    - `text_highlight_secondary_background_color` string, nullable — Color of the background behind the highlighted text to show on every other scene (CSS color format, supports linear-gradient(to right, ...))
    - `text_highlight_background_radius` number — Border radius of the highlight text background
    - `text_shadow` string — Text shadow of non-highlighted words (CSS format, supports linear-gradient(to right, ...))
    - `text_highlight_shadow` string, nullable — Text shadow of highlighted words (CSS format, supports linear-gradient(to right, ...))
    - `text_stroke` string — Text outline of non-highlighted words (CSS format, supports linear-gradient(to right, ...) and inside/center/outside)
    - `text_highlight_stroke` string, nullable — Text outline of highlighted words (CSS format, supports linear-gradient(to right, ...) and inside/center/outside)
    - `text_fonts` string[] — List of font families to use for text rendering (prioritized by glyph coverage)
    - `text_font_size` integer — Font size for text captions (30-90)
    - `text_width` number — Maximum width of text as a ratio of the frame width.
    - `text_lines` integer, nullable — Maximum number of text lines to display simultaneously (1-5)
    - `text_words` integer, nullable — Maximum number of words to show per line
    - `text_horizontal_align` 'start' | 'center' | 'end' — The horizontal alignment of text lines, either 'start', 'center', or 'end'. A value of 'start' aligns the text to the left for left-to-right languages, right otherwise. A value of 'end' aligns the text to the right for left-to-right languages, left otherwise.
    - `text_vertical_align` 'start' | 'center' | 'end' — The vertical alignment of text lines, either 'start' (top), 'center', or 'end' (bottom).
    - `text_horizontal_offset` number — The horizontal offset of text relative to the frame width, between -1.0 and 1.0
    - `text_vertical_offset` number — The vertical offset of text relative to the frame height, between -1.0 and 1.0
    - `text_animation` 'classic' | 'reveal' | 'karaoke' | 'pop' — The text animation to show
    - `entrance_animation` 'none' | 'fade' | 'zoom-in' | 'zoom-out' | 'slide-up' | 'slide-down' | 'slide-left' | 'slide-right' | 'pop' — The image entrance animation to show
    - `exit_animation` 'none' | 'fade' | 'zoom-in' | 'zoom-out' | 'slide-up' | 'slide-down' | 'slide-left' | 'slide-right' | 'pop' — The image exit animation to show
    - `waveform_color` string — Color of the audio waveform visualization (CSS color format)
    - `playback_mode` 'cycle' | 'space-evenly' | 'follow-article' — How images are displayed: cycle (repeat), space-evenly (distribute), or follow-article (match text position)
    - `cycle_time` integer — Duration to show each image when playback_mode is 'cycle' (milliseconds, 1-60 seconds)
    - `variants` string[]
    - `sizes` object[]
      - `name` string
      - `description` string, nullable
      - `width` integer
      - `height` integer
      - `enabled` boolean
    - `template` VideoSettingsTemplateModel[]
      - `id` integer
      - `slug` string — Unique identifier for the object
      - `name` string
      - `logo_image_url` string, uri, nullable — The logo that should appear in the corner of the video. Defaults to the BeyondWords logo.
      - `logo_image_position` 'top-left' | 'top-right' — The position of the logo that appears in the corner of the video.
      - `background_color` string — The background color of the video when there is no image. Supports CSS colors including linear-gradient(to right, ...)
      - `text_transform` 'none' | 'uppercase' | 'lowercase' | 'titlecase' — Text transformation to apply to captions
      - `text_background_color` string — The background color to show behind text. Supports CSS colors including linear-gradient(to right, ...)
      - `text_background_radius` number — Border radius of the text background
      - `text_color` string — The foreground color of text. Supports CSS colors including linear-gradient(to right, ...)
      - `text_secondary_color` string, nullable — Color of the text captions to show on every other scene (CSS color format)
      - `text_highlight_color` string, nullable — The foreground color of text whilst the word is being read out. Supports CSS colors including linear-gradient(to right, ...)
      - `text_highlight_secondary_color` string, nullable — Color of highlighted text to show on every other scene. Supports CSS colors including linear-gradient(to right, ...)
      - `text_highlight_background_color` string — Color of the background behind the highlighted text (CSS color format, supports linear-gradient(to right, ...))
      - `text_highlight_secondary_background_color` string, nullable — Color of the background behind the highlighted text to show on every other scene (CSS color format, supports linear-gradient(to right, ...))
      - `text_highlight_background_radius` number — Border radius of the highlight text background
      - `text_shadow` string — Text shadow of non-highlighted words (CSS format, supports linear-gradient(to right, ...))
      - `text_highlight_shadow` string, nullable — Text shadow of highlighted words (CSS format, supports linear-gradient(to right, ...))
      - `text_stroke` string — Text outline of non-highlighted words (CSS format, supports linear-gradient(to right, ...) and inside/center/outside)
      - `text_highlight_stroke` string, nullable — Text outline of highlighted words (CSS format, supports linear-gradient(to right, ...) and inside/center/outside)
      - `text_fonts` string[] — A list of fonts to use. Fonts will be prioritized automatically based on glyph coverage for the text. The default fonts are built-in, but you can include remote URLs to custom fonts in .ttf or .otf format.
      - `text_font_size` integer — Font size for text captions (30-90).
      - `text_width` number — Maximum width of text as a ratio of the frame width.
      - `text_lines` integer, nullable — The maximum number of lines of text to show at once. Must be between 1 and 5. If not specified, text_lines will default to landscape=4, square=5, portrait=5.
      - `text_words` integer, nullable — Maximum number of words to show per line
      - `text_horizontal_align` 'start' | 'center' | 'end' — The horizontal alignment of text lines, either 'start', 'center', or 'end'. A value of 'start' aligns the text to the left for left-to-right languages, right otherwise. A value of 'end' aligns the text to the right for left-to-right languages, left otherwise.
      - `text_vertical_align` 'start' | 'center' | 'end' — The vertical alignment of text lines, either 'start' (top), 'center', or 'end' (bottom).
      - `text_horizontal_offset` number — The horizontal offset of text relative to the frame width, between -1.0 and 1.0
      - `text_vertical_offset` number — The vertical offset of text relative to the frame height, between -1.0 and 1.0
      - `text_animation` 'classic' | 'reveal' | 'karaoke' | 'pop' — The text animation to show
      - `entrance_animation` 'none' | 'fade' | 'zoom-in' | 'zoom-out' | 'slide-up' | 'slide-down' | 'slide-left' | 'slide-right' | 'pop' — The entrance animation for image and video segments
      - `exit_animation` 'none' | 'fade' | 'zoom-in' | 'zoom-out' | 'slide-up' | 'slide-down' | 'slide-left' | 'slide-right' | 'pop' — The exit animation for image and video segments
      - `waveform_color` string — The color of the audio waveform bars. Supports CSS colors including linear-gradient(to right, ...)
      - `content_image_enabled` boolean — When true, uses the content's featured image as video background
      - `image_extraction_enabled` boolean — When true, automatically extracts images from HTML content. Alternatively, set the data-beyondwords-image='true' attribute.
      - `pan_and_zoom_enabled` boolean — When true, applies pan and zoom effects to background images
      - `audio_and_waveform_enabled` boolean — When true, video includes audio and animated waveform visualization
      - `text_captions_enabled` boolean — When true, displays text captions overlaid on the video
      - `playback_mode` 'cycle' | 'space-evenly' | 'follow-article' — The playback mode for images in the video. There are three available options. A value of 'cycle' will cycle through images, potentially repeating them according to cycle_time. A value of 'space-evenly' will space images evenly throughout the video without repeating them. A value of 'follow-article' will show images at the point when they appear in the article. Note that 'follow-article' is not applicable for summaries which have different text.
      - `cycle_time` integer — The time in milliseconds to show each image when playback_mode is set to 'cycle'.
      - `preview_url` string, nullable
      - `template` VideoSettingsTemplatesModel — recursive
  - `preprocessing_settings` object, nullable
    - `ai_preprocessing_enabled` boolean — When true, AI preprocessing is applied to improve text normalization quality
  - `language` string, nullable — The default language of the content
  - `created` string, date-time — Time at which the object was created (ISO 8601)
  - `updated` string, date-time — Time at which the object was updated (ISO 8601)

---

[API](https://skmtc.net/beyondwords/apis/beyondwords-rest-api.md) · [All operations](https://skmtc.net/beyondwords/apis/beyondwords-rest-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/beyondwords/beyondwords-rest-api/revisions/8c4bfe3e2ebd/schema)
