# Sync-3 lipsync of a video to an audio track

Needs video url and audio url. Served by fal.ai.

sync-3 (sync.so), lipsync a video to an audio track, served by fal.ai. The OpenAPI schema for the fal-ai/sync-lipsync/v3 queue. Price: $8 per minute of output video, which follows the input length, metered by fal after the call (x-fal-billable-units) and billed at that reading; the reservation is the bound you declare and the difference is refunded. Asynchronous: returns a request_id; poll fal/status and fetch fal/result with model "fal-ai/sync-lipsync" and that request_id. Billed once, when the result is ready; a generation that fails is refunded.

- Tool ID: `fal/sync-lipsync-v3`
- Name in the catalog: sync-3 (sync.so), lipsync a video to an audio track
- Provider: [fal.ai](/providers/fal.md)
- Capability: [Lip sync](/tools/video-generation/lip-sync.md)
- Price: $8.00 per unit
- Authentication: an authorised Agentik workspace is required for execution, including zero-price tools.

## Pricing contract

The provider’s price, with no markup. Billed for measured usage.


```json
{
  "model": "per_unit",
  "amountUsd": 8,
  "unitsHeader": "x-fal-billable-units",
  "maxUnits": 10,
  "maxUnitsField": "max_minutes",
  "fractional": true
}
```

Pricing source: [https://fal.ai/models/fal-ai/sync-lipsync/v3](https://fal.ai/models/fal-ai/sync-lipsync/v3). $8 per minute of output video, which follows the input length, metered by fal after the call (x-fal-billable-units) and billed at that reading; the reservation is the bound you declare and the difference is refunded..

Price verification date: 2026-10-08.

## Complete input schema


```json
{
  "type": "object",
  "properties": {
    "audio_url": {
      "title": "Audio Url",
      "description": "URL of the input audio",
      "type": "string"
    },
    "options": {
      "title": "Sync3GenerationOptions",
      "type": "object",
      "properties": {
        "active_speaker_detection": {
          "description": "Active speaker detection configuration for videos with multiple people.",
          "anyOf": [
            {
              "title": "Sync3ActiveSpeakerDetection",
              "type": "object",
              "properties": {
                "bounding_boxes": {
                  "title": "Bounding Boxes",
                  "description": "Per-frame bounding boxes [x1, y1, x2, y2] for the detected face.",
                  "anyOf": [
                    {
                      "items": {
                        "anyOf": [
                          {
                            "items": {
                              "type": "integer"
                            },
                            "type": "array"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "type": "array"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "face_image": {
                  "title": "Face Image",
                  "description": "Base64 encoded face image for manual speaker selection.",
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "auto_detect": {
                  "title": "Auto Detect",
                  "description": "Whether to automatically detect and apply generation to the active speaker.",
                  "anyOf": [
                    {
                      "type": "boolean"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "use_v2": {
                  "title": "Use V2",
                  "description": "Deprecated Sync.so option for active speaker detection v2.",
                  "anyOf": [
                    {
                      "type": "boolean"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "bounding_boxes_url": {
                  "title": "Bounding Boxes Url",
                  "description": "URL to a JSON file containing per-frame bounding boxes.",
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "coordinates": {
                  "title": "Coordinates",
                  "description": "Reference point [x, y] on the speaker's face in frame_number.",
                  "anyOf": [
                    {
                      "items": {
                        "type": "integer"
                      },
                      "maxItems": 2,
                      "type": "array",
                      "minItems": 2
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "frame_number": {
                  "title": "Frame Number",
                  "description": "Frame index for manual speaker selection coordinates.",
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": 0
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "v3": {
                  "title": "V3",
                  "description": "Whether to use Sync.so's active speaker detection v3.",
                  "anyOf": [
                    {
                      "type": "boolean"
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "x-fal-order-properties": [
                "auto_detect",
                "v3",
                "use_v2",
                "frame_number",
                "coordinates",
                "bounding_boxes",
                "bounding_boxes_url",
                "face_image"
              ]
            },
            {
              "type": "null"
            }
          ]
        },
        "prompt": {
          "title": "Prompt",
          "description": "Emotion prompt for generation. This is a Sync.so option primarily used by react-1.",
          "anyOf": [
            {
              "enum": [
                "happy",
                "sad",
                "angry",
                "disgusted",
                "surprised",
                "neutral"
              ],
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "sync_mode": {
          "title": "Sync Mode",
          "description": "Defines how to handle duration mismatches between video and audio inputs. Overrides the top-level sync_mode when provided.",
          "anyOf": [
            {
              "enum": [
                "cut_off",
                "loop",
                "bounce",
                "silence",
                "remap"
              ],
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "occlusion_detection_enabled": {
          "title": "Occlusion Detection Enabled",
          "description": "Whether to detect occlusion during generation. Sync.so handles this automatically for sync-3, so this option is ignored by sync-3.",
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ]
        },
        "temperature": {
          "title": "Temperature",
          "description": "Controls how expressive lipsync can be; 0 is least expressive, 1 is most expressive. Sync.so handles this natively for sync-3, so this option is ignored by sync-3.",
          "anyOf": [
            {
              "type": "number",
              "minimum": 0,
              "maximum": 1
            },
            {
              "type": "null"
            }
          ]
        },
        "model_mode": {
          "title": "Model Mode",
          "description": "Edit region for the model. This is a Sync.so option primarily used by react-1.",
          "anyOf": [
            {
              "enum": [
                "lips",
                "face",
                "head",
                "lipsync",
                "emotion",
                "talking_head"
              ],
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "x-fal-order-properties": [
        "sync_mode",
        "model_mode",
        "prompt",
        "temperature",
        "active_speaker_detection",
        "occlusion_detection_enabled"
      ],
      "description": "Additional Sync.so generation options. If options.sync_mode is set, it overrides the top-level sync_mode field."
    },
    "video_url": {
      "title": "Video Url",
      "description": "URL of the input video",
      "type": "string"
    },
    "max_minutes": {
      "type": "number",
      "minimum": 0.05,
      "maximum": 10,
      "default": 1,
      "description": "Upper bound of the output video length, which follows the input, in minutes (default 1, max 10). The reservation is this bound at the unit price; after the call the minutes fal meters are billed and the rest is refunded. Declare at least the real amount: a larger input is still processed but is never billed above the reservation."
    }
  },
  "required": [
    "video_url",
    "audio_url"
  ],
  "additionalProperties": false
}
```

## Published example

This is the provider tool’s published example. Replace example values with the user’s requested inputs, respecting the schema; do not execute an example merely to test a connection.


```json
{
  "tool_id": "fal/sync-lipsync-v3",
  "input": {
    "video_url": "https://v3b.fal.media/files/b/0a93c312/TqKMiLtCcTKWSeAWXJRD0_output.mp4",
    "audio_url": "https://v3.fal.media/files/zebra/zJL_oRY8h5RWwjoK1w7tx_output.mp3",
    "max_minutes": 0.25
  }
}
```

## Execute and retrieve

Inspect again before execution, explain the price and obtain the required authority. Use MCP run_tool or POST /v1/run with this tool ID, valid input and an idempotency key. Save the returned run ID and follow the actual state. If Agentik answers that the tool is temporarily unavailable, do not retry it blindly; use discovery to propose an alternative.

This tool uses deferred settlement. Follow its returned task/run instructions; preserve the existing reservation until the result is reconciled.

A partial or uncertain result can still have consumed provider resources. Consult [billing](/docs/billing.md), [idempotency](/docs/idempotency.md) and [asynchronous results](/docs/async.md).

[Provider documentation](https://fal.ai/models/fal-ai/sync-lipsync/v3)

[REST inspection](https://api.agentik.cc/v1/tools/fal/sync-lipsync-v3) · [OpenAPI](/openapi.json) · [Connection guide](/connect.md)

---

[HTML page](/providers/fal/sync-lipsync-v3) · [Agent index](/llms.txt)
