> For clean Markdown of any page, append `.md` to the page URL.
> For a complete documentation index, see https://docs.sarvam.ai/llms.txt.
> For full documentation content in one file, see https://docs.sarvam.ai/llms-full.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.sarvam.ai/_mcp/server.

# Dubbing API

> Localize video and audio into 12 Indian languages with the Sarvam AI Dubbing API. Clone each speaker's voice across languages, control translation tone, and export video, audio, and subtitles from a single asynchronous job.

Sarvam's Dubbing API seamlessly translates your audio and video content into every language you target. By leveraging state-of-the-art voice cloning technology, it delivers broadcast-ready dubs while preserving the original vocal identity of every speaker.

It is part of **Content Agents**, and is the programmatic equivalent of the Dubbing workspace in [Creator Studio](https://platform.sarvam.ai/creator-studio).

**Base URL and authentication.** See the [API Reference](/api-reference/creative-agents-dubbing/create-dub) for the current base URL and auth header. Generate a key from [Key Management](https://dashboard.sarvam.ai/key-management) in the dashboard.

## What one job gives you

A single job dubs into **every** target language you list, and produces **every** format in `export_options` for each of them. You never need one job per language. In the REST body the language fields are `src_lang` / `target_langs`; in the Python SDK they are `source_language_code` / `target_language_codes`.

#### [12 Indian languages](/api/api-guides-tutorials/dubbing/how-to/specify-language-codes)

Dub into any combination of the 12 supported target languages in one pass.

#### [Speaker voice cloning](/api/api-guides-tutorials/dubbing/how-to/choose-a-voice)

Preserve each original speaker's voice identity in every target language.

#### [Video, audio & SRT](/api/api-guides-tutorials/dubbing/how-to/choose-export-formats)

Produce the dubbed video, an isolated audio track, and a subtitle file.

## How it works

Dubbing is **asynchronous by design**: you create a job, upload to it, start it, then follow it to completion rather than waiting on a single request. Every integration is the same five steps.

#### Create the job

`POST /jobs` with your languages and options. Returns a `job_id` and a short-lived signed `upload_url`. The job sits at `not_started` until you start it.

#### Upload the media

`PUT` the raw file bytes to `upload_url`. This step is required, because the create call does not accept the file itself.

#### Start the pipeline

`POST /jobs/{job_id}/start` moves the job to `queued`, and a worker picks it up as `in_progress`.

#### Poll progress

`GET /jobs/{job_id}/live-status` for a progress percentage and the current pipeline step.

#### Fetch downloads

`GET /jobs/{job_id}/export-status` for one signed `download_url` per (language, format).

Runnable code for each individual call, in cURL and seven other languages, is on that call's page in the [API Reference](/api-reference/creative-agents-dubbing/create-dub).

## Quickstart

Install the SDK with `pip install sarvamai`, set `SARVAM_API_KEY`, and point `media` at a local file. The client resolves the dubbing endpoint from its default environment, so your API key is the only configuration it needs.

```python
import os
from pathlib import Path
from sarvamai import SarvamAI

client = SarvamAI(api_subscription_key=os.environ["SARVAM_API_KEY"])

media = Path("sample.mp4")

created = client.dubbing.create(
    source_language_code="en-IN",
    target_language_codes=["hi-IN", "ta-IN"],
    export_options=["video", "srt"],
    voice_cloning=True,
    num_speakers=1,
    job_name=media.name,
)

client.dubbing.upload(created.data.upload_url, media)
client.dubbing.start(job_id=created.data.job_id)

print(created.data.job_id)
```

That job is now running. See [Job Lifecycle](/api/api-guides-tutorials/dubbing/job-lifecycle) for the polling loop that carries it to downloadable files.

### What you can upload

| Kind      | Formats                            |
| --------- | ---------------------------------- |
| **Video** | MP4, MOV, MKV, WebM, AVI, FLV, WMV |
| **Audio** | WAV, MP3, M4A                      |

The file must be at least one second long and contain audible speech, since there has to be something to transcribe. Maximum size and duration depend on your plan:

| Plan     | Max file size | Max duration |
| -------- | ------------- | ------------ |
| Starter  | 2 GB          | 1 hour       |
| Pro      | 3 GB          | 1 hour       |
| Business | 4 GB          | 4 hours      |

Starter is the default, so those are the limits that apply unless your account is on a higher plan. On an Enterprise plan, check your limits with your account team. See [Credits & Rate Limits](/api/getting-started/ratelimits) for the rate limits that apply alongside these.

The format is detected from the file's contents, not its name. The signed URL always ends in `.mp4` — that is a storage detail, and uploading a `.wav` to it is fine.

Your media is checked after you call `start`, not while it uploads. Storage accepts whatever you send it, so an unsupported or corrupt file shows up as a `failed` job with the reason in `error_message` rather than as an error on the upload itself.

### Uploading the media

`client.dubbing.upload()` handles the upload for you, including the `x-ms-blob-type: BlockBlob` header that the underlying storage requires. It accepts a path or an open binary file, and guesses the `Content-Type` from the filename.

The helper requires `sarvamai` 0.1.31a1 or newer.

`upload_url` is short-lived and unauthenticated. Check `data.expires_in_hours` and upload promptly; an expired URL returns `403` and needs a new job. Never send your API subscription key to the storage URL.

A `completed` job is not always downloadable yet, since exports can still be rendering. Confirm in `export-status` and pull entries whose own `status` is `completed`. [Job Lifecycle](/api/api-guides-tutorials/dubbing/job-lifecycle) has the details.

## Explore

#### [Job Lifecycle](/api/api-guides-tutorials/dubbing/job-lifecycle)

Every job status, and a complete polling script.

#### [Choose a Voice](/api/api-guides-tutorials/dubbing/how-to/choose-a-voice)

How cloning works, and the 15 preset voices with audio previews.

#### [Specify Language Codes](/api/api-guides-tutorials/dubbing/how-to/specify-language-codes)

All 12 supported codes, and how to format them.

#### [Control Translation Tone](/api/api-guides-tutorials/dubbing/how-to/control-translation-tone)

Pick the `register` that matches your audience.

#### [Choose Export Formats](/api/api-guides-tutorials/dubbing/how-to/choose-export-formats)

Which formats each language produces, and the watermark.

#### [FAQs](/api/api-guides-tutorials/dubbing/faq)

Quick answers on languages, exports, polling, and errors.

#### [API Reference](/api-reference/creative-agents-dubbing/create-dub)

Endpoint-level schemas for every request and response field.

Need help scoping a dubbing integration? Reach out on [Discord](https://discord.com/invite/5rAsykttcs).