Only a menu item's title is translatable. Menu names, handles, link destinations, and tree positions stay unchanged. Use item IDs from a menu tree or item list. Reads require read_menus and read_translations; writes require write_menus and write_translations. The locale must be enabled and must not be the store's source language.
An empty title removes its translation. Batch reads return field maps keyed by menu_item:{id}; batch writes apply all rows or none. Source title edits mark translations as outdated without hiding them. Deleting an item removes its translations.
Get a menu item translation
Read a menu item's translated title.
Menu item IDs are store-scoped. Only title is translatable; destinations, menu names and handles stay unchanged. Missing translations return an empty fields object.
Path parameters
| Name | Type | Description |
|---|---|---|
itemId
required
|
uuid |
Menu item ID returned in a menu tree or item list. Example: 1d2b7c44-93cf-4f2f-9f6a-5f4a1e2ce8d0 |
locale
required
|
string |
Enabled non-default store locale. Example: fr |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
400INVALID_INPUTA menu item ID is not a valid UUID.
-
400TRANSLATION_LOCALE_REQUIREDA locale is required.
-
400TRANSLATION_LOCALE_NOT_ENABLEDThe language is not enabled for this store.
-
400TRANSLATION_DEFAULT_LOCALE_FORBIDDENThe source language cannot be a translation target.
-
400TRANSLATION_RESOURCE_ID_NOT_IN_STOREAn item does not exist in this store.
-
400TRANSLATION_TOO_MANY_RESOURCESThe batch exceeds the translation resource limit.
Set a menu item translation
Write or clear a menu item's translated title.
Supply title; an empty string clears its translation. A nonempty translation requires a nonempty source title. Saves validate ownership and source content and commit translation events atomically.
Path parameters
| Name | Type | Description |
|---|---|---|
itemId
required
|
uuid |
Menu item ID returned in a menu tree or item list. Example: 1d2b7c44-93cf-4f2f-9f6a-5f4a1e2ce8d0 |
locale
required
|
string |
Enabled non-default store locale. Example: fr |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Idempotency-Key
|
string |
Optional key for this translation write. Reuse it only with the same payload when repeating the request. |
Body parameters
| Name | Type | Description |
|---|---|---|
translations
required
|
object |
Only title is supported. Example: {"title":"Boutique"} |
Errors
-
400INVALID_INPUTA menu item ID is not a valid UUID.
-
400TRANSLATION_LOCALE_REQUIREDA locale is required.
-
400TRANSLATION_LOCALE_NOT_ENABLEDThe language is not enabled for this store.
-
400TRANSLATION_DEFAULT_LOCALE_FORBIDDENThe source language cannot be a translation target.
-
400TRANSLATION_RESOURCE_ID_NOT_IN_STOREAn item does not exist in this store.
-
400TRANSLATION_TOO_MANY_RESOURCESThe batch exceeds the translation resource limit.
-
400STORE_API_INVALID_REQUEST_BODYThe body is invalid or contains unknown fields.
-
400TRANSLATION_FIELD_NOT_TRANSLATABLEOnly title can be translated.
-
400TRANSLATION_FIELDS_REQUIREDAt least one translated field is required.
-
400TRANSLATION_NO_SOURCE_TEXTA nonempty translation requires a source title.
-
400MENU_ITEM_TITLE_TOO_LONGThe translated title exceeds the menu item title limit.
-
409TRANSLATION_MUTATION_CONFLICTThe idempotency key was already used for a different translation change.
Batch get menu item translations
Read translated titles for menu items.
Supply item IDs from this store. Each requested item appears in resources, including an empty field map when it has no translation.
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 menu item IDs. Example: 1d2b7c44-93cf-4f2f-9f6a-5f4a1e2ce8d0 |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
400INVALID_INPUTA menu item ID is not a valid UUID.
-
400TRANSLATION_LOCALE_REQUIREDA locale is required.
-
400TRANSLATION_LOCALE_NOT_ENABLEDThe language is not enabled for this store.
-
400TRANSLATION_DEFAULT_LOCALE_FORBIDDENThe source language cannot be a translation target.
-
400TRANSLATION_RESOURCE_ID_NOT_IN_STOREAn item does not exist in this store.
-
400TRANSLATION_TOO_MANY_RESOURCESThe batch exceeds the translation resource limit.
Batch set menu item translations
Write translated menu item titles in one batch.
Each row identifies a menu item from this store and supplies title in fields. The complete batch is validated before any translation is saved.
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. |
Idempotency-Key
|
string |
Optional key for this translation write. Reuse it only with the same payload when repeating the request. |
Body parameters
| Name | Type | Description |
|---|---|---|
translations
required
|
array<object> |
Rows with an item id and title in fields. Example: [{"id":"1d2b7c44-93cf-4f2f-9f6a-5f4a1e2ce8d0","fields":{"title":"Boutique"}}] |
Errors
-
400INVALID_INPUTA menu item ID is not a valid UUID.
-
400TRANSLATION_LOCALE_REQUIREDA locale is required.
-
400TRANSLATION_LOCALE_NOT_ENABLEDThe language is not enabled for this store.
-
400TRANSLATION_DEFAULT_LOCALE_FORBIDDENThe source language cannot be a translation target.
-
400TRANSLATION_RESOURCE_ID_NOT_IN_STOREAn item does not exist in this store.
-
400TRANSLATION_TOO_MANY_RESOURCESThe batch exceeds the translation resource limit.
-
400STORE_API_INVALID_REQUEST_BODYThe body is invalid or contains unknown fields.
-
400TRANSLATION_FIELD_NOT_TRANSLATABLEOnly title can be translated.
-
400TRANSLATION_FIELDS_REQUIREDAt least one translated field is required.
-
400TRANSLATION_NO_SOURCE_TEXTA nonempty translation requires a source title.
-
400MENU_ITEM_TITLE_TOO_LONGThe translated title exceeds the menu item title limit.
-
409TRANSLATION_MUTATION_CONFLICTThe idempotency key was already used for a different translation change.
Webhook events#
Subscribe to these events when your integration mirrors localized menus. Update and clear events identify the locale and changed fields. One write can emit both events when it sets some fields and clears others.
Menu item translations updated
menu_items/translations/update
App scope: read_menus
Staff permission: menus:write
Fired when a menu item's title translation is added or updated for a locale.
Payload fields
| Field | Type | Description |
|---|---|---|
menu.id |
string |
Always present |
menu.name |
string |
Selectable in the Payload builder |
menu.handle |
string |
Selectable in the Payload builder |
menu_item.id |
string |
Always present |
menu_item.menu_id |
string |
Selectable in the Payload builder |
menu_item.parent_id |
string |
Selectable in the Payload builder |
menu_item.title |
string |
Selectable in the Payload builder |
menu_item.link_type |
string |
Selectable in the Payload builder |
menu_item.link_value |
string |
Selectable in the Payload builder |
menu_item.link_label |
string |
Selectable in the Payload builder |
menu_item.open_in_new_tab |
boolean |
Selectable in the Payload builder |
menu_item.sort_order |
integer |
Selectable in the Payload builder |
menu_item.created_at |
string |
Selectable in the Payload builder |
locale |
string |
Selectable in the Payload builder |
translation.title |
string |
Selectable in the Payload builder |
updated_at |
string |
Selectable in the Payload builder |
Menu item translations deleted
menu_items/translations/delete
App scope: read_menus
Staff permission: menus:write
Fired when a menu item's title translation is cleared for a locale.
Payload fields
| Field | Type | Description |
|---|---|---|
menu.id |
string |
Always present |
menu.name |
string |
Selectable in the Payload builder |
menu.handle |
string |
Selectable in the Payload builder |
menu_item.id |
string |
Always present |
menu_item.menu_id |
string |
Selectable in the Payload builder |
menu_item.parent_id |
string |
Selectable in the Payload builder |
menu_item.title |
string |
Selectable in the Payload builder |
menu_item.link_type |
string |
Selectable in the Payload builder |
menu_item.link_value |
string |
Selectable in the Payload builder |
menu_item.link_label |
string |
Selectable in the Payload builder |
menu_item.open_in_new_tab |
boolean |
Selectable in the Payload builder |
menu_item.sort_order |
integer |
Selectable in the Payload builder |
menu_item.created_at |
string |
Selectable in the Payload builder |
locale |
string |
Selectable in the Payload builder |
translation.title |
string |
Selectable in the Payload builder |
updated_at |
string |
Selectable in the Payload builder |