---
title: "Submit a dubbing pro job"
method: POST
path: "/v1/dubbing-pro"
tags: ["Dubbing"]
---

# Submit a dubbing pro job

`POST /v1/dubbing-pro`

## Request

- Base URL: `https://api.veed.io`
- URL: `https://api.veed.io/v1/dubbing-pro`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/veed/apis/veed-api/docs/v1/dubbing-pro/post.ts> (a function with typed inputs; its response is checked against the schema)

Start an asynchronous job that translates the speech in a video into another language, clones each speaker's voice to say the translation, and lip-syncs their faces to it. Returns the dubbed video.

**Inputs**

- `video_url` — public URL of the video to dub, up to 10 minutes
- `target_language` — the language to dub into, as a BCP 47 tag such as `es`, or one of the dialects below such as `es-MX`. A region is ignored for a language without dialects: `de-DE` is dubbed as `de`
- `source_language` — optional; the language spoken in the video. Omit it, or send `auto`, to detect it
- `voice_cloning_strength` — optional; how closely the dubbed voices match the speakers, from `0` to `10`. Higher keeps more of each speaker's voice and accent; lower sounds more natural in the target language

**Languages**

`af`, `ak`, `am`, `ar`, `as`, `az`, `be`, `bg`, `bo`, `bs`, `ca`, `ceb`, `cmn`, `cs`, `cy`, `da`, `de`, `dgo`, `el`, `en`, `es`, `et`, `eu`, `fa`, `fi`, `fil`, `fr`, `gl`, `gu`, `ha`, `he`, `hi`, `hr`, `hu`, `hy`, `id`, `is`, `it`, `ja`, `jv`, `ka`, `ki`, `kk`, `kn`, `ko`, `ky`, `lg`, `lt`, `lv`, `mk`, `ml`, `mn`, `mr`, `ms`, `my`, `ne`, `nl`, `no`, `nso`, `pa`, `pl`, `pt`, `rn`, `ro`, `ru`, `rw`, `sd`, `sk`, `sl`, `sq`, `ss`, `st`, `su`, `sv`, `sw`, `ta`, `te`, `tg`, `th`, `tn`, `tr`, `ts`, `ug`, `uk`, `ur`, `uz`, `ve`, `vi`, `war`, `wo`, `yo`, `yue`, `zh`, `zu`

**Dialects**

`ar-EG`, `en-AU`, `en-CA`, `en-GB`, `en-US`, `es-AR`, `es-CL`, `es-ES`, `es-MX`, `fr-CA`, `fr-FR`, `pt-BR`, `pt-PT`, `zh-TW`

**What happens next**

The job is **accepted immediately** — you get `202 Accepted` with a `job_id` and status `PROCESSING`. Poll `GET /v1/dubbing-pro/{job_id}` until the job is `COMPLETED` or `FAILED`.

## Headers

- `X-Veed-Store-IO` '0' | '1'
- `X-Veed-Media-Expiration-Seconds` integer

## Request body

- DubbingProInput
  - `$schema` string, uri: A URL to the JSON Schema for this object.
  - `source_language` string: Language spoken in the video, as a BCP 47 tag. Omit it, or send auto, to detect it.
  - `target_language` string, required: Language to dub into, as a BCP 47 tag.
  - `video_url` string, uri, required: URL of the video to dub, up to 10 minutes.
  - `voice_cloning_strength` integer: How closely the dubbed voices match the speakers. Higher keeps more of each speaker's voice and accent; lower sounds more natural in the target language.

## Response `202`

Accepted

- ResourceDubbingJob
  - `$schema` string, uri: A URL to the JSON Schema for this object.
  - `data` DubbingJob, required
    - `credits_charged` integer: Credits charged for the job. Present once the job is COMPLETED and the final charge is known.
    - `credits_estimated` integer: Credits quoted before the job ran. Present only on the response that created the job. This is an estimate, not the price: the charged amount can be higher or lower.
    - `error` JobErrorDubbingErrorCode
      - `code` 'input_validation' | 'content_moderation' | 'invalid_file' | 'audio_too_long' | 'transload_failed' | 'generation_failed' | 'timeout' | 'insufficient_credits', required: Stable, machine-readable failure code for this job type.
      - `details` JobErrorDetail[], nullable: Optional structured failure details.
        - `field` string: Dotted path to the offending input, when applicable.
        - `message` string, required: Human-readable explanation of this detail.
        - `type` string, required: The category of this detail entry.
      - `message` string, required: Human-readable failure message.
    - `job_id` string, uuid, required: Stable identifier of the job and of the resource it produces.
    - `result` Dubbing
      - `video` File, required
        - `content_type` string: The mime type of the file.
        - `file_name` string: The name of the file.
        - `file_size` integer: The size of the file in bytes.
        - `url` string, required: The URL where the file can be downloaded from.
    - `status` 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'CANCELLED', required: Current lifecycle state of the job.

## Other responses

- `401`: Unauthorized
- `402`: Payment Required
- `422`: Unprocessable Entity
- `429`: Rate limit exceeded
- `500`: Internal Server Error

## Changes

- **2026-10-28** `b55472650209`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/veed/apis/veed-api/changes/v1/dubbing-pro/post.md)

---

[API](https://skmtc.dev/veed/apis/veed-api.md) - [All operations](https://skmtc.dev/veed/apis/veed-api/llms.txt) - [OpenAPI document](https://skmtc.dev/veed/apis/veed-api/revisions/b55472650209?raw)
