Layouts de página
Lê o layout de uma página (a árvore de contêineres, linhas, colunas e blocos), os blocos compartilhados de cabeçalho e rodapé e o layout simples antigo.
Um layout diz quais blocos aparecem em uma página e em que lugar. As duas rotas principais são page-layout/{dispatch} (a página inteira) e shared-layout (as partes comuns a todas as páginas: painel superior, cabeçalho e rodapé). A terceira, layout/{dispatch}, é o sistema simples antigo, mantido só por compatibilidade.
Todas são públicas, sem cache, e filtram no servidor os blocos restritos a grupos de clientes que o visitante não tem: o corpo não carrega o campo de restrição nem os blocos escondidos.
Layout de uma página
/api/v1/storefront/page-layout/{dispatch}PúblicaConsulta o layout avançado de uma página
Devolve o layout da página identificada por dispatch. A API escolhe o melhor candidato, nesta ordem: (1) a página específica de um objeto, se você passar object_id (por exemplo, um produto ou categoria com layout próprio); (2) a página padrão daquele dispatch; (3) a página catch-all default. Por isso um dispatch desconhecido não dá erro: ele recebe o layout default. Só responde 204 quando a loja não tem layout nenhum.
Quando a loja tem um tema ativo, o layout do tema ativo tem prioridade; se ele não tiver a página, vale o layout padrão geral.
Parâmetros de caminho
dispatchstringobrigatórioindex.index (home), categories.view, products.view, search.view, checkout.cart, auth.login. Veja a lista na home da seção.Parâmetros de consulta
object_idstringlayout_idintegerpreview_draftstring11, sobrepõe o rascunho do editor visual clássico ao layout publicado. Combine com layout_id.Exemplo de requisição
curl "$BASE_URL/api/v1/storefront/page-layout/products.view?object_id=22fbd12a-1b6e-41ea-a84f-4d9cf06c8766"Resposta
{
"layout": { "id": 166, "name": "Default", "theme_variant": "", "is_default": true },
"page": {
"id": 3788,
"layout_id": 166,
"dispatch": "default",
"name": "Default (Catch-all)",
"is_default": true,
"position": 0,
"seo_title": "",
"seo_description": "",
"seo_keywords": "",
"og_image": "",
"og_type": "website",
"canonical_url": "",
"no_index": false,
"custom_html_code": ""
},
"containers": [
{ "id": 14434, "page_id": 3788, "position": "top_panel", "sort_order": 0, "uses_default": false },
{ "id": 14435, "page_id": 3788, "position": "header", "sort_order": 1, "uses_default": false },
{
"id": 14436,
"page_id": 3788,
"position": "content",
"sort_order": 2,
"uses_default": false,
"rows": [
{
"id": 11189,
"container_id": 14436,
"sort_order": 0,
"full_width": true,
"spacing": "normal",
"display_mode": "normal",
"visibility": { "desktop": true, "tablet": true, "mobile": true },
"columns": [
{
"id": 11958,
"row_id": 11189,
"sort_order": 0,
"width_desktop": 12,
"width_tablet": 12,
"width_mobile": 12,
"visibility": { "desktop": true, "tablet": true, "mobile": true },
"blocks": [
{
"id": 15257,
"column_id": 11958,
"block_type": "main_content",
"sort_order": 0,
"name": "Main Content",
"config": {},
"content": {},
"visibility": { "desktop": true, "tablet": true, "mobile": true },
"status": "A",
"cache_ttl": 300
}
]
}
]
}
]
},
{ "id": 14437, "page_id": 3788, "position": "footer", "sort_order": 3, "uses_default": false }
]
}A resposta real é maior (a mesma resposta lista todas as páginas do layout em layout.pages); o exemplo acima mostra só o necessário para desenhar uma página.
Campos da resposta
layoutobjectid, name, theme_variant, is_default e a lista pages.pageobjectdispatch.page.dispatchstringdefault mesmo que você tenha pedido outro (veja acima).page.seo_titlestringpage.seo_descriptionstringpage.seo_keywordsstringpage.og_imagestringpage.og_typestringwebsite).page.canonical_urlstringpage.no_indexbooleantrue: a página não deve ser indexada por buscadores.page.custom_html_codestringcontainersarrayposition (top_panel, header, content, footer), sort_order e, quando tem conteúdo próprio, rows.containers[].uses_defaultbooleantrue quando o contêiner herda o conteúdo do layout padrão.containers[].rows[]objectfull_width, spacing (tight, normal...), display_mode, visibility por tamanho de tela e columns.containers[].rows[].columns[]objectwidth_desktop, width_tablet, width_mobile (largura numa grade de 12), visibility e blocks.blocks[].block_typestringbreadcrumbs, main_content, banners, listas de produtos...).blocks[].configobjectblock_type.blocks[].contentobjectblocks[].statusstringA quando o bloco está ativo.blocks[].cache_ttlintegerErros
| Status | Quando | Corpo |
|---|---|---|
| 204 | A loja não tem layout configurado | corpo vazio |
| 404 | Loja não identificada | {"error":"tenant not found","message":"could not resolve storefront from request"} |
| 500 | Falha ao ler o layout | {"error":"failed to get page layout","detail":"..."} |
Blocos compartilhados
/api/v1/storefront/shared-layoutPúblicaConsulta os contêineres compartilhados (painel superior, cabeçalho, rodapé)
Devolve os contêineres top_panel, header e footer do layout padrão, que o casco da vitrine desenha em todas as páginas. Busque uma vez e reaproveite entre páginas. Sem parâmetros. Responde 204 se a loja não tem contêineres compartilhados (use o cabeçalho e o rodapé padrão do seu front-end).
Exemplo de requisição
curl "$BASE_URL/api/v1/storefront/shared-layout"Resposta
{
"containers": [
{ "id": 14434, "page_id": 3788, "position": "top_panel", "sort_order": 0, "uses_default": false },
{ "id": 14435, "page_id": 3788, "position": "header", "sort_order": 1, "uses_default": false },
{ "id": 14437, "page_id": 3788, "position": "footer", "sort_order": 3, "uses_default": false }
]
}Campos da resposta
containersarraycontainers de uma página (com rows, columns e blocks quando têm conteúdo).Erros
| Status | Quando | Corpo |
|---|---|---|
| 204 | Sem contêineres compartilhados | corpo vazio |
| 500 | Falha ao ler | {"error":"failed to get shared layout","detail":"..."} |
Layout simples (descontinuado)
/api/v1/storefront/layout/{dispatch}PúblicaConsulta o layout simples legado de um tipo de página
Sistema antigo de layout em lista plana de blocos. Não use em integrações novas: use page-layout. A rota traduz o dispatch em um tipo de página (index.index e index para homepage, products.view para product, categories.view para category, companies.view para vendor) e devolve o layout padrão desse tipo. Qualquer outro valor vira homepage, então layout/qualquer-coisa devolve o layout da home. Responde 204 se não houver layout.
Parâmetros de caminho
dispatchstringobrigatórioindex.index, index, products.view, categories.view ou companies.view. Outros valores caem na home.Exemplo de requisição
curl "$BASE_URL/api/v1/storefront/layout/index.index"Resposta
{
"id": 9,
"name": "Standard Homepage",
"page_type": "homepage",
"is_default": true,
"blocks": [
{
"id": "1a1a2400-e07f-4529-b73e-b557538817fa",
"type": "logo",
"position": "header",
"order": 0,
"title": "Store Logo",
"config": { "alignment": "left", "alt_text": "Store Logo", "link_to_home": true, "max_height": 60 },
"visible": true
},
{
"id": "8fba21e9-c053-4d95-82b2-33ad8f1ceaff",
"type": "featured_products",
"position": "main",
"order": 0,
"title": "Featured Products",
"config": { "columns": 4, "count": 8, "sort": "popular", "title": "Featured Products", "view_type": "grid" },
"visible": true
}
]
}Campos da resposta
idintegernamestringpage_typestringhomepageproductcategoryvendoris_defaultbooleantrue quando é o layout padrão desse tipo.blocksarrayblocks[].typestringlogo, search_bar, hero_banner, featured_products...).blocks[].positionstringheader, main_top, main, main_bottom...).blocks[].orderintegerblocks[].configobjectblocks[].visiblebooleanErros
| Status | Quando | Corpo |
|---|---|---|
| 204 | Nenhum layout configurado | corpo vazio |
| 500 | Falha ao ler | {"error":"failed to get layout","detail":"..."} |