Menus

Menus require menus scopes: reads use read_menus, writes use write_menus. A menu is a named, handle-addressed tree of items; each item links to a store resource (product, category, collection, page, blog post, vendor, brand, policy), a fixed destination (home, shop, cart, wishlist, account, the list pages), a custom URL, or is a non-navigable label heading a dropdown. Fetch /menus/limits first — the link-type vocabulary, per-type value requirements, and every tree cap (total items, children per parent, nesting depth) come from there, never hardcoded.

Item reads are built for scale: /menus/{menuId}/items pages one tree level at a time with per-node child counts, and /menus/{menuId}/items/search finds items anywhere in the tree with their ancestor paths. Writes are strict — cross-resource link targets are existence-validated in one batched pass, tree caps are enforced server-side, and reparenting is cycle- and depth-guarded. The atomic save (PUT /menus/{menuId}/save) applies name, handle, and item changes all-or-nothing: send the full items tree (existing item ids update in place so item-title translations survive) or a dirty ops buffer that stays O(changes) for very large menus. Item titles translate through the translations surface as the menu_item resource.

Endpoints#

Fields#

Field

Kind

Create

Update

Required

Translatable

name

text

Yes

Yes

create

No

handle

slug

Yes

Yes

No

item_count

integer

No

No

No

created_at

datetime

No

No

No

updated_at

datetime

No

No

No

Webhook events#

Menu webhook events are declared by the Menu resource contract. The event cards below include the topic, subscription scope, store permission, payload schema, and sample payload.

Menu created

EVENT menus/create write_menus menus:write

Fired when a navigation menu is created.

Payload fields

Field Type Description
menu.id string Always present
menu.name string Can be removed/added via the Payload builder
menu.handle string Can be removed/added via the Payload builder
menu.item_count integer Can be removed/added via the Payload builder
menu.created_at string Can be removed/added via the Payload builder
menu.updated_at string Can be removed/added via the Payload builder

Menu updated

EVENT menus/update write_menus menus:write

Fired when a navigation menu or one of its items is updated.

Payload fields

Field Type Description
menu.id string Always present
menu.name string Can be removed/added via the Payload builder
menu.handle string Can be removed/added via the Payload builder
menu.item_count integer Can be removed/added via the Payload builder
menu.created_at string Can be removed/added via the Payload builder
menu.updated_at string Can be removed/added via the Payload builder

Menu deleted

EVENT menus/delete write_menus menus:write

Fired when a navigation menu is deleted.

Payload fields

Field Type Description
menu.id string Always present
menu.name string Can be removed/added via the Payload builder
menu.handle string Can be removed/added via the Payload builder