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.

modelCreditsMinimumWhat it adds
sync-lipsync-2 (default)10 / second50Fast, cost-efficient lip sync
sync-lipsync-2-pro20 / second100Super-resolution detail in the mouth region
sync-lipsync-330 / second150Handles 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.

Durationsync-lipsync-2sync-lipsync-2-prosync-lipsync-3
3s50100150
5s50100150
10s100200300
15s150300450
15.04s160320480
20s200400600
30s300600900

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/lipsync

See Authentication for API key setup.

Parameters

ParameterTypeRequiredDescription
video_urlstringYesSource video URL (MP4, MOV, WebM, M4V, GIF). Max 30 seconds.
audio_urlstringYesAudio track URL (MP3, WAV, AAC, OGG, M4A)
sync_modestringNoHow to handle duration mismatch. Default: "cut_off".
modelstringNo"sync-lipsync-2" (default) or "sync-lipsync-2-pro". See Pricing.
active_speakerbooleanNoDetect who is speaking in multi-person video. Default: false.

Sync Modes

ModeBehavior
cut_offTruncates whichever input is longer (default, most predictable)
loopRepeats the video to match longer audio
bouncePalindrome playback of video to match audio length
silenceExtends video with frozen frames if audio is longer
remapTime-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

ConstraintValue
Maximum video duration30 seconds
Supported video formatsMP4, MOV, WebM, M4V, GIF
Supported audio formatsMP3, WAV, AAC, OGG, M4A
Max processing time4 minutes
Multi-person supportYes (active speaker detection)
AI-generated charactersYes

Errors

CodeHTTPDescription
MISSING_VIDEO_URL400video_url not provided
MISSING_AUDIO_URL400audio_url not provided
INVALID_SYNC_MODE400Sync mode not one of the valid options
INVALID_MODEL400Model not one of the supported lipsync models
INVALID_ACTIVE_SPEAKER400active_speaker was not a boolean
PROBE_FAILED422Could not read video duration
VIDEO_TOO_LONG422Video exceeds 30 second maximum
INSUFFICIENT_CREDITS402Not enough credits
LIPSYNC_SUBMIT_FAILED500Could not start the lipsync job
LIPSYNC_FAILED500Processing failed or timed out