Brands require product scopes. Reads use read_products; writes use write_products. Brands support name, slug, description, seo_title, seo_description, image_id, and template_handle fields. Assigning a non-empty image_id also requires read_files for the referenced upload image. On create, omitting template_handle assigns default_brand. Use default_brand for the default Brand template, or pass an alternate Brand template handle configured for the store. Omit template_handle on update to leave the current assignment unchanged; an empty string is invalid. AI translation is not exposed through the Store API.
Endpoints#
Brand limits
Fetch Brand limits and per-field constraints.
Returns the per-field maximum lengths and request caps that apply to Brand endpoints. Useful for clients to validate inputs before sending them and to size UIs.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
List brands
List brands for the store.
Returns paginated brands. Pagination, sorting, and search validation are enforced by the product service.
Query parameters
| Name | Type | Description |
|---|---|---|
page
|
integer |
Page number. |
limit
|
integer |
Page size. |
search
|
string |
Search query. |
sort_by
|
string |
Sort field from the Brand list contract.
Allowed values
nameproduct_countcreated_atupdated_at |
sort_direction
|
string |
Sort direction from the Brand list contract.
Allowed values
ascdesc |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
400VALIDATION_LIST_INVALID_PAGEpage must be a positive integer.
-
400VALIDATION_LIST_INVALID_LIMITlimit is outside the Brand contract range.
-
400VALIDATION_LIST_INVALID_SORT_BYsort_by is not a sortable Brand column.
-
400VALIDATION_LIST_INVALID_SORT_DIRECTIONsort_direction is not supported.
-
400VALIDATION_SEARCH_TOO_LONGsearch exceeds the Brand contract maximum length.
Search brands
Search brands for picker-style suggestions.
Returns lightweight brand suggestions by query. This endpoint is intended for pickers and simple selection UIs.
Query parameters
| Name | Type | Description |
|---|---|---|
q
|
string |
Search query. |
limit
|
integer |
Suggestion count. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
400VALIDATION_LIST_INVALID_LIMITlimit is outside the Brand search range.
-
400VALIDATION_SEARCH_TOO_LONGq exceeds the Brand contract maximum length.
Get a brand
Fetch one brand by id.
Returns the brand if it belongs to the token's store.
Path parameters
| Name | Type | Description |
|---|---|---|
id
required
|
integer |
Brand id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
400STORE_API_INVALID_BRAND_IDBrand id is invalid.
-
404BRAND_NOT_FOUNDBrand does not exist in this store.
Create a brand
Create a brand.
Creates a brand. name is required. Omit slug to generate it from the name. Omitted or empty template_handle selects default_brand. A non-empty image_id must identify an uploaded image in this store and requires read_files; video, document, 3D-model, and site-asset ids are rejected.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
name
required
|
string |
Brand name. |
slug
|
string |
Optional slug. Omit to generate from name. |
description
|
string |
Optional plain-text description. |
seo_title
|
string |
Optional SEO title. |
seo_description
|
string |
Optional SEO description. |
image_id
|
string |
Optional Media-library upload image id. Video, document, 3D-model, and site-asset ids are invalid. Non-empty values require |
template_handle
|
string |
Template assignment. On create, omitting this field or sending an empty string assigns |
Errors
-
400STORE_API_INVALID_REQUEST_BODYRequest body is not valid JSON.
-
400STORE_API_CREATE_REDIRECT_UNSUPPORTEDcreate_redirect is only supported when updating a brand.
-
400BRAND_NAME_REQUIREDName is required.
-
400BRAND_NAME_INVALID_CHARSName contains unsupported control characters.
-
400BRAND_NAME_TOO_LONGName exceeds the maximum length.
-
400BRAND_DESCRIPTION_INVALID_CHARSDescription contains unsupported control characters.
-
400BRAND_DESCRIPTION_TOO_LONGDescription exceeds the maximum length.
-
400BRAND_SEO_TITLE_INVALID_CHARSSEO title contains unsupported control characters.
-
400BRAND_SEO_TITLE_TOO_LONGSEO title exceeds the maximum length.
-
400BRAND_SEO_DESCRIPTION_INVALID_CHARSSEO description contains unsupported control characters.
-
400BRAND_SEO_DESCRIPTION_TOO_LONGSEO description exceeds the maximum length.
-
400BRAND_SLUG_INVALID_FORMATSlug is not valid for Brand URLs.
-
400BRAND_SLUG_TOO_LONGSlug exceeds the maximum length.
-
400TEMPLATE_HANDLE_INVALIDTemplate handle is not valid for Brand templates.
-
400TEMPLATE_HANDLE_NOT_FOUNDTemplate handle is not available for this store.
-
400INVALID_INPUTimage_id is malformed, is not an image, or references a file outside the Media-library upload namespace.
-
403STORE_ADMIN_TOKEN_RUNTIME_FORBIDDENA non-empty image_id requires read_files scope in addition to write_products.
-
404NOT_FOUNDThe supplied image does not exist in this store.
-
409BRAND_DUPLICATEName or slug already exists in this store.
-
400BRAND_SLUG_GENERATION_FAILEDA slug could not be generated from the supplied name.
-
400BRAND_UNIQUE_SLUG_GENERATION_FAILEDA unique generated slug could not be found; supply a slug explicitly.
-
400BRAND_LIMIT_REACHEDThe store has reached its brand limit.
Bulk create brands
Create multiple brands by name.
Creates multiple brands from names. Slugs are generated server-side; existing names are skipped and reported in the response.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
names
required
|
array<string> |
Brand names to create. |
Errors
-
400STORE_API_INVALID_REQUEST_BODYRequest body is not valid JSON.
-
400BRAND_BULK_NO_NAMESNo names were provided.
-
400BRAND_BULK_CREATE_TOO_MANYBatch exceeds the Brand bulk create cap.
-
409BRAND_BULK_DUPLICATEOne of the names in the batch was just created by another request.
Update a brand
Update a brand.
Updates only the fields you provide. Empty description and SEO values clear those fields; an empty image_id clears the image. A non-empty image_id must identify an uploaded image in this store and requires read_files; video, document, 3D-model, and site-asset ids are rejected. Omit template_handle to keep the assignment; default_brand resets it; empty is invalid. When slug changes, create_redirect defaults to true.
Path parameters
| Name | Type | Description |
|---|---|---|
id
required
|
integer |
Brand id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
name
|
string |
Brand name. |
slug
|
string |
New slug. Omit to leave the current slug unchanged; an empty value is invalid. |
description
|
string |
Optional plain-text description. |
seo_title
|
string |
Optional SEO title. |
seo_description
|
string |
Optional SEO description. |
image_id
|
string |
Optional Media-library upload image id. Video, document, 3D-model, and site-asset ids are invalid. Non-empty values require |
template_handle
|
string |
Template assignment. On create, omitting this field or sending an empty string assigns |
create_redirect
|
boolean |
When slug changes, create a redirect from the previous slug. |
Errors
-
400STORE_API_INVALID_BRAND_IDBrand id is invalid.
-
400STORE_API_INVALID_REQUEST_BODYRequest body is not valid JSON.
-
400BRAND_NAME_REQUIREDName is required.
-
400BRAND_NAME_INVALID_CHARSName contains unsupported control characters.
-
400BRAND_NAME_TOO_LONGName exceeds the maximum length.
-
400BRAND_DESCRIPTION_INVALID_CHARSDescription contains unsupported control characters.
-
400BRAND_DESCRIPTION_TOO_LONGDescription exceeds the maximum length.
-
400BRAND_SEO_TITLE_INVALID_CHARSSEO title contains unsupported control characters.
-
400BRAND_SEO_TITLE_TOO_LONGSEO title exceeds the maximum length.
-
400BRAND_SEO_DESCRIPTION_INVALID_CHARSSEO description contains unsupported control characters.
-
400BRAND_SEO_DESCRIPTION_TOO_LONGSEO description exceeds the maximum length.
-
400BRAND_SLUG_INVALID_FORMATSlug is not valid for Brand URLs.
-
400BRAND_SLUG_TOO_LONGSlug exceeds the maximum length.
-
400TEMPLATE_HANDLE_INVALIDTemplate handle is not valid for Brand templates.
-
400TEMPLATE_HANDLE_NOT_FOUNDTemplate handle is not available for this store.
-
400INVALID_INPUTimage_id is malformed, is not an image, or references a file outside the Media-library upload namespace.
-
403STORE_ADMIN_TOKEN_RUNTIME_FORBIDDENA non-empty image_id requires read_files scope in addition to write_products.
-
404NOT_FOUNDThe supplied image does not exist in this store.
-
409BRAND_DUPLICATEName or slug already exists in this store.
-
404BRAND_NOT_FOUNDBrand does not exist in this store.
-
409TRANSLATION_SOURCE_FIELD_HAS_TRANSLATIONSClear a field's translations before clearing its source value.
Delete a brand
Delete a brand.
Deletes a brand. If dependent products, collection rules, or menu items require confirmation, retry with the returned confirmation token.
Path parameters
| Name | Type | Description |
|---|---|---|
id
required
|
integer |
Brand id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
confirmed
|
boolean |
On a confirmation retry, set this to true and send the returned confirmation_token. Omit it on the first request. |
confirmation_token
|
string |
Token from the CONFIRMATION_REQUIRED response. Omit it on the first request and resend the exact same id selection when using it. |
Errors
-
400STORE_API_INVALID_BRAND_IDBrand id is invalid.
-
400STORE_API_INVALID_REQUEST_BODYA non-empty request body must be valid JSON.
-
400BRAND_CONFIRMATION_INVALIDConfirmation token is missing, expired, or mismatched.
-
404BRAND_NOT_FOUNDBrand does not exist in this store.
-
409CONFIRMATION_REQUIREDDelete requires confirmation because dependent records will be changed.
Bulk delete brands
Delete multiple brands.
Send store-scoped integer brand ids in brand_ids. The first request needs only that array. If products, collection rules, or menu items will be changed, the API returns CONFIRMATION_REQUIRED; retry the same ids with confirmed: true and its confirmation_token. The success response separates deleted ids from missing or concurrently changed ids in deleted and failed. All database changes for the ids reported as deleted commit together.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
brand_ids
required
|
array<integer> |
Store-scoped integer brand ids to delete. |
confirmed
|
boolean |
On a confirmation retry, set this to true and send the returned confirmation_token. Omit it on the first request. |
confirmation_token
|
string |
Token from the CONFIRMATION_REQUIRED response. Omit it on the first request and resend the exact same id selection when using it. |
Errors
-
400STORE_API_INVALID_REQUEST_BODYRequest body is not valid JSON.
-
400BRAND_BULK_NO_IDSNo brand ids were provided.
-
400BRAND_BULK_DELETE_TOO_MANYBatch exceeds the Brand bulk delete cap.
-
409BRAND_BULK_RACEDDependencies changed while the bulk delete was running; retry with fresh state.
-
400BRAND_CONFIRMATION_INVALIDConfirmation token is missing, expired, or mismatched.
-
404BRAND_NOT_FOUNDBrand does not exist in this store.
-
409CONFIRMATION_REQUIREDDelete requires confirmation because dependent records will be changed.
Fields#
Field |
Kind |
Create |
Update |
Required |
Translatable |
|---|---|---|---|---|---|
|
text |
Yes |
Yes |
create |
Yes |
|
slug |
Yes |
Yes |
Yes |
|
|
textarea |
Yes |
Yes |
Yes |
|
|
text |
Yes |
Yes |
Yes |
|
|
textarea |
Yes |
Yes |
Yes |
|
|
image |
Yes |
Yes |
No |
|
|
template |
Yes |
Yes |
No |
|
|
boolean |
No |
Yes |
No |
|
|
integer |
No |
No |
No |
|
|
datetime |
No |
No |
No |
|
|
datetime |
No |
No |
No |
|
|
url |
No |
No |
No |
No |
Webhook events#
Brand webhook events are declared by the Brand resource contract. The event cards below include the topic, subscription scope, store permission, payload schema, and sample payload.
Brand created
Fired when a brand is created.
Payload fields
| Field | Type | Description |
|---|---|---|
brand.id |
integer |
Always present |
brand.name |
string |
Can be removed/added via the Payload builder |
brand.slug |
string |
Can be removed/added via the Payload builder |
brand.description |
string |
Can be removed/added via the Payload builder |
brand.seo_title |
string |
Can be removed/added via the Payload builder |
brand.seo_description |
string |
Can be removed/added via the Payload builder |
brand.image_id |
string |
Can be removed/added via the Payload builder |
brand.image_url |
string |
Can be removed/added via the Payload builder |
brand.image_cdn_url |
string |
Can be removed/added via the Payload builder |
brand.product_count |
integer |
Can be removed/added via the Payload builder |
brand.template_handle |
string |
Can be removed/added via the Payload builder |
brand.created_at |
string |
Can be removed/added via the Payload builder |
brand.updated_at |
string |
Can be removed/added via the Payload builder |
brand.translations_updated_at |
string |
Can be removed/added via the Payload builder |
Brand updated
Fired when a brand is updated.
Payload fields
| Field | Type | Description |
|---|---|---|
brand.id |
integer |
Always present |
brand.name |
string |
Can be removed/added via the Payload builder |
brand.slug |
string |
Can be removed/added via the Payload builder |
brand.description |
string |
Can be removed/added via the Payload builder |
brand.seo_title |
string |
Can be removed/added via the Payload builder |
brand.seo_description |
string |
Can be removed/added via the Payload builder |
brand.image_id |
string |
Can be removed/added via the Payload builder |
brand.image_url |
string |
Can be removed/added via the Payload builder |
brand.image_cdn_url |
string |
Can be removed/added via the Payload builder |
brand.product_count |
integer |
Can be removed/added via the Payload builder |
brand.template_handle |
string |
Can be removed/added via the Payload builder |
brand.created_at |
string |
Can be removed/added via the Payload builder |
brand.updated_at |
string |
Can be removed/added via the Payload builder |
brand.translations_updated_at |
string |
Can be removed/added via the Payload builder |
Brand deleted
Fired when a brand is deleted.
Payload fields
| Field | Type | Description |
|---|---|---|
brand.id |
integer |
Always present |
brand.name |
string |
Can be removed/added via the Payload builder |
brand.slug |
string |
Can be removed/added via the Payload builder |