Skip to main content

How Lip Sync and Video Translation Relate

Both APIs sit on top of one lip sync engine that runs in two modes — Speed and Precision — trading latency for fidelity. What differs is what each API does around that engine:
  • Lip Sync API — the engine on its own. You bring the video and your own audio; the engine redraws the mouth to match. No translation, no audio generation — dialogue replacement only.
  • Video Translation API — translation, optionally followed by the engine. It has two output modes:
    • Audio only (translate_audio_only: true) — transcribe, translate, and generate the translated audio, then stop. No lip sync. The output is just the new audio track (or the original video with swapped audio and an untouched mouth).
    • Video (audio + visual) — the same translation pipeline, then runs the lip sync engine so the mouth matches the translated speech.
The short version:
  • Lip Sync API = engine only — you bring the audio.
  • Video Translation API = translation, optionally followed by the engine. Audio-only mode skips the engine entirely; video mode adds it back.

Quick Example

Request Body

ParameterTypeRequiredDefaultDescription
videoobjectYesSource video. Provide as { "type": "url", "url": "https://..." } or { "type": "asset_id", "asset_id": "..." } (from POST /v3/assets — see Upload Assets).
audioobjectYesReplacement audio. Same format options as video.
modestringNoSet to "speed" for fast audio-only resync.
titlestringNoDisplay title for the lipsync in the HeyGen dashboard.
enable_captionbooleanNofalseGenerate captions for the output video.
enable_dynamic_durationbooleanNotrueAllow output duration to adjust to match the new audio length.
disable_music_trackbooleanNofalseStrip background music from the source video.
enable_speech_enhancementbooleanNofalseEnhance speech quality in the output.
enable_watermarkbooleanNofalseAdd a watermark to the output.
start_timenumberNoStart time in seconds for partial lipsync.
end_timenumberNoEnd time in seconds for partial lipsync.
keep_the_same_formatbooleanNoPreserve the source video’s resolution and bitrate.
fps_modestringNoFrame rate mode: "vfr", "cfr", or "passthrough".
callback_urlstringNoWebhook URL — receives a POST when the job completes or fails.
callback_idstringNoArbitrary ID echoed back in the webhook payload.
folder_idstringNoOrganize the lipsync into a specific project folder.

Response

FieldTypeDescription
lipsync_idstringUnique identifier. Use with GET /v3/lipsyncs/{lipsync_id} to poll status.

Get Lipsync Details

Quick Example

Path Parameters

ParameterTypeRequiredDescription
lipsync_idstringYesUnique lipsync identifier.

Response

Response Fields

FieldTypeDescription
idstringUnique lipsync identifier.
titlestring or nullDisplay title.
statusstringCurrent status: "pending", "running", "completed", or "failed".
durationnumber or nullVideo duration in seconds. Present when completed.
video_urlstring or nullPresigned download URL for the output video. Only present when status is "completed".
callback_idstring or nullClient-provided callback ID.
created_atinteger or nullUnix timestamp of creation.
failure_messagestring or nullError description. Only present when status is "failed".

List Lipsyncs

  • Endpoint: GET /v3/lipsyncs
  • Purpose: List lipsyncs with cursor-based pagination.

Quick Example

Query Parameters

ParameterTypeRequiredDefaultDescription
limitintegerNo10Results per page (1–100).
tokenstringNoOpaque cursor token for the next page.

Response

Update Lipsync

Quick Example

Request Body

ParameterTypeRequiredDescription
titlestringYesNew title for the lipsync.

Delete Lipsync

Quick Example

Response

CLI Usage

Use --request-schema to see all available request fields without needing auth:

Polling Pattern

Lipsyncs are processed asynchronously. Poll until status reaches "completed" or "failed". Status transitions: pendingrunningcompleted | failed
Or let the CLI handle polling for you:

Asset Inputs

Both video and audio fields accept two input formats: By URL — any publicly accessible HTTPS link:
By asset ID — reference a file previously uploaded via POST /v3/assets (see Upload Assets):