---
title: "Create video translation"
method: POST
path: "/v2/video_translate"
tags: ["Video Translate"]
---

# Create video translation

`POST /v2/video_translate`

## Request

- Base URL: `https://api.heygen.com`
- URL: `https://api.heygen.com/v2/video_translate`
- Auth: one of:
  - API key in header `x-api-key`
  - HTTP bearer

Translates a video into one or more target languages. Runs asynchronously: poll with the returned `video_translate_id`. Get supported language codes from the languages endpoint, then set `output_language` or `output_languages`, and `mode` (`speed` or `precision`).

## Request body

- MCPVideoTranslateCreateRequest: Request body for creating a video translation job via the MCP server.
  - `video_url` string, required: URL of the source video to translate
  - `title` string, nullable: Title for the translation job
  - `output_language` string, nullable: Single target language code. Mutually exclusive with output_languages.
  - `output_languages` string[], nullable: Multiple target language codes for batch translation. Mutually exclusive with output_language.
  - `audio_url` string, nullable: Custom audio URL for audio dubbing
  - `input_language` string, nullable: Source language code (auto-detected if omitted)
  - `translate_audio_only` boolean: Only translate audio, keep original video
  - `speaker_num` integer, nullable: Number of speakers (improves speaker separation)
  - `mode` 'speed' | 'precision': Translation quality mode: 'speed' (faster) or 'precision' (higher quality, uses avatar inference)
  - `callback_url` string, nullable: Webhook URL for completion notifications
  - `callback_id` string, nullable: ID included in webhook payload
  - `enable_caption` boolean: Deprecated and ignored: captions are always generated; whether to display them is a download-side choice.
  - `keep_the_same_format` boolean, nullable: Preserve the source video's encoding specs (resolution, bitrate). Defaults to True for enterprise/team/pro API users with audio_url.
  - `enable_dynamic_duration` boolean: Allow dynamic duration adjustment
  - `disable_music_track` boolean: Remove background music
  - `enable_speech_enhancement` boolean: Enhance speech quality
  - `enable_watermark` boolean: Add watermark to output
  - `start_time` number, nullable: Start time in seconds for partial translation
  - `end_time` number, nullable: End time in seconds for partial translation
  - `brand_voice_id` string, nullable: Brand glossary ID for custom term translations. The legacy field name for `brand_glossary_id` — both are accepted and resolve to the same workspace record. Discover IDs via GET /v3/brand-glossaries.
  - `brand_glossary_id` string, nullable: Brand glossary ID for custom term translations (e.g. translate 'Reformer' as 'Pilates equipment', not 'political activist'). Alias for the legacy `brand_voice_id` field. Discover IDs via GET /v3/brand-glossaries.
  - `stock_voice_config` StockVoiceConfig: Stock-voice options for a video translation request. Use a preset HeyGen voice for the translation instead of recreating the original speaker's voice. Enterprise feature, available for selected accounts and languages by request. See the ``stock_voice_config`` request field for usage.
    - `use_stock_voice` boolean: Set to true to use a preset stock voice instead of cloning the original speaker.
    - `preferred_stock_voice_ids` string[]: Optional. Pin specific stock voice IDs to draw from. If omitted, the target language's default stock-voice pool is used.
  - `srt_url` string, nullable: Custom subtitle file URL.
  - `srt_role` 'input' | 'output', nullable: Which video the SRT applies to. Used with srt_url.
  - `fps_mode` string, nullable: Frame rate mode: 'vfr', 'cfr', or 'passthrough'. Only valid with audio_url.
  - `folder_id` string, nullable: Destination folder ID in the caller's workspace, for example one returned by POST /v3/folders. Omit, pass null, or pass an empty string to place the result at the workspace root. The id must name a folder that is not in the trash and that the caller can write to. Assets library folders are accepted, but the HeyGen app files only assets in them, so a result placed there may not appear in the Assets library view. An unknown id, a folder in another workspace, a project of another kind such as a brand kit, or a trashed folder is rejected with 404 before anything is created.

## Response `200`

Successful response

- object
  - `data` VideoTranslateCreateResponse
    - `video_translate_id` string, nullable
    - `video_translate_ids` string[], nullable

## Other responses

- `400`: Invalid request parameters
- `401`: Authentication failed
- `429`: Rate limit exceeded

## Changes

- **2026-11-03** `7dfa5e59b4f5`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/heygen/apis/heygen-external-api/changes/v2/video_translate/post.md)

---

[API](https://skmtc.dev/heygen/apis/heygen-external-api.md) - [All operations](https://skmtc.dev/heygen/apis/heygen-external-api/llms.txt) - [OpenAPI document](https://skmtc.dev/heygen/apis/heygen-external-api/revisions/7dfa5e59b4f5?raw)
