Vendas, pedidos e produtos
Quatro relatórios de entrada: resumo de vendas, vendas, pedidos por status e produtos mais vendidos, com janela padrão de 30 dias.
Estas quatro rotas são o jeito mais curto de obter números de vendas: não exigem parâmetros, e sem datas usam os últimos 30 dias. GET /admin/reports e GET /admin/reports/sales devolvem o relatório de vendas (o primeiro dentro de um envelope report/period/data). GET /admin/reports/orders conta pedidos por status e GET /admin/reports/products lista os mais vendidos. Valores em dinheiro vêm em centavos. Para filtros por seller ou categoria e comparação entre períodos, use os relatórios avançados.
Resumo de relatórios
/api/v1/admin/reportsAdminRelatório de vendas dentro de um envelope
Parâmetros de consulta
fromstringYYYY-MM-DD. Sem from e to, vale os últimos 30 dias.tostringYYYY-MM-DD. Os dois precisam vir juntos, senão a janela padrão é usada.compare_fromstringYYYY-MM-DD.compare_tostringYYYY-MM-DD. Precisa vir junto com compare_from.vendor_iduuidcategory_iduuidgroup_bystringpadrão: daydayweekmonthExemplo de requisição
curl "$BASE_URL/api/v1/admin/reports?from=2026-10-01&to=2026-10-11" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"report": "sales",
"period": {
"from": "2026-10-01",
"to": "2026-10-11"
},
"data": {
"total_revenue": 63853,
"total_orders": 4,
"avg_order_value": 15963,
"completed_orders": 0,
"cancelled_orders": 3,
"time_series": [
{
"date": "2026-10-09",
"revenue": 13587,
"orders": 1,
"aov": 13587
},
{
"date": "2026-10-10",
"revenue": 45000,
"orders": 2,
"aov": 22500
}
],
"compare_revenue": 0,
"compare_orders": 0,
"compare_series": [],
"revenue_change": 0,
"order_change": 0,
"top_products": [
{
"product_id": "22fbd12a-1b6e-41ea-a84f-4d9cf06c8766",
"product_name": "Camisa do Flamengo Masculina I 26 Adidas",
"quantity": 2,
"revenue": 45000
}
],
"generated_at": "2026-10-11T21:02:40.868Z"
}
}Campos da resposta
reportstringsales.periodobjectfrom e to efetivamente usados.dataobjectErros
| Status | Quando | Exemplo de corpo |
|---|---|---|
| 401 | Token ausente, inválido ou expirado. | {"error":"missing authorization header"} |
| 403 | O token não é de um usuário administrador. | {"error":"admin access required"} |
| 403 | O usuário é administrador, mas não tem o privilégio exigido. | {"error":"insufficient privileges","privilege_required_any":["view_reports"]} |
| 500 | Falha ao consultar o banco. | {"error":"failed to generate report","detail":"..."} |
Vendas
/api/v1/admin/reports/salesAdminRelatório de vendas
Parâmetros de consulta
fromstringYYYY-MM-DD. Padrão: 30 dias atrás.tostringYYYY-MM-DD. Padrão: hoje (UTC).compare_fromstringcompare_tostringvendor_iduuidcategory_iduuidgroup_bystringpadrão: daydayweekmonthExemplo de requisição
curl "$BASE_URL/api/v1/admin/reports/sales?from=2026-10-01&to=2026-10-11&group_by=week" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"total_revenue": 63853,
"total_orders": 4,
"avg_order_value": 15963,
"completed_orders": 0,
"cancelled_orders": 3,
"time_series": [
{
"date": "2026-10-09",
"revenue": 13587,
"orders": 1,
"aov": 13587
},
{
"date": "2026-10-10",
"revenue": 45000,
"orders": 2,
"aov": 22500
}
],
"compare_revenue": 0,
"compare_orders": 0,
"compare_series": [],
"revenue_change": 0,
"order_change": 0,
"top_products": [
{
"product_id": "22fbd12a-1b6e-41ea-a84f-4d9cf06c8766",
"product_name": "Camisa do Flamengo Masculina I 26 Adidas",
"quantity": 2,
"revenue": 45000
}
],
"generated_at": "2026-10-11T21:02:40.868Z"
}Campos da resposta
total_revenueintegertotal_ordersintegeravg_order_valueintegercompleted_ordersintegercancelled_ordersintegertime_seriesarraygroup_by): date, revenue (centavos), orders, aov (ticket médio, centavos). Só aparecem os dias com pedido.compare_revenue / compare_ordersinteger0 quando nenhum período de comparação foi pedido.compare_seriesarraytime_series.revenue_change / order_changeinteger-9976 = menos 99,76%; 1250 = mais 12,50%.top_productsarrayproduct_id, product_name, quantity, revenue.generated_atstringErros
| Status | Quando | Exemplo de corpo |
|---|---|---|
| 401 | Token ausente, inválido ou expirado. | {"error":"missing authorization header"} |
| 403 | O token não é de um usuário administrador. | {"error":"admin access required"} |
| 403 | O usuário é administrador, mas não tem o privilégio exigido. | {"error":"insufficient privileges","privilege_required_any":["view_reports"]} |
| 500 | Falha ao consultar o banco. | {"error":"failed to generate sales report","detail":"..."} |
Pedidos por status
/api/v1/admin/reports/ordersAdminQuantidade de pedidos por status
Parâmetros de consulta
fromstringYYYY-MM-DD. Só vale junto com to.tostringYYYY-MM-DD. Se vier só um dos dois, a validação de datas é aplicada e a ausência do outro dá erro 400.Exemplo de requisição
curl "$BASE_URL/api/v1/admin/reports/orders?from=2026-09-01&to=2026-10-11" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"orders_by_status": [
{
"status": "C",
"code": "delivered",
"name": "Entregue",
"type": "complete",
"count": 191
},
{
"status": "O",
"code": "pending",
"name": "Pendente",
"type": "initial",
"count": 39
},
{
"status": "I",
"code": "cancelled",
"name": "Cancelado",
"type": "cancelled",
"count": 4
}
]
}Campos da resposta
orders_by_statusarrayorders_by_status[].statusstringorders_by_status[].codestringpending, delivered...). Vazio para letra sem cadastro.orders_by_status[].namestringorders_by_status[].typestringinitial, processing, general, shipped, complete, cancelled, refunded ou final.orders_by_status[].countintegerErros
| Status | Quando | Exemplo de corpo |
|---|---|---|
| 401 | Token ausente, inválido ou expirado. | {"error":"missing authorization header"} |
| 403 | O token não é de um usuário administrador. | {"error":"admin access required"} |
| 403 | O usuário é administrador, mas não tem o privilégio exigido. | {"error":"insufficient privileges","privilege_required_any":["view_reports"]} |
| 400 | Datas inválidas (mesmas regras de Relatórios por dimensão). | {"error":"from and to query parameters are required (format: 2006-01-02)"} |
| 500 | Falha ao consultar o banco. | {"error":"failed to get orders by status","detail":"..."} |
Produtos mais vendidos
/api/v1/admin/reports/productsAdminProdutos mais vendidos do período
Parâmetros de consulta
fromstringYYYY-MM-DD. Padrão: 30 dias atrás. Não é validado: um texto inválido produz resultado vazio ou erro 500.tostringYYYY-MM-DD. Padrão: hoje (UTC).limitintegerpadrão: 10Exemplo de requisição
curl "$BASE_URL/api/v1/admin/reports/products?limit=5" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"period": {
"from": "2026-09-11",
"to": "2026-10-11"
},
"products": [
{
"product_id": "b02afb3d-4218-40ef-a72f-47beede28d46",
"product_name": "Cafeteira Elétrica Lumina 900W",
"quantity": 9,
"revenue": 2691000
}
]
}Campos da resposta
periodobjectfrom e to usados.productsarrayproduct_id (UUID), product_name, quantity (unidades) e revenue (centavos).Erros
| Status | Quando | Exemplo de corpo |
|---|---|---|
| 401 | Token ausente, inválido ou expirado. | {"error":"missing authorization header"} |
| 403 | O token não é de um usuário administrador. | {"error":"admin access required"} |
| 403 | O usuário é administrador, mas não tem o privilégio exigido. | {"error":"insufficient privileges","privilege_required_any":["view_reports"]} |
| 500 | Falha ao consultar o banco. | {"error":"failed to get top products","detail":"..."} |