Ingesting Transcript Files

Dynamic Ingest can be used to ingest transcript files with your video, request auto captions and transcripts, request caption translations and dubbing, trigger AI metadata enhancement, request AI audio description on `transcriptions` entries, and use related Ingest API AI endpoints.

Setup

The setup for Dynamic Ingest requests is the same, whether you are ingesting a video, images, a Transcript file, or all of these. For full details of the request body fields, see the API Reference.

Request URL
        https://ingest.api.brightcove.com/v1/accounts/account_id/videos/video_id/ingest-requests
Authentication
Authentication requires an access token passed as a Bearer token in an Authorization header:
        Authorization: Bearer {access_token}

Note on S3

If your Transcript will be pulled from a protected S3 bucket, you will need to set a bucket policy to allow Video Cloud to access the files. See Using Dynamic Ingest with S3 for details.

Ingest Transcript files

You can also add Transcript files to your video or upload them for an existing video using Dynamic Ingest:

Add transcripts during video ingestion

Request URL

https://ingest.api.brightcove.com/v1/accounts/account_id/videos/video_id/ingest-requests

Method

POST

Sample request body

{
  "master": {
    "url": "https://support.brightcove.com/test-assets/videos/Great_Blue_Heron.mp4"
  },
  "transcriptions": [
    {
      "url": "https://support.brightcove.com/test-assets/transcript/herons-transcript.txt",
      "srclang": "en-US",
      "kind": "transcripts",
      "label": "English",
      "default": true,
      "status" : "published"
    }
  ]
}

Add transcripts existing videos

Adding transcripts to existing videos is exactly the same, except that you do not need any of the video information or the profile in the request body. unless you are requesting closed transcript to be added to MP4 renditions - in that case, you will need to replace the video

Request URL

        https://ingest.api.brightcove.com/v1/accounts/account_id/videos/video_id/ingest-requests

Method

POST

Sample request body

{
  "transcriptions": [
    {
      "url": "https://support.brightcove.com/test-assets/transcripts/herons.txt",
      "srclang": "en-US",
      "kind": "transcripts",
      "label": "English",
      "default": true,
      "status" : "published"
    }
  ]
}

Ingest fields

The following table details the fields used for ingesting transcripts or requesting auto captions.

Fields for Auto Captions and Transcripts
Field Type Required Description
autodetect boolean no true to auto-detect language from audio source. false to use srclang specifying the audio language.
default boolean no If true, srclang will be ignored, and the main audio track will be used - language will be auto-detected.
input_audio_track object no For multiple audio tracks, defines the audio to extract the captions from. It is composed by language and variant (both required).
kind string no The kind of output to generate. Allowed values:
  • captions
  • transcripts
Notes:
  1. If the kind is transcripts, and the url for the transcripts file is included, a transcript file will be ingested, and no auto captions will be generated. See Ingesting Transcriptions for more details.
  2. If the kind is transcripts, and the url for the transcripts file is not included, a transcript file and captions will be generated,
  3. If the kind is captions, a captions will be generated, but not a transcript file.
label string no Human readable label. Defaults to the BCP-47 style language code.
srclang string no BCP-47 style language code for the text tracks (en-US, fr-FR, es-ES, etc.); see supported languages
status string no Indicates the actual situation of the caption, if it is published, draft.
url string no The URL where a transcript file is located. Must be included in the kind is transcripts. Must not be included if the kind is captions.
use_dictionary boolean no When true, apply the account autocaption dictionary to generated captions/transcripts when supported.
max_chars_per_line integer no Maximum characters per caption line when provided; must be between 25 and 60 inclusive when set.
max_lines_per_cue integer no Maximum lines per caption cue when provided; must be 1 or 2 when set.
diarization_mode string no How speaker changes are represented when supported: hyphen, speaker_labels, or speaker_names.
enable_audio_tags boolean no When true, include audio event tags in the output when supported.
allow_multilanguage_caption boolean no When true, allow multilanguage caption behavior for this entry when supported.
ai_transparency_label string no Optional label for AI-generated text tracks (AI transparency).
polished_transcription boolean no When true, request a polished transcript style when supported.
translation_languages array no Target languages for caption translation (and optional dubbing) after auto captions are generated for the source transcriptions entry. Each item is an object with srclang (BCP-47, required) and optional label, status (draft or published), dubbing (boolean), disable_voice_cloning (boolean), ai_transparency_label (string, label for translated captions when supported), and ai_transparency_label_dubbing (string, label for generated dubbed audio when supported). See Caption translation and dubbing and the Universal Translator documentation.
metadata_optimizer object no Requests AI metadata enhancement in the same workflow as this transcriptions entry. Same fields as POST .../videos/{video_id}/ai/metadata-enhancement/{language}, including optional translation_request with only languages (BCP-47 array). On ingest, include translation_request only when skip_review and auto_translate are both true, and use explicit srclang on this entry (not autodetect: true). Must include language (BCP-47). See AI metadata enhancement at ingest and AI Metadata Optimizer.
audio_descriptions object no Requests AI audio description in the same workflow as this transcriptions entry. Same body as POST .../videos/{video_id}/ai/audio-descriptions: required languages (array of BCP-47 strings) and optional ai_transparency_label (string, for generated descriptive audio tracks when supported). See Audio description at ingest and Audio Description.

Caption translation and dubbing

Within each object in the transcriptions array, you can add translation_languages to translate auto-generated captions into additional languages. Each translation entry is an object with:

  • srclang (required) — BCP-47 target language code
  • label (optional) — display label
  • status (optional) — draft or published
  • dubbing (optional, boolean) — when true, generates dubbed audio for that language after translated captions exist
  • disable_voice_cloning (optional, boolean) — when true, uses a synthetic voice instead of voice cloning for dubbing
  • ai_transparency_label (optional, string) — AI transparency label for translated captions (text tracks) for this target language when supported
  • ai_transparency_label_dubbing (optional, string) — AI transparency label for dubbed audio generated for this target language when supported (typically used when dubbing is true)

Dubbing depends on translated captions, and translated captions depend on auto captions for the source language. If prerequisites are missing, downstream steps may not run.

Sample transcriptions with translations

{
  "transcriptions": [{
    "srclang": "en-US",
    "label": "English",
    "status": "published",
    "kind": "captions",
    "translation_languages": [
      { "srclang": "es-ES", "label": "Spanish", "status": "draft", "dubbing": true, "disable_voice_cloning": true, "ai_transparency_label": "AI-generated captions", "ai_transparency_label_dubbing": "AI-generated audio" },
      { "srclang": "fr-FR", "label": "French", "status": "draft" }
    ]
  }]
}

For account-level defaults that prefill Studio upload fields (API clients may still send any values), see GET/PUT https://ingest.api.brightcove.com/v1/accounts/{account_id}/ingestion-configurations in the Universal Translator documentation.

To start translation jobs outside an ingest request, use POST https://ingest.api.brightcove.com/v1/accounts/{account_id}/videos/{video_id}/ai/translation with a target_languages array (same per-language shape as above). See AI translation endpoints for request and response details.

AI metadata enhancement at ingest

You can queue AI Metadata Optimizer jobs together with auto captions by including metadata_optimizer on a transcriptions object. The object uses the same fields as POST .../videos/{video_id}/ai/metadata-enhancement/{language} and must include language (BCP-47). On ingest, include translation_request (with only languages) only when skip_review and auto_translate are both true so metadata can be applied and then translated in one job; omit translation_request for review workflows (skip_review false). Use explicit caption fields such as srclang on the transcriptions entry when combining with metadata or translation—do not use autodetect: true in those cases. Other typical optional fields include fields_to_generate, use_tag_architecture, references, and character_limits. Full behavior is described in AI Metadata Optimizer — API access.

Sample ingest body (review workflow)

{
  "transcriptions": [
    {
      "srclang": "en-US",
      "label": "English",
      "kind": "captions",
      "status": "published",
      "metadata_optimizer": {
        "language": "en-US",
        "fields_to_generate": ["names", "short_descriptions", "tags", "long_descriptions"],
        "skip_review": false
      }
    }
  ]
}

Sample ingest body (generate, apply, and translate in one job)

Requires explicit srclang on the transcriptions entry (not autodetect), and both skip_review and auto_translate set to true with translation_request.languages:

{
  "transcriptions": [
    {
      "srclang": "en-US",
      "label": "English",
      "kind": "captions",
      "status": "published",
      "metadata_optimizer": {
        "language": "en-US",
        "fields_to_generate": ["names", "short_descriptions", "tags", "long_descriptions"],
        "skip_review": true,
        "auto_translate": true,
        "translation_request": {
          "languages": ["es-ES", "fr-FR"]
        }
      }
    }
  ]
}

Creating a job via ingest uses the same job lifecycle as direct API calls: poll or delete with GET/DELETE on .../videos/{video_id}/ai/metadata-enhancement/{language}, and list jobs with GET .../ai/metadata-enhancement/jobs. Full field reference and behavior notes are in AI Metadata Optimizer — API access.

Audio description at ingest

On each object in the transcriptions array, optional audio_descriptions queues AI Audio Description in the same ingest workflow (typically with auto captions so a text track exists). Use the same body as POST .../videos/{video_id}/ai/audio-descriptions: required languages, an array of BCP-47 language codes with at least one entry (e.g. ["en-US", "es-ES"]), and optional ai_transparency_label (string) for AI transparency on generated descriptive audio when supported. One descriptive audio track per language.

Sample transcriptions with audio_descriptions

{
  "transcriptions": [
    {
      "srclang": "en-US",
      "label": "English",
      "kind": "captions",
      "status": "published",
      "audio_descriptions": {
        "languages": ["en-US"],
        "ai_transparency_label": "AI-generated audio"
      }
    }
  ]
}

Standalone audio description endpoints

You can also create or list jobs without an ingest request:

  • POST | GET https://ingest.api.brightcove.com/v1/accounts/{account_id}/videos/{video_id}/ai/audio-descriptions — create a job (body: required languages array as above; optional ai_transparency_label when supported) or list jobs for the video (GET)
  • GET https://ingest.api.brightcove.com/v1/accounts/{account_id}/ai/audio-descriptions/jobs — list audio description jobs for the account

For supported languages and job response fields, see Audio Description — API access.

Supported languages

Currently, the supported languages for transcripts are limited to the following languages

  • Australian English (en-AU)
  • Afrikaans (af-ZA)
  • Brazilian Portuguese (pt-BR)
  • British English (en-GB)
  • Canadian French (fr-CA)
  • Danish (da-DK)
  • Dutch (nl-NL)
  • Farsi Persian (fa-IR)
  • French (fr-FR)
  • German (de-DE)
  • Gulf Arabic (ar-AE)
  • Hebrew (he-IL)
  • Indian English (en-IN)
  • Indian Hindi (hi-IN)
  • Indonesian (id-ID)
  • Irish English (en-IE)
  • Italian (it-IT)
  • Japanese (ja-JP)
  • Korean (ko-KR)
  • Malay (ms-MY)
  • Mandarin Chinese – Mainland (zh-CN)
  • Mandarin Chinese (Taiwan) (zh-TW)
  • Modern Standard Arabic (ar-SA)
  • New Zealand English (en-NZ)
  • Portuguese (pt-PT)
  • Russian (ru-RU)
  • Scottish English (en-AB)
  • South African English (en-ZA)
  • Spanish (es-ES)
  • Swiss German (de-CH)
  • Tamil (ta-IN)
  • Telugu (te-IN)
  • Thai (th-TH)
  • Turkish (tr-TR)
  • US English (en-US)
  • US Spanish (es-US)
  • Welsh English (en-WL)