synclabs/sync-3, served by Comfy Router from Synclabs.
Quick start
Create a key in your Comfy workspace and export it asCOMFY_API_KEY. The Python, TypeScript and Swift snippets use the Comfy SDKs (pip install comfy-sdk, npm install @comfyorg/sdk, and the ComfySwiftSDK Swift package); the cURL snippet is the same call over raw HTTP.
Model ID: synclabs/sync-3
Endpoint: POST https://api.comfy.org/v2/models/synclabs/sync-3
- Wait for the result
- Queue and collect later
Schema
Input
object
Dubbing parameters attached to a Sync Labs generate request
integer
Number of speakers in the source video; 0 enables auto-detection
string
required
Provider to use for dubbing (e.g. elevenlabs)
string
Source language code; defaults to auto
string
required
Target language code for dubbing
object[]
required
Input items; exactly one visual input (video or image) and one audio or text input
string
ID of an asset from the Sync Labs media library
object
Text-to-speech provider configuration for a Sync Labs text input
string
required
TTS provider name (e.g. elevenlabs)
string
required
Script to be used for generation
number
How closely the AI should adhere to the original voiceFormat:
doublenumber
Voice stability; lower values introduce broader emotional rangeFormat:
doublestring
required
Sync voice id (cloned voice from the Studio) or ElevenLabs voice ID
string
Reference identifier used to link this input to segment definitions
integer[][]
Deprecated - use the top-level segments array instead
number[][]
Deprecated - use the top-level segments array instead
string
required
Input type (video, image, audio, or text)
string
URL of the media to be used for generation
string
Name of the model to use for generation; only sync-3 is supported. On the Comfy Router route
POST /v2/models/synclabs/{model} this field is supplied from the path and may be omitted.object
Additional options available for a Sync Labs generation
object
Active speaker detection configuration
boolean
Whether to automatically detect and apply generation to the active speaker
integer[][]
Per-frame array of bounding boxes [x1, y1, x2, y2] for the detected face
string
URL to a JSON file containing bounding boxes
integer[]
Pixel coordinates [x, y] in the source video frame identified by frame_number
integer
Frame index that corresponds to the provided coordinates for manual speaker selection
boolean
Whether to use ASD v3
string
Edit region for the model (lips, face, head); only works with react-1
boolean
Whether to detect occlusion during generation
string
Emotion prompt; only works with react-1
string
How to handle duration mismatches between video and audio (bounce, loop, cut_off, silence, remap)
number
How expressive lipsync can be, 0 to 1Format:
doublestring
Base filename for the generated output without extension
string
Optionally attach this generation to a Sync Labs project
object[]
Segment definitions applying different audio inputs to different video segments
object
required
Audio input configuration for a specific segment
number
Optional end time in seconds to crop the referenced audioFormat:
doublestring
required
Reference ID of the audio/text-to-speech input to use for this segment
number
Optional start time in seconds to crop the referenced audioFormat:
doublenumber
required
Segment end time in secondsFormat:
doubleobject
Override generation options for a specific segment
object
Active speaker detection configuration
boolean
Whether to automatically detect and apply generation to the active speaker
integer[][]
Per-frame array of bounding boxes [x1, y1, x2, y2] for the detected face
string
URL to a JSON file containing bounding boxes
integer[]
Pixel coordinates [x, y] in the source video frame identified by frame_number
integer
Frame index that corresponds to the provided coordinates for manual speaker selection
boolean
Whether to use ASD v3
boolean
Override occlusion detection for this segment
string
Override the sync mode for this segment
number
Override temperature (0-1) for this segmentFormat:
doublenumber
required
Segment start time in secondsFormat:
doublestring
Webhook URL for generation status updates
GET /v2/models/synclabs/sync-3/openapi.json, the same document it validates a call against before the request reaches the provider.
Output
string
The date and time the generation was created
string
The error message if the generation failed
string
Stable, machine-readable error code if the generation failed
string
Unique identifier for the generation
object[]
The input items used for generation
string
ID of an asset from the Sync Labs media library
object
Text-to-speech provider configuration for a Sync Labs text input
string
required
TTS provider name (e.g. elevenlabs)
string
required
Script to be used for generation
number
How closely the AI should adhere to the original voiceFormat:
doublenumber
Voice stability; lower values introduce broader emotional rangeFormat:
doublestring
required
Sync voice id (cloned voice from the Studio) or ElevenLabs voice ID
string
Reference identifier used to link this input to segment definitions
integer[][]
Deprecated - use the top-level segments array instead
number[][]
Deprecated - use the top-level segments array instead
string
required
Input type (video, image, audio, or text)
string
URL of the media to be used for generation
string
The name of the model used for generation
object
Additional options available for a Sync Labs generation
object
Active speaker detection configuration
boolean
Whether to automatically detect and apply generation to the active speaker
integer[][]
Per-frame array of bounding boxes [x1, y1, x2, y2] for the detected face
string
URL to a JSON file containing bounding boxes
integer[]
Pixel coordinates [x, y] in the source video frame identified by frame_number
integer
Frame index that corresponds to the provided coordinates for manual speaker selection
boolean
Whether to use ASD v3
string
Edit region for the model (lips, face, head); only works with react-1
boolean
Whether to detect occlusion during generation
string
Emotion prompt; only works with react-1
string
How to handle duration mismatches between video and audio (bounce, loop, cut_off, silence, remap)
number
How expressive lipsync can be, 0 to 1Format:
doublenumber
The duration of the output media in secondsFormat:
doublestring
The sanitized filename applied to the output media
string
The URL of the output media
string
The id of the project this generation is attached to
string
The URL of the segment output media
object[]
The segments of the generation
object
required
Audio input configuration for a specific segment
number
Optional end time in seconds to crop the referenced audioFormat:
doublestring
required
Reference ID of the audio/text-to-speech input to use for this segment
number
Optional start time in seconds to crop the referenced audioFormat:
doublenumber
required
Segment end time in secondsFormat:
doubleobject
Override generation options for a specific segment
object
Active speaker detection configuration
boolean
Whether to automatically detect and apply generation to the active speaker
integer[][]
Per-frame array of bounding boxes [x1, y1, x2, y2] for the detected face
string
URL to a JSON file containing bounding boxes
integer[]
Pixel coordinates [x, y] in the source video frame identified by frame_number
integer
Frame index that corresponds to the provided coordinates for manual speaker selection
boolean
Whether to use ASD v3
boolean
Override occlusion detection for this segment
string
Override the sync mode for this segment
number
Override temperature (0-1) for this segmentFormat:
doublenumber
required
Segment start time in secondsFormat:
doublestring
The status of the generation (PENDING, PROCESSING, COMPLETED, FAILED, REJECTED)
string
The URL of the audio synthesized from a text (TTS) input
string
The URL to the webhook endpoint
Examples
Input
Output
Before you ship
The SDKs create anIdempotency-Key and reuse it for automatic retries. For manual retries, reuse the original key. Router can hold the connection for up to 10 minutes.
When a request fails, Router sends an X-Comfy-Error-Type response header explaining why. A 422 means Router rejected the input before calling the provider, and a 413 means the request body was larger than Router accepts. Download generated assets promptly because result URLs can expire.
Any size limit named in a field description above is the provider’s own bound on that field, quoted from the provider’s specification. Router applies a separate cap to the whole request body, which base64-encoded media counts against: see request body size.
This page documents one partner model called through Comfy Router. The same comfy-sdk / @comfyorg/sdk package also ships a second client, for running a whole ComfyUI workflow graph on Comfy Cloud: Comfy(api_key=...) / new Comfy({ apiKey }), with client.workflows, client.assets and client.jobs. See Comfy SDKs.
Headers
Authentication, idempotency, request IDs, error buckets, retry pacing, spend limits.
Using the Router API
Model discovery, validation errors, retries, and billing.
Limitations
What Router does not do today, and what to use instead.