Two pipes: records out, logs in.
A BI feed that hands your warehouse additive records, and a webhook that receives your CDN’s crawler logs.
BI connector
POST /bi/records returns flat records for a date range from one of two tables — mentions or sources — grouped by the dimensions you pass. Gated by the bi_connector flag.
POST https://app.bementioned.ai/api/v1/projects/{project_id}/bi/records
{
"start_date": "2026-07-01",
"end_date": "2026-07-31",
"table": "mentions",
"dimensions": ["week", "brand_id", "model_channel_id"],
"limit": 10000,
"offset": 0
}
Dimensions are a closed set, with at most one time grain per request:
date · week · month · model_channel_id · country_code · prompt_id · topic_id · tag_id · brand_id · domain · url · source_type
Rows carry only additive components — counts, and sums beside their counts — and no ratios, on purpose: sum the components in your BI tool and divide once, and the aggregate is exact at any grouping.
One warning worth reading twice: scope_response_count is the row’s denominator and repeats identically across sibling rows of one scope — never SUM it across brands, domains or URLs. And source_type is always split and echoed on every row: api and web_scrape are never blended.
Ingest webhook — agent analytics
Push your CDN or server access logs and the product turns them into agent-analytics visits: which AI crawlers read which pages. The token is minted when you create an ingest source in the app — prefixed bmi_, shown once, rotatable.
curl -X POST https://app.bementioned.ai/api/v1/ingest/agent-logs \
-H "X-Ingest-Token: bmi_your_token_here" \
--data-binary @access-log-batch.csv
The endpoint stores the payload verbatim and answers 202 with a receipt — lines kept, and lines dropped by reason:
{
"batch_id": 118,
"line_count": 5000,
"kept_count": 4816,
"dropped": { "no_ua_match": 121, "ip_spoof": 12, "malformed": 51 }
}
Limits: 25 MiB per batch, 600 batches per minute per source, and a strict bad-credential bucket. 401 for a missing or revoked token, 403 for a paused source, 413 over the size cap, 429 with Retry-After.
This surface carries no plan flag and no serving rate-limit tie-in: capture never stops for a plan reason. Lines are parsed by the source’s declared format; unverifiable bot claims are dropped and accounted for in the receipt.