Perguntas de produto
Lista a fila de perguntas públicas sobre produtos e responde, rejeita ou arquiva cada uma.
Na página de um produto, visitantes e clientes podem fazer perguntas públicas. A resposta, depois de publicada, fica visível para todos e ajuda na decisão de compra (e entra no índice de busca do produto). Estas quatro rotas são a fila da equipe da loja: ver o que chegou, responder, rejeitar como spam ou arquivar. O seller dono do produto também pode responder, pela API de seller.
Todas exigem o privilégio manage_content. Mais de uma pessoa pode estar moderando ao mesmo tempo, então confira o status antes de agir.
Listar perguntas
/api/v1/admin/product-questionsAdminListar perguntas, mais novas primeiro
Devolve 50 perguntas por página, da mais nova para a mais antiga, com o nome do produto e os dados de quem perguntou. O tamanho da página não é configurável por esta rota.
Parâmetros de consulta
statusstringpendingansweredrejectedarchivedpageintegerpadrão: 1curl "$BASE_URL/api/v1/admin/product-questions?status=pending" \
-H "Authorization: Bearer $TOKEN"{
"questions": [
{
"id": "8b3e6f10-52c9-4d7a-a1e4-0f9c2d7b5a63",
"product_id": "d8a6c5e7-8e44-4055-a0e2-49014f5d17f6",
"product_name": "Notebook Vintage Vermelho",
"guest_name": "Maria",
"guest_email": "maria.souza@example.com",
"question_text": "Esse caderno tem folhas pautadas?",
"status": "pending",
"ai_draft": "Sim, o caderno tem folhas pautadas.",
"ai_draft_shown": false,
"created_at": "2026-10-11T14:22:05Z"
}
]
}Campos da resposta
questions[].iduuidquestions[].product_iduuidquestions[].product_namestringquestions[].user_iduuidquestions[].guest_namestringquestions[].guest_emailstringquestions[].question_textstringquestions[].statusstringpendingansweredrejectedarchivedquestions[].ai_draftstringquestions[].ai_draft_shownbooleanquestions[].answer_textstringquestions[].answered_bystringadmin ou o id do seller.questions[].answered_atstringquestions[].created_atstringResponder
/api/v1/admin/product-questions/{id}/answerAdminPublicar a resposta de uma pergunta
Grava a resposta, marca a pergunta como answered e publica na página do produto (o produto é reindexado). Só perguntas pending ou archived são respondidas. Se a pergunta já foi respondida ou rejeitada, a rota não muda nada e devolve o estado atual com 200.
Parâmetros de caminho
iduuidobrigatórioCorpo da requisição
answer_textstringobrigatóriocurl -X PUT "$BASE_URL/api/v1/admin/product-questions/8b3e6f10-52c9-4d7a-a1e4-0f9c2d7b5a63/answer" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"answer_text":"Sim, o caderno tem 96 folhas pautadas."}'A resposta é a pergunta completa, no formato da lista, agora com status: "answered", answer_text, answered_by: "admin" e answered_at.
Rejeitar
/api/v1/admin/product-questions/{id}/rejectAdminRejeitar uma pergunta como spam ou ofensa
Marca a pergunta como rejected, o que a tira da página pública. Sem corpo. A rota não confere se a pergunta existe nem em que estado estava: rejeita mesmo uma pergunta já respondida.
Parâmetros de caminho
iduuidobrigatóriocurl -X PUT "$BASE_URL/api/v1/admin/product-questions/8b3e6f10-52c9-4d7a-a1e4-0f9c2d7b5a63/reject" \
-H "Authorization: Bearer $TOKEN"{ "rejected": true }Arquivar
/api/v1/admin/product-questions/{id}/archiveAdminArquivar uma pergunta
Marca a pergunta como archived, escondendo-a da página do produto sem apagá-la. Uma pergunta arquivada pode ser respondida depois. Sem corpo. Também não confere se a pergunta existe.
Parâmetros de caminho
iduuidobrigatóriocurl -X PUT "$BASE_URL/api/v1/admin/product-questions/8b3e6f10-52c9-4d7a-a1e4-0f9c2d7b5a63/archive" \
-H "Authorization: Bearer $TOKEN"{ "archived": true }Erros
| Status | Quando | Corpo de exemplo |
|---|---|---|
| 400 | answer com corpo que não é JSON. | {"error":"invalid request body","detail":"..."} |
| 400 | answer com answer_text vazio. | {"error":"answer required"} |
| 401 | Sem token ou token expirado. | {"error":"invalid or expired token"} |
| 403 | Sem manage_content. | {"error":"insufficient privileges","privilege_required_any":["manage_content"]} |
| 500 | {id} que não é UUID, ou falha ao gravar. | {"error":"failed to answer","detail":"..."} |