Skip to main content
A brand glossary is a list of your terms and the pronunciation each one should get. Pass its brand_glossary_id when you create a video and every term in the list is respelled for the voice — so HeyGen is spoken hey-jen rather than hey-gen, and an acronym your team says as a word isn’t spelled out letter by letter. Glossaries are authored in the HeyGen web app under Brand Kit. Over the API they are read-only: list them, read their terms, and reference them by ID.

One glossary, two jobs

The same glossary record behaves differently depending on where you pass it, because the two pipelines need different things from it:
  • In generationStudio, Templates, and single-scene avatar and image videos — it sets pronunciation. The term keeps its spelling in the script and in captions; only the audio changes.
  • In translation — it pins terminology. A term that a general translator would render literally stays your term instead, so Reformer arrives as the Pilates equipment rather than a political activist.
One list serves both, so a term you add for a Studio voiceover is also honored the next time you translate that video.

List your glossaries

Full schema: GET /v3/brand-glossaries. Returns the glossaries in the authenticated workspace.

Query parameters

The list gives you names and IDs but not contents — to see what a glossary actually changes, read it by ID.

Read a glossary’s terms

GET /v3/brand-glossaries/{brand_glossary_id} returns one glossary with its full term list. This is the endpoint to reach for when a generated video pronounces something unexpectedly — it tells you whether the term is in the list at all, and exactly what respelling it was given.
Terms are not limited to brand names. Numerals, years, and units are common entries, since a written 2024 can be read several defensible ways and a glossary is how you pick one.
A glossary with "terms": [] is valid and applying it is accepted, but it changes nothing. An empty term list is the usual explanation for a glossary that appears to have no effect.

Apply a glossary

Pass brand_glossary_id at the top level of the creation request. It is global to the request — one glossary per call.
See On Brand for the full list of endpoints that accept the field. On POST /v3/videos it applies to "type" of studio, avatar, or image, and in a translation batch or a video batch it is set per item.

What a glossary leaves alone

  • Captions and subtitles keep the original spelling. A term written HeyGen still reads HeyGen on screen and in the .srt sidecar while being spoken hey-jen. The respelling is for the voice, not the viewer.
  • Scenes with finished audio are untouched. A Studio scene that supplies audio_url or audio_asset_id already has its audio, so there is no synthesis step for the glossary to influence.

Errors

Reading a glossary that does not exist in the workspace returns 404 with the resource_not_found code:
On a creation request, an unknown or inaccessible brand_glossary_id is rejected with 400 when the request is made, rather than failing partway through a render — so a bad ID produces no video and consumes no credits. Glossaries are workspace-scoped, so if an ID you can see in the app is rejected, check that the API key belongs to that same workspace.

brand_voice_id is the former name

brand_voice_id was the original name for this field and is deprecated. It is accepted on three endpoints — POST /v3/templates/{template_id}, POST /v3/video-translations, and POST /v3/video-translations/proofreads — where it resolves to the same workspace record, so existing requests keep working. It is not accepted on POST /v3/videos, on any composition type. That request rejects unknown fields outright, so brand_voice_id there is a 400 rather than a silently ignored field — use brand_glossary_id. This is the trap for anyone porting a working translation payload over to Studio. Prefer brand_glossary_id everywhere in new code. The old name is also misleading: a glossary never changes which voice speaks.