Temas
Lista, consulta, cria, altera e exclui os temas da vitrine.
Um tema reúne a aparência de toda a vitrine: ajustes globais (cores, fontes, raio de borda), seções reutilizáveis, modelos de página e os grupos de cabeçalho e rodapé. A loja pode ter vários temas, mas só um está ao vivo (is_live: true). Estas rotas gerenciam o cadastro do tema; o conteúdo dele é editado nas demais páginas desta seção.
Listar temas
Devolve todos os temas da loja, sem paginação.
/api/v1/admin/theme-builder/themesAdminListar os temas
Requer o privilégio manage_theme.
Exemplo de requisição
curl -X GET "$BASE_URL/api/v1/admin/theme-builder/themes" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"themes": [
{
"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
themesarrayTemas.
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 list themes","detail":"..."} |
Obter tema
Devolve o tema com seus ajustes globais. Seções, modelos e grupos têm rotas próprias.
/api/v1/admin/theme-builder/themes/{id}AdminObter um tema
Requer o privilégio manage_theme.
Parâmetros de caminho
iduuidobrigatórioExemplo de requisição
curl -X GET "$BASE_URL/api/v1/admin/theme-builder/themes/fb9134bb-7063-46a5-96f8-bad686d1c69b" \
-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"} |
| 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 get 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
Cria um tema novo, por padrão em rascunho e sem seções. Para partir de algo pronto, prefira duplicar ou importar.
/api/v1/admin/theme-builder/themesAdminCriar um tema vazio
Requer o privilégio manage_theme.
Corpo da requisição
namestringobrigatórioslugstringobrigatóriooutono-2026. Em branco falha com 500 (theme slug is required).descriptionstringthumbnail_urlstringauthorstringversionstringpadrão: 1.0.0statusstringpadrão: draftdraft, published, live, archived ou a letra (R, A, L, D).global_settings_schemaobject[]padrão: []global_settings_valuesobjectpadrão: {}Exemplo de requisição
curl -X POST "$BASE_URL/api/v1/admin/theme-builder/themes" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Outono 2026",
"slug": "outono-2026",
"author": "Equipe de marca"
}'Resposta
{
"id": "a0c1d2e3-1111-4222-8333-444455556666",
"name": "Outono 2026",
"slug": "outono-2026",
"description": "Starter theme",
"thumbnail_url": "",
"author": "Equipe de marca",
"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 |
|---|---|---|
| 400 | Corpo JSON inválido. | {"error":"invalid request body","detail":"unexpected EOF"} |
| 400 | name vazio. | {"error":"name 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_theme. | {"error":"insufficient privileges","required":"manage_theme"} |
| 500 | slug vazio ("theme slug is required") ou já usado por outro tema. | {"error":"failed to create theme","detail":"theme slug is required"} |
Atualizar tema
Altera só os campos enviados. Para ajustar cores e fontes, envie global_settings_values: o objeto é substituído por inteiro, então leia o atual e devolva completo. Esta rota não coloca o tema no ar; para isso use definir como ao vivo.
/api/v1/admin/theme-builder/themes/{id}AdminAtualizar dados do tema
Requer o privilégio manage_theme.
Parâmetros de caminho
iduuidobrigatórioCorpo da requisição
namestringslugstringoutono-2026.descriptionstringthumbnail_urlstringauthorstringversionstringstatusstringdraft, published, live, archived ou a letra (R, A, L, D).global_settings_schemaobject[]global_settings_valuesobjectExemplo de requisição
curl -X PUT "$BASE_URL/api/v1/admin/theme-builder/themes/fb9134bb-7063-46a5-96f8-bad686d1c69b" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"global_settings_values": {
"primary_color": "#B45309",
"font_body": "Inter",
"border_radius": 8
}
}'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 |
|---|---|---|
| 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_theme. | {"error":"insufficient privileges","required":"manage_theme"} |
| 404 | Tema não existe. | {"error":"theme not found","detail":"theme fb9134bb-7063-46a5-96f8-bad686d1c69b"} |
| 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 update 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."} |
Excluir tema
Exclui o tema e tudo o que pertence a ele (seções, modelos, grupos, rascunho). Não é possível excluir o tema ao vivo.
/api/v1/admin/theme-builder/themes/{id}AdminExcluir um tema
Requer o privilégio manage_theme.
Parâmetros de caminho
iduuidobrigatórioExemplo de requisição
curl -X DELETE "$BASE_URL/api/v1/admin/theme-builder/themes/a0c1d2e3-1111-4222-8333-444455556666" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"message": "theme deleted"
}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 ..."} |
| 500 | O tema está ao vivo (cannot delete the live theme). Defina outro como ao vivo antes. Esta rota devolve 500 e não 409. | {"error":"failed to delete theme","detail":"cannot delete the live theme"} |
| 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 delete 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."} |