Documentação

Um contrato de request, toda família de relatório.

Todo relatório é um POST com a mesma forma: janela de datas, filters pré-agregação, having pós-agregação — e uma resposta que carrega os componentes ao lado de cada razão.

Todos os paths têm escopo de um projeto — /projects/{project_id}/… — autenticados por chave e atrás da flag reporting_api. Datas são ISO (YYYY-MM-DD); o grão da janela é day, week ou month.

O request

POST https://app.bementioned.ai/api/v1/projects/{project_id}/reports/brands

{
  "window": { "start": "2026-07-01", "end": "2026-07-31", "grain": "day" },
  "filters": [
    { "field": "country_code", "op": "in", "values": ["US"] }
  ],
  "having": [
    { "measure": "visibility", "op": "gte", "value": 0.25 }
  ],
  "order_by": "share_of_voice",
  "limit": 100,
  "offset": 0
}

filters[] é um WHERE pré-agregação: molda quais respostas são contadas antes de qualquer soma. Campos e operadores são conjuntos fechados:

model_channel_id · country_code · topic_id · prompt_id · tag_id · in · not_in · gt · gte · lt · lte

having[] é um HAVING pós-agregação sobre as medidas computadas — o mesmo conjunto fechado que order_by aceita:

visibility · share_of_voice · avg_position · sentiment · mention_count · responses_with_brand

Um campo está deliberadamente ausente: não existe filtro de marca. A marca reportada é escolhida depois da agregação, então o Share of Voice nunca pode ler 1.0 sob um filtro de marca — o número fica honesto por construção.

A resposta

Cada razão vem com seus componentes aditivos — mention_count, responses_with_brand e o response_count da janela — para você re-agregar corretamente: some os componentes, divida uma vez. Deltas comparam com a janela anterior de mesmo tamanho.

{
  "start": "2026-07-01",
  "end": "2026-07-31",
  "response_count": 372,
  "all_brand_mention_count": 941,
  "gated_columns": [],
  "brands": [
    {
      "brand_id": 7, "name": "Your Brand", "role": "you",
      "visibility": 0.42, "share_of_voice": 0.19,
      "avg_position": 2.4, "sentiment": 0.61,
      "mention_count": 158, "responses_with_brand": 156,
      "delta": { "visibility": 0.03, "share_of_voice": -0.01,
                 "avg_position": 0.2, "sentiment": 0.0 }
    }
  ]
}

Em planos sem uma coluna premium o valor volta null e o id da coluna aparece em gated_columns — a forma da resposta nunca muda com o plano.

Famílias de relatório

Os bodies variam só onde o recurso exige: os relatórios de fontes acrescentam um grão e um bloco gap opcional; o feed de respostas acrescenta filtros de exibição. Todo o resto é o contrato acima.

EndpointO que retorna
POST /reports/brandsA tabela de marcas: Visibilidade, Share of Voice, posição e sentimento por marca, com deltas da janela anterior.
POST /reports/timeseriesSéries diárias, semanais ou mensais das métricas de marca, mais a série de citações do próprio domínio.
POST /reports/matrixO pivot de visibilidade marca × motor, cada motor com o próprio denominador.
POST /reports/rankingsA grade motor × posição na resposta: qual marca mais ocupou cada slot.
POST /reports/promptsMétricas por prompt para cada prompt acompanhado, com uma faixa de resumo.
POST /reports/pairedOs dois lados de uma comparação de duas janelas, para slope charts.
POST /reports/rank-weeklyO rank ordinal de cada marca, por semana ISO.
POST /reports/slot-distributionQuantas vezes cada marca ocupou cada slot — a distribuição que uma posição média esconde.
POST /reports/engine-compositionShare of Voice por marca dentro de cada motor, denominadores por motor.
POST /reports/coverage · /reports/coverage-disclosureO que foi coletado — contagens de resposta por status e motor — e quanto do mercado o conjunto acompanhado cobre.
POST /reports/absentOs prompts que rodaram e nunca nomearam a sua marca.
POST /reports/prompt-leaders · /prompt-brands · /prompt-seriesQuem lidera cada prompt e por quanto, a participação de cada marca por prompt e a sua própria tendência semanal por prompt.
POST /reports/chatsO feed paginado de respostas coletadas.
GET /reports/chats/{chat_id}Uma resposta, decomposta: mensagens, features, fan-outs, fontes e menções.
POST /reports/domains · /reports/urlsAnalytics de fontes no grão de domínio, host ou URL; acrescente o bloco gap para a variante de gap.
POST /reports/source-brands · /reports/gap-fieldQuais marcas as respostas que citam cada fonte nomearam, e o gap score decomposto nas suas duas contagens.
POST /reports/fanouts · /rollups · /coverage · /treeAs buscas que os motores rodaram por baixo das respostas: a tabela, os rollups de KPI, a cobertura e a árvore de um prompt.
GET /overview · /channels/freshness · /reports/brand-perception · /reports/sources/{url_id}A faixa de overview, os marcos de frescor por motor, os temas de percepção mais recentes e o conteúdo rastreado de uma fonte.

Export CSV

Cinco relatórios também exportam como CSV — endpoints GET cujos parâmetros de query espelham os bodies dos POSTs, atrás da flag csv_export, honrando os mesmos filtros e ordenação.

EndpointO que retorna
GET /reports/brands/exportA tabela de marcas.
GET /reports/prompts/exportA tabela por prompt.
GET /reports/domains/exportO relatório de domínios — ou a lista de gap, quando os parâmetros de gap estão presentes.
GET /reports/urls/exportO relatório de URLs, com a mesma variante de gap.
GET /reports/fanouts/exportFan-out queries, marcas nas buscas ou frases comuns — uma superfície por requisição.