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. Use the project's progress fields to decide whether to check again or wait for review.Create a project, then follow its status to completed 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. The project keeps transcript review, target languages, usage, and completed files together.
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",
"progress": {
"phase": "dubbing",
"waiting_on": "dittodub",
"can_advance_without_user": true,
"poll_after_seconds": 60,
"message": "DittoDub is processing one or more target languages."
},
"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" }
}
}BreezeType
Create a key with breeze:read at BreezeType → Account → API keys, or choose “Read BreezeType meetings only” in your personal DittoDub workspace. Existing project keys and delegated OAuth connections do not grant meeting access. Local-only, deleted, hidden, and shared-with-you meetings are excluded. Audio downloads are not included.
/v1/breeze/meetingsList your synced meetings
Metadata only, newest started_at first, with ID as a stable tie-breaker. Pass page.next_offset while page.has_more is true. Concurrent sync or deletion may shift offset pages; deduplicate by id. Timestamps use Unix seconds.
Parameters
limitqueryinteger1–100; default 20.
offsetqueryinteger0–1000000; default 0.
curl 'https://api.dittodub.com/v1/breeze/meetings' \
-H "Authorization: Bearer $BREEZE_API_KEY"{
"data": [],
"page": {
"limit": 20,
"offset": 0,
"has_more": false,
"next_offset": null
}
}/v1/breeze/meetings/{meeting_id}Get a meeting and its saved content
Returns saved transcript, notes, and summary when available. Returns 404 for another owner's meeting, including meetings shared with you. Does not generate content or return audio download links.
Parameters
meeting_idpathstringMeeting ID from the list response.
curl 'https://api.dittodub.com/v1/breeze/meetings/MEETING_ID' \
-H "Authorization: Bearer $BREEZE_API_KEY"{
"data": {
"id": "11111111-1111-4111-8111-111111111111",
"name": "Weekly planning",
"started_at": 1789327000,
"ended_at": 1789328000,
"duration_seconds": 1000,
"tags": [],
"updated_at": 1789328001,
"transcript_text": "Saved meeting transcript.",
"transcript_segments": [],
"notes": [],
"summary": null,
"summary_generated_at": null
}
}