Fila de moderação
Lista os produtos que aguardam moderação e aprova ou recusa um produto por vez, com o motivo enviado ao seller.
Use a fila para revisar o que os sellers cadastraram. Por padrão ela mostra só os produtos que aguardam (status = R), do mais novo para o mais antigo. Cada decisão acontece por produto: aprovar publica, recusar devolve ao seller com um motivo. O módulo product-moderation precisa estar ligado.
Listar a fila
/api/v1/admin/moderation/queueAdminLista os produtos em moderação
Parâmetros de consulta
statusstringpadrão: pendingpendingapprovedrejectedallADHRXpending = R; approved = tudo que não é R nem X; rejected = X; all = sem filtro. Também aceita uma letra de status de produto. Um valor desconhecido não filtra (volta tudo).searchstringpageintegerpadrão: 1limitintegerpadrão: 20Exemplo de requisição
curl "$BASE_URL/api/v1/admin/moderation/queue?status=pending&limit=20" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"products": [
{
"id": "d8a6c5e7-8e44-4055-a0e2-49014f5d17f6",
"vendor_id": "94bd7e9a-fdad-4d01-8fc2-ba9d677d8b36",
"vendor_name": "Loja Seller Teste",
"vendor_slug": "loja-seller-teste",
"category_id": "ae6f8f8b-7cbe-4725-84fa-247cce138143",
"name": "Caderno Vintage Vermelho",
"slug": "caderno-vintage-vermelho",
"sku": "SD-004018",
"price": 4990,
"cost_price": 2500,
"quantity": 77,
"status": "R",
"intended_status": "A",
"approval_status": "pending",
"created_at": "2026-10-09T14:01:22Z",
"updated_at": "2026-10-09T14:01:22Z"
}
],
"total": 1,
"page": 1,
"per_page": 20,
"total_pages": 1
}Campos da resposta
productsarraynull quando não há nenhum. É o produto completo do catálogo, com os campos de moderação abaixo.products[].iduuidproducts[].vendor_iduuidproducts[].vendor_namestringproducts[].vendor_slugstringproducts[].priceinteger4990 = R$ 49,90).products[].statusstringADHRXproducts[].intended_statusstringproducts[].approval_statusstringpending, approved, rejected).products[].rejected_reasonstringproducts[].moderated_atstringproducts[].moderated_byuuidtotalintegerpageintegerper_pageintegertotal_pagesintegerAprovar um produto
Leva o produto ao status guardado em intended_status, apaga o motivo de recusa anterior e registra quem aprovou. Como efeitos: avisa o seller, reindexa a busca da loja e tenta ligar o produto ao catálogo mestre (por SKU).
/api/v1/admin/moderation/{id}/approveAdminAprova um produto em moderação
Parâmetros de caminho
iduuidobrigatórioNão há corpo.
{ "message": "product approved", "product_id": "d8a6c5e7-8e44-4055-a0e2-49014f5d17f6" }Recusar um produto
Grava status = X e o motivo, que o seller vê no banner de recusa da edição do produto.
/api/v1/admin/moderation/{id}/rejectAdminRecusa um produto com motivo
Parâmetros de caminho
iduuidobrigatórioCorpo da requisição
reasonstringobrigatóriorejected_reason e notes; vale o primeiro não vazio nessa ordem: reason, rejected_reason, notes.{ "message": "product rejected", "product_id": "d8a6c5e7-8e44-4055-a0e2-49014f5d17f6" }Exemplo de requisição
curl -X POST "$BASE_URL/api/v1/admin/moderation/d8a6c5e7-8e44-4055-a0e2-49014f5d17f6/reject" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"reason": "Foto sem fundo branco e descrição incompleta."}'Erros
| Status | Quando | Corpo de exemplo |
|---|---|---|
| 400 | Recusa sem motivo. | {"error":"rejected_reason is required"} |
| 400 | Corpo da recusa não é JSON. | {"error":"invalid request body","detail":"..."} |
| 400 | A loja exige dados de frete e o produto físico a ser ativado está sem peso e dimensões positivos. | {"error":"physical_shipping_data_required","detail":"fill positive shipping data (weight, length, width, height) before activating this physical product; save it as disabled while incomplete"} |
| 500 | Produto não existe, ou id não é UUID. | {"error":"failed to approve product","detail":"product not found: 0000..."} |
| 401 / 403 | Sem token, módulo desligado ou sem manage_products/manage_catalog. | {"error":"module_disabled","module":"product-moderation"} |