Menus de navegação
Lê um menu da loja pela posição (cabeçalho, rodapé, lateral) ou pelo id, com os itens já organizados em árvore.
Um menu é uma lista de links da loja (Feminino, Infantil, Lançamentos...) que o lojista monta no painel. Cada menu tem uma posição (location), que diz onde ele aparece, e uma lista de itens, que podem ter itens filhos (submenus). Estas duas rotas públicas devolvem o menu pronto, só com os itens ativos, já em árvore.
Menu de uma posição
/api/v1/storefront/navigation/{location}PúblicaConsulta o menu de um local
Devolve o menu ativo da posição pedida. Se houver mais de um menu ativo na mesma posição, a API devolve sempre o primeiro em ordem alfabética do nome, de forma estável. É esse o menu que o painel marca como "servido" ao lojista, mas o campo is_served sempre vem false nesta rota pública, então não o use.
Posições válidas: header, header_account, footer, footer_about, footer_help, footer_contact, footer_brands, footer_policies, footer_shop e sidebar. Uma posição fora dessa lista só é aceita se existir um menu com esse nome de posição na loja; senão responde 400. Sem menu ativo na posição, responde 200 com menu: null e items vazio.
Parâmetros de caminho
locationstringobrigatórioheaderheader_accountfooterfooter_aboutfooter_helpfooter_contactfooter_brandsfooter_policiesfooter_shopsidebarExemplo de requisição
curl "$BASE_URL/api/v1/storefront/navigation/header"Resposta
{
"id": "b723eb99-ca29-4c4b-8b8a-7fbc0a9c219d",
"name": "Menu Home",
"location": "header",
"status": "A",
"created_at": "2026-04-07T02:45:34.115783Z",
"updated_at": "2026-06-18T12:29:32.465381Z",
"is_served": false,
"items": [
{
"id": "501f1e92-26eb-4ced-add2-2b1cdea77cbd",
"menu_id": "b723eb99-ca29-4c4b-8b8a-7fbc0a9c219d",
"label": "Feminino",
"url": "/feminino",
"item_type": "custom_link",
"position": 0,
"open_in_new_tab": false,
"status": "A",
"created_at": "2026-04-07T02:45:34.121123Z",
"updated_at": "2026-04-07T02:45:34.121123Z"
},
{
"id": "4a9c0d08-af2c-487c-8494-af46e9f67d63",
"menu_id": "b723eb99-ca29-4c4b-8b8a-7fbc0a9c219d",
"label": "Coleções",
"url": "/colecoes",
"item_type": "custom_link",
"position": 3,
"open_in_new_tab": false,
"status": "A",
"created_at": "2026-04-07T02:45:34.13228Z",
"updated_at": "2026-04-07T02:45:34.13228Z"
}
]
}{ "menu": null, "items": [] }Campos da resposta
iduuidnamestringlocationstringstatusstringA (ativo). Só menus ativos são devolvidos.is_servedbooleanfalse nesta rota pública. Só tem significado no painel.created_atstringupdated_atstringitemsarrayposition. Submenus ficam em children.items[].iduuiditems[].menu_iduuiditems[].parent_item_iduuiditems[].labelstringitems[].urlstringreference_id.items[].item_typestringcategorypageproductcustom_linkitems[].reference_iduuiditem_type não é custom_link.items[].positionintegeritems[].open_in_new_tabbooleanitems[].css_classstringitems[].statusstringA (ativo).items[].childrenarrayErros
| Status | Quando | Corpo |
|---|---|---|
| 400 | Posição inexistente | {"error":"invalid location","detail":"invalid menu location: main"} |
| 404 | Loja não identificada | {"error":"tenant not found","message":"could not resolve storefront from request"} |
| 500 | Falha ao ler | {"error":"failed to get navigation","detail":"..."} |
Menu por id
/api/v1/storefront/navigation-menu/{id}PúblicaConsulta um menu pelo id
Mesma resposta, mas buscando o menu por id em vez de posição. Serve para blocos do layout (como uma coluna do rodapé) que o lojista ligou a um menu específico. Só devolve menu ativo; id que não existe ou de menu inativo responde 200 com {"menu": null, "items": []}.
Parâmetros de caminho
iduuidobrigatórioid de uma resposta de menu). Um valor que não é UUID responde 500.Exemplo de requisição
curl "$BASE_URL/api/v1/storefront/navigation-menu/b723eb99-ca29-4c4b-8b8a-7fbc0a9c219d"Resposta
{
"id": "b723eb99-ca29-4c4b-8b8a-7fbc0a9c219d",
"name": "Menu Home",
"location": "header",
"status": "A",
"is_served": false,
"items": [
{ "id": "501f1e92-26eb-4ced-add2-2b1cdea77cbd", "label": "Feminino", "url": "/feminino", "item_type": "custom_link", "position": 0, "open_in_new_tab": false, "status": "A" }
]
}Os campos são os mesmos de Menu de uma posição, aqui encurtados.
Erros
| Status | Quando | Corpo |
|---|---|---|
| 500 | id que não é UUID | {"error":"failed to get menu","detail":"o valor \"nope\" não é um uuid válido. ..."} |
| 500 | Falha ao ler | {"error":"failed to get menu","detail":"..."} |
O detail do 500 por id inválido é uma frase em português, como o servidor devolve.