Order Dubs
Create Dubs orders dubbing in any number of target languages on one media file in a single request. The media (an upload, a URL, or a file already in 3Play) and the order go in the same call, one order per target language, each with its own package.
How it works
- Check the menu. List Products with
type=dubslists which target languages, packages and turnarounds your project can order from the source language. - Order. Create Dubs with the media and
orders[]. You get202 Acceptedand anidfor each target language. - Wait. Poll List Dubs with
id, or wait for a callback if you passed acallback_urlin your order. - Download. When
statusiscomplete, the order'sdownloadsarray holds a signed URL per file.
Every call authenticates with your API key. See Authentication.
Check the menu
List Products returns one row per target language, package and turnaround your project can order from the source language. Pass type=dubs and the media's source_language; target_language, package and turnaround narrow the list further. Availability depends on your project, so check before ordering.
GET /v3/products?type=dubs&source_language=en-US
{
"code": 200,
"data": [
{ "type": "dubs", "source_language": "en-US", "target_language": "fr-FR", "variant": null, "package": "refine", "turnaround": "standard" },
{ "type": "dubs", "source_language": "en-US", "target_language": "fr-FR", "variant": null, "package": "refine", "turnaround": "flexible" },
{ "type": "dubs", "source_language": "en-US", "target_language": "de-DE", "variant": null, "package": "studio", "turnaround": "flexible" }
]
}Order
{
"source_url": "https://example.com/master.mp4",
"name": "Episode 12",
"source_language": "en-US",
"external_source_id": "master-s02e12",
"callback_url": "https://example.com/hooks/3play?token=abcd-1234",
"orders": [
{ "target_language": "fr-FR", "package": "refine", "turnaround": "standard" },
{ "target_language": "de-DE", "package": "studio", "turnaround": "flexible" }
]
}Send JSON, or multipart/form-data when uploading the file in source.
Media. Send exactly one of source (file upload), source_url (3Play downloads it; an authenticated URL must stay valid for at least 1 day), or media_file_id (a file already in 3Play).
Fields.
| Field | Required | Notes |
|---|---|---|
name | yes | Name of the media file |
source_language | yes | BCP-47 code of the media's language. Generic (en) or regional (en-US); a generic code resolves to the project's default variant |
orders | yes | One entry per target language. See below |
localization_profile_id | no | Localization profile to apply. Defaults to the project's default profile |
external_source_id | no | Your own key for the media, echoed on each order and in callbacks |
folder_name | no | Folder to file the media under |
description | no | Free-text description of the media |
callback_url | no | URL 3Play calls when each target language finishes. See Callbacks |
instructions | no | Free-text instructions for the whole order |
orders[] entry.
| Field | Required | Notes |
|---|---|---|
target_language | yes | BCP-47 code. Must be a target_language that List Products returns with type dubs for the source language |
package | yes | launch, refine, creator, or studio. Not every service offers every package; List Products shows what your project can order |
turnaround | no | standard (default), asap, or flexible. Not every service offers every turnaround; List Products shows what your project can order |
launch is the entry tier and studio the premium tier, with refine and creator between them.
The whole request is validated before anything is created. If any order asks for a package, turnaround, or language your project cannot order, the call returns 400 with the allowed values and nothing is ordered.
Response
202 Accepted, with the media and its orders in data:
{
"code": 202,
"data": {
"media_file_id": 123456,
"name": "Episode 12",
"source_language": "en-US",
"external_source_id": "master-s02e12",
"folder_name": null,
"orders": [
{
"id": 987,
"type": "dubs",
"media_file_id": 123456,
"source_language": "en-US",
"target_language": "fr-FR",
"package": "refine",
"turnaround": "standard",
"status": "in_progress",
"external_source_id": "master-s02e12",
"folder_name": null,
"downloads": null
}
]
},
"meta": {}
}Each order's id is the ID of the service: pass it to List Dubs as the id filter, and the callback carries the same id.
Track status
Poll List Dubs with the order's id, or set callback_url and skip polling. An unknown id returns an empty list. List Dubs also filters by media_file_id, external_source_id, status, and folder_name, with page and per_page (default 25, max 100).
status | Meaning |
|---|---|
in_progress | Being worked on |
complete | Done. downloads is populated |
failed | Did not complete. failure says why |
cancelled | 3Play cancelled the order on your behalf. There is no cancel endpoint |
A failed order carries failure, an object with type and message (the same shape as the v3 error object). It is omitted on every other status. The values below are illustrative.
"failure": { "type": "media_error", "message": "The media file could not be processed" }Callbacks
When callback_url is set, 3Play sends one POST per order (so once per target language), when it reaches complete, failed, or cancelled. Nothing fires on intermediate status changes. The body is the same envelope a read of the order returns, downloads included:
{
"code": 200,
"data": {
"id": 987,
"media_file_id": 123456,
"external_source_id": "master-s02e12",
"folder_name": null,
"type": "dubs",
"source_language": "en-US",
"target_language": "fr-FR",
"package": "refine",
"turnaround": "standard",
"status": "complete",
"downloads": [
{
"type": "audio_mp3_mixed",
"format_name": "MP3 mixed",
"mime_type": "audio/mpeg",
"url": "https://s3.amazonaws.com/bucket/asset?signature=...",
"expires_at": "2026-11-01T12:00:00Z"
}
]
},
"meta": {}
}The download links expire; call List Dubs with id for fresh ones. Put an expiring token in the callback URL and check it on receipt; see Using Callback URLs. 3Play retries a callback that fails to deliver.
Download
Once status is complete, downloads holds one entry per file: type, format_name, mime_type, a signed url valid for 8 hours, and expires_at. Call List Dubs with id again for fresh links.
type | What it is |
|---|---|
audio_wav_vocals, audio_wav_mixed, audio_wav_ducked_voice | WAV audio |
audio_mp3_vocals, audio_mp3_mixed | MP3 audio |
video_mp4_vocals, video_mp4_mixed | MP4 video |
audio_wav_mixed_5pt1, video_mp4_mixed_5pt1, audio_wav_bed_5pt1 | 5.1 sources only |
Dubs carry no subtitles and no companion documents; order subtitles with Order Subs.
Errors
Errors use the standard v3 error envelope.
| Status | Cause |
|---|---|
400 | A package, turnaround, or language is not available to your project. Call List Products to see what you can order |
400 | A required field is missing |
401 | Missing or invalid API key |
Updated about 4 hours ago
