Lipsync
Lip-sync video characters to an audio track. Modify lip movements in AI-generated or real video to match voiceover narration. 10 credits per second, 20 for the pro model. Max 30s.
Media inputs must be public https URLs. To use a local file, upload it first — see
Uploading Files.
New: Lip-sync video characters to any audio track with a single API call. Works with AI-generated characters, animation, and live-action footage.
Pricing
Choose the model with the model field. Defaults to sync-lipsync-2.
model | Credits | Minimum | What it adds |
|---|---|---|---|
sync-lipsync-2 (default) | 10 / second | 50 | Fast, cost-efficient lip sync |
sync-lipsync-2-pro | 20 / second | 100 | Super-resolution detail in the mouth region |
sync-lipsync-3 | 30 / second | 150 | Handles obstructions, close-ups and extreme angles |
sync-lipsync-2 credits = max(50, ceil(seconds) x 10)
sync-lipsync-2-pro credits = max(100, ceil(seconds) x 20)
sync-lipsync-3 credits = max(150, ceil(seconds) x 30)Duration is measured from your video automatically before processing, so you do not need to send it.
| Duration | sync-lipsync-2 | sync-lipsync-2-pro | sync-lipsync-3 |
|---|---|---|---|
| 3s | 50 | 100 | 150 |
| 5s | 50 | 100 | 150 |
| 10s | 100 | 200 | 300 |
| 15s | 150 | 300 | 450 |
| 15.04s | 160 | 320 | 480 |
| 20s | 200 | 400 | 600 |
| 30s | 300 | 600 | 900 |
Maximum video duration: 30 seconds.
When to use sync-lipsync-2-pro
sync-lipsync-2 rebuilds the mouth region at a fixed internal resolution and composites it back
into your frame, re-encoding as it goes. On tightly framed or vertical video the result can look
soft next to the surrounding footage.
sync-lipsync-2-pro runs a super-resolution pass over that region and preserves the bitrate of
your source. Measured on a real 480x854 clip: the source arrived at 6.5 Mbps, sync-lipsync-2
returned 3.1 Mbps, sync-lipsync-2-pro returned 6.7 Mbps. Use it when the face is small in
frame, when you can see pixelation around the mouth, or when the output will be judged on detail.
For talking-head footage where the face fills the frame, sync-lipsync-2 is usually
indistinguishable and half the price.
When to use sync-lipsync-3
The newest model. It handles obstructions in front of the mouth, close-ups, and extreme head angles without special configuration — cases where the other two struggle.
It is not an upscaler. Measured on a 480x854 source it returned 480x854. Its advantage is reconstruction quality, not resolution. If your footage is soft because the source is low resolution, generate at a higher resolution first — no lipsync model can add detail that was never in the input.
No model can add resolution your source never had. A 480x854 input stays 480x854.
Measured duration is rarely a round number. A clip you asked a model to render at
15 seconds usually measures a little over, because frame counts do not divide evenly
into seconds (361 frames at 24fps is 15.04s). That rounds up to 16 billable seconds.
Read creditsUsed and model on the response to confirm exactly what ran.
Credits are deducted upfront based on the measured duration. Refunded automatically if lipsync fails.
Multi-person video
active_speaker (boolean, default false) turns on active-speaker detection. When more than
one face is visible, it works out who is actually talking and drives only that mouth. Leave it
off for single-subject video.
----------|---------|-------------------|---------------------| | 3s | 50 | $0.30 | $0.40 | | 5s | 50 | $0.30 | $0.40 | | 10s | 100 | $0.60 | $0.80 | | 15s | 150 | $0.90 | $1.20 | | 15.04s | 160 | $0.96 | $1.28 | | 20s | 200 | $1.20 | $1.60 | | 30s | 300 | $1.80 | $2.40 |
Maximum video duration: 30 seconds.
Measured duration is rarely a round number. A clip you asked a model to render at
15 seconds usually measures a little over, because frame counts do not divide evenly
into seconds (361 frames at 24fps is 15.04s). That rounds up to 16 billable seconds.
If you need an exact figure before committing, read creditsUsed on the response.
Credits are deducted upfront based on the measured duration. Refunded automatically if lipsync fails.
Endpoint
POST https://vicsee.com/api/v1/tools/lipsyncSee Authentication for API key setup.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| video_url | string | Yes | Source video URL (MP4, MOV, WebM, M4V, GIF). Max 30 seconds. |
| audio_url | string | Yes | Audio track URL (MP3, WAV, AAC, OGG, M4A) |
| sync_mode | string | No | How to handle duration mismatch. Default: "cut_off". |
| model | string | No | "sync-lipsync-2" (default) or "sync-lipsync-2-pro". See Pricing. |
| active_speaker | boolean | No | Detect who is speaking in multi-person video. Default: false. |
Sync Modes
| Mode | Behavior |
|---|---|
cut_off | Truncates whichever input is longer (default, most predictable) |
loop | Repeats the video to match longer audio |
bounce | Palindrome playback of video to match audio length |
silence | Extends video with frozen frames if audio is longer |
remap | Time-stretches the video to match audio duration |
Example Request
curl -X POST https://vicsee.com/api/v1/tools/lipsync \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"video_url": "https://example.com/scene.mp4",
"audio_url": "https://example.com/voiceover.mp3"
}'Response
Lipsync returns 202 Accepted immediately with a task id. It does not wait for the job.
{
"success": true,
"data": {
"id": "task_abc123",
"model": "sync-lipsync-2",
"status": "pending",
"pollUrl": "/api/v1/tasks/task_abc123",
"duration": 5.0,
"creditsUsed": 50,
"creditsRemaining": 450,
"createdAt": "2026-03-01T12:00:00.000Z"
}
}duration and creditsUsed are returned up front so you can reconcile the charge without
waiting. The video is not in this response.
Collecting the result
Poll GET /api/v1/tasks/{id} until status is completed or failed. This is the same task
endpoint every other VicSee generation uses.
{
"success": true,
"data": {
"id": "task_abc123",
"model": "sync-lipsync-2",
"status": "completed",
"result": {
"url": "https://cdn.vicsee.com/results/dew/user-id/abc123.mp4",
"type": "video",
"duration": 5.0
}
}
}Jobs typically take 30 to 250 seconds depending on length and model. Poll every few seconds. Result URLs are hosted on the VicSee CDN and available for 7 days.
Changed 2026-08-20. This endpoint previously held the connection open and returned the finished video in one call. It no longer does. The old behaviour failed for any job over roughly 100 seconds: the connection was terminated at the network edge and callers received an error while the job completed and was charged. Returning a task id makes long jobs reliable and matches the rest of the API.
Pipeline Example
Generate a voiceover with ElevenLabs, then lip-sync it to an AI-generated video:
# Step 1: Generate voiceover
AUDIO=$(curl -s -X POST https://vicsee.com/api/v1/generate \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "elevenlabs-v3-dialogue",
"prompt": "Welcome to the future of AI video creation."
}' | jq -r '.data.output.url')
# Step 2: Lip-sync the voiceover to your video
curl -X POST https://vicsee.com/api/v1/tools/lipsync \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d "{
\"video_url\": \"https://example.com/ai-generated-scene.mp4\",
\"audio_url\": \"$AUDIO\"
}"Limits
| Constraint | Value |
|---|---|
| Maximum video duration | 30 seconds |
| Supported video formats | MP4, MOV, WebM, M4V, GIF |
| Supported audio formats | MP3, WAV, AAC, OGG, M4A |
| Max processing time | 4 minutes |
| Multi-person support | Yes (active speaker detection) |
| AI-generated characters | Yes |
Errors
| Code | HTTP | Description |
|---|---|---|
MISSING_VIDEO_URL | 400 | video_url not provided |
MISSING_AUDIO_URL | 400 | audio_url not provided |
INVALID_SYNC_MODE | 400 | Sync mode not one of the valid options |
INVALID_MODEL | 400 | Model not one of the supported lipsync models |
INVALID_ACTIVE_SPEAKER | 400 | active_speaker was not a boolean |
PROBE_FAILED | 422 | Could not read video duration |
VIDEO_TOO_LONG | 422 | Video exceeds 30 second maximum |
INSUFFICIENT_CREDITS | 402 | Not enough credits |
LIPSYNC_SUBMIT_FAILED | 500 | Could not start the lipsync job |
LIPSYNC_FAILED | 500 | Processing failed or timed out |
Related
- ElevenLabs Audio — Generate voiceover audio to lip-sync
- Merge Audio + Video — Merge audio and video without lipsync
- Merge Videos — Combine multiple videos into one
- Tasks API — Check task history
- Credits API — Check your credit balance
Character Creation
Train a consistent character identity from photos (FLUX LoRA). Upload 10-30 images, get a character ID, then generate unlimited consistent images via API. 500 credits per training, 15 credits per image.
Merge Audio + Video
Merge a video URL with an audio URL into a single MP4. Replace original audio or mix new audio on top of existing. 1 credit per merge.