A brand glossary holds your terms and how HeyGen should treat them: how the voice pronounces them, and whether translation keeps or replaces them. Pass its brand_glossary_id on a video or translation request to apply it. Glossaries can be authored in the HeyGen app under Brand Kit or over the API; the API is how you give each of your own customers their own vocabulary.
API reference: Create Brand Glossary · Update Brand Glossary · Get Brand Glossary · List Brand Glossaries · Delete Brand Glossary
Three lists
Translation rules take effect only through a translation feature; plain video generation and text-to-speech use
terms alone. Matching is case-insensitive. A translation is inserted verbatim with no inflection, so pick a form that reads correctly on its own. Put a term in do_not_translate_terms or forced_translations, not both.
Create
POST /v3/brand-glossaries takes a name (1–64 characters, unique per workspace) and any of the three lists. The 201 response is the full glossary, usable immediately.
hey-jen, hyper frames, twenty twenty-four. Add a term once you have heard it come out wrong.
Update
PATCH /v3/brand-glossaries/{brand_glossary_id} replaces each field independently. Omit a field to leave it alone, send a list to replace it in full, send [] to clear it. Send at least one field. A term repeated within one list returns 409 conflict.
To add a single entry, read the glossary, append, and send the whole list back:
PATCH.
Read
GET /v3/brand-glossaries lists names, IDs, and timestamps, paged with limit and token. GET /v3/brand-glossaries/{brand_glossary_id} returns the full glossary; do_not_translate_terms and forced_translations appear whenever the glossary has rules of that kind, including rules set in the app. Read it when a video pronounces or translates a term unexpectedly.
Delete
DELETE /v3/brand-glossaries/{brand_glossary_id} removes a glossary. Videos and translations already created with it are unaffected. This cannot be undone.
Apply
Passbrand_glossary_id at the top level of the request, one glossary per call:
POST /v3/video-agents it is set once per session. In a translation batch or video batch it is set per item. Scenes with their own audio_url or audio_asset_id have no synthesis step, so terms leaves them unchanged.
An unknown brand_glossary_id fails the request with 400 before rendering, so no credits are spent. Glossaries are workspace-scoped: an ID visible in the app is rejected if the API key belongs to another workspace.
Errors
Migrating from v1 brand voice
brand_voice_id is the deprecated former name of brand_glossary_id. It is still accepted on POST /v3/templates/{template_id}, POST /v3/video-translations, and POST /v3/video-translations/proofreads. POST /v3/videos accepts brand_glossary_id only.
The legacy POST /v1/brand_voice/{brand_voice_id} lists map to the v3 glossary as follows, ahead of the October 31, 2026 v1/v2 sunset:

