sync-3 Lipsync
sync-3 turns a single still into a talking character from a voice track. It works with photos, illustrations and animated frames, and it has no creative controls.
lipsync · model sync-lipsync-v3 · catalog model-catalog@2026-10-06.v5 · pricing customer-pricing@2026-11-05.v15.Endpoint
POST https://api.roasos.com/v1/lipsync/sync-lipsync-v3Send your API key as a bearer token. The key needs the scope api:write. Every paid request also needs an Idempotency-Key header.
The envelope fields quote_only, quote_id, webhook_url and wait_timeout_seconds behave the same on each model endpoint. Refer to Jobs and Quotes and credits.
Good at
Drawn, cartoon or stylized faces paired with a voice track. The output matches the duration of the audio. Send an image and an audio file, nothing else. It has no prompt and no aspect ratio control. Use /v1/lipsync/ltx-lipsync when you want a prompt-driven motion, and /v1/lipsync/veed-lipsync-v2 when the source is a video.
Pricing
The unit is one second. Pricing key: sync-lipsync-v3.
| Request | Credits |
|---|---|
10s | 16 |
The credits come from the roasOS pricing table. No other field changes the price. To get the exact price of your request, send it with quote_only: true first.
Modes
image-audio-to-video
Provider endpoints: fal-ai/sync-lipsync/v3/image-to-video.
Request fields
| Field | Type | Required | Default | Rule |
|---|---|---|---|---|
audio_url | string | yes | — | https URL; ≤ 4,096 characters |
avatar_id | string | no | — | UUID |
image_url | string | no | — | https URL; ≤ 4,096 characters |
quote_id | string | no | — | UUID |
quote_only | boolean | no | false | — |
wait_timeout_seconds | integer | no | 0 | 0–60 |
webhook_url | string | no | — | https URL; ≤ 4,096 characters |
The schema is strict. A field that is not in this table gets 400 unsupported_option. The field names are the roasOS role names. One role has one name in every family.
Media
This endpoint accepts these media roles:
avatar_id— identity; the saved character reference sheet, with a derived portrait only where the model requires a single face or source frameimage_url— first frame (or the single source image)audio_url— the driving audio track
| Role | Items | Maximum size | Content types | Duration |
|---|---|---|---|---|
audio_url | ≤ 1 | 15 MB | audio/mp3, audio/mpeg, audio/wav, audio/wave, audio/x-wav | 0–60 s |
image_url | ≤ 1 | 10 MB | image/jpeg, image/png, image/webp | — |
Every other role is refused: elements, product_id, product_images, references, reference_images, end_image_url, scene_id, scene_image, video_urls, video_url, audio_urls, voice_id. A refused role gets 400 unsupported_option.
https://cdn.roasos.com that your workspace owns. Any other URL gets 400 reference_media_not_workspace_owned. Refer to Reference media and uploads to learn how to put a file there.Prompt
None. The endpoint has no prompt.
Not exposed
roasOS pins no provider field for this model.
Result
The result kind is lipsync. Always present: url.
{
"data": {
"id": "gen_…",
"kind": "lipsync",
"model": "sync-lipsync-v3",
"status": "completed",
"result": {
"url": "https://cdn.roasos.com/workspaces/ws_01/result"
}
}
}The files are immutable objects on https://cdn.roasos.com. A result URL is a valid media input for your next request.
Example
The three steps are always the same: quote, run, poll.
# 1. Quote. Nothing is spent.
curl -X POST https://api.roasos.com/v1/lipsync/sync-lipsync-v3 \
-H "Authorization: Bearer roasos_sk_live_..." \
-H "Idempotency-Key: 0f1c9e2a-sync-lipsync-v3-0001" \
-H "Content-Type: application/json" \
-d '{"quote_only":true,"audio_url":"https://cdn.roasos.com/workspaces/ws_01/uploads/audio_url.mp3","image_url":"https://cdn.roasos.com/workspaces/ws_01/uploads/image_url.png"}'
# 200 { "data": { "kind": "quote", "quote_id": "q_7Hk...", "credits": 16, "expires_at": "...",
# "confirmation": { "model": "sync-lipsync-v3", "example": "10s" } } }
# 2. Run. Same body, same Idempotency-Key, quote_id in place of quote_only.
curl -X POST https://api.roasos.com/v1/lipsync/sync-lipsync-v3 \
-H "Authorization: Bearer roasos_sk_live_..." \
-H "Idempotency-Key: 0f1c9e2a-sync-lipsync-v3-0001" \
-H "Content-Type: application/json" \
-d '{"quote_id":"q_7Hk...","audio_url":"https://cdn.roasos.com/workspaces/ws_01/uploads/audio_url.mp3","image_url":"https://cdn.roasos.com/workspaces/ws_01/uploads/image_url.png"}'
# 201 { "data": { "id": "gen_...", "status": "queued", "credits_reserved": 16 } }
# 3. Poll, then read the result.
curl https://api.roasos.com/v1/jobs/gen_.../status -H "Authorization: Bearer roasos_sk_live_..."
curl https://api.roasos.com/v1/jobs/gen_.../result -H "Authorization: Bearer roasos_sk_live_..."The deprecated path
POST /v1/generations still reaches this model for one minor version. It is deprecated. This is how it maps:
The endpoint is POST /v1/lipsync/sync-lipsync-v3 with image_url (or avatar_id) and audio_url.
The deprecated alias does not carry this model: POST /v1/generations { "type": "lipsync" } returns 503 lipsync_public_authority_unavailable for every lipsync model except ltx-lipsync.
See also
llms.txtfor this model — the same facts as one plain-text file for an agent.GET https://api.roasos.com/v1/catalog/sync-lipsync-v3— the machine-readable form: enums, defaults, limits and prices. Refer to the API reference.- Jobs — how to poll a job and read its result.
- Provider endpoints:
fal-ai/sync-lipsync/v3/image-to-video.
LTX Lipsync
LTX 2.3 turns a still image and a voice track into a short talking clip, with an optional prompt for a small camera or body motion. It is the default lipsync model of the platform.
VEED Lipsync v2
VEED Lipsync v2 re-lips a video that already exists to a new audio track. It keeps the original motion, camera and background, and it is the cheapest lipsync model per second.