openapi: 3.0.3 info: title: Sync Labs Assets Generate API description: The Sync Labs API provides studio-grade AI lip-sync and visual dubbing capabilities. Generate perfectly synchronized lip movements for any video and audio input using state-of-the-art models. Supports single generation, batch processing, asset management, and webhook notifications. Used for video localization, content dubbing, personalized video, and educational content translation. version: v2 contact: name: Sync Labs Support email: hello@sync.so url: https://sync.so license: name: Commercial url: https://sync.so/terms servers: - url: https://api.sync.so/v2 description: Sync Labs API v2 security: - ApiKeyAuth: [] tags: - name: Generate description: Lip-sync video generation operations paths: /generate: post: summary: Create Lip-Sync Generation description: Submit a video and audio input to generate a lip-synced output video. The operation is asynchronous — poll the GET endpoint or use webhooks for completion notification. Rate limited to 60 requests/min. operationId: createGeneration tags: - Generate requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/GenerationRequest' responses: '201': description: Generation job created successfully content: application/json: schema: $ref: '#/components/schemas/GenerationResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '429': $ref: '#/components/responses/RateLimitExceeded' '500': $ref: '#/components/responses/InternalError' get: summary: List Generations description: List all generation jobs for the authenticated account operationId: listGenerations tags: - Generate parameters: - name: limit in: query schema: type: integer default: 20 maximum: 100 description: Maximum number of results to return - name: offset in: query schema: type: integer default: 0 description: Pagination offset - name: status in: query schema: type: string enum: - pending - processing - completed - failed description: Filter by status responses: '200': description: List of generation jobs content: application/json: schema: type: object properties: generations: type: array items: $ref: '#/components/schemas/GenerationResponse' total: type: integer has_more: type: boolean '401': $ref: '#/components/responses/Unauthorized' /generate/{id}: get: summary: Get Generation Status description: Retrieve the status and result of a specific generation job operationId: getGeneration tags: - Generate parameters: - name: id in: path required: true schema: type: string description: Generation job ID responses: '200': description: Generation job details content: application/json: schema: $ref: '#/components/schemas/GenerationResponse' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /generate/estimate-cost: get: summary: Estimate Generation Cost description: Calculate the estimated cost before submitting a generation operationId: estimateGenerationCost tags: - Generate parameters: - name: model in: query required: true schema: $ref: '#/components/schemas/ModelId' description: AI model to use - name: duration in: query required: true schema: type: number format: float description: Video duration in seconds responses: '200': description: Cost estimate content: application/json: schema: type: object properties: estimated_cost: type: number format: float description: Estimated cost in USD model: type: string duration_seconds: type: number cost_per_second: type: number '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' components: responses: InternalError: description: Internal server error content: application/json: schema: $ref: '#/components/schemas/Error' Unauthorized: description: Unauthorized - missing or invalid API key content: application/json: schema: $ref: '#/components/schemas/Error' BadRequest: description: Bad request - invalid parameters content: application/json: schema: $ref: '#/components/schemas/Error' NotFound: description: Resource not found content: application/json: schema: $ref: '#/components/schemas/Error' RateLimitExceeded: description: Rate limit exceeded (60 req/min on POST /v2/generate) content: application/json: schema: $ref: '#/components/schemas/Error' schemas: ModelId: type: string enum: - sync-3 - lipsync-2-pro - lipsync-2 - lipsync-1.9 - react-1 description: AI model identifier GenerationResponse: type: object properties: id: type: string description: Unique generation job ID status: type: string enum: - pending - processing - completed - failed description: Current job status created_at: type: string format: date-time description: Job creation timestamp completed_at: type: string format: date-time nullable: true description: Job completion timestamp video_url: type: string format: uri nullable: true description: URL to the output video (available when completed) model: $ref: '#/components/schemas/ModelId' error: type: string nullable: true description: Error message if status is failed duration_seconds: type: number format: float description: Duration of the generated video in seconds cost: type: number format: float nullable: true description: Actual cost of the generation in USD GenerationRequest: type: object required: - video_url - audio_url - model properties: video_url: type: string format: uri description: URL to the source video (MP4 or common video formats) audio_url: type: string format: uri description: URL to the source audio (WAV or MP3) video_asset_id: type: string description: Alternatively, provide an uploaded video asset ID audio_asset_id: type: string description: Alternatively, provide an uploaded audio asset ID model: $ref: '#/components/schemas/ModelId' webhook_url: type: string format: uri description: URL to receive webhook notification on completion synergize: type: boolean description: Enable multi-speaker detection and selection max_face_resolution: type: integer description: Maximum face resolution cap in pixels output_format: type: string enum: - mp4 - webm default: mp4 description: Output video format Error: type: object properties: error: type: string description: Error type message: type: string description: Human-readable error description request_id: type: string description: Request ID for support reference securitySchemes: ApiKeyAuth: type: apiKey in: header name: x-api-key description: API key from https://sync.so/settings/api-keys