New: AI video tools. Cut, clip, caption and dub your videos. See all video tools →
Dubs

Lip sync a video to a new voice track

POST
/v1/lipsyncs

Matches the lips in a video of up to 60 seconds to a new voice track. Only the segments with a face on screen are synced. Returns a job whose result is a LipsyncResult.

Estimated cost: 3000 tokens plus 1250 per second of video with version 1.6, or 775 with 1.5, at 25 inference steps. The per second part grows in proportion to inference_steps.

Authorization

bearer
headerAuthorizationBearer <API key>

An API key from Settings, starting vcp_live_.

Header Parameters

Idempotency-Key?string

Optional. Up to 255 characters, scoped to your account and kept for 90 days. Sending the same key with the same body again returns the original job. The same key with a different body is rejected with 409.

Lengthlength <= 255

Request Body

application/json
  1. body
video_file_id*string

A file_id from POST /v1/uploads of an MP4, MOV, MKV or WEBM video up to 60 seconds long.

Length1 <= length
audio_file_id*string

A file_id from POST /v1/uploads of the new voice track as an audio file. It plays from the start of the video.

Length1 <= length
segments*array<>

The spoken lines in order. Each one ends after it starts and no later than duration_s. Lines with a face on screen are synced and the rest of the video stays as it is.

Items1 <= items <= 500
duration_s*number

The video length in seconds.

Range0 < value <= 60
fps*number

The video frame rate.

Range0 < value <= 120
version*string

The lip sync model. 1.6 gives sharper mouths and costs more.

Value in"1.5""1.6"
guidance_scale?number

How closely the mouth follows the voice track. Higher follows it more closely.

Range1 <= value <= 3
Default1.5
inference_steps?integer

More steps give a cleaner mouth and cost more. The cost per second of video grows in proportion to the steps.

Range10 <= value <= 50
Default25

Response Body

Accepted. Returns the job.

application/json
  1. response
id*string

Job id.

type*JobType
Value in"speech""voice_design""voice_clone""voice_change""transcription""dub""avatar_video""cut""lipsync"
status*JobStatus
Value in"queued""running""succeeded""failed""cancelled"
progress*|

From 0 to 1 while an avatar video renders, a dub or lip sync runs or a video is cut, otherwise null.

Range0 <= value <= 1
result*|||||||

The result of a succeeded job, or null. Speech, voice designs and the voice changer give AudioResult, kept for 24 hours after the job finishes, then this is null. Transcriptions give TranscriptionResult. Voice clones give VoiceCloneResult. Avatar videos give AvatarVideoResult, dubs give DubResult, lip syncs give LipsyncResult and cuts give CutResult, all kept for 24 hours after the job was created.

error*|

Why the job failed, or null.

tokens_charged*|

Tokens billed, or null until billing has run.

Range0 <= value
resource_id*|

The voice id for voice clones, the project id for dubs, lip syncs and cuts, and the video id for avatar videos.

created_at*string

When the job was created.

Formatdate-time
finished_at*|

When the job finished, or null while it runs.

Formatdate-time
Example Request
curl -X POST 'https://api.vcp.name/v1/lipsyncs' \  -H 'Content-Type: application/json' \  -d '{  "video_file_id": "8383fc02-625a-4b71-a226-cbb2d19aaf17",  "audio_file_id": "c56a4180-65aa-42ec-a945-5fd21dec0538",  "segments": [    {      "start": 0.4,      "end": 2.6    },    {      "start": 3.1,      "end": 7.8    }  ],  "duration_s": 12.5,  "fps": 25,  "version": "1.6"}'
Example Response
{  "id": "04bd0571-e2c8-4d5b-a3cc-e56f85773abf",  "type": "lipsync",  "status": "queued",  "progress": null,  "result": null,  "error": null,  "tokens_charged": null,  "resource_id": "857fcb81-9073-4f26-97c7-a388979fcdca",  "created_at": "2026-10-30T00:10:42Z",  "finished_at": null}