← sync. labsCONTENT HISTORY

Update to sync. labs

Snapshot Nov 6, 2026 · 18:14 UTC · version 2.1.1

Collection source: downloaded plugin package.

WHAT CHANGED

Instructions updated for translate-and-dub

Full description — Now says: one source video's speech into another language with sync. labs (sync.so) and re-sync the speaker's lips to the dubbed audio, from a local file, URL, or...

Observed in instructions or declared skills. Runtime behavior has not been tested.

Save sync. labs and check future changes in Following.

Up to 3 plugins free · no card required.

All fields and original values.

Full description

Before

Nov 3, 2026 · 18:14 UTC

a video's speech into another language with sync. labs and re-sync the lips to the dubbed audio, from an uploaded video or a YouTube, TikTok, Instagram or Facebook link, into one or several languages. Use for "dub this video into Spanish...

After

Nov 6, 2026 · 18:14 UTC

one source video's speech into another language with sync. labs (sync.so) and re-sync the speaker's lips to the dubbed audio, from a local file, URL, or YouTube, TikTok, Instagram or Facebook link, into one or several languages. Use for ...

Skill instructions

Before

Nov 3, 2026 · 18:14 UTC

a video's speech into another language with sync. labs and re-sync the lips to the dubbed audio, from an uploaded video or a YouTube, TikTok, Instagram or Facebook link, into one or several languages. Use for "dub this video into Spanish...

After

Nov 6, 2026 · 18:14 UTC

one source video's speech into another language with sync. labs (sync.so) and re-sync the speaker's lips to the dubbed audio, from a local file, URL, or YouTube, TikTok, Instagram or Facebook link, into one or several languages. Use for ...

Supporting files

Before

Nov 3, 2026 · 18:14 UTC

[{"relative_path":"agents/openai.yaml","size_in_bytes":221}]

After

Nov 6, 2026 · 18:14 UTC

[{"relative_path":"agents/openai.yaml","size_in_bytes":197},{"relative_path":"references/api.md","size_in_bytes":4169},{"relative_path":"references/connect.md","size_in_bytes":3346},{"relative_path":"references/media-input.md","size_in_b...

Compare saved observations

Download comparison JSON

SKILL.md text changes

− removed · + added

--- before
+++ after
@@ -1,44 +1,45 @@
 ---
 name: translate-and-dub
-description: Translate a video's speech into another language with sync. labs and re-sync the lips to the dubbed audio, from an uploaded video or a YouTube, TikTok, Instagram or Facebook link, into one or several languages. Use for "dub this video into Spanish", "translate my YouTube video to Japanese", AI dubbing, or localizing a video for other markets. Not for subtitles only, translating a text document, or lip-syncing audio the user already has (lipsync-video).
+description: Translate one source video's speech into another language with sync. labs (sync.so) and re-sync the speaker's lips to the dubbed audio, from a local file, URL, or YouTube, TikTok, Instagram or Facebook link, into one or several languages. Use for "dub this video into Spanish", "translate my YouTube video to Japanese", AI dubbing, video translation, or a multilingual version of one video. Not for subtitles or captions only, translating a text document, lip-syncing audio the user already has (lipsync), or a whole campaign of several videos across markets (localize-campaign).
+license: MIT
+compatibility: Needs the sync. MCP server or a SYNC_API_KEY. See references/connect.md.
 ---
 
 # Translate and dub a video
 
-Delivers one dubbed MP4 per target language, with lips matched to the new audio.
+Delivers one dubbed MP4 per target language, with lips matched to the new audio. The dubbed voice follows the original speaker's.
+
+If no sync. tools are available, follow [references/connect.md](references/connect.md) first. Without the MCP tools, use `dubParams` on `POST /v2/generate` as shown in [references/api.md](references/api.md).
 
 ## Inputs
 
-- **Video**: a video file in this conversation, a Sync video asset ID, or a YouTube, TikTok, Instagram or Facebook link.
-- **Target language(s)**: ask if none was given. Use `sourceLang: "auto"` unless the user names the spoken language.
+- **Video:** a local file, a public URL, a sync. video asset ID, or a social link. It needs its original speech on the audio track.
+- **Target languages:** ask if none were given. Use `sourceLang: "auto"` unless the user names the spoken language.
 
 ## Tools
 
 | Step | Tool |
 | --- | --- |
-| Check languages | `get-translation-options` |
+| Check languages | `dubbing_get-options` |
 | Create the project | `projects_create` |
-| Save the video | `upload-media` (file) or `assets_create` (link) |
-| Quote | `generate_estimate-cost` |
-| Create | `create-translate-and-dub` |
-| Wait for the result | `generate_get-generation` |
+| Save the video | `assets_upload`, `assets_create-upload-url` + `assets_create`, or `assets_create` with a link |
+| Quote | `generations_estimate-cost` |
+| Create | `dubbing_create` |
+| Wait | `generations_get` |
 
 ## Steps
 
-1. **Languages.** Call `get-translation-options` and check that every requested language is supported. Name the closest supported option for any that is not.
-2. **Project.** Call `projects_create` with a new random UUID as `id`, a short `name` and `defaultWorkflow: "translate_and_dub"`. Use the returned `projectId` with `projectIntent: "explicit"` in every later call.
-3. **Save the video.**
-   - **File:** call `upload-media` with `mediaType: "video"`.
-   - **Link:** call `assets_create` with the URL, `type: "VIDEO"`, the `projectId` and `projectIntent: "explicit"`. A 409 `import_in_progress` means the import is running: wait `retryAfterMs` (15 seconds if absent) and repeat the identical request until it returns an asset. On `import_failed`, `import_not_enabled`, `import_unavailable` or a limit error, explain the reason, offer a file upload, and stop.
-
-   Never pass an `importJobId` as an asset ID.
-4. **Quote.** Call `generate_estimate-cost` with `workflow: "translate-and-dub"`, `model: "sync-3"` and the video's duration in seconds. Show the returned breakdown and say that any external voice-provider charges it lists are extra.
-5. **Confirm.** Show the video, the language(s) and the estimate per language, then wait for approval, unless this exact request and cost were already approved.
-6. **Create.** For each target language, call `create-translate-and-dub` once with `videoAssetId`, `targetLang`, `sourceLang`, `model: "sync-3"`, the `projectId` with `projectIntent: "explicit"`, and its own new `idempotencyKey`. On a lost response, retry that language once with the same key and inputs.
-7. **Wait and deliver.** Poll `generate_get-generation` with each returned `id` and `wait: true` until it is `COMPLETED` or `FAILED`. Dubbing takes longer than plain lipsync, so tell the user it may take a few minutes. Give each exact `outputUrl`, unchanged, labelled with its language.
+1. **Languages.** Call `dubbing_get-options` and check every requested language. For any that isn't supported, name the closest supported option.
+2. **Project.** Call `projects_create` with a new random UUID as `id`, a short `name` and `defaultWorkflow: "translate_and_dub"`. Save the returned `id` as `projectId`. Pass it wherever a tool asks for `projectId`, and add `projectIntent: "explicit"` only on tools that take that field.
+3. **Save the video** into that project. Follow [references/media-input.md](references/media-input.md).
+4. **Quote.** Call `generations_estimate-cost` with `workflow: "translate-and-dub"`, `model: "sync-3"` and the video's length as `duration` in seconds. Show the returned estimate and its breakdown per language and in total. If it reports external provider charges as excluded, say they're extra.
+5. **Confirm.** Show the video, the languages and the estimate, and wait for approval. Skip the wait only if the user already approved this exact request and cost.
+6. **Create.** For each language, call `dubbing_create` once with `videoAssetId`, `targetLang`, `sourceLang`, `model: "sync-3"`, the `projectId` with `projectIntent: "explicit"`, and its own new `idempotencyKey`. If a response is lost, retry that language once with the same key and inputs.
+7. **Wait and deliver.** Poll `generations_get` with each `id` and `wait: true` until each is final. Dubbing takes longer than plain lipsync, so tell the user it may take several minutes. Give each exact `outputMediaUrl`, unchanged and labelled with its language.
 
 ## Rules
 
 - One paid job per language. Never resubmit a language to check progress.
-- If a language fails, report it and keep the others.
-- Don't offer subtitles, captions or a translated transcript as a substitute; this workflow produces dubbed video only.
+- If one language fails, report it and keep the others.
+- Text on screen isn't translated, and the output is dubbed video only. Don't offer subtitles or a translated transcript as a substitute.
+- If dubbing fails with a voice-provider error and the user connected their own ElevenLabs key to sync., the cause is usually that key's credits or validity. Say so.
Full technical diff · 3 changed fields

changed /description

BEFORE
"Translate a video's speech into another language with sync. labs and re-sync the lips to the dubbed audio, from an uploaded video or a YouTube, TikTok, Instagram or Facebook link, into one or several languages. Use for \"dub this video into Spanish\", \"translate my YouTube video to Japanese\", AI dubbing, or localizing a video for other markets. Not for subtitles only, translating a text document, or lip-syncing audio the user already has (lipsync-video)."
AFTER
"Translate one source video's speech into another language with sync. labs (sync.so) and re-sync the speaker's lips to the dubbed audio, from a local file, URL, or YouTube, TikTok, Instagram or Facebook link, into one or several languages. Use for \"dub this video into Spanish\", \"translate my YouTube video to Japanese\", AI dubbing, video translation, or a multilingual version of one video. Not for subtitles or captions only, translating a text document, lip-syncing audio the user already has (lipsync), or a whole campaign of several videos across markets (localize-campaign)."

changed /included_files

BEFORE
[
  {
    "relative_path": "agents/openai.yaml",
    "size_in_bytes": 221
  }
]
AFTER
[
  {
    "relative_path": "agents/openai.yaml",
    "size_in_bytes": 197
  },
  {
    "relative_path": "references/api.md",
    "size_in_bytes": 4169
  },
  {
    "relative_path": "references/connect.md",
    "size_in_bytes": 3346
  },
  {
    "relative_path": "references/media-input.md",
    "size_in_bytes": 3853
  }
]

changed /skill_md_contents

BEFORE
"---\nname: translate-and-dub\ndescription: Translate a video's speech into another language with sync. labs and re-sync the lips to the dubbed audio, from an uploaded video or a YouTube, TikTok, Instagram or Facebook link, into one or several languages. Use for \"dub this video into Spanish\", \"translate my YouTube video to Japanese\", AI dubbing, or localizing a video for other markets. Not for subtitles only, translating a text document, or lip-syncing audio the user already has (lipsync-video).\n---\n\n# Translate and dub a video\n\nDelivers one dubbed MP4 per target language, with lips matched to the new audio.\n\n## Inputs\n\n- **Video**: a video file in this conversation, a Sync video asset ID, or a YouTube, TikTok, Instagram or Facebook link.\n- **Target language(s)**: ask if none was given. Use `sourceLang: \"auto\"` unless the user names the spoken language.\n\n## Tools\n\n| Step | Tool |\n| --- | --- |\n| Check languages | `get-translation-options` |\n| Create the project | `projects_create` |\n| Save the video | `upload-media` (file) or `assets_create` (link) |\n| Quote | `generate_estimate-cost` |\n| Create | `create-translate-and-dub` |\n| Wait for the result | `generate_get-generation` |\n\n## Steps\n\n1. **Languages.** Call `get-translation-options` and check that every requested language is supported. Name the closest supported option for any that is not.\n2. **Project.** Call `projects_create` with a new random UUID as `id`, a short `name` and `defaultWorkflow: \"translate_and_dub\"`. Use the returned `projectId` with `projectIntent: \"explicit\"` in every later call.\n3. **Save the video.**\n   - **File:** call `upload-media` with `mediaType: \"video\"`.\n   - **Link:** call `assets_create` with the URL, `type: \"VIDEO\"`, the `projectId` and `projectIntent: \"explicit\"`. A 409 `import_in_progress` means the import is running: wait `retryAfterMs` (15 seconds if absent) and repeat the identical request until it returns an asset. On `import_failed`, `import_not_enabled`, `import_unavailable` or a limit error, explain the reason, offer a file upload, and stop.\n\n   Never pass an `importJobId` as an asset ID.\n4. **Quote.** Call `generate_estimate-cost` with `workflow: \"translate-and-dub\"`, `model: \"sync-3\"` and the video's duration in seconds. Show the returned breakdown and say that any external voice-provider charges it lists are extra.\n5. **Confirm.** Show the video, the language(s) and the estimate per language, then wait for approval, unless this exact request and cost were already approved.\n6. **Create.** For each target language, call `create-translate-and-dub` once with `videoAssetId`, `targetLang`, `sourceLang`, `model: \"sync-3\"`, the `projectId` with `projectIntent: \"explicit\"`, and its own new `idempotencyKey`. On a lost response, retry that language once with the same key and inputs.\n7. **Wait and deliver.** Poll `generate_get-generation` with each returned `id` and `wait: true` until it is `COMPLETED` or `FAILED`. Dubbing takes longer than plain lipsync, so tell the user it may take a few minutes. Give each exact `outputUrl`, unchanged, labelled with its language.\n\n## Rules\n\n- One paid job per language. Never resubmit a language to check progress.\n- If a language fails, report it and keep the others.\n- Don't offer subtitles, captions or a translated transcript as a substitute; this workflow produces dubbed video only.\n"
AFTER
"---\nname: translate-and-dub\ndescription: Translate one source video's speech into another language with sync. labs (sync.so) and re-sync the speaker's lips to the dubbed audio, from a local file, URL, or YouTube, TikTok, Instagram or Facebook link, into one or several languages. Use for \"dub this video into Spanish\", \"translate my YouTube video to Japanese\", AI dubbing, video translation, or a multilingual version of one video. Not for subtitles or captions only, translating a text document, lip-syncing audio the user already has (lipsync), or a whole campaign of several videos across markets (localize-campaign).\nlicense: MIT\ncompatibility: Needs the sync. MCP server or a SYNC_API_KEY. See references/connect.md.\n---\n\n# Translate and dub a video\n\nDelivers one dubbed MP4 per target language, with lips matched to the new audio. The dubbed voice follows the original speaker's.\n\nIf no sync. tools are available, follow [references/connect.md](references/connect.md) first. Without the MCP tools, use `dubParams` on `POST /v2/generate` as shown in [references/api.md](references/api.md).\n\n## Inputs\n\n- **Video:** a local file, a public URL, a sync. video asset ID, or a social link. It needs its original speech on the audio track.\n- **Target languages:** ask if none were given. Use `sourceLang: \"auto\"` unless the user names the spoken language.\n\n## Tools\n\n| Step | Tool |\n| --- | --- |\n| Check languages | `dubbing_get-options` |\n| Create the project | `projects_create` |\n| Save the video | `assets_upload`, `assets_create-upload-url` + `assets_create`, or `assets_create` with a link |\n| Quote | `generations_estimate-cost` |\n| Create | `dubbing_create` |\n| Wait | `generations_get` |\n\n## Steps\n\n1. **Languages.** Call `dubbing_get-options` and check every requested language. For any that isn't supported, name the closest supported option.\n2. **Project.** Call `projects_create` with a new random UUID as `id`, a short `name` and `defaultWorkflow: \"translate_and_dub\"`. Save the returned `id` as `projectId`. Pass it wherever a tool asks for `projectId`, and add `projectIntent: \"explicit\"` only on tools that take that field.\n3. **Save the video** into that project. Follow [references/media-input.md](references/media-input.md).\n4. **Quote.** Call `generations_estimate-cost` with `workflow: \"translate-and-dub\"`, `model: \"sync-3\"` and the video's length as `duration` in seconds. Show the returned estimate and its breakdown per language and in total. If it reports external provider charges as excluded, say they're extra.\n5. **Confirm.** Show the video, the languages and the estimate, and wait for approval. Skip the wait only if the user already approved this exact request and cost.\n6. **Create.** For each language, call `dubbing_create` once with `videoAssetId`, `targetLang`, `sourceLang`, `model: \"sync-3\"`, the `projectId` with `projectIntent: \"explicit\"`, and its own new `idempotencyKey`. If a response is lost, retry that language once with the same key and inputs.\n7. **Wait and deliver.** Poll `generations_get` with each `id` and `wait: true` until each is final. Dubbing takes longer than plain lipsync, so tell the user it may take several minutes. Give each exact `outputMediaUrl`, unchanged and labelled with its language.\n\n## Rules\n\n- One paid job per language. Never resubmit a language to check progress.\n- If one language fails, report it and keep the others.\n- Text on screen isn't translated, and the output is dubbed video only. Don't offer subtitles or a translated transcript as a substitute.\n- If dubbing fails with a voice-provider error and the user connected their own ElevenLabs key to sync., the cause is usually that key's credits or validity. Say so.\n"
Full snapshot data
{
  "description": "Translate one source video's speech into another language with sync. labs (sync.so) and re-sync the speaker's lips to the dubbed audio, from a local file, URL, or YouTube, TikTok, Instagram or Facebook link, into one or several languages. Use for \"dub this video into Spanish\", \"translate my YouTube video to Japanese\", AI dubbing, video translation, or a multilingual version of one video. Not for subtitles or captions only, translating a text document, lip-syncing audio the user already has (lipsync), or a whole campaign of several videos across markets (localize-campaign).",
  "included_files": [
    {
      "relative_path": "agents/openai.yaml",
      "size_in_bytes": 197
    },
    {
      "relative_path": "references/api.md",
      "size_in_bytes": 4169
    },
    {
      "relative_path": "references/connect.md",
      "size_in_bytes": 3346
    },
    {
      "relative_path": "references/media-input.md",
      "size_in_bytes": 3853
    }
  ],
  "name": "translate-and-dub",
  "skill_md_contents": "---\nname: translate-and-dub\ndescription: Translate one source video's speech into another language with sync. labs (sync.so) and re-sync the speaker's lips to the dubbed audio, from a local file, URL, or YouTube, TikTok, Instagram or Facebook link, into one or several languages. Use for \"dub this video into Spanish\", \"translate my YouTube video to Japanese\", AI dubbing, video translation, or a multilingual version of one video. Not for subtitles or captions only, translating a text document, lip-syncing audio the user already has (lipsync), or a whole campaign of several videos across markets (localize-campaign).\nlicense: MIT\ncompatibility: Needs the sync. MCP server or a SYNC_API_KEY. See references/connect.md.\n---\n\n# Translate and dub a video\n\nDelivers one dubbed MP4 per target language, with lips matched to the new audio. The dubbed voice follows the original speaker's.\n\nIf no sync. tools are available, follow [references/connect.md](references/connect.md) first. Without the MCP tools, use `dubParams` on `POST /v2/generate` as shown in [references/api.md](references/api.md).\n\n## Inputs\n\n- **Video:** a local file, a public URL, a sync. video asset ID, or a social link. It needs its original speech on the audio track.\n- **Target languages:** ask if none were given. Use `sourceLang: \"auto\"` unless the user names the spoken language.\n\n## Tools\n\n| Step | Tool |\n| --- | --- |\n| Check languages | `dubbing_get-options` |\n| Create the project | `projects_create` |\n| Save the video | `assets_upload`, `assets_create-upload-url` + `assets_create`, or `assets_create` with a link |\n| Quote | `generations_estimate-cost` |\n| Create | `dubbing_create` |\n| Wait | `generations_get` |\n\n## Steps\n\n1. **Languages.** Call `dubbing_get-options` and check every requested language. For any that isn't supported, name the closest supported option.\n2. **Project.** Call `projects_create` with a new random UUID as `id`, a short `name` and `defaultWorkflow: \"translate_and_dub\"`. Save the returned `id` as `projectId`. Pass it wherever a tool asks for `projectId`, and add `projectIntent: \"explicit\"` only on tools that take that field.\n3. **Save the video** into that project. Follow [references/media-input.md](references/media-input.md).\n4. **Quote.** Call `generations_estimate-cost` with `workflow: \"translate-and-dub\"`, `model: \"sync-3\"` and the video's length as `duration` in seconds. Show the returned estimate and its breakdown per language and in total. If it reports external provider charges as excluded, say they're extra.\n5. **Confirm.** Show the video, the languages and the estimate, and wait for approval. Skip the wait only if the user already approved this exact request and cost.\n6. **Create.** For each language, call `dubbing_create` once with `videoAssetId`, `targetLang`, `sourceLang`, `model: \"sync-3\"`, the `projectId` with `projectIntent: \"explicit\"`, and its own new `idempotencyKey`. If a response is lost, retry that language once with the same key and inputs.\n7. **Wait and deliver.** Poll `generations_get` with each `id` and `wait: true` until each is final. Dubbing takes longer than plain lipsync, so tell the user it may take several minutes. Give each exact `outputMediaUrl`, unchanged and labelled with its language.\n\n## Rules\n\n- One paid job per language. Never resubmit a language to check progress.\n- If one language fails, report it and keep the others.\n- Text on screen isn't translated, and the output is dubbed video only. Don't offer subtitles or a translated transcript as a substitute.\n- If dubbing fails with a voice-provider error and the user connected their own ElevenLabs key to sync., the cause is usually that key's credits or validity. Say so.\n"
}

SHA-256 of public snapshot: 922852616a0b55f9436720b44cdae9ee476ccbdcea473256d76036b2377bec2e