Variantes da caixa
Liga uma caixa a um produto com preço e estoque próprios, e lista, altera ou remove essas ligações.
A variante é a ligação entre uma caixa e um produto. É ela que coloca a caixa à venda: sem variante, a caixa existe mas nenhum produto a oferece. Cada variante guarda o preço da caixa inteira para aquele produto e quantas caixas há para vender.
Um produto pode ter várias caixas (uma grade e uma fechada, por exemplo), e uma caixa pode servir a vários produtos. O par (caixa, produto) é único: ligar o mesmo produto duas vezes à mesma caixa dá 409.
Esta página reúne as quatro rotas de variante.
/api/v1/admin/product-boxes/{id}/variantsAdminLista as variantes de uma caixa
Autenticação: Authorization: Bearer <token> de um administrador com o privilégio manage_product_boxes ou manage_catalog.
Parâmetros de caminho
iduuidobrigatórioParâmetros de consulta
pageintegerpadrão: 1per_pageintegerpadrão: 50product_iduuidbox_typestringCGlangstringpadrão: pt-BRtitle e description na resposta./api/v1/admin/product-boxes/{id}/variantsAdminVincula uma caixa a um produto
Cria a variante. Responde 201 com a variante completa.
Parâmetros de caminho
iduuidobrigatórioCorpo da requisição
product_iduuidobrigatórioprice_centavosintegerpadrão: 059940 = R$ 599,40). Não pode ser negativo. 0 usa o preço do produto vezes os pares.amountintegerpadrão: 00 usa o estoque do produto.box_typestringCG/api/v1/admin/product-boxes/variants/{variantId}AdminAtualiza o preço e o estoque de uma variante
Altera só price_centavos e amount. A caixa e o produto de uma variante não mudam: para trocá-los, remova a variante e crie outra.
Parâmetros de caminho
variantIduuidobrigatórioid devolvido na criação ou na lista; não é o id da caixa).Corpo da requisição
price_centavosintegerobrigatório0, e zera o valor gravado. Envie sempre os dois campos.amountintegerobrigatório0./api/v1/admin/product-boxes/variants/{variantId}AdminRemove a variant
Remove a ligação de vez (não é soft delete). A caixa e o produto continuam existindo. Responde 204.
Parâmetros de caminho
variantIduuidobrigatórioExemplo de requisição
# ligar a caixa a um produto
curl -X POST "$BASE_URL/api/v1/admin/product-boxes/959af717-ae72-427b-a497-58d3ff422cc8/variants" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"product_id":"1d22de37-ab3b-422d-82ef-275b8257691d","price_centavos":59940,"amount":10}'
# ajustar preço e estoque (use o id da variante)
curl -X PUT "$BASE_URL/api/v1/admin/product-boxes/variants/d77cf791-d92e-4be8-828d-23e97e3d8eea" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"price_centavos":54900,"amount":8}'Resposta
{
"id": "d77cf791-d92e-4be8-828d-23e97e3d8eea",
"box_id": "959af717-ae72-427b-a497-58d3ff422cc8",
"product_id": "1d22de37-ab3b-422d-82ef-275b8257691d",
"price_centavos": 59940,
"amount": 10,
"box_type": "G",
"created_at": "2026-10-11T20:54:29.57382Z",
"updated_at": "2026-10-11T20:54:29.57382Z",
"product_name": "Chinelo Slim Preto",
"product_sku": "SD-004387"
}{
"items": [
{
"id": "d77cf791-d92e-4be8-828d-23e97e3d8eea",
"box_id": "959af717-ae72-427b-a497-58d3ff422cc8",
"product_id": "1d22de37-ab3b-422d-82ef-275b8257691d",
"price_centavos": 59940,
"amount": 10,
"box_type": "G",
"product_name": "Chinelo Slim Preto",
"product_sku": "SD-004387",
"title": "Grade 37 e 38",
"description": "Grade com 6 pares"
}
],
"total": 1,
"page": 1,
"per_page": 50
}Campos da resposta
iduuidbox_iduuidproduct_iduuidprice_centavosintegeramountintegerbox_typestringCGproduct_namestringproduct_skustringtitlestringdescriptionstringcreated_atstringupdated_at traz a última alteração.itemsarraytotal, page e per_page.Erros
| Status | Quando | Corpo |
|---|---|---|
| 400 | Corpo não é JSON válido | {"error":"invalid request body","detail":"..."} |
| 400 | product_id ausente | {"error":"invalid input","detail":"product-boxes: invalid input: product_id is required"} |
| 400 | product_id ou id da caixa que não é UUID | {"error":"invalid uuid","detail":"product-boxes: invalid uuid: product_id must be a UUID"} |
| 400 | Preço ou estoque negativo; box_type diferente de C e G | {"error":"invalid input","detail":"product-boxes: invalid input: price_centavos must be >= 0"} |
| 401 | Token ausente ou expirado | {"error":"invalid or expired token"} |
| 403 | Módulo product-boxes desligado, ou sem privilégio | {"error":"module_disabled","module":"product-boxes"} |
| 404 | Caixa excluída ou inexistente (criação sem box_type no corpo), ou variante inexistente (alteração e exclusão) | {"error":"not found","detail":"product-boxes: not found"} |
| 409 | O produto já está ligado a esta caixa | {"error":"duplicate variant","detail":"product-boxes: duplicate variant for product"} |
| 500 | Caixa inexistente com box_type informado no corpo, ou falha interna | {"error":"internal error","detail":"o registro referenciado não existe (campo relacionado a ...). Crie ou confira esse registro antes de vinculá-lo."} |