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

POST/v1/dubs
REQUEST
curl -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."
TABLE 01 · REQUEST FIELDS
FIELDTYPEREQUIREDDESCRIPTION
filefileone ofThe source video or audio, up to 10 GB and 24 hours. Send this or source_url.
source_urlstringone ofA fetchable URL to the source media.
target_langsstringyesComma-separated language codes, up to 29 -- see Languages.
source_langstringnoDefault auto (detected). Set it to pin a known source language.
creator_idstringnoScopes the dub to a creator profile so their Do Not Translate list and context apply -- see Creator profiles.
contextstringnoOne sentence on what the video is: who is on screen (names) and what kind of video it is. Job-scoped; see Context below.
dub_modestringnofull (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.
stylestringnohuman (default) · anime -- see Style below. Full mode only.
modestringnodub (default) · dub_subtitles · subtitles_only. Subtitles are free on every dub -- see Outputs & subtitles.
reviewstringnoauto (default -- render immediately) · manual (pause at in_review until you render). See Review below.
metadata.titlestringnoThe source title; translated per language -- see Metadata translation.
metadata.descriptionstringnoThe source description; translated per language alongside the title.
namestringnoYour label for the job; comes back on every read.
webhook_urlstringnoOverrides your organization's default endpoint for this dub -- Webhooks.

02.The response

201 · CREATED
{
  "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"
}
TABLE 02 · RESPONSE FIELDS
FIELDTYPEDESCRIPTION
dub_idstringThe job's ID; every other dub endpoint takes it.
namestring | nullYour label, echoed back.
statusstringThe lifecycle status -- the table on the introduction.
source_langstring | nullnull until detection finishes (or your pinned value).
target_langsstring[]The requested languages, normalized.
stylestringThe style the pipeline is treating the presence with.
reviewstringauto or manual, as requested.
outputs[]object[]One entry per language: lang + its own status.
created_atstringISO 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.

TABLE 03 · STYLE VALUES
VALUEUSE FOR
humanPeople on camera (default).
animeVTubers 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

GET/v1/dubs/{dub_id}
200 · OK
{
  "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

GET/v1/dubs
curl "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
}
TABLE 04 · QUERY PARAMETERS
PARAMTYPEDESCRIPTION
limitintegerPage size; default 20, max 100.
starting_afterstringCursor: the last dub_id of the previous page.
statusstringFilter to one lifecycle status, e.g. in_review.
creator_idstringFilter to one creator profile's jobs.

Newest first. Page until has_more is false.

08.Delete a dub

DELETE/v1/dubs/{dub_id}
200 · OK
{ "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.