API
On this section

Dubbing Standard

Submit a dubbing job

video
produces
video
$0.077per second

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. This variant has no dialects: a regional tag such as fr-CA is dubbed as its base language
  • source_language — optional; the language spoken in the video. Omit it, or send auto, to detect it

Languages

af, ar, as, ast, az, be, bg, bn, bs, ca, ceb, cs, cy, da, de, el, en, es, et, fa, fi, fil, fr, ga, gl, gu, ha, he, hi, hr, hu, hy, id, is, it, ja, jv, ka, kk, kn, ko, ky, lb, ln, lt, lv, mi, mk, ml, mn, mr, ms, mt, my, ne, nl, no, ny, oc, or, pa, pl, ps, pt, ro, ru, sd, sk, sl, so, sr, sv, sw, ta, te, tg, th, tl, tr, uk, ur, uz, vi, yo, yue, zh

What happens next

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

POST
/v1/dubbing
Try it ▷

Headers

X-Veed-Store-IOenumoptional

Set to 0 to not store this request's and response's bodies. They are then not available in your request logs for debugging.

Accepts01Defaults to "1".
X-Veed-Media-Expiration-Secondsintegeroptional

Number of seconds before the media URLs returned for this request expire. A value above the maximum is capped rather than rejected.

At most 2592000.Defaults to 86400.

Request body DubbingInput ↗

source_languagestringoptional

Language spoken in the video, as a BCP 47 tag. Omit it, or send auto, to detect it.

target_languagestringrequired

Language to dub into, as a BCP 47 tag.

video_urlurlrequired

URL of the video to dub, up to 10 minutes.

Must be an http(s) URL.

Responses

dataobjectrequiredDubbingJob ↗
Show 6 nested fields
credits_chargedintegeroptional

Credits charged for the job. Present once the job is COMPLETED and the final charge is known.

credits_estimatedintegeroptional

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.

errorobjectoptionalJobErrorDubbingErrorCode ↗

Failure information. Present once the job has FAILED.

Show 3 nested fields
codeenumrequired

Stable, machine-readable failure code for this job type.

Acceptsinput_validationcontent_moderationinvalid_fileaudio_too_longtransload_failedgeneration_failedtimeoutinsufficient_credits
detailsarray of objectoptionalJobErrorDetail ↗

Optional structured failure details.

Show 3 nested fields
fieldstringoptional

Dotted path to the offending input, when applicable.

messagestringrequired

Human-readable explanation of this detail.

typestringrequired

The category of this detail entry.

messagestringrequired

Human-readable failure message.

job_iduuidrequired

Stable identifier of the job and of the resource it produces.

resultobjectoptionalDubbing ↗

The produced resource. Present once the job is COMPLETED.

Show 1 nested field
videoobjectrequiredFile ↗

The input video with its speech dubbed into the target language and the speakers' lips synced to it.

Show 4 nested fields
content_typestringoptional

The mime type of the file.

file_namestringoptional

The name of the file.

file_sizeintegeroptional

The size of the file in bytes.

urlstringrequired

The URL where the file can be downloaded from.

statusenumrequired

Current lifecycle state of the job.

AcceptsPROCESSINGCOMPLETEDFAILEDCANCELLED
X-Request-IDCorrelation id for this request, adopted from the request or minted at the edge.
401UnauthorizedErrorResponse ↗
errorobjectrequiredErrorBody ↗
Show 4 nested fields
codeenumrequired
Acceptsinvalid_requestunauthenticatedinsufficient_tokenspermission_deniednot_foundconflictrate_limitedunavailableinternal
detailsarray of objectoptionalErrorDetail ↗
Show 6 nested fields
fieldstringoptional
messagestringoptional
reasonenumoptional
Acceptsapi_key_expiredapi_key_inactiveapi_key_invalidapi_key_revokedapi_key_workspace_unavailableinsufficient_creditsjob_not_foundmodel_access_requiredoauth_token_invalid
retry_after_msintegeroptional
typestringrequired
valueobjectoptional
messagestringrequired
request_idstringrequired
X-Request-IDCorrelation id for this request, adopted from the request or minted at the edge.
402Payment RequiredErrorResponse ↗
errorobjectrequiredErrorBody ↗
Show 4 nested fields
codeenumrequired
Acceptsinvalid_requestunauthenticatedinsufficient_tokenspermission_deniednot_foundconflictrate_limitedunavailableinternal
detailsarray of objectoptionalErrorDetail ↗
Show 6 nested fields
fieldstringoptional
messagestringoptional
reasonenumoptional
Acceptsapi_key_expiredapi_key_inactiveapi_key_invalidapi_key_revokedapi_key_workspace_unavailableinsufficient_creditsjob_not_foundmodel_access_requiredoauth_token_invalid
retry_after_msintegeroptional
typestringrequired
valueobjectoptional
messagestringrequired
request_idstringrequired
X-Request-IDCorrelation id for this request, adopted from the request or minted at the edge.
422Unprocessable EntityErrorResponse ↗
errorobjectrequiredErrorBody ↗
Show 4 nested fields
codeenumrequired
Acceptsinvalid_requestunauthenticatedinsufficient_tokenspermission_deniednot_foundconflictrate_limitedunavailableinternal
detailsarray of objectoptionalErrorDetail ↗
Show 6 nested fields
fieldstringoptional
messagestringoptional
reasonenumoptional
Acceptsapi_key_expiredapi_key_inactiveapi_key_invalidapi_key_revokedapi_key_workspace_unavailableinsufficient_creditsjob_not_foundmodel_access_requiredoauth_token_invalid
retry_after_msintegeroptional
typestringrequired
valueobjectoptional
messagestringrequired
request_idstringrequired
X-Request-IDCorrelation id for this request, adopted from the request or minted at the edge.
429Rate limit exceededErrorResponse ↗
errorobjectrequiredErrorBody ↗
Show 4 nested fields
codeenumrequired
Acceptsinvalid_requestunauthenticatedinsufficient_tokenspermission_deniednot_foundconflictrate_limitedunavailableinternal
detailsarray of objectoptionalErrorDetail ↗
Show 6 nested fields
fieldstringoptional
messagestringoptional
reasonenumoptional
Acceptsapi_key_expiredapi_key_inactiveapi_key_invalidapi_key_revokedapi_key_workspace_unavailableinsufficient_creditsjob_not_foundmodel_access_requiredoauth_token_invalid
retry_after_msintegeroptional
typestringrequired
valueobjectoptional
messagestringrequired
request_idstringrequired
Retry-AfterSeconds until the rate limit resets.
X-RateLimit-ClassThe rate-limit class that was hit (read, mutation, ai-generation).
X-RateLimit-LimitRequest budget for the matched class.
X-RateLimit-RemainingRemaining requests in the current window.
X-RateLimit-ResetUnix time (seconds) when the budget resets.
X-Request-IDCorrelation id for this request, adopted from the request or minted at the edge.
500Internal Server ErrorErrorResponse ↗
errorobjectrequiredErrorBody ↗
Show 4 nested fields
codeenumrequired
Acceptsinvalid_requestunauthenticatedinsufficient_tokenspermission_deniednot_foundconflictrate_limitedunavailableinternal
detailsarray of objectoptionalErrorDetail ↗
Show 6 nested fields
fieldstringoptional
messagestringoptional
reasonenumoptional
Acceptsapi_key_expiredapi_key_inactiveapi_key_invalidapi_key_revokedapi_key_workspace_unavailableinsufficient_creditsjob_not_foundmodel_access_requiredoauth_token_invalid
retry_after_msintegeroptional
typestringrequired
valueobjectoptional
messagestringrequired
request_idstringrequired
X-Request-IDCorrelation id for this request, adopted from the request or minted at the edge.

Guides

Example request

terminal
curl -X POST "https://api.veed.io/v1/dubbing" \
  -H "Authorization: Bearer $VEED_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "target_language": "en",
  "video_url": "https://static-assets.veed.io/api-examples/dubbing-input.mp4"
}'

Example response

HTTP 202
{
  "data": {
    "job_id": "123e4567-e89b-12d3-a456-426614174000",
    "status": "PROCESSING",
    "credits_estimated": 84
  }
}