Menus do painel
Lê e substitui a lista de menus que o painel esconde para os administradores e para os sellers.
Para simplificar o painel, a loja pode esconder menus que a operação não usa, separadamente para administradores e para sellers. A lista é feita de chaves de menu (domain:, group:, item:) e das rotas do painel correspondentes. O painel lê a lista de cada perfil e deixa de mostrar esses itens.
Exigem o privilégio manage_settings.
Ler a lista
/api/v1/admin/panel-menusAdminLer os menus escondidos de cada perfil
Devolve as duas listas. Uma loja que nunca salvou nada recebe as duas vazias (todos os menus aparecem).
curl "$BASE_URL/api/v1/admin/panel-menus" \
-H "Authorization: Bearer $TOKEN"{
"admin": {
"hidden": ["group:marketing/email", "item:blog"],
"hidden_routes": ["/admin/blog", "/admin/newsletter"]
},
"seller": { "hidden": [], "hidden_routes": [] },
"updated_at": "2026-10-11T22:10:00Z",
"updated_by": "d4613dde-ac7a-431c-9232-50d8cd6ad5fc"
}Campos da resposta
adminobjectsellerobject*.hiddenarray*.hidden_routesarray/admin/... ou /vendor/.... É calculada pelo painel na hora de salvar; o servidor não conhece a estrutura do menu.updated_atstringupdated_byuuidSubstituir a lista
/api/v1/admin/panel-menusAdminGravar a lista completa de menus escondidos
O corpo substitui tudo: não há mesclagem. Os dois perfis e as duas listas de cada um são obrigatórios. Os itens são deduplicados e ordenados. A resposta é o que ficou salvo. A mudança é registrada na auditoria com o antes e o depois.
Corpo da requisição
adminobjectobrigatórioPerfil do administrador.
hiddenarrayobrigatóriodomain:<nome>, group:<dominio>/<grupo> ou item:<nome>, com letras minúsculas, números e hífen. Até 1000.hidden_routesarrayobrigatório/admin/, sem ?. Até 1000. Não podem ser as rotas fixas /admin, /vendor e /admin/settings/panel-menus.sellerobjectobrigatórioPerfil do seller. Mesmos campos; as rotas começam com /vendor/.
hiddenarrayobrigatóriohidden_routesarrayobrigatóriocurl -X PUT "$BASE_URL/api/v1/admin/panel-menus" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"admin": {"hidden": ["item:blog"], "hidden_routes": ["/admin/blog"]},
"seller": {"hidden": [], "hidden_routes": []}
}'A resposta tem o formato da leitura, com updated_at e updated_by preenchidos.
Erros
| Status | Quando | Corpo de exemplo |
|---|---|---|
| 400 | Corpo que não é JSON. | {"error":"invalid panel menus: corpo inválido"} |
| 400 | Falta admin ou seller, ou falta hidden ou hidden_routes. | {"error":"invalid panel menus: o corpo precisa de admin e seller"} |
| 400 | Chave fora do formato. | {"error":"invalid panel menus: chave inválida: \"blog\""} |
| 400 | Rota com ?, rota fixa, ou prefixo errado para o perfil. | {"error":"invalid panel menus: rota de administrador tem de começar com /admin/: \"/vendor/x\""} |
| 400 | Mais de 1000 chaves ou rotas num perfil. | {"error":"invalid panel menus: no máximo 1000 chaves por perfil"} |
| 401 | Sem token ou token expirado. | {"error":"invalid or expired token"} |
| 403 | Sem manage_settings. | {"error":"insufficient privileges","required":"manage_settings"} |
| 500 | Falha ao gravar. | {"error":"failed to save panel menus","detail":"..."} |
As mensagens de validação desta área chegam em português.