Skip to navigation

How to choose export formats

View as Markdown

export_options decides which formats the pipeline auto-produces for each target language.

ParameterTypeDefaultAccepted values
export_optionsstring[]unsetvideo, audio, audio_vocals, srt, vtt, any combination

When you pass the parameter, only the formats you list are auto-exported. When you omit it, only the dubbed video (MP4) is exported for each target language.

Omitting it produces the dubbed video only. Since 2026-10-12, a job without export_options no longer produces audio. Audio and subtitles are never auto-exported unless you list them, for example ["video", "audio", "srt"], or request them later. Audio-only sources still get audio, because video resolves to audio for them. If your integration relied on the earlier default, pass export_options explicitly.

The five formats

The “Use it for” column is suggested guidance from us, not API-defined behaviour. The “You get” column is what the API actually produces.

ValueYou getUse it for
videoThe dubbed video, re-mixed onto the original timelinePublishing straight to YouTube, an LMS, or a social platform
audioThe full dubbed audio, with the dubbed voice over the background, uncompressed .wavPodcast feeds, radio, IVR prompts
audio_vocalsThe dubbed voice on its own, uncompressed .wavRe-editing in your own video or audio editor, mixing with your own music
srtSubtitles for the dubbed language, as an .srt fileAccessibility, SEO, on-platform captions, QA review of the translation
vttThe same subtitles as a .vtt fileWeb video players that expect WebVTT

New dubs keep the original background music and effects at higher quality for sources up to 30 minutes, and longer sources keep standard background quality. The volume is evened out on every export, including exports of older jobs. Dubs made earlier keep their old background.

Ask for srt even when you only plan to ship video. It’s the cheapest way to review translation quality, since you can read the whole dub in seconds instead of watching it.

Audio-only sources cannot produce a video. If you upload a .wav or .mp3 and request video, that request resolves to audio, there is no source picture to re-mix onto.

Reading the exports back

export-status returns a flat array with one entry per (language, format). All formats for all languages come back in a single poll, and there are no per-language or per-format calls.

{
"data": {
"exports": [
{ "id": "a1...", "target_language": "hi-IN", "export_type": "video", "status": "completed", "is_stale": false, "download_url": "https://..." },
{ "id": "b2...", "target_language": "hi-IN", "export_type": "audio", "status": "completed", "is_stale": false, "download_url": "https://..." },
{ "id": "c3...", "target_language": "hi-IN", "export_type": "srt", "status": "completed", "is_stale": false, "download_url": "https://..." }
]
}
}

Group by target_language on your side and read download_url from each entry.

Set limit deliberately. It defaults to 5, and a job with 3 languages × 3 formats produces 9 entries, so the tail is not returned. Use a value comfortably above languages × formats (max 100).

Keep the id from each entry: it is the export_id used to download or cancel that specific export.

The watermark on video exports

Video exports carry a Sarvam watermark by default. Pass disable_watermark: true at job creation for clean output. It applies to video only, audio and srt are never watermarked, and it is fixed at creation, so a job created with the watermark keeps it.

created = client.dubbing.create(
source_language_code="en-IN",
target_language_codes=["hi-IN"],
export_options=["video"],
disable_watermark=True,
job_name="launch-film",
)

It also makes MP4 exports faster. Compositing a watermark forces a full re-encode of the video. With it disabled, an MP4 or MOV source is stream-copied instead, quicker, and with no generational quality loss. Sources in other containers are re-encoded either way.

Watermark-free export will become the default in a future release and the parameter will no longer be needed, so passing true today is forward-compatible.

Getting a format you didn’t request

Every setting is fixed at job creation and there is no update endpoint, but exports are separate from the job. A finished job can still produce a format you skipped, without re-dubbing and without re-uploading, because the translated audio already exists.

To do thisCall
Add one specific format for one languagePOST /jobs/{job_id}/export for one target language, with {"export_type": "video"}. export_type also accepts audio, audio_vocals, srt, and vtt.
Get the full video + audio set for one languagePOST /jobs/{job_id}/export-all for one target language
Fetch a fresh signed URL for one exportGET /exports/{export_id}/download
Stop an export that is still runningPOST /exports/{export_id}/cancel

export-all ignores the job’s export_options on purpose, so a job created with ["srt"] can still obtain the video and audio later. Both re-export calls reuse a valid existing export rather than redoing the work, and report per-format reused, triggered, or already_in_progress.

Poll export-status afterwards exactly as you would for an auto-export.

These four endpoints are available over REST today. Dedicated Python SDK methods for them are on the way; until then, call them with any HTTP client using your usual api-subscription-key header.

Stale exports

Each entry carries an is_stale flag. It becomes true when the translation chunks for that language were edited (for example, in the Creator Studio editor) after the export completed, meaning the file you’d download no longer reflects the latest text.

for item in exports:
if item["status"] == "completed" and item["is_stale"]:
print(f"{item['target_language']}/{item['export_type']} is out of date - re-export before publishing")

Re-export with POST /jobs/{job_id}/export to refresh it.

Download URLs are signed and expire in roughly 24 hours. Persist the job_id and re-poll export-status for a fresh link, and don’t cache the URL itself.