Listas sugeridas
Cria e gerencia kits prontos, com produtos e quantidades prescritas e um preço combinado opcional, exibidos na vitrine.
Uma lista sugerida é um kit fixo: um conjunto de produtos, cada um com uma quantidade prescrita, mais um preço de kit opcional. É a ferramenta para vender "o enxoval completo" ou "o kit da reposição do mês" de uma vez. A vitrine mostra as listas agrupadas por card_name (cartão) e group_name (subgrupo), com o total, o preço final e o selo de "% OFF".
Diferente do mix, o cliente não monta nem troca itens: a lista é o que está definida aqui. As rotas exigem o módulo suggested-lists ligado e o privilégio manage_promotions.
Listar kits
/api/v1/admin/suggested-listsAdminListar as listas sugeridas
Devolve as listas com os totais calculados, em páginas.
Parâmetros de consulta
pageintegerpadrão: 1per_pageintegerpadrão: 20statusstringADHsearchstringcurl "$BASE_URL/api/v1/admin/suggested-lists?status=A" \
-H "Authorization: Bearer $TOKEN"{
"lists": [
{
"id": "3d8f6a21-7c40-4b19-8e05-91a2c4d7b6f3",
"name": "Kit Reposição Verão",
"description": "Os 3 itens mais vendidos do mês",
"card_name": "Reposição",
"group_name": "Verão",
"image_url": "",
"kit_price": 8990,
"status": "A",
"position": 0,
"total_price": 10970,
"final_price": 8990,
"discount_pct": 18,
"created_at": "2026-10-01T12:00:00Z",
"updated_at": "2026-10-01T12:00:00Z"
}
],
"total": 1,
"page": 1,
"per_page": 10,
"total_pages": 1
}Criar um kit
/api/v1/admin/suggested-listsAdminCriar uma lista sugerida
Cria a lista com seus itens e devolve o kit completo (201).
Corpo da requisição
namestringobrigatóriodescriptionstringcard_namestringgroup_namestringimage_urlstringkit_priceintegernull significa "soma dos itens". Se for maior que a soma, vale a soma.statusstringpadrão: AADHactive, disabled). Vazio vira A.positionintegerpadrão: 0itemsarrayProdutos do kit.
product_iduuidobrigatórioquantityintegerpositionintegercurl -X POST "$BASE_URL/api/v1/admin/suggested-lists" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Kit Reposição Verão",
"card_name": "Reposição",
"kit_price": 8990,
"items": [{"product_id": "ab3f1a07-2ae2-45b7-a4be-bcb67314d601", "quantity": 2}]
}'Ler um kit
/api/v1/admin/suggested-lists/{id}AdminLer uma lista sugerida com seus itens
Parâmetros de caminho
iduuidobrigatóriocurl "$BASE_URL/api/v1/admin/suggested-lists/3d8f6a21-7c40-4b19-8e05-91a2c4d7b6f3" \
-H "Authorization: Bearer $TOKEN"Resposta (criar, ler e alterar)
A criação responde 201 com o mesmo corpo.
{
"id": "3d8f6a21-7c40-4b19-8e05-91a2c4d7b6f3",
"name": "Kit Reposição Verão",
"description": "",
"card_name": "Reposição",
"group_name": "",
"image_url": "",
"kit_price": 8990,
"status": "A",
"position": 0,
"created_at": "2026-10-01T12:00:00Z",
"updated_at": "2026-10-01T12:00:00Z",
"items": [
{
"id": "e5a1c7d3-92b4-4f60-8a1d-3c7e9b2f4a68",
"list_id": "3d8f6a21-7c40-4b19-8e05-91a2c4d7b6f3",
"product_id": "ab3f1a07-2ae2-45b7-a4be-bcb67314d601",
"quantity": 2,
"position": 0,
"product_name": "Chinelo Clássico",
"product_slug": "chinelo-classico",
"product_price": 5485,
"product_image": "/uploads/chinelo.png",
"product_sku": "CHI-001",
"in_stock": true
}
],
"total_price": 10970,
"final_price": 8990,
"discount_pct": 18
}Campos da resposta
iduuidnamestringdescriptionstringcard_namestringgroup_namestringimage_urlstringkit_priceintegernull quando não há.statusstringADHpositionintegeritemsarrayid, list_id, product_id, quantity, position, e do produto product_name, product_slug, product_price (centavos por unidade), product_image, product_sku e in_stock.items[].in_stockbooleanfalse quando o produto está inativo ou sem estoque.total_priceintegerfinal_priceintegerkit_price quando existe e é menor que total_price; senão, total_price.discount_pctinteger0 sem desconto efetivo.created_atstringupdated_atstringAlterar um kit
/api/v1/admin/suggested-lists/{id}AdminAlterar uma lista sugerida
Atualização parcial. Para limpar o preço do kit (voltar a "soma dos itens"), envie kit_price_set: true com kit_price: null; só enviar kit_price: null é ignorado. Se enviar items, substitui todos os itens. Devolve o kit completo.
Parâmetros de caminho
iduuidobrigatórioCorpo da requisição
namestringdescriptionstringcard_namestringgroup_namestringimage_urlstringkit_price_setbooleantrue indica que kit_price deve ser aplicado, inclusive quando null.kit_priceintegerkit_price_set: true.statusstringADHpositionintegeritemsarrayproduct_id, quantity, position). Substitui a atual.curl -X PUT "$BASE_URL/api/v1/admin/suggested-lists/3d8f6a21-7c40-4b19-8e05-91a2c4d7b6f3" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"kit_price_set": true, "kit_price": null}'Apagar um kit
/api/v1/admin/suggested-lists/{id}AdminApagar uma lista sugerida
Remove a lista e seus itens. É idempotente: apagar um id que não existe também responde 200.
Parâmetros de caminho
iduuidobrigatóriocurl -X DELETE "$BASE_URL/api/v1/admin/suggested-lists/3d8f6a21-7c40-4b19-8e05-91a2c4d7b6f3" \
-H "Authorization: Bearer $TOKEN"{ "message": "suggested list deleted" }Erros
| Status | Quando | Corpo de exemplo |
|---|---|---|
| 400 | Corpo que não é JSON. | {"error":"invalid request body","detail":"..."} |
| 400 | Criação sem name. | {"error":"name is required"} |
| 401 | Sem token ou token expirado. | {"error":"invalid or expired token"} |
| 403 | Módulo desligado. | {"error":"module_disabled","module":"suggested-lists"} |
| 403 | Sem manage_promotions. | {"error":"insufficient privileges","required":"manage_promotions"} |
| 404 | Lista inexistente em GET ou PUT. | {"error":"suggested list not found"} |
| 500 | Falha ao gravar, {id} que não é UUID ou produto inexistente num item. | {"error":"failed to create suggested list","detail":"..."} |