Categorias do produto
Lista as categorias em que um produto está e substitui o conjunto inteiro, definindo qual é a principal.
Um produto fica em uma categoria principal e, se quiser, em várias categorias adicionais. É a principal que define o caminho da URL e a trilha de navegação (Início / Casa / Cozinha / Caneca); as adicionais só fazem o produto aparecer também nas outras listagens. Esta página mostra como ler esse vínculo e como trocá-lo de uma vez, sem editar o produto inteiro.
Quando você só precisa trocar a categoria principal ao alterar o produto, o campo category_id do PUT basta, mas ele mantém a categoria antiga como adicional. Para tirar o produto de uma categoria, ou para definir várias de uma vez, use a rota PUT .../categories desta página: ela substitui o conjunto inteiro.
/api/v1/admin/products/{id}/categoriesAdminCategorias de um produto
Autenticação: Authorization: Bearer <token> de um usuário administrador com o privilégio view_catalog ou manage_catalog. Um produto que não existe devolve 200 com listas vazias.
Path parameters
iduuidobrigatórioExemplo de requisição (leitura)
curl "$BASE_URL/api/v1/admin/products/0497b6a8-c868-43be-ac21-2abddd24cd3c/categories" \
-H "Authorization: Bearer $TOKEN"Resposta (leitura)
{
"categories": [
{
"id": "7ebc648d-6091-4511-8ea2-f86f7b3b4dd9",
"name": "Informática",
"slug": "informatica",
"description": "",
"position": 0,
"status": "A",
"path": "7ebc648d-6091-4511-8ea2-f86f7b3b4dd9",
"depth": 0,
"product_count": 0,
"created_at": "2026-06-29T02:33:02.245706Z",
"updated_at": "2026-07-10T07:22:15.460489Z",
"category_id": "7ebc648d-6091-4511-8ea2-f86f7b3b4dd9",
"category": "Informática",
"seo_name": "informatica",
"timestamp": 1782700382,
"updated_timestamp": 1783668135
}
],
"links": [
{
"product_id": "0497b6a8-c868-43be-ac21-2abddd24cd3c",
"category_id": "7ebc648d-6091-4511-8ea2-f86f7b3b4dd9",
"position": 0,
"is_primary": true
}
],
"total": 1
}Campos da resposta
categoriesarraycategories[].iduuidcategory_id repete o valor.categories[].namestringcategory repete o valor.categories[].slugstringseo_name repete o valor.categories[].descriptionstringcategories[].image_urlstringcategories[].parent_iduuidcategories[].positionintegercategories[].statusstringADHA ativa, D desativada, H oculta.categories[].pathstringcategories[].depthinteger0 = raiz).categories[].product_countintegercategories[].created_atstringcategories[].updated_atstringcategories[].timestampintegercategories[].updated_timestampintegerlinksarraylinks[].product_iduuidlinks[].category_iduuidlinks[].positionintegerlinks[].is_primarybooleantrue na categoria principal.totalinteger/api/v1/admin/products/{id}/categoriesAdminSubstitui as categorias de um produto
Substitui todos os vínculos de categoria do produto pelos que você enviar, de forma atômica (tudo ou nada), e atualiza o category_id do produto para a principal. Autenticação: Authorization: Bearer <token> de um usuário com o privilégio manage_catalog. A resposta é a mesma da leitura, já com o novo conjunto.
Path parameters
iduuidobrigatórioCorpo da requisição
category_idsarrayobrigatórioprimary_category_iduuidobrigatóriocategory_ids.Exemplo de requisição (escrita)
curl -X PUT "$BASE_URL/api/v1/admin/products/0497b6a8-c868-43be-ac21-2abddd24cd3c/categories" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"category_ids": [
"7ebc648d-6091-4511-8ea2-f86f7b3b4dd9",
"345ac33e-4dcd-4d60-bedf-a2c2d47897d9"
],
"primary_category_id": "7ebc648d-6091-4511-8ea2-f86f7b3b4dd9"
}'Resposta (escrita)
{
"categories": [
{ "id": "7ebc648d-6091-4511-8ea2-f86f7b3b4dd9", "name": "Informática", "slug": "informatica", "position": 0, "status": "A", "path": "7ebc648d-6091-4511-8ea2-f86f7b3b4dd9", "depth": 0, "product_count": 0, "category_id": "7ebc648d-6091-4511-8ea2-f86f7b3b4dd9", "category": "Informática", "seo_name": "informatica" },
{ "id": "345ac33e-4dcd-4d60-bedf-a2c2d47897d9", "name": "Escritório", "slug": "escritorio", "position": 0, "status": "A", "path": "345ac33e-4dcd-4d60-bedf-a2c2d47897d9", "depth": 0, "product_count": 0, "category_id": "345ac33e-4dcd-4d60-bedf-a2c2d47897d9", "category": "Escritório", "seo_name": "escritorio" }
],
"links": [
{ "product_id": "0497b6a8-c868-43be-ac21-2abddd24cd3c", "category_id": "7ebc648d-6091-4511-8ea2-f86f7b3b4dd9", "position": 0, "is_primary": true },
{ "product_id": "0497b6a8-c868-43be-ac21-2abddd24cd3c", "category_id": "345ac33e-4dcd-4d60-bedf-a2c2d47897d9", "position": 1, "is_primary": false }
],
"total": 2
}Os campos da resposta são os da leitura, descritos acima (versão abreviada no exemplo).
Erros
| Status | Quando | Corpo |
|---|---|---|
| 400 | (PUT) category_ids vazio ou ausente | {"error":"category_ids is required and must not be empty"} |
| 400 | (PUT) primary_category_id ausente | {"error":"primary_category_id is required"} |
| 400 | (PUT) JSON inválido | {"error":"invalid request body","detail":"..."} |
| 401 | Sem credenciais, chave inválida ou token expirado | {"error":"invalid or expired token"} |
| 403 | Sem o privilégio (view_catalog/manage_catalog na leitura, manage_catalog na escrita) | {"error":"insufficient privileges","required":"manage_catalog"} |
| 429 | Limite de requisições | {"error":"rate limit exceeded","detail":"too many requests, please try again later"} |
| 500 | (PUT) primary_category_id fora de category_ids; categoria ou produto inexistentes. Por limitação conhecida saem como 500 e não como 400/404 | {"error":"failed to set product categories","detail":"primary_category_id must be included in category_ids"} |
| 500 | (GET) {id} que não é UUID | {"error":"failed to get product categories","detail":"..."} |