---
title: "Create Brand Glossary"
method: POST
path: "/v3/brand-glossaries"
tags: ["Brand"]
---

# Create Brand Glossary

`POST /v3/brand-glossaries`

## Request

- Base URL: `https://api.heygen.com`
- URL: `https://api.heygen.com/v3/brand-glossaries`
- Auth: one of:
  - API key in header `x-api-key`
  - HTTP bearer

Creates a brand glossary. Pass the returned `brand_glossary_id` when creating a video or translation to apply it. `name` must be unique in the workspace, ignoring case; a duplicate returns 409. Term lists are optional and can be added later with PATCH. `pronunciation_language` and `target_language` accept scope 'all' or scope 'specific' with a base language code such as 'fr'; omission means all languages and null is invalid. Duplicate term/rule-type/language combinations return 409; distinct languages for the same term are allowed. The response includes language fields for specific-language rules. Temporary access-evaluation failures return 503; retry the request.

## Headers

- `Idempotency-Key` string

## Request body

- CreateBrandGlossaryRequest: Request body for POST /v3/brand-glossaries.
  - `name` string, required: Display name for the glossary. Surrounding whitespace is removed, and the trimmed name must be 1-64 characters and unique within your workspace, compared without regard to case.
  - `terms` BrandGlossaryTermWrite[]: Term-to-pronunciation mappings. Omit it, or pass an empty array, to create a glossary you fill in later.
    - `term` string, required: The term as written in a script, matched case-insensitively. Surrounding whitespace is removed and the trimmed value must be non-empty.
    - `pronunciation` string, required: Respelling handed to the speech synthesizer in place of `term` (for example 'hey-jen' for 'HeyGen'). Affects generated audio only — captions and subtitles keep the original `term` spelling. Surrounding whitespace is removed and the trimmed value must be non-empty.
    - `pronunciation_language` union: Language in which this pronunciation applies. Omit or use scope 'all' for all languages; null is invalid. Use scope 'specific' with a base language code such as 'fr', not a locale such as 'fr-FR'. A language-specific rule overrides an all-languages rule. Responses omit this field for all-languages rules.
      - AllBrandGlossaryLanguages: Apply the rule in every language.
        - `scope` 'all', required: Apply this rule in every language.
      - SpecificBrandGlossaryLanguage: Apply the rule in one language.
        - `scope` 'specific', required: Apply this rule only in the specified language.
        - `code` string, required: Language code, such as 'en' or 'fr'. Locale codes such as 'en-US' are not accepted.
  - `do_not_translate_terms` DoNotTranslateEntryWrite[]: Terms to keep untranslated when this glossary is used by a translation feature. Omit it, or pass an empty array, to add none.
    - `term` string, required: A term to keep untranslated. When this glossary is used by a translation feature, each occurrence of the term — matched case-insensitively — is kept untranslated in every target language. Surrounding whitespace is removed and the trimmed value must be non-empty.
  - `forced_translations` ForcedTranslationEntryWrite[]: Force Translate rules: terms translated into an exact replacement when this glossary is used by a translation feature. Omit it, or pass an empty array, to add none. If a term also appears in `do_not_translate_terms`, Don't Translate takes precedence without deleting its Force Translate rules.
    - `term` string, required: The term to replace, matched in the source text case-insensitively. Surrounding whitespace is removed and the trimmed value must be non-empty.
    - `translation` string, required: The exact text used in place of `term` in the translated output for the selected target language scope. Inserted verbatim: grammatical inflection (case, gender, number) is not adapted to the surrounding sentence. Surrounding whitespace is removed and the trimmed value must be non-empty.
    - `target_language` union: Target language in which this translation applies. Omit or use scope 'all' for all languages; null is invalid. Use scope 'specific' with a base language code such as 'fr', not a locale such as 'fr-FR'. A language-specific rule overrides an all-languages rule. Responses omit this field for all-languages rules.
      - AllBrandGlossaryLanguages: Apply the rule in every language.
        - `scope` 'all', required: Apply this rule in every language.
      - SpecificBrandGlossaryLanguage: Apply the rule in one language.
        - `scope` 'specific', required: Apply this rule only in the specified language.
        - `code` string, required: Language code, such as 'en' or 'fr'. Locale codes such as 'en-US' are not accepted.

## Response `201`

Created.

- object
  - `data` BrandGlossaryDetail: A single brand glossary with its full term list (GET /v3/brand-glossaries/{id}).
    - `brand_glossary_id` string, required: Unique brand glossary ID. Pass it as `brand_glossary_id` when creating a video or translation to apply this glossary.
    - `name` string, required: Display name of the brand glossary.
    - `created_at` string, date-time, required: Creation timestamp (UTC).
    - `updated_at` string, date-time, required: Last update timestamp (UTC).
    - `terms` BrandGlossaryTerm[], required: Every term mapping in this glossary. Empty when the glossary has no terms yet, in which case applying it has no effect.
      - `term` string, required: The term as written in a script, matched case-insensitively.
      - `pronunciation` string, required: Respelling handed to the speech synthesizer in place of `term` (for example 'hey-jen' for 'HeyGen'). Affects generated audio only — captions and subtitles keep the original `term` spelling.
      - `pronunciation_language` union: Language in which this pronunciation applies. Omit or use scope 'all' for all languages; null is invalid. Use scope 'specific' with a base language code such as 'fr', not a locale such as 'fr-FR'. A language-specific rule overrides an all-languages rule. Responses omit this field for all-languages rules.
        - AllBrandGlossaryLanguages: Apply the rule in every language.
          - `scope` 'all', required: Apply this rule in every language.
        - SpecificBrandGlossaryLanguage: Apply the rule in one language.
          - `scope` 'specific', required: Apply this rule only in the specified language.
          - `code` string, required: Language code, such as 'en' or 'fr'. Locale codes such as 'en-US' are not accepted.
    - `do_not_translate_terms` DoNotTranslateEntry[]: Don't Translate rules in this glossary. Omitted when it has none.
      - `term` string, required: A term to keep untranslated. When this glossary is used by a translation feature, each occurrence of the term — matched case-insensitively — is kept untranslated in every target language.
    - `forced_translations` ForcedTranslationEntry[]: Force Translate rules in this glossary. Omitted when it has none. If a term also appears in `do_not_translate_terms`, Don't Translate takes precedence without deleting its Force Translate rules.
      - `term` string, required: The term to replace, matched in the source text case-insensitively.
      - `translation` string, required: The exact text used in place of `term` in the translated output for the selected target language scope. Inserted verbatim: grammatical inflection (case, gender, number) is not adapted to the surrounding sentence.
      - `target_language` union: Target language in which this translation applies. Omit or use scope 'all' for all languages; null is invalid. Use scope 'specific' with a base language code such as 'fr', not a locale such as 'fr-FR'. A language-specific rule overrides an all-languages rule. Responses omit this field for all-languages rules.
        - AllBrandGlossaryLanguages: Apply the rule in every language.
          - `scope` 'all', required: Apply this rule in every language.
        - SpecificBrandGlossaryLanguage: Apply the rule in one language.
          - `scope` 'specific', required: Apply this rule only in the specified language.
          - `code` string, required: Language code, such as 'en' or 'fr'. Locale codes such as 'en-US' are not accepted.

## Other responses

- `400`: Invalid request parameters
- `401`: Authentication failed
- `409`: Conflict — either the request conflicts with existing state, or a prior request with this `Idempotency-Key` is still in progress (`request_in_progress`).
- `429`: Rate limit exceeded
- `503`: Temporarily unavailable — the request did not complete and is safe to retry.

## Changes

- **2026-11-03** `7dfa5e59b4f5`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/heygen/apis/heygen-external-api/changes/v3/brand-glossaries/post.md)

---

[API](https://skmtc.dev/heygen/apis/heygen-external-api.md) - [All operations](https://skmtc.dev/heygen/apis/heygen-external-api/llms.txt) - [OpenAPI document](https://skmtc.dev/heygen/apis/heygen-external-api/revisions/7dfa5e59b4f5?raw)
