Brand translations

Read and write localized brand fields through the Store API.

Brand translations#

Brand translations require product and translation scopes. Brands support translated name, slug, description, seo_title, and seo_description fields. AI translation is not exposed through the Store API.

Get brand translation

GET read_products + read_translations

Fetch one brand translation.

Returns stored translated Brand fields for one locale, including whether the translation is out of date.

Path parameters

Name Type Description
id required integer

Brand id.

Example: 7
locale required string

Enabled non-default store locale.

Example: fr

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Errors

  • 400 STORE_API_INVALID_BRAND_ID

    Brand id is invalid.

  • 400 TRANSLATION_LOCALE_REQUIRED

    locale is required.

  • 400 TRANSLATION_LOCALE_NOT_ENABLED

    Locale is not enabled for this store.

  • 400 TRANSLATION_DEFAULT_LOCALE_FORBIDDEN

    Translations cannot target the store's default locale.

  • 400 TRANSLATION_FIELD_NOT_TRANSLATABLE

    Field is not translatable for brands.

  • 400 TRANSLATION_FIELDS_REQUIRED

    At least one translated field is required.

  • 400 TRANSLATION_FIELD_VALUE_TOO_LONG

    A translated value exceeds its field limit.

  • 400 TRANSLATION_INVALID_RESOURCE_ID

    Brand id is invalid.

  • 400 TRANSLATION_TOO_MANY_RESOURCES

    The request exceeds the translation batch resource cap.

  • 404 TRANSLATION_RESOURCE_NOT_FOUND

    Brand does not exist in this store.

  • 409 TRANSLATION_DUPLICATE_NAME_OR_SLUG

    Translated name or slug conflicts with another brand.

Set brand translation

PUT write_products + write_translations

Set one brand translation.

Writes translated Brand fields for one locale. Empty values clear the matching field translation.

Path parameters

Name Type Description
id required integer

Brand id.

Example: 7
locale required string

Enabled non-default store locale.

Example: fr

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Body parameters

Name Type Description
translations required object

Field-keyed translation values. Allowed fields come from contract.translation.fields.

Example: {"name": "Acme", "description": "Acme fait du matériel outdoor durable."}

Errors

  • 400 STORE_API_INVALID_BRAND_ID

    Brand id is invalid.

  • 400 STORE_API_INVALID_REQUEST_BODY

    Request body is not valid JSON.

  • 400 TRANSLATION_LOCALE_REQUIRED

    locale is required.

  • 400 TRANSLATION_LOCALE_NOT_ENABLED

    Locale is not enabled for this store.

  • 400 TRANSLATION_DEFAULT_LOCALE_FORBIDDEN

    Translations cannot target the store's default locale.

  • 400 TRANSLATION_FIELD_NOT_TRANSLATABLE

    Field is not translatable for brands.

  • 400 TRANSLATION_FIELDS_REQUIRED

    At least one translated field is required.

  • 400 TRANSLATION_FIELD_VALUE_TOO_LONG

    A translated value exceeds its field limit.

  • 400 TRANSLATION_INVALID_RESOURCE_ID

    Brand id is invalid.

  • 400 TRANSLATION_TOO_MANY_RESOURCES

    The request exceeds the translation batch resource cap.

  • 404 TRANSLATION_RESOURCE_NOT_FOUND

    Brand does not exist in this store.

  • 409 TRANSLATION_DUPLICATE_NAME_OR_SLUG

    Translated name or slug conflicts with another brand.

  • 400 BRAND_NAME_INVALID_CHARS

    Translated name contains unsupported control characters.

  • 400 BRAND_NAME_TOO_LONG

    Translated name exceeds the maximum length.

  • 400 BRAND_DESCRIPTION_INVALID_CHARS

    Translated description contains unsupported control characters.

  • 400 BRAND_DESCRIPTION_TOO_LONG

    Translated description exceeds the maximum length.

  • 400 BRAND_SEO_TITLE_INVALID_CHARS

    Translated SEO title contains unsupported control characters.

  • 400 BRAND_SEO_TITLE_TOO_LONG

    Translated SEO title exceeds the maximum length.

  • 400 BRAND_SEO_DESCRIPTION_INVALID_CHARS

    Translated SEO description contains unsupported control characters.

  • 400 BRAND_SEO_DESCRIPTION_TOO_LONG

    Translated SEO description exceeds the maximum length.

  • 400 BRAND_SLUG_INVALID_FORMAT

    Translated slug is not valid for Brand URLs.

  • 400 BRAND_SLUG_TOO_LONG

    Translated slug exceeds the maximum length.

Batch get brand translations

GET read_products + read_translations

Fetch brand translations in batch.

Returns translated Brand fields for multiple brand ids in one locale.

Path parameters

Name Type Description
locale required string

Enabled non-default store locale.

Example: fr

Query parameters

Name Type Description
ids required string

Comma-separated brand ids.

Example: 1,2,3

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Errors

  • 400 TRANSLATION_LOCALE_REQUIRED

    locale is required.

  • 400 TRANSLATION_LOCALE_NOT_ENABLED

    Locale is not enabled for this store.

  • 400 TRANSLATION_DEFAULT_LOCALE_FORBIDDEN

    Translations cannot target the store's default locale.

  • 400 TRANSLATION_FIELD_NOT_TRANSLATABLE

    Field is not translatable for brands.

  • 400 TRANSLATION_FIELDS_REQUIRED

    At least one translated field is required.

  • 400 TRANSLATION_FIELD_VALUE_TOO_LONG

    A translated value exceeds its field limit.

  • 400 TRANSLATION_INVALID_RESOURCE_ID

    Brand id is invalid.

  • 400 TRANSLATION_TOO_MANY_RESOURCES

    The request exceeds the translation batch resource cap.

  • 404 TRANSLATION_RESOURCE_NOT_FOUND

    Brand does not exist in this store.

  • 409 TRANSLATION_DUPLICATE_NAME_OR_SLUG

    Translated name or slug conflicts with another brand.

Batch set brand translations

PUT write_products + write_translations

Set brand translations in batch.

Writes translated Brand fields for multiple brand ids in one locale. Either every row is written or, if any row is invalid, none are.

Path parameters

Name Type Description
locale required string

Enabled non-default store locale.

Example: fr

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Body parameters

Name Type Description
translations required array<object>

Rows with id and fields. Allowed field keys come from contract.translation.fields.

Example: [{"id": 7, "fields": {"name": "Acme"}}]

Errors

  • 400 STORE_API_INVALID_REQUEST_BODY

    Request body is not valid JSON.

  • 400 TRANSLATION_LOCALE_REQUIRED

    locale is required.

  • 400 TRANSLATION_LOCALE_NOT_ENABLED

    Locale is not enabled for this store.

  • 400 TRANSLATION_DEFAULT_LOCALE_FORBIDDEN

    Translations cannot target the store's default locale.

  • 400 TRANSLATION_FIELD_NOT_TRANSLATABLE

    Field is not translatable for brands.

  • 400 TRANSLATION_FIELDS_REQUIRED

    At least one translated field is required.

  • 400 TRANSLATION_FIELD_VALUE_TOO_LONG

    A translated value exceeds its field limit.

  • 400 TRANSLATION_INVALID_RESOURCE_ID

    Brand id is invalid.

  • 400 TRANSLATION_TOO_MANY_RESOURCES

    The request exceeds the translation batch resource cap.

  • 404 TRANSLATION_RESOURCE_NOT_FOUND

    Brand does not exist in this store.

  • 409 TRANSLATION_DUPLICATE_NAME_OR_SLUG

    Translated name or slug conflicts with another brand.

  • 400 BRAND_NAME_INVALID_CHARS

    Translated name contains unsupported control characters.

  • 400 BRAND_NAME_TOO_LONG

    Translated name exceeds the maximum length.

  • 400 BRAND_DESCRIPTION_INVALID_CHARS

    Translated description contains unsupported control characters.

  • 400 BRAND_DESCRIPTION_TOO_LONG

    Translated description exceeds the maximum length.

  • 400 BRAND_SEO_TITLE_INVALID_CHARS

    Translated SEO title contains unsupported control characters.

  • 400 BRAND_SEO_TITLE_TOO_LONG

    Translated SEO title exceeds the maximum length.

  • 400 BRAND_SEO_DESCRIPTION_INVALID_CHARS

    Translated SEO description contains unsupported control characters.

  • 400 BRAND_SEO_DESCRIPTION_TOO_LONG

    Translated SEO description exceeds the maximum length.

  • 400 BRAND_SLUG_INVALID_FORMAT

    Translated slug is not valid for Brand URLs.

  • 400 BRAND_SLUG_TOO_LONG

    Translated slug exceeds the maximum length.

Response shape#

Read endpoints return stored translation fields with metadata. Single-resource reads use data.fields; batch reads use data.resources keyed by brand:{id}. Each field object includes value, is_outdated, and word_count.

Validation and behavior#

Scopes

Reads require read_products and read_translations; writes require write_products and write_translations.

Locale

The locale must be enabled for the store and cannot be the store default locale.

Fields

Brands support translated name, slug, description, seo_title, and seo_description. description is plain text and may span multiple lines; seo_title and seo_description are single line. Unknown fields are rejected.

Empty values

Sending an empty value clears that field translation. If a write mixes set and clear fields, update and delete translation webhooks fire separately.

Name

Translated names are normalized like source brand names and are unique among brand translations in the locale.

Slug

Translated slugs are normalized and must be unique for brand URLs in the locale.

Staleness

When the source brand name, slug, description, seo_title, or seo_description changes, matching translation fields are marked outdated until they are saved again.

Brand IDs

Single and batch writes verify that each brand ID belongs to the store. Batch writes commit atomically: every row validates and writes, or none do.

Error codes#

Brand translation errors use the same registered translation and brand validation codes returned by the endpoints above. Render the response message directly.

Webhooks#

Store API brand translation writes publish brands/translations/update for fields that are set and brands/translations/delete for fields that are cleared. The same scope and permission gate as brand CRUD applies.

Event

Fires when

App scope

Store permission

brands/translations/update

A brand translation is added or updated for a locale.

read_products

products:read

brands/translations/delete

A brand translation is cleared for one or more fields in a locale.

read_products

products:read

Single and batch translation writes emit events only for committed field changes. Brand deletion fires brands/translations/delete per affected locale before brands/delete.

Update payload#

json
{
  "brand": {
    "id": 7,
    "store_id": "{store_id}",
    "name": "Acme",
    "slug": "acme",
    "description": "Acme makes durable outdoor gear.",
    "seo_title": "Acme — Outdoor Gear",
    "seo_description": "Shop Acme outdoor gear: tents, packs, and more.",
    "image_id": "4b7dd68d-dab6-4ec3-92b9-95f63f1ed119",
    "image_url": "https://{storefront_domain}/uploads/4b7dd68d-dab6-4ec3-92b9-95f63f1ed119",
    "image_cdn_url": "https://{cdn_domain}/{store_id}/uploads/{filename}",
    "product_count": 12,
    "created_at": "2026-06-09T12:00:00-04:00",
    "updated_at": "2026-06-09T12:00:00-04:00",
    "translations_updated_at": "2026-06-09T12:10:00-04:00"
  },
  "locale": "fr",
  "translation": {
    "name": "Acme France",
    "slug": "acme-france",
    "description": "Acme fabrique du matériel outdoor durable."
  },
  "updated_at": "2026-06-09T12:10:00-04:00"
}

Delete payload#

json
{
  "brand": {
    "id": 7,
    "store_id": "{store_id}",
    "name": "Acme",
    "slug": "acme",
    "description": "Acme makes durable outdoor gear.",
    "seo_title": "Acme — Outdoor Gear",
    "seo_description": "Shop Acme outdoor gear: tents, packs, and more.",
    "image_id": "4b7dd68d-dab6-4ec3-92b9-95f63f1ed119",
    "image_url": "https://{storefront_domain}/uploads/4b7dd68d-dab6-4ec3-92b9-95f63f1ed119",
    "image_cdn_url": "https://{cdn_domain}/{store_id}/uploads/{filename}",
    "product_count": 12,
    "created_at": "2026-06-09T12:00:00-04:00",
    "updated_at": "2026-06-09T12:00:00-04:00",
    "translations_updated_at": "2026-06-09T12:10:00-04:00"
  },
  "locale": "fr",
  "translation": {
    "description": ""
  },
  "updated_at": "2026-06-09T12:10:00-04:00"
}