Try the API
No request is sent until you press the button.
Dubbing
/v1/dubbing. Check /v1/usage before paid work. Search for an existing project or connected YouTube video before creating one. Poll the project until each requested language completes.Create a project, then poll it for status and files.
Use upload and download routes for local source files and completed deliverables.
/v1/dubbing/localesChoose languages
/v1/dubbing/youtube/videosFind source videos
/v1/usageCheck available credits
/v1/dubbing/projectsCreate a project
/v1/dubbing/projectsFind existing projects
/v1/dubbing/projects/{id}Read status and files
/v1/dubbing/projects/{id}/languagesPreview or add languages
/v1/dubbing/localesList supported locales
Lists the source and target locales accepted by the Dubbing API. No authentication required.
Parameters
No request parameters.
curl "https://api.dittodub.com/v1/dubbing/locales"{
"data": [
{ "locale": "en_us", "display_name": "English - United States" },
{ "locale": "es_mx", "display_name": "Spanish - Mexico" },
{ "locale": "fr_fr", "display_name": "French - France" }
]
}/v1/dubbing/youtube/videosList connected YouTube videos
Lists recent or matching videos from YouTube channels connected to the workspace. If a video already has a DittoDub project, the response includes it.
Parameters
channel_idquerystringA connected channel ID. When omitted, DittoDub uses the workspace's primary channel.
queryquerystringSearch video titles or provide an exact YouTube video ID.
limitqueryintegerNumber of videos to return, from 1 to 50. Defaults to 20.
curl "https://api.dittodub.com/v1/dubbing/youtube/videos?query=launch&limit=20" \
--header "x-api-key: $DITTODUB_API_KEY"{
"data": {
"connection_required": false,
"channel": { "channel_id": "UC...", "title": "My channel" },
"items": [
{
"youtube_video_id": "VIDEO_ID",
"title": "Launch video",
"url": "https://www.youtube.com/watch?v=VIDEO_ID",
"duration_seconds": 487,
"matching_project": {
"project_id": "23fa9d79-cc42-4c82-90b8-2b7c78c57b31",
"state": "verified",
"target_locales": ["es_mx"]
}
}
]
}
}/v1/usageGet workspace usage
Returns total, reserved, and currently available workspace credits and billable seconds. Check this before starting paid work.
Parameters
No request parameters.
curl "https://api.dittodub.com/v1/usage" \
--header "x-api-key: $DITTODUB_API_KEY"{
"data": {
"credits_per_second": 93,
"credits": {
"total": 930000,
"reserved": 93000,
"available": 837000
},
"billable_seconds": {
"total": 10000,
"reserved": 1000,
"available": 9000
},
"as_of": "2026-08-20T18:00:00.000Z"
}
}/v1/dubbing/projectsCreate a dubbing project
Creates a dubbing project from a YouTube URL or uploaded file. DittoDub processes every target language inside that project.
Parameters
Idempotency-KeyheaderstringRequiredA unique key for this create request. Send the same key and body again to receive the original project.
namebodystringRequiredA human-readable project name, up to 100 characters.
external_idbodystringYour own stable identifier for later lookup.
source_localebodylocaleRequiredThe exact source locale returned by List locales.
target_localesbodylocale[]RequiredOne or more unique target locales.
max_billable_secondsbodyintegerRequiredIf validated billable duration exceeds this value, DittoDub stops before processing or charging.
sourcebodyobjectRequiredUse { type: youtube, url } or { type: upload, file_name, size_bytes }.
curl "https://api.dittodub.com/v1/dubbing/projects" \
--request POST \
--header "x-api-key: $DITTODUB_API_KEY" \
--header "Idempotency-Key: launch-video-1042" \
--header "Content-Type: application/json" \
--data '{
"name": "Launch video",
"external_id": "video-1042",
"source_locale": "en_us",
"target_locales": ["es_mx", "fr_fr"],
"max_billable_seconds": 1800,
"source": {
"type": "youtube",
"url": "https://www.youtube.com/watch?v=VIDEO_ID"
}
}'{
"data": {
"id": "23fa9d79-cc42-4c82-90b8-2b7c78c57b31",
"external_id": "video-1042",
"name": "Launch video",
"status": "validating",
"source_locale": "en_us",
"target_locales": ["es_mx", "fr_fr"],
"usage": {
"max_billable_seconds": 1800,
"billable_seconds": null,
"charged_seconds": 0,
"state": "pending_validation"
},
"languages": []
}
}/v1/dubbing/projectsList dubbing projects
Lists projects with cursor pagination. Filter by external ID or YouTube video ID to find a known project.
Parameters
limitqueryintegerNumber of projects to return, from 1 to 50. Defaults to 20.
cursorquerystringThe opaque next_cursor from the previous response.
external_idquerystringReturn projects with your external identifier.
youtube_video_idquerystringReturn projects created for this YouTube video ID.
queryquerystringSearch project names, external IDs, or an exact YouTube video ID.
curl "https://api.dittodub.com/v1/dubbing/projects?limit=20" \
--header "x-api-key: $DITTODUB_API_KEY"{
"data": [
{
"id": "23fa9d79-cc42-4c82-90b8-2b7c78c57b31",
"name": "Launch video",
"status": "processing",
"target_locales": ["es_mx", "fr_fr"]
}
],
"page": {
"has_more": true,
"next_cursor": "eyJ2IjoxLCJjcmVhdGVkX2F0IjoiLi4uIn0"
}
}/v1/dubbing/projects/{project_id}Get a dubbing project
Returns project status and usage, source transcript review status, progress for each language, publishing metadata, and completed files. Set include_transfer to true to refresh upload URLs.
Parameters
project_idpathUUIDRequiredThe project ID returned when the project was created.
include_transferquerybooleanSet false when you do not need refreshed upload URLs.
curl "https://api.dittodub.com/v1/dubbing/projects/PROJECT_ID" \
--header "x-api-key: $DITTODUB_API_KEY"{
"data": {
"id": "23fa9d79-cc42-4c82-90b8-2b7c78c57b31",
"status": "completed",
"usage": {
"max_billable_seconds": 1800,
"billable_seconds": 487,
"charged_seconds": 974,
"state": "charged"
},
"languages": [
{
"locale": "es_mx",
"status": "completed",
"deliverables": [
{ "type": "audio", "format": "mp3", "download_url": "https://api.dittodub.com/v1/dubbing/projects/PROJECT_ID/download?locale=es_mx&type=audio" }
]
}
]
}
}/v1/dubbing/projects/{project_id}/languagesAdd languages to a project
Returns an exact quote for new target languages. The default preview does not charge or change the project. After approval, set preview_only to false to add them.
Parameters
project_idpathUUIDRequiredThe existing project that should receive new languages.
target_localesbodylocale[]RequiredExact locales returned by List locales.
max_billable_secondsbodyintegerRequiredLimits billable seconds for the full request. If the quote exceeds it, DittoDub does not charge or add languages.
preview_onlybodybooleanDefaults to true. Set false only after accepting the returned quote.
Idempotency-KeyheaderstringRequired when preview_only is false. Reuse the same key when retrying that accepted request.
curl "https://api.dittodub.com/v1/dubbing/projects/PROJECT_ID/languages" \
--request POST \
--header "x-api-key: $DITTODUB_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"target_locales": ["de_de", "ja_jp"],
"max_billable_seconds": 1800,
"preview_only": true
}'{
"data": {
"addition": {
"preview_only": true,
"existing_locales": [],
"new_locales": ["de_de", "ja_jp"],
"billable_seconds": 974,
"credits": 90582,
"max_billable_seconds": 1800,
"within_limit": true
}
}
}/v1/dubbing/projects/{project_id}/transcript-reviewSubmit the source transcript for human review
Returns an exact quote or submits the English source transcript to Ditto Verified. It never sends a translated transcript. Preview the quote first, then submit with the approved spend ceiling.
Parameters
project_idpathUUIDRequiredThe project whose English source transcript needs review.
max_billable_secondsbodyintegerRequiredLimits billable seconds for the review. If the project duration rounds above it, DittoDub does not submit or charge.
preview_onlybodybooleanDefaults to true. Set false only after accepting the returned quote.
Idempotency-KeyheaderstringRequired when preview_only is false. Reuse the same key when retrying that accepted request.
curl "https://api.dittodub.com/v1/dubbing/projects/PROJECT_ID/transcript-review" --request POST --header "x-api-key: $DITTODUB_API_KEY" --header "Content-Type: application/json" --data '{
"max_billable_seconds": 1800,
"preview_only": true
}'{
"data": {
"project": {
"id": "23fa9d79-cc42-4c82-90b8-2b7c78c57b31",
"transcript_review": {
"requested": false,
"status": "not_requested"
}
},
"review": {
"preview_only": true,
"already_requested": false,
"billable_seconds": 487,
"credits": 45291,
"max_billable_seconds": 1800,
"within_limit": true,
"charged_now_seconds": 0
}
}
}/v1/dubbing/projects/{project_id}/downloadDownload a completed file
Returns a completed file through a stable authenticated URL. Audio and thumbnails redirect to short-lived storage URLs. DittoDub returns subtitle files directly.
Parameters
project_idpathUUIDRequiredThe project that owns the deliverable.
localequerylocaleRequiredThe completed target locale.
typequeryenumRequiredaudio, subtitles, or thumbnail.
formatqueryenumFor subtitles only: srt or vtt. Defaults to vtt.
curl --location \
"https://api.dittodub.com/v1/dubbing/projects/PROJECT_ID/download?locale=es_mx&type=subtitles&format=vtt" \
--header "x-api-key: $DITTODUB_API_KEY" \
--output launch-video.es-MX.vttWEBVTT
00:00:00.000 --> 00:00:02.480
Bienvenidos a nuestro video de lanzamiento./v1/dubbing/projects/{project_id}/upload/completeComplete an upload
Completes the project's multipart upload after all parts reach their presigned URLs, then queues source validation.
Parameters
project_idpathUUIDRequiredThe upload project returned by Create project.
partsbodyarrayRequiredEvery uploaded part_number and its ETag, in ascending order.
curl "https://api.dittodub.com/v1/dubbing/projects/PROJECT_ID/upload/complete" \
--request POST \
--header "x-api-key: $DITTODUB_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"parts": [
{ "part_number": 1, "etag": "ETAG_FROM_UPLOAD_RESPONSE" }
]
}'{
"data": {
"id": "23fa9d79-cc42-4c82-90b8-2b7c78c57b31",
"status": "validating",
"source": { "type": "upload", "file_name": "launch-video.mp4" }
}
}