- Endpoint:
POST https://api.heygen.com/v3/lipsyncs - Purpose: Dub or replace audio on a video with high-accuracy lip-sync. The job runs asynchronously — poll status via the Get Lipsync Details endpoint.
Quick Example
Request Body
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
video | object | Yes | — | Source video. Provide as { "type": "url", "url": "https://..." } or { "type": "asset_id", "asset_id": "..." } (from POST /v3/assets). |
audio | object | Yes | — | Replacement audio. Same format options as video. |
mode | string | No | — | Set to "precision" for avatar-inference lip-sync. |
title | string | No | — | Display title for the lipsync in the HeyGen dashboard. |
enable_caption | boolean | No | false | Generate captions for the output video. |
enable_dynamic_duration | boolean | No | true | Allow output duration to adjust to match the new audio length. |
disable_music_track | boolean | No | false | Strip background music from the source video. |
enable_speech_enhancement | boolean | No | false | Enhance speech quality in the output. |
enable_watermark | boolean | No | false | Add a watermark to the output. |
start_time | number | No | — | Start time in seconds for partial lipsync. |
end_time | number | No | — | End time in seconds for partial lipsync. |
keep_the_same_format | boolean | No | — | Preserve the source video’s resolution and bitrate. |
fps_mode | string | No | — | Frame rate mode: "vfr", "cfr", or "passthrough". |
callback_url | string | No | — | Webhook URL — receives a POST when the job completes or fails. |
callback_id | string | No | — | Arbitrary ID echoed back in the webhook payload. |
folder_id | string | No | — | Organize the lipsync into a specific project folder. |
Response
| Field | Type | Description |
|---|---|---|
lipsync_id | string | Unique identifier. Use with GET /v3/lipsyncs/{lipsync_id} to poll status. |
Get Lipsync Details
- Endpoint:
GET https://api.heygen.com/v3/lipsyncs/{lipsync_id} - Purpose: Get detailed information about a lipsync including status, download URL, and metadata.
Quick Example
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
lipsync_id | string | Yes | Unique lipsync identifier. |
Response
Response Fields
| Field | Type | Description |
|---|---|---|
id | string | Unique lipsync identifier. |
title | string or null | Display title. |
status | string | Current status: "pending", "running", "completed", or "failed". |
duration | number or null | Video duration in seconds. Present when completed. |
video_url | string or null | Presigned download URL for the output video. Only present when status is "completed". |
callback_id | string or null | Client-provided callback ID. |
created_at | integer or null | Unix timestamp of creation. |
failure_message | string or null | Error description. Only present when status is "failed". |
List Lipsyncs
- Endpoint:
GET https://api.heygen.com/v3/lipsyncs - Purpose: List lipsyncs with cursor-based pagination.
Quick Example
Query Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
limit | integer | No | 10 | Results per page (1–100). |
token | string | No | — | Opaque cursor token for the next page. |
Response
Update Lipsync
- Endpoint:
PATCH https://api.heygen.com/v3/lipsyncs/{lipsync_id} - Purpose: Update a lipsync’s title.
Quick Example
Request Body
| Parameter | Type | Required | Description |
|---|---|---|---|
title | string | Yes | New title for the lipsync. |
Delete Lipsync
- Endpoint:
DELETE https://api.heygen.com/v3/lipsyncs/{lipsync_id} - Purpose: Permanently delete a lipsync.
Quick Example
Response
CLI Usage
--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: pending → running → completed | failed
Asset Inputs
Bothvideo and audio fields accept two input formats:
By URL — any publicly accessible HTTPS link:
POST /v3/assets:

