Relatórios de frete
Três relatórios de leitura: pontualidade por transportadora, margem entre frete cobrado e pago, e cobertura da tabela de contingência.
Os relatórios respondem a perguntas de gestão: as transportadoras estão cumprindo o prazo? Estou ganhando ou perdendo dinheiro com o frete? Se a transportadora ficar fora do ar, para quais regiões a loja ainda consegue cotar? Todos aceitam view_shipping ou manage_shipping.
Prazo prometido x realizado
Por transportadora, no período: quantas remessas foram entregues, qual percentual chegou até a data prometida e quanto tempo levou em média do envio à entrega. Só entram remessas que têm data de envio e de entrega.
/api/v1/admin/shipping/sla-reportAdminRelatório de prazo por transportadora
Exige view_shipping ou manage_shipping.
Parâmetros de consulta
fromstringAAAA-MM-DD, contado pela data de entrega. Padrão: 90 dias atrás.tostringAAAA-MM-DD. Padrão: agora.Exemplo de requisição
curl "$BASE_URL/api/v1/admin/shipping/sla-report?from=2026-07-01&to=2026-09-30" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"carriers": [
{
"carrier": "Correios",
"shipments": 120,
"on_time_pct": 91.7,
"avg_transit_days": 3.8
}
]
}Campos da resposta
carriersarrayUma linha por transportadora, da que mais entregou para a que menos. [] quando não há remessas.
carrierstringdesconhecido quando a remessa não informa.shipmentsintegeron_time_pctnumbernull se nenhum pedido tinha data prometida.avg_transit_daysnumberFrete cobrado x pago
Agrupa os pedidos do período por método de envio (padrão) ou por área de tarifa e soma o frete cobrado do cliente e o frete pago à transportadora. Pedidos cancelados, falhos, anulados e com chargeback ficam de fora. Todos os valores são em centavos.
/api/v1/admin/shipping/margin-reportAdminRelatório de margem de frete
Exige view_shipping ou manage_shipping.
Parâmetros de consulta
fromstring2026-01-01 ou 2026-01-01T00:00:00-03:00), pela data de criação do pedido. Omitido = sem limite.tostringgroup_bystringareamethodarea agrupa pela área de tarifa do CEP de entrega (sem área se nenhuma cobrir). Qualquer outro valor agrupa por método de envio.Exemplo de requisição
curl "$BASE_URL/api/v1/admin/shipping/margin-report?group_by=area&from=2026-01-01" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"rows": [
{
"key": "Entrega Expressa",
"orders": 10171,
"charged_cents": 9194030,
"paid_cents": 0,
"margin_cents": 9194030
},
{
"key": "PAC",
"orders": 10276,
"charged_cents": 8869200,
"paid_cents": 0,
"margin_cents": 8869200
}
]
}Campos da resposta
rowsarrayUma linha por grupo, do maior frete cobrado para o menor. [] sem pedidos.
keystringdesconhecido se o pedido não o guardou) ou da área.ordersintegercharged_centsintegerpaid_centsinteger0 quando a loja não tem cotações registradas.margin_centsintegercharged_cents menos paid_cents.Cobertura da contingência
Quando uma transportadora em tempo real não responde, a loja pode cotar com uma tabela de contingência aprendida das cotações anteriores: um preço por área de tarifa e faixa de peso. Este relatório mostra, por área, as faixas já aprendidas. Uma área com bands: [] é uma lacuna: sem a transportadora, não há preço de contingência para ela.
/api/v1/admin/shipping/fallback-coverageAdminCobertura da tabela de contingência
Exige view_shipping ou manage_shipping. Sem parâmetros.
Exemplo de requisição
curl "$BASE_URL/api/v1/admin/shipping/fallback-coverage" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"areas": [
{
"rate_area_id": "32ffd693-895b-47a7-832a-ae6794de249e",
"name": "Centro-Oeste",
"bands": [
{
"weight_from_g": 0,
"weight_to_g": 1000,
"cost_cents": 2490,
"sample_count": 37
}
]
},
{
"rate_area_id": "1cb5ac9d-4ae2-4824-87ee-a26fde7240c8",
"name": "Nordeste",
"bands": []
}
]
}Campos da resposta
areasarrayTodas as áreas de tarifa da loja, por nome.
rate_area_iduuidnamestringbandsarrayFaixas de peso aprendidas. [] quando não há.
weight_from_gintegerweight_to_gintegercost_centsintegersample_countintegerErros
| Status | Quando | Corpo |
|---|---|---|
| 401 | Sem token, token inválido ou expirado | {"error":"invalid or expired token"} |
| 403 | Sem o privilégio exigido | {"error":"insufficient privileges","privilege_required_any":["manage_shipping","view_shipping"]} |
| 500 | from/to em formato que o banco não entende; falha interna | {"error":"failed to build margin report","detail":"o valor \"ontem\" não é um timestamp with time zone válido..."} / {"error":"sla_report_failed","detail":"..."} / {"error":"failed to load coverage","detail":"..."} |