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.
API reference: List Brand Glossaries · Get Brand Glossary
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 generation — Studio, Templates, and single-scene
avatarandimagevideos — 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
Reformerarrives as the Pilates equipment rather than a political activist.
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
Passbrand_glossary_id at the top level of the creation request. It is global to the request — one glossary per call.
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
HeyGenstill readsHeyGenon screen and in the.srtsidecar while being spokenhey-jen. The respelling is for the voice, not the viewer. - Scenes with finished audio are untouched. A Studio scene that supplies
audio_urloraudio_asset_idalready 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 returns404 with the resource_not_found code:
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.
