API REFERENCE · DUBBING
Create a dub
One request per video. The engine transcribes, translates, and re-renders the performance in each target language: the voice from the clip itself, the face re-performed to match.
01.Create a dub
/v1/dubscurl -X POST https://api.thefamiliarlab.com/v1/dubs \ -H "Authorization: Bearer $FAMILIAR_API_KEY" \ -F "file=@upload.mp4" \ -F "target_langs=es,pt,ja" \ -F "creator_id=cr_8f2k1q" \ -F "context=Maya, our head of product, walks through the spring release" \ -F "style=human" \ -F "review=manual" \ -F "metadata.title=Spring release: everything new" \ -F "metadata.description=Full walkthrough of the spring release. Chapters below."
| FIELD | TYPE | REQUIRED | DESCRIPTION |
|---|---|---|---|
file | file | one of | The source video or audio, up to 10 GB and 24 hours. Send this or source_url. |
source_url | string | one of | A fetchable URL to the source media. |
target_langs | string | yes | Comma-separated language codes, up to 29 -- see Languages. |
source_lang | string | no | Default auto (detected). Set it to pin a known source language. |
creator_id | string | no | Scopes the dub to a creator profile so their Do Not Translate list and context apply -- see Creator profiles. |
context | string | no | One sentence on what the video is: who is on screen (names) and what kind of video it is. Job-scoped; see Context below. |
dub_mode | string | no | full (default) -- video + lip-sync · audio -- the dubbed audio only. Audio sources always run audio; both meter per finished minute per language at your contract's rates. |
style | string | no | human (default) · anime -- see Style below. Full mode only. |
mode | string | no | dub (default) · dub_subtitles · subtitles_only. Subtitles are free on every dub -- see Outputs & subtitles. |
review | string | no | auto (default -- render immediately) · manual (pause at in_review until you render). See Review below. |
metadata.title | string | no | The source title; translated per language -- see Metadata translation. |
metadata.description | string | no | The source description; translated per language alongside the title. |
name | string | no | Your label for the job; comes back on every read. |
webhook_url | string | no | Overrides your organization's default endpoint for this dub -- Webhooks. |
02.The response
{
"dub_id": "dub_31xk9m",
"name": null,
"status": "queued",
"source_lang": null,
"target_langs": ["es", "pt", "ja"],
"style": "human",
"review": "manual",
"outputs": [
{ "lang": "es", "status": "queued" },
{ "lang": "pt", "status": "queued" },
{ "lang": "ja", "status": "queued" }
],
"created_at": "2026-08-13T17:02:11Z"
}| FIELD | TYPE | DESCRIPTION |
|---|---|---|
dub_id | string | The job's ID; every other dub endpoint takes it. |
name | string | null | Your label, echoed back. |
status | string | The lifecycle status -- the table on the introduction. |
source_lang | string | null | null until detection finishes (or your pinned value). |
target_langs | string[] | The requested languages, normalized. |
style | string | The style the pipeline is treating the presence with. |
review | string | auto or manual, as requested. |
outputs[] | object[] | One entry per language: lang + its own status. |
created_at | string | ISO 8601, UTC. |
03.Context
contextis the "What's this video?" one-sentencer from the console: the names of the people on screen and what kind of video it is. It sharpens translation the way a human translator's briefing would.
-F "context=Maya, our head of product, walks through the spring release"
The field on this request is the job scope -- one video only. Persistent context (per creator, per recurring stream) is written once through Context and applies to every dub automatically; narrower scopes win.
04.Style
style tells the pipeline how to treat the on-screen presence.
| VALUE | USE FOR |
|---|---|
human | People on camera (default). |
anime | VTubers and animated characters. |
05.Review
review=auto (the default) renders straight through. review=manual pauses the dub at in_review after translation: GET the transcript, PATCH any line, POST /render when approved. Credits only spend at render. The full flow is Transcript & review.
06.Read a dub
/v1/dubs/{dub_id}{
"dub_id": "dub_31xk9m",
"name": "episode-42",
"status": "rendering",
"source_lang": "en",
"style": "human",
"review": "manual",
"outputs": [
{ "lang": "es", "status": "complete" },
{ "lang": "pt", "status": "rendering" },
{ "lang": "ja", "status": "queued" }
],
"created_at": "2026-08-13T17:02:11Z"
}The top-level status follows the lifecycle table; each language also reports its own, so you can publish Spanish while Japanese still renders.
07.List dubs
/v1/dubscurl "https://api.thefamiliarlab.com/v1/dubs?limit=25&starting_after=dub_2ww10d" \
-H "Authorization: Bearer $FAMILIAR_API_KEY"
{
"data": [ { "dub_id": "dub_31xk9m", "status": "complete", … } ],
"has_more": true
}| PARAM | TYPE | DESCRIPTION |
|---|---|---|
limit | integer | Page size; default 20, max 100. |
starting_after | string | Cursor: the last dub_id of the previous page. |
status | string | Filter to one lifecycle status, e.g. in_review. |
creator_id | string | Filter to one creator profile's jobs. |
Newest first. Page until has_more is false.
08.Delete a dub
/v1/dubs/{dub_id}{ "dub_id": "dub_31xk9m", "deleted": true }Deletes the job and its outputs. A dub that is actively rendering can't be deleted mid-flight (409); spent credits aren't refunded.
09.Credits and limits
Dubs draw on your contract's included credits, metered per finished minute per language at your contract's rates (full and audio-only dubs meter differently); past them, overage rides your monthly invoice. Studio jobs never block on balance -- current balance and cycle are at Usage.
Operational defaults: 10 concurrent renders, 10 GB / 24 hours per upload, 100 requests a minute. The full table + the raise path are in Errors & limits.
10.Access
The API is enterprise-only: private access under a Studio contract, with volume pricing, raised limits, and a named point of contact for the integration. Book a call and your key is issued with the contract.