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
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. |
locale
required
|
string |
Enabled non-default store locale. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
400STORE_API_INVALID_BRAND_IDBrand id is invalid.
-
400TRANSLATION_LOCALE_REQUIREDlocale is required.
-
400TRANSLATION_LOCALE_NOT_ENABLEDLocale is not enabled for this store.
-
400TRANSLATION_DEFAULT_LOCALE_FORBIDDENTranslations cannot target the store's default locale.
-
400TRANSLATION_FIELD_NOT_TRANSLATABLEField is not translatable for brands.
-
400TRANSLATION_FIELDS_REQUIREDAt least one translated field is required.
-
400TRANSLATION_FIELD_VALUE_TOO_LONGA translated value exceeds its field limit.
-
400TRANSLATION_INVALID_RESOURCE_IDBrand id is invalid.
-
400TRANSLATION_TOO_MANY_RESOURCESThe request exceeds the translation batch resource cap.
-
404TRANSLATION_RESOURCE_NOT_FOUNDBrand does not exist in this store.
-
409TRANSLATION_DUPLICATE_NAME_OR_SLUGTranslated name or slug conflicts with another brand.
Set brand translation
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. |
locale
required
|
string |
Enabled non-default store locale. |
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 |
Errors
-
400STORE_API_INVALID_BRAND_IDBrand id is invalid.
-
400STORE_API_INVALID_REQUEST_BODYRequest body is not valid JSON.
-
400TRANSLATION_LOCALE_REQUIREDlocale is required.
-
400TRANSLATION_LOCALE_NOT_ENABLEDLocale is not enabled for this store.
-
400TRANSLATION_DEFAULT_LOCALE_FORBIDDENTranslations cannot target the store's default locale.
-
400TRANSLATION_FIELD_NOT_TRANSLATABLEField is not translatable for brands.
-
400TRANSLATION_FIELDS_REQUIREDAt least one translated field is required.
-
400TRANSLATION_FIELD_VALUE_TOO_LONGA translated value exceeds its field limit.
-
400TRANSLATION_INVALID_RESOURCE_IDBrand id is invalid.
-
400TRANSLATION_TOO_MANY_RESOURCESThe request exceeds the translation batch resource cap.
-
404TRANSLATION_RESOURCE_NOT_FOUNDBrand does not exist in this store.
-
409TRANSLATION_DUPLICATE_NAME_OR_SLUGTranslated name or slug conflicts with another brand.
-
400BRAND_NAME_INVALID_CHARSTranslated name contains unsupported control characters.
-
400BRAND_NAME_TOO_LONGTranslated name exceeds the maximum length.
-
400BRAND_DESCRIPTION_INVALID_CHARSTranslated description contains unsupported control characters.
-
400BRAND_DESCRIPTION_TOO_LONGTranslated description exceeds the maximum length.
-
400BRAND_SEO_TITLE_INVALID_CHARSTranslated SEO title contains unsupported control characters.
-
400BRAND_SEO_TITLE_TOO_LONGTranslated SEO title exceeds the maximum length.
-
400BRAND_SEO_DESCRIPTION_INVALID_CHARSTranslated SEO description contains unsupported control characters.
-
400BRAND_SEO_DESCRIPTION_TOO_LONGTranslated SEO description exceeds the maximum length.
-
400BRAND_SLUG_INVALID_FORMATTranslated slug is not valid for Brand URLs.
-
400BRAND_SLUG_TOO_LONGTranslated slug exceeds the maximum length.
Batch get brand 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. |
Query parameters
| Name | Type | Description |
|---|---|---|
ids
required
|
string |
Comma-separated brand ids. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
400TRANSLATION_LOCALE_REQUIREDlocale is required.
-
400TRANSLATION_LOCALE_NOT_ENABLEDLocale is not enabled for this store.
-
400TRANSLATION_DEFAULT_LOCALE_FORBIDDENTranslations cannot target the store's default locale.
-
400TRANSLATION_FIELD_NOT_TRANSLATABLEField is not translatable for brands.
-
400TRANSLATION_FIELDS_REQUIREDAt least one translated field is required.
-
400TRANSLATION_FIELD_VALUE_TOO_LONGA translated value exceeds its field limit.
-
400TRANSLATION_INVALID_RESOURCE_IDBrand id is invalid.
-
400TRANSLATION_TOO_MANY_RESOURCESThe request exceeds the translation batch resource cap.
-
404TRANSLATION_RESOURCE_NOT_FOUNDBrand does not exist in this store.
-
409TRANSLATION_DUPLICATE_NAME_OR_SLUGTranslated name or slug conflicts with another brand.
Batch set brand 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. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
translations
required
|
array<object> |
Rows with |
Errors
-
400STORE_API_INVALID_REQUEST_BODYRequest body is not valid JSON.
-
400TRANSLATION_LOCALE_REQUIREDlocale is required.
-
400TRANSLATION_LOCALE_NOT_ENABLEDLocale is not enabled for this store.
-
400TRANSLATION_DEFAULT_LOCALE_FORBIDDENTranslations cannot target the store's default locale.
-
400TRANSLATION_FIELD_NOT_TRANSLATABLEField is not translatable for brands.
-
400TRANSLATION_FIELDS_REQUIREDAt least one translated field is required.
-
400TRANSLATION_FIELD_VALUE_TOO_LONGA translated value exceeds its field limit.
-
400TRANSLATION_INVALID_RESOURCE_IDBrand id is invalid.
-
400TRANSLATION_TOO_MANY_RESOURCESThe request exceeds the translation batch resource cap.
-
404TRANSLATION_RESOURCE_NOT_FOUNDBrand does not exist in this store.
-
409TRANSLATION_DUPLICATE_NAME_OR_SLUGTranslated name or slug conflicts with another brand.
-
400BRAND_NAME_INVALID_CHARSTranslated name contains unsupported control characters.
-
400BRAND_NAME_TOO_LONGTranslated name exceeds the maximum length.
-
400BRAND_DESCRIPTION_INVALID_CHARSTranslated description contains unsupported control characters.
-
400BRAND_DESCRIPTION_TOO_LONGTranslated description exceeds the maximum length.
-
400BRAND_SEO_TITLE_INVALID_CHARSTranslated SEO title contains unsupported control characters.
-
400BRAND_SEO_TITLE_TOO_LONGTranslated SEO title exceeds the maximum length.
-
400BRAND_SEO_DESCRIPTION_INVALID_CHARSTranslated SEO description contains unsupported control characters.
-
400BRAND_SEO_DESCRIPTION_TOO_LONGTranslated SEO description exceeds the maximum length.
-
400BRAND_SLUG_INVALID_FORMATTranslated slug is not valid for Brand URLs.
-
400BRAND_SLUG_TOO_LONGTranslated 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 |
|---|---|
Locale |
The locale must be enabled for the store and cannot be the store default locale. |
Fields |
Brands support translated |
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 |
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 |
|---|---|---|---|
|
A brand translation is added or updated for a locale. |
|
|
|
A brand translation is cleared for one or more fields in a locale. |
|
|
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#
{
"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#
{
"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"
}