Build with Video Lip Sync
Make your first request
Use your Sorceress API key on your server. The playground uses your signed-in account; your application uses the same model with an API key.
curl -X POST 'https://sorceress.games/api/v1/tools/lip_sync' \
-H 'Authorization: Bearer $SORCERESS_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"videoUrl": "<videoUrl>",
"audioUrl": "<audioUrl>"
}'Inputs & settings
videoUrlstringRequiredhttps URL of the source video (MP4/MOV). Use file_upload publicUrl for a local clip.
audioUrlstringRequiredhttps URL of the replacement voice clip. Max 180 seconds. Use speech_generate or file_upload.
modestringlite (default, faster frontal speaker) or basic (scene cuts / harder shots). Same price.
separateVocalbooleanSplit vocals from the driving audio before sync (default false).
openScenedetbooleanbasic mode only: detect scene cuts.
alignAudiobooleanlite mode: loop the video if audio is longer (default true).
alignAudioReversebooleanlite mode: reverse-loop when alignAudio is true.
audioSecondsnumberClip length in seconds (1–180). Optional — probed from audioUrl when omitted.
Full input schema
{
"required": [
"videoUrl",
"audioUrl"
],
"properties": {
"videoUrl": {
"type": "string",
"title": "video Url",
"description": "https URL of the source video (MP4/MOV). Use file_upload publicUrl for a local clip.",
"format": "uri"
},
"audioUrl": {
"type": "string",
"title": "audio Url",
"description": "https URL of the replacement voice clip. Max 180 seconds. Use speech_generate or file_upload.",
"format": "uri"
},
"mode": {
"type": "string",
"title": "mode",
"description": "lite (default, faster frontal speaker) or basic (scene cuts / harder shots). Same price."
},
"separateVocal": {
"type": "boolean",
"title": "separate Vocal",
"description": "Split vocals from the driving audio before sync (default false)."
},
"openScenedet": {
"type": "boolean",
"title": "open Scenedet",
"description": "basic mode only: detect scene cuts."
},
"alignAudio": {
"type": "boolean",
"title": "align Audio",
"description": "lite mode: loop the video if audio is longer (default true)."
},
"alignAudioReverse": {
"type": "boolean",
"title": "align Audio Reverse",
"description": "lite mode: reverse-loop when alignAudio is true."
},
"audioSeconds": {
"type": "number",
"title": "audio Seconds",
"description": "Clip length in seconds (1–180). Optional — probed from audioUrl when omitted."
}
}
}Results, saved runs & billing
Media requests return a job ID. Poll GET /api/v1/jobs/:id until it succeeds or fails; keep the same ID while it is processing. Long chat requests can also return a saved job to poll. Completed outputs are stored in your account, and successful work is billed using your model's current rates.
A multi-step workflow may include separately billed successful actions. If a connection drops, check your saved run before submitting it again.






