Custom fonts in compose and caption.burn
Name any Google Fonts family in style.font, or declare your own files in the fonts input under family names you pick. A stack falls through instead of failing.
Text in a compose timeline used to resolve to one of seven bundled families. Anything else silently rendered in whatever the render machine happened to have, and you were billed for a video in a typeface you did not choose.

Three things changed.
Any Google Fonts family works by name. Nothing to upload, nothing to configure. The family is fetched at render time.
"style": { "font": "Bebas Neue", "size": 96, "weight": 700 }Your own files, under names you pick. Put the URLs in the job’s fonts input. There is no limit on how many. TTF, OTF, TTC, WOFF and WOFF2 all work, and an uploaded asset’s content URL works in src like any other input.
"inputs": { "fonts": [ { "family": "Display", "src": "https://cdn.example.com/BrandDisplay.woff2" }, { "family": "Body", "src": "https://cdn.example.com/BrandText.otf" } ]}You choose the name. The alternative is referencing the family string buried inside the file, which you have to find with a font inspector and which often is not what the file is called. Omit family and that embedded name is read for you.
A fallback stack is a failure policy. style.font takes a CSS-style list and falls through in order, so an unreachable CDN or a font catalogue outage gives you the next entry rather than a failed job or a silent substitution.
"style": { "font": "Display, Bebas Neue, sans-serif" }Every substitution is reported back on the job, under steps[].meta.fontFallbacks, so a render that did not use the font you asked for tells you which one it used instead. A value that names nothing resolvable is rejected at submit, which catches pasting a font URL into style.font instead of into fonts.
Where it works
Every job that renders text, on the same rules.
composetakes all of the above, including thefontsarray and stacks.caption.burnandcaptions.animatetake a family by name or a stack infont, and theirfontinput takes your own file, which wins over the name.
The captions jobs take one file rather than an array, because they render one caption track.
Scripts
Latin, Cyrillic, Greek, Vietnamese, Turkish, Arabic, Hebrew, Thai, Devanagari, Bengali, Tamil, Amharic, Khmer, Chinese, Japanese and Korean all render, with right-to-left joining and conjunct shaping handled by the engine. Colour emoji does not render in text assets.

Full reference in the compose fonts docs.
Clip timing changed the same day: see compose timelines without clip timing.
