Consultar layouts
Lista os layouts da loja, abre a árvore completa de um layout e consulta seu histórico de alterações.
Estas três rotas só leem. Use a lista para descobrir qual layout está no ar (is_default: true), o GET por id para obter a árvore inteira (páginas, contêineres, linhas, colunas e blocos) e o histórico para saber quem mudou o quê.
Listar layouts
Retorna os layouts do tema ativo da loja (ou do tema pedido em theme_id), com as páginas de cada um, sem a árvore de blocos. Layouts de rascunho do editor ao vivo e cópias antigas com nome repetido são escondidos da lista, mas continuam acessíveis pelo id.
/api/v1/admin/advanced-layoutsAdminListar layouts
Requer o privilégio manage_layouts.
Parâmetros de consulta
theme_iduuidExemplo de requisição
curl -X GET "$BASE_URL/api/v1/admin/advanced-layouts" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"layouts": [
{
"id": 135,
"name": "Novo Layout Avançado",
"theme_variant": "default",
"is_default": false,
"pages": [
{
"id": 2930,
"layout_id": 135,
"dispatch": "index.index",
"name": "Homepage",
"is_default": false,
"position": 1,
"seo_title": "",
"seo_description": "",
"seo_keywords": "",
"og_image": "",
"og_type": "website",
"canonical_url": "",
"no_index": false,
"custom_html_code": "",
"created_at": "2026-07-12T16:29:12.505299Z"
}
],
"created_at": "2026-07-12T16:29:12.505299Z",
"updated_at": "2026-07-12T16:29:12.505299Z"
}
]
}Campos da resposta
layoutsarrayLista de layouts.
idintegernamestringtheme_variantstringdefault, machic...). É só um rótulo para o editor.is_defaultbooleantrue no layout que a vitrine está servindo. Só um por loja (e por tema).pagesarrayGET por id cada página traz containers, com linhas, colunas e blocos aninhados.created_atstringupdated_atstringErros
| Status | Quando | Corpo de exemplo |
|---|---|---|
| 401 | Sem token, token inválido ou expirado. | {"error":"invalid or expired token"} |
| 403 | Seu usuário não tem o privilégio manage_layouts. | {"error":"insufficient privileges","required":"manage_layouts"} |
| 500 | Falha ao gravar ou ler no banco, ou id inexistente onde a rota não trata 404. | {"error":"failed to list layouts","detail":"..."} |
Obter um layout
Retorna o layout com todas as páginas e, dentro de cada página, os quatro contêineres (top_panel, header, content, footer) com suas linhas, colunas e blocos. É a resposta que um editor visual precisa para desenhar a tela. As visibilidades por grupo de comprador não são filtradas aqui: o administrador vê tudo.
/api/v1/admin/advanced-layouts/{id}AdminObter a árvore de um layout
Requer o privilégio manage_layouts.
Parâmetros de caminho
idintegerobrigatórioExemplo de requisição
curl -X GET "$BASE_URL/api/v1/admin/advanced-layouts/135" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"id": 135,
"name": "Novo Layout Avançado",
"theme_variant": "default",
"is_default": false,
"pages": [
{
"id": 2930,
"layout_id": 135,
"dispatch": "index.index",
"name": "Homepage",
"is_default": false,
"position": 1,
"seo_title": "",
"seo_description": "",
"seo_keywords": "",
"og_image": "",
"og_type": "website",
"canonical_url": "",
"no_index": false,
"custom_html_code": "",
"created_at": "2026-07-12T16:29:12.505299Z",
"containers": [
{
"id": 11056,
"page_id": 2930,
"position": "content",
"sort_order": 0,
"uses_default": false,
"rows": [
{
"id": 8029,
"container_id": 11056,
"sort_order": 0,
"full_width": false,
"spacing": "normal",
"display_mode": "normal",
"visibility": {
"desktop": true,
"tablet": true,
"mobile": true
},
"columns": [
{
"id": 8786,
"row_id": 8029,
"sort_order": 0,
"width_desktop": 12,
"width_tablet": 12,
"width_mobile": 12,
"visibility": {
"desktop": true,
"tablet": true,
"mobile": true
},
"blocks": [
{
"id": 11081,
"column_id": 8786,
"block_type": "banner_slider",
"sort_order": 0,
"name": "Main Banner",
"config": {
"autoplay": true,
"interval": 5000,
"show_arrows": true
},
"content": {},
"visibility": {
"desktop": true,
"tablet": true,
"mobile": true
},
"status": "A",
"cache_ttl": 300,
"updated_at": "2026-07-12T16:29:12.505299Z"
}
]
}
]
}
]
}
]
}
],
"created_at": "2026-07-12T16:29:12.505299Z",
"updated_at": "2026-07-12T16:29:12.505299Z"
}Campos da resposta
idintegernamestringtheme_variantstringdefault, machic...). É só um rótulo para o editor.is_defaultbooleantrue no layout que a vitrine está servindo. Só um por loja (e por tema).pagesarrayGET por id cada página traz containers, com linhas, colunas e blocos aninhados.created_atstringupdated_atstringpages[].containersarrayid, page_id, position, sort_order, uses_default (veja a visão geral) e rows.Erros
| Status | Quando | Corpo de exemplo |
|---|---|---|
| 400 | O id de layout no caminho não é um inteiro. | {"error":"invalid layout id","detail":"id must be an integer"} |
| 401 | Sem token, token inválido ou expirado. | {"error":"invalid or expired token"} |
| 403 | Seu usuário não tem o privilégio manage_layouts. | {"error":"insufficient privileges","required":"manage_layouts"} |
| 404 | Layout não existe. | {"error":"layout not found"} |
| 500 | Falha ao gravar ou ler no banco, ou id inexistente onde a rota não trata 404. | {"error":"failed to get layout","detail":"..."} |
Histórico do layout
Retorna o log de alterações do layout, da mais nova para a mais antiga: criação, edição, exclusão e reordenação de páginas, linhas, colunas e blocos, com quem fez (id e e-mail do administrador).
/api/v1/admin/advanced-layouts/{id}/historyAdminHistórico de alterações de um layout
Requer o privilégio manage_layouts.
Parâmetros de caminho
idintegerobrigatórioParâmetros de consulta
limitintegerpadrão: 50Exemplo de requisição
curl -X GET "$BASE_URL/api/v1/admin/advanced-layouts/135/history?limit=20" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"history": [
{
"id": 1029,
"layout_id": 135,
"entity_type": "layout",
"entity_id": 135,
"action": "create_from_default",
"changes": "{\"new_name\": \"Novo Layout Avançado\", \"source_id\": 122}",
"changed_by": "67bf291c-0846-4053-9528-8cfd5ab0ebf1",
"changed_by_email": "admin@minhaloja.com.br",
"created_at": "2026-07-12 16:29:12.936594+00"
}
],
"total": 1
}Campos da resposta
historyarrayRegistros, do mais novo ao mais antigo.
idintegerlayout_idintegerpage_idintegerentity_typestringlayout, page, container, row, column ou block.entity_idintegeractionstringcreate, update, delete, reorder.changesstringJSON.parse).changed_bystringchanged_by_emailstringcreated_atstring2026-07-12 16:29:12.936594+00), não RFC 3339.totalintegerErros
| Status | Quando | Corpo de exemplo |
|---|---|---|
| 400 | O id de layout no caminho não é um inteiro. | {"error":"invalid layout id","detail":"id must be an integer"} |
| 401 | Sem token, token inválido ou expirado. | {"error":"invalid or expired token"} |
| 403 | Seu usuário não tem o privilégio manage_layouts. | {"error":"insufficient privileges","required":"manage_layouts"} |
| 500 | Falha ao gravar ou ler no banco, ou id inexistente onde a rota não trata 404. | {"error":"failed to get layout history","detail":"..."} |