Blocos
Cria, altera, move e exclui os blocos de conteúdo dentro das colunas.
O bloco é a peça de conteúdo: um banner, uma grade de produtos, um menu, o botão de comprar. Cada bloco tem um block_type (veja o catálogo), uma config com as opções desse tipo, um content livre e uma camada design de estilo.
Criar bloco
Adiciona um bloco à coluna. Só block_type é obrigatório; name assume o próprio tipo, e config, content e visibility assumem valores vazios/visível em tudo.
/api/v1/admin/advanced-layouts/columns/{id}/blocksAdminCriar um bloco na coluna
Requer o privilégio manage_layouts.
Parâmetros de caminho
idintegerobrigatórioCorpo da requisição
block_typestringobrigatóriosort_orderintegerpadrão: 0namestringpadrão: o próprio block_typeconfigobjectpadrão: {}settings no catálogo.contentobjectpadrão: {}visibilityobjectdesktop, tablet e mobile, valores booleanos. Se omitido na criação, vale true nos três.usergroup_idsstring[]guest (visitante anônimo) e registered (logado), além de UUIDs de grupos.statusstringpadrão: activeA ou active (ativo), D ou inactive (inativo).custom_classstringcustom_cssstringwrapperstringh1_mainh2_importanth3_ordinaryfooteronclick_dropdownfilter_wrappercarddesignobjectbase, tablet e mobile. O formato dos campos vem de Esquema de design. Opcional.Exemplo de requisição
curl -X POST "$BASE_URL/api/v1/admin/advanced-layouts/columns/8786/blocks" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"block_type": "heading",
"name": "Título da seção",
"config": {
"text": "Ofertas da semana",
"tag": "h2"
}
}'Resposta
{
"id": 11120,
"column_id": 8786,
"block_type": "heading",
"sort_order": 0,
"name": "Título da seção",
"config": {
"text": "Ofertas da semana",
"tag": "h2"
},
"content": {},
"visibility": {
"desktop": true,
"tablet": true,
"mobile": true
},
"status": "A",
"cache_ttl": 300,
"updated_at": "2026-07-12T16:29:12.505299Z"
}Campos da resposta
idintegercolumn_idintegerblock_typestringbanner_slider. A lista completa vem de Catálogo de blocos.sort_orderintegernamestringconfigobjectsettings do catálogo).contentobjectvisibilityobjectusergroup_idsstring[]statusstringA (ativo) ou D (inativo).cache_ttlintegercustom_classstringcustom_cssstringwrapperstringh1_main, h2_important, h3_ordinary, footer, onclick_dropdown, filter_wrapper ou card.designobjectreusable_block_idintegercreated_atstringupdated_atstringErros
| Status | Quando | Corpo de exemplo |
|---|---|---|
| 400 | O id de column no caminho não é um inteiro. | {"error":"invalid column id","detail":"id must be an integer"} |
| 400 | Corpo JSON inválido. | {"error":"invalid request body","detail":"unexpected EOF"} |
| 400 | block_type vazio. | {"error":"block_type is required"} |
| 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 | Tipo que só pode existir uma vez por página (como main_content) já presente, conteúdo acima de 1 MB, ou status com palavra não reconhecida (o campo é de 1 letra). | {"error":"failed to create block","detail":"block type \"main_content\" already has the maximum of 1 on this page"} |
Atualizar bloco
Altera os campos enviados. config, content e design, quando enviados, substituem o objeto inteiro (não há mesclagem): leia o bloco, altere o que precisa e devolva o objeto completo.
/api/v1/admin/advanced-layouts/blocks/{id}AdminAtualizar um bloco
Requer o privilégio manage_layouts.
Parâmetros de caminho
idintegerobrigatórioCorpo da requisição
block_typestringsort_orderintegernamestringconfigobjectcontentobjectvisibilityobjectdesktop, tablet e mobile, valores booleanos. Se omitido, o valor atual é mantido. Se enviado, substitui o objeto inteiro.usergroup_idsstring[]guest (visitante anônimo) e registered (logado), além de UUIDs de grupos.statusstringA/active ou D/inactive.custom_classstringcustom_cssstringwrapperstringdesignobjectbase, tablet e mobile. O formato dos campos vem de Esquema de design. Substitui o objeto inteiro quando enviado; envie {} para limpar.Exemplo de requisição
curl -X PUT "$BASE_URL/api/v1/admin/advanced-layouts/blocks/11081" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"config": {
"autoplay": false,
"interval": 5000,
"show_arrows": true
},
"status": "inactive"
}'Resposta
{
"id": 11081,
"column_id": 8786,
"block_type": "banner_slider",
"sort_order": 0,
"name": "Main Banner",
"config": {
"autoplay": false,
"interval": 5000,
"show_arrows": true
},
"content": {},
"visibility": {
"desktop": true,
"tablet": true,
"mobile": true
},
"status": "D",
"cache_ttl": 300,
"updated_at": "2026-07-12T16:29:12.505299Z"
}Campos da resposta
idintegercolumn_idintegerblock_typestringbanner_slider. A lista completa vem de Catálogo de blocos.sort_orderintegernamestringconfigobjectsettings do catálogo).contentobjectvisibilityobjectusergroup_idsstring[]statusstringA (ativo) ou D (inativo).cache_ttlintegercustom_classstringcustom_cssstringwrapperstringh1_main, h2_important, h3_ordinary, footer, onclick_dropdown, filter_wrapper ou card.designobjectreusable_block_idintegercreated_atstringupdated_atstringErros
| Status | Quando | Corpo de exemplo |
|---|---|---|
| 400 | O id de block no caminho não é um inteiro. | {"error":"invalid block id","detail":"id must be an integer"} |
| 400 | Corpo JSON inválido. | {"error":"invalid request body","detail":"unexpected EOF"} |
| 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"} |
| 409 | O bloco pertence a um patch aplicado na loja (Patches). A edição é recusada para o patch continuar reversível. | {"error":"...","code":"patch_owned","how_to_proceed":"revert the owning patch, or apply your change as a new patch (IO → Patches) so it stays attributable and revertible"} |
| 500 | Falha ao gravar ou ler no banco, ou id inexistente onde a rota não trata 404. | {"error":"failed to update block","detail":"..."} |
Excluir bloco
Remove o bloco da coluna. Se ele era uma instância vinculada de um bloco reutilizável, só a instância some; o reutilizável continua na biblioteca.
/api/v1/admin/advanced-layouts/blocks/{id}AdminExcluir um bloco
Requer o privilégio manage_layouts.
Parâmetros de caminho
idintegerobrigatórioExemplo de requisição
curl -X DELETE "$BASE_URL/api/v1/admin/advanced-layouts/blocks/11120" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"message": "block deleted"
}Erros
| Status | Quando | Corpo de exemplo |
|---|---|---|
| 400 | O id de block no caminho não é um inteiro. | {"error":"invalid block 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 | Bloco não existe. | {"error":"block not found","detail":"11120"} |
| 409 | O bloco pertence a um patch aplicado na loja (Patches). A edição é recusada para o patch continuar reversível. | {"error":"...","code":"patch_owned","how_to_proceed":"revert the owning patch, or apply your change as a new patch (IO → Patches) so it stays attributable and revertible"} |
| 500 | Falha ao gravar ou ler no banco, ou id inexistente onde a rota não trata 404. | {"error":"failed to delete block","detail":"..."} |
Mover bloco
Troca a coluna do bloco e define a posição dele nela. A coluna de destino pode estar em qualquer linha.
/api/v1/admin/advanced-layouts/blocks/{id}/moveAdminMover um bloco para outra coluna
Requer o privilégio manage_layouts.
Parâmetros de caminho
idintegerobrigatórioCorpo da requisição
target_column_idintegerobrigatóriosort_orderintegerpadrão: 0Exemplo de requisição
curl -X POST "$BASE_URL/api/v1/admin/advanced-layouts/blocks/11081/move" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"target_column_id": 8790,
"sort_order": 0
}'Resposta
{
"id": 11081,
"column_id": 8790,
"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"
}Campos da resposta
idintegercolumn_idintegerblock_typestringbanner_slider. A lista completa vem de Catálogo de blocos.sort_orderintegernamestringconfigobjectsettings do catálogo).contentobjectvisibilityobjectusergroup_idsstring[]statusstringA (ativo) ou D (inativo).cache_ttlintegercustom_classstringcustom_cssstringwrapperstringh1_main, h2_important, h3_ordinary, footer, onclick_dropdown, filter_wrapper ou card.designobjectreusable_block_idintegercreated_atstringupdated_atstringErros
| Status | Quando | Corpo de exemplo |
|---|---|---|
| 400 | O id de block no caminho não é um inteiro. | {"error":"invalid block id","detail":"id must be an integer"} |
| 400 | Corpo JSON inválido. | {"error":"invalid request body","detail":"unexpected EOF"} |
| 400 | target_column_id ausente ou zero. | {"error":"target_column_id is required"} |
| 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"} |
| 409 | O bloco pertence a um patch aplicado na loja (Patches). A edição é recusada para o patch continuar reversível. | {"error":"...","code":"patch_owned","how_to_proceed":"revert the owning patch, or apply your change as a new patch (IO → Patches) so it stays attributable and revertible"} |
| 500 | Falha ao gravar ou ler no banco, ou id inexistente onde a rota não trata 404. | {"error":"failed to move block","detail":"..."} |