Relatórios
Endereço base: https://api.denaryx.com/admin/2026-10. Exemplos e regras no guia Relatórios. Os erros seguem o formato comum. A especificação inteira: baixar o OpenAPI.
GET /reports/sales
As vendas do período
Escopo read_reports
As vendas somadas no período, e por dia, produto ou coleção, sem nenhum dado de quem comprou. Venda é o pedido pago e não cancelado, pela data do pagamento em Brasília (America/Sao_Paulo), como nos relatórios do painel. revenue é o valor dos produtos com os descontos e sem o frete, o mesmo da compra que a loja manda à Meta, ao TikTok e ao GA4; por produto e por coleção, é o dos itens, antes do cupom e do desconto no Pix. A coleção soma os produtos dela e das coleções de baixo. Por dia, o período vai até 92 dias; por produto ou coleção, até 366.
Parâmetros
| Nome | Onde | Tipo | Descrição |
|---|---|---|---|
from | consulta | string | O primeiro dia (AAAA-MM-DD), em Brasília. Junto com to; sem os dois, os últimos 30 dias, até hoje. |
to | consulta | string | O último dia (AAAA-MM-DD), inclusive. |
group_by | consulta | string | day: uma linha por dia, com os dias sem venda; product ou collection: as que mais venderam em receita.Um de: day, product, collection. |
limit | consulta | integer | Por produto ou coleção, quantas linhas, de 1 a 100 (50 sem ele). truncated diz se há mais. |
Resposta
200 Sucesso. (SalesReport)
Os campos da resposta (14)
| Campo | Tipo | Descrição |
|---|---|---|
from | string | |
to | string | |
group_by | string | Um de: day, product, collection. |
timezone | "America/Sao_Paulo" | |
currency | "BRL" | |
totals | objeto | |
totals.orders | integer | Os pedidos pagos.A partir de 0. |
totals.items | integer | As unidades vendidas.A partir de 0. |
totals.revenue | integer | A receita, em centavos: o valor dos produtos com os descontos e sem o frete, o mesmo valor da compra mandado à Meta, ao TikTok e ao GA4.A partir de 0. |
totals.average_order_value | integer ou null | O ticket médio, em centavos: revenue dividido por orders, arredondado. Null sem pedidos: não há ticket médio, e o 0 entraria numa média como se fosse um valor.A partir de 0. |
totals.discount | integer | Os descontos do pedido, em centavos: o do cupom e o do Pix somados.A partir de 0. |
totals.shipping | integer | O frete cobrado, em centavos.A partir de 0. |
rows | lista de objeto | |
truncated | boolean | Há mais produtos ou coleções do que o limit. |
Erros
400A chamada veio com campos inválidos; os campos recusados vão em fields (invalid_request).401O token falta, não existe, foi revogado ou venceu (authentication_error).403O token não tem o escopo da rota, ou, com write_content, mandou campos que pedem write_products, listados em fields (permission_error).429Chamadas demais: espere o Retry-After (rate_limited).500Erro do nosso lado (api_error).503A API está ocupada com outras chamadas: espere o Retry-After (api_error).
GET /reports/searches
As buscas da vitrine no período
Escopo read_products ou read_content
Os termos que os compradores buscaram na vitrine, somados no período: os que mais voltaram sem nenhum produto (no_results), os mais buscados (top) e os que acharam produtos sem clique (no_clicks). Serve para criar páginas, categorias ou sinônimos para o que ninguém acha. Só termos e contagens: nada de quem buscou, e o termo que parecia dado pessoal (e-mail, CPF, telefone, cartão) não é guardado. Conta uma busca por página de resultados (a primeira, sem filtro e na ordem padrão); as sugestões enquanto o comprador digita, os robôs e a prévia do tema não contam. Os dias são os de Brasília (America/Sao_Paulo); o período vai até 366 dias, e as buscas ficam 13 meses.
Parâmetros
| Nome | Onde | Tipo | Descrição |
|---|---|---|---|
from | consulta | string | O primeiro dia (AAAA-MM-DD), em Brasília. Junto com to; sem os dois, os últimos 30 dias, até hoje. |
to | consulta | string | O último dia (AAAA-MM-DD), inclusive. |
limit | consulta | integer | Quantos termos em cada lista, de 1 a 100 (50 sem ele). |
Resposta
200 Sucesso. (SearchReport)
Os campos da resposta (34)
| Campo | Tipo | Descrição |
|---|---|---|
from | string | |
to | string | |
timezone | "America/Sao_Paulo" | |
totals | objeto | |
totals.searches | integer | A partir de 0. |
totals.no_results | integer | A partir de 0. |
totals.no_results_rate | number ou null | no_results dividido por searches, de 0 a 1. Null sem buscas. |
totals.searches_with_click | integer | A partir de 0. |
totals.clicks | integer | A partir de 0. |
totals.discarded | integer | As buscas cujo termo parecia dado pessoal: contadas aqui, sem o texto, e fora das outras contagens.A partir de 0. |
no_results | lista de objeto | Os termos que mais voltaram sem nenhum produto. |
no_results[].term | string | O termo normalizado: minúsculas, sem acento, só letras e números. "Camisetas Azúis" vira "camisetas azuis". |
no_results[].searches | integer | As buscas pelo termo no período.A partir de 0. |
no_results[].no_results | integer | Das buscas, quantas não acharam nenhum produto.A partir de 0. |
no_results[].results | integer | Quantos produtos a última busca pelo termo achou.A partir de 0. |
no_results[].searches_with_click | integer | Das buscas, quantas tiveram um clique num produto do resultado.A partir de 0. |
no_results[].clicks | integer | Os cliques em produtos do resultado (o mesmo produto na mesma busca conta uma vez).A partir de 0. |
no_results[].average_click_position | number ou null | A posição média dos produtos clicados, a partir de 1. Null sem clique. |
top | lista de objeto | Os termos mais buscados. |
top[].term | string | O termo normalizado: minúsculas, sem acento, só letras e números. "Camisetas Azúis" vira "camisetas azuis". |
top[].searches | integer | As buscas pelo termo no período.A partir de 0. |
top[].no_results | integer | Das buscas, quantas não acharam nenhum produto.A partir de 0. |
top[].results | integer | Quantos produtos a última busca pelo termo achou.A partir de 0. |
top[].searches_with_click | integer | Das buscas, quantas tiveram um clique num produto do resultado.A partir de 0. |
top[].clicks | integer | Os cliques em produtos do resultado (o mesmo produto na mesma busca conta uma vez).A partir de 0. |
top[].average_click_position | number ou null | A posição média dos produtos clicados, a partir de 1. Null sem clique. |
no_clicks | lista de objeto | Os termos mais buscados que acharam produtos e não tiveram clique: o resultado não convenceu. |
no_clicks[].term | string | O termo normalizado: minúsculas, sem acento, só letras e números. "Camisetas Azúis" vira "camisetas azuis". |
no_clicks[].searches | integer | As buscas pelo termo no período.A partir de 0. |
no_clicks[].no_results | integer | Das buscas, quantas não acharam nenhum produto.A partir de 0. |
no_clicks[].results | integer | Quantos produtos a última busca pelo termo achou.A partir de 0. |
no_clicks[].searches_with_click | integer | Das buscas, quantas tiveram um clique num produto do resultado.A partir de 0. |
no_clicks[].clicks | integer | Os cliques em produtos do resultado (o mesmo produto na mesma busca conta uma vez).A partir de 0. |
no_clicks[].average_click_position | number ou null | A posição média dos produtos clicados, a partir de 1. Null sem clique. |
Erros
400A chamada veio com campos inválidos; os campos recusados vão em fields (invalid_request).401O token falta, não existe, foi revogado ou venceu (authentication_error).403O token não tem o escopo da rota, ou, com write_content, mandou campos que pedem write_products, listados em fields (permission_error).429Chamadas demais: espere o Retry-After (rate_limited).500Erro do nosso lado (api_error).503A API está ocupada com outras chamadas: espere o Retry-After (api_error).