PREVIEW · CLOSED ACCESSAPI keys are issued under Studio contracts. Email the team

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

GET/v1/dubs/{dub_id}/decisions

The record as an API resource is in the works. One page per request, every decision with its options and what was chosen.

TABLE 01 · QUERY
PARAMETERTYPEDESCRIPTION
langstringOne target language; omit for every language.
typeenumtranslation | audio | visual
statusenumopen | settled | locked
limitintegerDefault 50, max 200.
starting_afterstringCursor on id.
200 · OK
{
  "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
}
TABLE 02 · DECISION FIELDS
FIELDTYPEDESCRIPTION
idstringStable; PATCH keys on it.
typeenumtranslation | audio | visual
kindenumSee the catalog of kinds.
segmentstring | nullThe transcript segment, for translation decisions.
start / endnumberSeconds into the source.
speakerstring | nullThe speaker, when there is one.
sourcestringThe line, the sound or the item in the frame.
options[]arrayid, text, intent and emotion (translation only), reasoning.
chosenstringThe option id in force.
chosen_byenummodel | you | memory
statusenumopen | settled | locked; see Lifecycle.
memoryobject | 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

TABLE 03 · KINDS
TYPEKINDWHAT IS DECIDEDSTATUS
translationrenderingWhich rendering carries a joke, a story, a conversational turn.today, in review
translationslangKept as said, or localized.today, in review
translationnameKept, or localized.today, in review
translationreferenceSwapped for one the audience knows.today, in review
translationtermThe term you already chose, kept consistent.today, in review
translationcultureWhat that culture avoids, and the way around it.today, in review
translationprofanityThe level for the audience; lowered for a younger cut.today, in review
audiotranslateWhether a voice is translated at all: the main voice, a background speaker, a line off mic.in the works
audiokeep_originalA chant, a yell, a phrase that stays in the source language.in the works
audiopreserveA sound kept as it was: the laughter, the crowd, a shout.in the works
visualspeakerWho on screen is saying it; the candidate faces are the options.in the works
visualon_screen_textEach text item in the frame: translate, in your terms, or keep as shot.in the works
visualexpressionExpressions and gestures follow the new line, or hold as shot.in the works

04.Lifecycle

TABLE 04 · STATUS
STATUSWHEN
openThe dub is at in_review; the decision awaits you.
settledYou chose, or the dub rendered with the model's choice.
lockedAfter 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

PATCH/v1/dubs/{dub_id}/decisions/{decision_id}
REQUEST
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.

TABLE 05 · BODY
FIELDTYPEAPPLIES TO
choosestringAny kind: an option id.
textstringYour own rendering; translation kinds and on_screen_text.
keep_originaltrueAudio kinds.
speakerstringA spk_… id; visual speaker.
translatefalseVisual on_screen_text: keep as shot.
holdtrueVisual expression: keep as shot.
remembercreator | jobOptional; 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

PATCH/v1/dubs/{dub_id}/decisions
REQUEST BODY
{
  "decisions": [
    { "id": "dec_7h2k0a", "choose": "opt_2" },
    { "id": "dec_7h2k0b", "choose": "opt_1" }
  ]
}
TABLE 06 · ERRORS
STATUSCODEWHEN
409decision_lockedThe dub is rendering; PATCH after it completes, then render again.
422option_not_foundThe 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).

TABLE 07 · DECISIONS.* FIELDS
FIELDVALUESDEFAULT
decisions.translation.options1 to 3: renderings per line that can land more than one way.3
decisions.profanitykeep | soften (the younger cut) | removekeep
decisions.audio.translatemain_voice | all_speech | askmain_voice
decisions.audio.keep_originalauto | askauto
decisions.visual.speakerauto | askauto
decisions.visual.on_screen_textauto | translate | keep | askauto
decisions.visual.expressionmatch | hold | askmatch
decisions.memorycreator | 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.