
Video Translate
Dub and translate an existing marketing or product video into new languages with HeyGen lip-sync via the video_translate API.
Overview
video-translate is an agent skill most often used in Launch (also Grow) that runs HeyGen video translation and dubbing jobs from a URL or video ID through the v2 API.
Install
npx skills add https://github.com/heygen-com/skills --skill video-translateWhat is this skill?
- POST /v2/video_translate with video URL or HeyGen video ID—no prior HeyGen create step required
- Poll GET /v2/video_translate/{translate_id} until completed, then download output URL
- Supports lip-sync dubbing and audio-only translation modes per API options
- Requires HEYGEN_API_KEY via X-Api-Key header; MCP heygen tools allowed in skill metadata
- Default workflow: submit job → poll status → retrieve translated video
- 4-step default workflow: provide URL → POST translate → poll status → download
Adoption & trust: 1.2k installs on skills.sh; 279 GitHub stars; 2/3 security scanners passed (skills.sh audits).
What problem does it solve?
You have one hero video in English and need credible dubbed or lip-synced versions for other markets without rebuilding the edit by hand.
Who is it for?
Solo marketers and founders repurposing a single recorded demo or ad into multiple languages via API-driven workflow.
Skip if: Greenfield avatar video generation from scratch without a source video, or workflows that cannot store or send a HEYGEN_API_KEY.
When should I use this skill?
Translating or dubbing existing videos with HeyGen, including multi-language versions, lip-sync, audio-only modes, or /v2/video_translate.
What do I get? / Deliverables
A completed HeyGen translation job with a downloadable localized video file ready for distribution channels.
- Completed translation job ID
- Download URL for translated video asset
Recommended Skills
Journey fit
Spans multiple journey phases - primary shelf plus alternate fits below.
Launch distribution is where multi-language video versions ship to new markets without re-filming. Distribution covers localized assets for ads, landing pages, and social—translation jobs fit the canonical launch shelf first.
Where it fits
Ship a Spanish dub of a product launch clip for paid social in LATAM.
Produce a German lip-sync version of a founder explainer for a DACH landing page.
Refresh onboarding tutorial videos for French users without re-recording screen capture.
How it compares
HeyGen translation integration skill—not a generic ffmpeg subtitle script or on-device ML dubbing tool.
Common Questions / FAQ
Who is video-translate for?
Indie builders and small teams distributing video content internationally who already use or can enable HeyGen with an API key.
When should I use video-translate?
At Launch for localized ads and announcement videos, and in Grow content workflows when refreshing lifecycle or tutorial videos for new locales.
Is video-translate safe to install?
It calls external HeyGen APIs and uses API keys; review the Security Audits panel on this Prism page and rotate keys if the skill runs in untrusted environments.
SKILL.md
READMESKILL.md - Video Translate
# Video Translation (HeyGen) Translate and dub existing videos into multiple languages, preserving lip-sync and natural speech patterns. Provide a video URL or HeyGen video ID — no need to create the video on HeyGen first. ## Authentication All requests require the `X-Api-Key` header. Set the `HEYGEN_API_KEY` environment variable. ```bash curl -X POST "https://api.heygen.com/v2/video_translate" \ -H "X-Api-Key: $HEYGEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{"video_url": "https://example.com/video.mp4", "output_language": "es-ES"}' ``` ## Default Workflow 1. Provide a video URL or HeyGen video ID 2. Call `POST /v2/video_translate` with the target language 3. Poll `GET /v2/video_translate/{translate_id}` until status is `completed` 4. Download the translated video from the returned URL ## Creating a Translation Job ### Request Fields | Field | Type | Req | Description | |-------|------|:---:|-------------| | `video_url` | string | Y* | URL of video to translate (*or `video_id`) | | `video_id` | string | Y* | HeyGen video ID (*or `video_url`) | | `output_language` | string | Y | Target language code (e.g., `"es-ES"`) | | `title` | string | | Name for the translated video | | `translate_audio_only` | boolean | | Audio only, no lip-sync (faster) | | `speaker_num` | number | | Number of speakers in video | | `callback_id` | string | | Custom ID for webhook tracking | | `callback_url` | string | | URL for completion notification | **Either** `video_url` **or** `video_id` must be provided. ### curl ```bash curl -X POST "https://api.heygen.com/v2/video_translate" \ -H "X-Api-Key: $HEYGEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "video_url": "https://example.com/original-video.mp4", "output_language": "es-ES", "title": "Spanish Version" }' ``` ### TypeScript ```typescript interface VideoTranslateRequest { video_url?: string; video_id?: string; output_language: string; title?: string; translate_audio_only?: boolean; speaker_num?: number; callback_id?: string; callback_url?: string; } interface VideoTranslateResponse { error: null | string; data: { video_translate_id: string; }; } async function translateVideo(config: VideoTranslateRequest): Promise<string> { const response = await fetch("https://api.heygen.com/v2/video_translate", { method: "POST", headers: { "X-Api-Key": process.env.HEYGEN_API_KEY!, "Content-Type": "application/json", }, body: JSON.stringify(config), }); const json: VideoTranslateResponse = await response.json(); if (json.error) { throw new Error(json.error); } return json.data.video_translate_id; } ``` ### Python ```python import requests import os def translate_video(config: dict) -> str: response = requests.post( "https://api.heygen.com/v2/video_translate", headers={ "X-Api-Key": os.environ["HEYGEN_API_KEY"], "Content-Type": "application/json" }, json=config ) data = response.json() if data.get("error"): raise Exception(data["error"]) return data["data"]["video_translate_id"] ``` ## Supported Languages | Language | Code | Notes | |----------|------|-------| | English (US) | en-US | Default source | | Spanish (Spain) | es-ES | European Spanish | | Spanish (Mexico) | es-MX | Latin American | | French | fr-FR | Standard French | | German | de-DE | Standard German | | Italian | it-IT | Stand