API REFERENCE · DECISIONS
The decision record
Every decision the MLDM makes, recorded with the dub: read it, override it, keep a choice for the next episode. A Multimodal Localization Decision Model (MLDM) is a new paradigm, the first of its kind: one model decides what to localize and how, across text, audio and visual, and shows you the choices that matter (What is an MLDM, The Decision Record).
01.What is recorded
Translation: which rendering carries a joke, a story or a conversational turn; the slang kept as said, the name kept, the reference swapped, what the culture avoids, the profanity level. Your creative directors review these today: three translations per line, each with its reasoning, pick one or edit it.
Audio (in the works): what to translate at all, what stays in the original language (a chant, a yell, a phrase), which sounds are kept as they were. You choose what is dubbed and what is left alone.
Visual (in the works): who on screen is saying it, the text in the frame (a phone screen, a street sign), the expressions and gestures. You pick a different face, translate or keep each sign, or hold an expression as shot.
02.Read the record
/v1/dubs/{dub_id}/decisionsThe record as an API resource is in the works. One page per request, every decision with its options and what was chosen.
| PARAMETER | TYPE | DESCRIPTION |
|---|---|---|
lang | string | One target language; omit for every language. |
type | enum | translation | audio | visual |
status | enum | open | settled | locked |
limit | integer | Default 50, max 200. |
starting_after | string | Cursor on id. |
{
"dub_id": "dub_31xk9m",
"lang": "en",
"decisions": [
{
"id": "dec_7h2k0a",
"type": "translation",
"kind": "rendering",
"segment": "seg_12",
"start": 12.48,
"end": 15.91,
"speaker": "spk_1",
"source": "사과하려고 사과 사 왔어.",
"options": [
{ "id": "opt_1", "text": "Apples. I'm sorry, right down to the core.", "intent": "the pun kept", "emotion": "playful", "reasoning": "The line rests on 사과 meaning both apology and apple, and bringing apples to say sorry is a real custom; the English keeps the fruit so the bag in the next shot still lands." },
{ "id": "opt_2", "text": "I came to say sorry. I brought apples.", "intent": "the meaning only", "emotion": "sincere", "reasoning": "Drops the pun; the apology reads straight." },
{ "id": "opt_3", "text": "An apple a day keeps the silent treatment away.", "intent": "a new joke", "emotion": "playful", "reasoning": "A different gag that fits the apples on screen." }
],
"chosen": "opt_1",
"chosen_by": "model",
"status": "open",
"memory": null
},
{
"id": "dec_7h2k0b",
"type": "audio",
"kind": "keep_original",
"start": 41.20,
"end": 44.05,
"speaker": null,
"source": "crowd chant",
"options": [
{ "id": "opt_1", "text": "keep in Korean", "reasoning": "A stadium chant; the crowd is the scene, not a speaker." },
{ "id": "opt_2", "text": "translate", "reasoning": "The words carry the next line's joke." }
],
"chosen": "opt_1",
"chosen_by": "model",
"status": "open",
"memory": null
},
{
"id": "dec_7h2k0c",
"type": "visual",
"kind": "on_screen_text",
"start": 58.00,
"end": 61.50,
"speaker": null,
"source": "phone screen: 내일 봐",
"options": [
{ "id": "opt_1", "text": "See you tomorrow", "reasoning": "The message is read on camera; the terms you already chose apply." },
{ "id": "opt_2", "text": "keep as shot", "reasoning": "Leave the screen in Korean." }
],
"chosen": "opt_1",
"chosen_by": "model",
"status": "open",
"memory": null
}
],
"has_more": false
}| FIELD | TYPE | DESCRIPTION |
|---|---|---|
id | string | Stable; PATCH keys on it. |
type | enum | translation | audio | visual |
kind | enum | See the catalog of kinds. |
segment | string | null | The transcript segment, for translation decisions. |
start / end | number | Seconds into the source. |
speaker | string | null | The speaker, when there is one. |
source | string | The line, the sound or the item in the frame. |
options[] | array | id, text, intent and emotion (translation only), reasoning. |
chosen | string | The option id in force. |
chosen_by | enum | model | you | memory |
status | enum | open | settled | locked; see Lifecycle. |
memory | object | null | { scope, scope_key } when carried from decision memory. |
Every delivered dub will also carry decisions.json (in the works): the full record per language, with what was chosen and by whom (Outputs & subtitles).
03.The catalog of kinds
| TYPE | KIND | WHAT IS DECIDED | STATUS |
|---|---|---|---|
| translation | rendering | Which rendering carries a joke, a story, a conversational turn. | today, in review |
| translation | slang | Kept as said, or localized. | today, in review |
| translation | name | Kept, or localized. | today, in review |
| translation | reference | Swapped for one the audience knows. | today, in review |
| translation | term | The term you already chose, kept consistent. | today, in review |
| translation | culture | What that culture avoids, and the way around it. | today, in review |
| translation | profanity | The level for the audience; lowered for a younger cut. | today, in review |
| audio | translate | Whether a voice is translated at all: the main voice, a background speaker, a line off mic. | in the works |
| audio | keep_original | A chant, a yell, a phrase that stays in the source language. | in the works |
| audio | preserve | A sound kept as it was: the laughter, the crowd, a shout. | in the works |
| visual | speaker | Who on screen is saying it; the candidate faces are the options. | in the works |
| visual | on_screen_text | Each text item in the frame: translate, in your terms, or keep as shot. | in the works |
| visual | expression | Expressions and gestures follow the new line, or hold as shot. | in the works |
04.Lifecycle
| STATUS | WHEN |
|---|---|
open | The dub is at in_review; the decision awaits you. |
settled | You chose, or the dub rendered with the model's choice. |
locked | After render. |
With review=manual every decision is open at in_review, and POST /render locks the record. With review=autothe record is still written with the model's choices (chosen_by: "model"), readable after render.
To change a delivered dub, PATCH the decision, then POST /render again; only the languages the decision touches render again. The dub.decisions_ready webhook (in the works) fires with dub.ready_for_review, carrying open and by_type counts (Webhooks).
05.Override
/v1/dubs/{dub_id}/decisions/{decision_id}curl -X PATCH https://api.thefamiliarlab.com/v1/dubs/dub_31xk9m/decisions/dec_7h2k0a \
-H "Authorization: Bearer $FAMILIAR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "choose": "opt_2", "remember": "creator" }'The override endpoint is in the works. Send exactly one choice field, plus an optional remember.
| FIELD | TYPE | APPLIES TO |
|---|---|---|
choose | string | Any kind: an option id. |
text | string | Your own rendering; translation kinds and on_screen_text. |
keep_original | true | Audio kinds. |
speaker | string | A spk_… id; visual speaker. |
translate | false | Visual on_screen_text: keep as shot. |
hold | true | Visual expression: keep as shot. |
remember | creator | job | Optional; default none. Carries the choice forward (Decision memory). |
The response is the decision with chosen_by: "you" and status: "settled". PATCH is valid at in_review and complete (then render again).
Batch
/v1/dubs/{dub_id}/decisions{
"decisions": [
{ "id": "dec_7h2k0a", "choose": "opt_2" },
{ "id": "dec_7h2k0b", "choose": "opt_1" }
]
}| STATUS | CODE | WHEN |
|---|---|---|
| 409 | decision_locked | The dub is rendering; PATCH after it completes, then render again. |
| 422 | option_not_found | The option id is not on the decision. |
06.Settings on the dub
Planned request fields on POST /v1/dubs (in the works); in multipart, nested fields are written dotted, as metadata.title already is (Create a dub).
| FIELD | VALUES | DEFAULT |
|---|---|---|
decisions.translation.options | 1 to 3: renderings per line that can land more than one way. | 3 |
decisions.profanity | keep | soften (the younger cut) | remove | keep |
decisions.audio.translate | main_voice | all_speech | ask | main_voice |
decisions.audio.keep_original | auto | ask | auto |
decisions.visual.speaker | auto | ask | auto |
decisions.visual.on_screen_text | auto | translate | keep | ask | auto |
decisions.visual.expression | match | hold | ask | match |
decisions.memory | creator | job: where overrides are kept. | job |
ask anywhere requires review=manual; otherwise the request returns 422 decision_setting_requires_review. The dub waits at in_reviewuntil every open decision is settled or you render, which accepts the model's choice on anything still open.
07.The review screen
Creative directors work on translation decisions today in the review step. In the works: the review screen gains a decisions rail, a timeline of the episode with a marker per decision, filtered by TRANSLATION, AUDIO or VISUAL.
Each card will show the moment, the options with the reasoning and the model's pick; one tap picks another, types your own, keeps the original or remembers the choice for this creator. It is the same record the API returns, so a choice made on the screen shows in the API and the other way round.
08.Access
The API is enterprise-only: private access under a Studio contract, with volume pricing, raised limits, ProRes masters on request, and a named point of contact. Book a call and your key is issued with the contract.