Ciclo de vida do tema
Duplica, publica e coloca um tema ao vivo, e cria o tema inicial padrão.
"Publicar" e "colocar ao vivo" são passos diferentes. Publicar muda o estado do tema para A (publicado): ele fica apto a ir ao ar, mas a vitrine ainda não o usa. Definir como ao vivo liga o tema à vitrine e desliga o anterior; só temas publicados podem ir ao vivo.
Duplicar tema
Copia o tema inteiro (definições de seção, modelos, grupos, seções e blocos) para um tema novo em rascunho, nomeado <nome> (Copy), com slug <slug>-copy-<timestamp>. Sem corpo.
/api/v1/admin/theme-builder/themes/{id}/duplicateAdminDuplicar um tema
Requer o privilégio manage_theme.
Parâmetros de caminho
iduuidobrigatórioExemplo de requisição
curl -X POST "$BASE_URL/api/v1/admin/theme-builder/themes/fb9134bb-7063-46a5-96f8-bad686d1c69b/duplicate" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"id": "a0c1d2e3-1111-4222-8333-444455556666",
"name": "Default (Copy)",
"slug": "default-copy-1791800000",
"description": "Starter theme",
"thumbnail_url": "",
"author": "Venddor",
"version": "1.0.0",
"status": "R",
"is_live": false,
"global_settings_schema": [
{
"key": "primary_color",
"type": "color",
"label": "Primary Color",
"default": "#2563EB"
}
],
"global_settings_values": {
"primary_color": "#2563EB",
"font_body": "Inter",
"border_radius": 8
},
"created_at": "2026-04-07T02:46:02.491306Z",
"updated_at": "2026-04-07T02:46:02.491306Z"
}Campos da resposta
iduuidnamestringslugstringdescriptionstringthumbnail_urlstringauthorstringversionstring1.0.0).statusstringR rascunho, A publicado, L ao vivo, D arquivado. Tema "ao vivo" é indicado por is_live.is_livebooleantrue no tema que a vitrine está usando. Só um por loja.global_settings_schemaobject[]key, type, label, default e, conforme o tipo, options, min, max, step, unit, placeholder, info. Tipos: text, textarea, richtext, url, image, color, range, number, checkbox, select, collection, product.global_settings_valuesobjectkey.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_theme. | {"error":"insufficient privileges","required":"manage_theme"} |
| 500 | Tema de origem inexistente ou falha na cópia. | {"error":"failed to duplicate theme","detail":"theme ... not found"} |
| 500 | O id do caminho não é um UUID. Esta rota não valida antes e devolve 500 com a mensagem do banco em português. | {"error":"failed to duplicate theme","detail":"o valor \"xx\" não é um uuid válido. Envie o identificador completo, com os 36 caracteres e os hífens. Corrija o campo e reenvie."} |
Criar tema inicial
Cria o tema "Default" (slug default) com cerca de 20 definições de seção, um modelo de home e os grupos de cabeçalho e rodapé já preenchidos. É idempotente: se já existe um tema com slug default, devolve esse. Sem corpo.
/api/v1/admin/theme-builder/themes/seedAdminCriar o tema inicial padrão
Requer o privilégio manage_theme.
Exemplo de requisição
curl -X POST "$BASE_URL/api/v1/admin/theme-builder/themes/seed" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"id": "fb9134bb-7063-46a5-96f8-bad686d1c69b",
"name": "Default",
"slug": "default",
"description": "Starter theme",
"thumbnail_url": "",
"author": "Venddor",
"version": "1.0.0",
"status": "A",
"is_live": true,
"global_settings_schema": [
{
"key": "primary_color",
"type": "color",
"label": "Primary Color",
"default": "#2563EB"
}
],
"global_settings_values": {
"primary_color": "#2563EB",
"font_body": "Inter",
"border_radius": 8
},
"created_at": "2026-04-07T02:46:02.491306Z",
"updated_at": "2026-04-07T02:46:02.491306Z"
}Campos da resposta
iduuidnamestringslugstringdescriptionstringthumbnail_urlstringauthorstringversionstring1.0.0).statusstringR rascunho, A publicado, L ao vivo, D arquivado. Tema "ao vivo" é indicado por is_live.is_livebooleantrue no tema que a vitrine está usando. Só um por loja.global_settings_schemaobject[]key, type, label, default e, conforme o tipo, options, min, max, step, unit, placeholder, info. Tipos: text, textarea, richtext, url, image, color, range, number, checkbox, select, collection, product.global_settings_valuesobjectkey.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_theme. | {"error":"insufficient privileges","required":"manage_theme"} |
| 500 | Falha de banco de dados ou dado inválido para a coluna. | {"error":"failed to seed default theme","detail":"..."} |
Publicar tema
Muda o estado do tema para A (publicado). Antes, uma verificação de orçamento de desempenho pesa os arquivos do rascunho do tema (imagens, scripts): se algum estourar o limite, a rota responde 422 com a lista de violações e não publica.
/api/v1/admin/theme-builder/themes/{id}/publishAdminPublicar o tema
Requer o privilégio manage_theme.
Parâmetros de caminho
iduuidobrigatórioParâmetros de consulta
forcebooleantrue ignora o orçamento de desempenho e publica assim mesmo.optimizebooleantrue recomprime automaticamente as imagens que estouram o limite (o original é preservado) e segue com a publicação; se nada puder ser otimizado, cai no 422.Exemplo de requisição
curl -X POST "$BASE_URL/api/v1/admin/theme-builder/themes/fb9134bb-7063-46a5-96f8-bad686d1c69b/publish" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"id": "fb9134bb-7063-46a5-96f8-bad686d1c69b",
"name": "Default",
"slug": "default",
"description": "Starter theme",
"thumbnail_url": "",
"author": "Venddor",
"version": "1.0.0",
"status": "A",
"is_live": true,
"global_settings_schema": [
{
"key": "primary_color",
"type": "color",
"label": "Primary Color",
"default": "#2563EB"
}
],
"global_settings_values": {
"primary_color": "#2563EB",
"font_body": "Inter",
"border_radius": 8
},
"created_at": "2026-04-07T02:46:02.491306Z",
"updated_at": "2026-04-07T02:46:02.491306Z"
}{
"violations": [
{
"rule": "image_size",
"severity": "error",
"asset_url": "/uploads/banner.png",
"actual_bytes": 4200000,
"limit_bytes": 400000,
"fix": "auto"
}
]
}Campos da resposta
iduuidnamestringslugstringdescriptionstringthumbnail_urlstringauthorstringversionstring1.0.0).statusstringR rascunho, A publicado, L ao vivo, D arquivado. Tema "ao vivo" é indicado por is_live.is_livebooleantrue no tema que a vitrine está usando. Só um por loja.global_settings_schemaobject[]key, type, label, default e, conforme o tipo, options, min, max, step, unit, placeholder, info. Tipos: text, textarea, richtext, url, image, color, range, number, checkbox, select, collection, product.global_settings_valuesobjectkey.created_atstringupdated_atstringviolations[]object[]422: rule, severity (error bloqueia, warning não), asset_url, actual_bytes, limit_bytes e fix (auto se optimize resolve, manual, none).Erros
| 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_theme. | {"error":"insufficient privileges","required":"manage_theme"} |
| 404 | Tema não existe. | {"error":"theme not found","detail":"not found: theme ..."} |
| 422 | Há violações de severidade error no rascunho. | {"violations":[{"rule":"...","severity":"error"}]} |
| 500 | O id do caminho não é um UUID. Esta rota não valida antes e devolve 500 com a mensagem do banco em português. | {"error":"failed to publish theme","detail":"o valor \"xx\" não é um uuid válido. Envie o identificador completo, com os 36 caracteres e os hífens. Corrija o campo e reenvie."} |
Definir tema ao vivo
Liga o tema à vitrine e desliga o tema ao vivo anterior, na mesma transação. O tema precisa estar publicado (status: A). Sem corpo.
/api/v1/admin/theme-builder/themes/{id}/set-liveAdminColocar o tema ao vivo
Requer o privilégio manage_theme.
Parâmetros de caminho
iduuidobrigatórioExemplo de requisição
curl -X POST "$BASE_URL/api/v1/admin/theme-builder/themes/fb9134bb-7063-46a5-96f8-bad686d1c69b/set-live" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"id": "fb9134bb-7063-46a5-96f8-bad686d1c69b",
"name": "Default",
"slug": "default",
"description": "Starter theme",
"thumbnail_url": "",
"author": "Venddor",
"version": "1.0.0",
"status": "A",
"is_live": true,
"global_settings_schema": [
{
"key": "primary_color",
"type": "color",
"label": "Primary Color",
"default": "#2563EB"
}
],
"global_settings_values": {
"primary_color": "#2563EB",
"font_body": "Inter",
"border_radius": 8
},
"created_at": "2026-04-07T02:46:02.491306Z",
"updated_at": "2026-04-07T02:46:02.491306Z"
}Campos da resposta
iduuidnamestringslugstringdescriptionstringthumbnail_urlstringauthorstringversionstring1.0.0).statusstringR rascunho, A publicado, L ao vivo, D arquivado. Tema "ao vivo" é indicado por is_live.is_livebooleantrue no tema que a vitrine está usando. Só um por loja.global_settings_schemaobject[]key, type, label, default e, conforme o tipo, options, min, max, step, unit, placeholder, info. Tipos: text, textarea, richtext, url, image, color, range, number, checkbox, select, collection, product.global_settings_valuesobjectkey.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_theme. | {"error":"insufficient privileges","required":"manage_theme"} |
| 404 | Tema não existe. | {"error":"theme not found","detail":"not found: theme ..."} |
| 500 | O tema não está publicado (only published themes can be set as live). | {"error":"failed to set live theme","detail":"only published themes can be set as live"} |
| 500 | O id do caminho não é um UUID. Esta rota não valida antes e devolve 500 com a mensagem do banco em português. | {"error":"failed to set live theme","detail":"o valor \"xx\" não é um uuid válido. Envie o identificador completo, com os 36 caracteres e os hífens. Corrija o campo e reenvie."} |