The data model
- A workspace holds one or more brands. An API key belongs to one workspace.
- Each brand has prompts: the buyer questions we put to each AI engine, such as “What is the best resume builder for career changers?”
- A run is one prompt sent to one engine. We read the answer and record which brands it named, in what order, with what sentiment, and which sources it cited.
- A cycle is one round of runs. Every number in the API is computed from stored runs, and no API call triggers a new one.
How often data changes
Each brand is tracked on a weekly cycle. Every prompt runs once per engine per cycle. Measurements change when a cycle completes and stay the same in between.
- Cycles are keyed by UTC calendar date. If a brand is run more than once on the same day (with “Run check now”), the API reports that day’s latest score, and Core vs Carousel counts the day once.
- Polling more than once a day gets you nothing new. For most integrations, once a day is plenty.
Time windows per endpoint
| Endpoint | Window |
|---|---|
| visibility | Scores: the latest cycle per engine, plus history in trend. Signals: successful runs in the last 14 days. |
| stability | Every recorded cycle for the brand's active prompts. |
| competitors | Successful runs in the last 14 days. |
| sources | Successful runs in the last 14 days. |
| prompts | Current configuration, not a measurement. |
The 14-day windows are rolling, measured back from the moment of the request.
Engines
Engines appear in responses by slug. Which ones a brand has depends on the workspace’s plan and on which have run so far.
| Slug | Engine | Returns citations | Tracked on |
|---|---|---|---|
chatgpt | ChatGPT | No | Starter, Growth, Agency, Scale, Enterprise |
claude | Claude | No | Free, Starter, Growth, Agency, Scale, Enterprise |
gemini | Gemini | No | Free, Starter, Growth, Agency, Scale, Enterprise |
perplexity | Perplexity | Yes | Starter, Growth, Agency, Scale, Enterprise |
ai_overview | Google AI Overviews | Yes | Starter, Growth, Agency, Scale, Enterprise |
ai_mode | Google AI Mode | Yes | Starter, Growth, Agency, Scale, Enterprise |
deepseek | DeepSeek | No | Agency, Scale (opt-in) |
grok | Grok | No | Agency, Scale (opt-in) |
Only engines that search the web before answering return citations, so only they feed the sources endpoint. The others name brands without links.
Google does not show an AI Overview for every question. When a surface serves no answer, that run is recorded as absent and left out of the score, not counted as a miss. noAnswerRate tells you how often that happened.
Visibility and the drift band
An engine’s score is the percentage of the brand’s prompts in which that engine named the brand in a cycle. AI answers move from week to week even when nothing real has changed, so a single change in score tells you little. Each score therefore comes with a drift band:
- The band is built from the previous 8 scores for that engine: their mean ± 1.5 standard deviations, never narrower than ±3 percentage points, clamped to 0–100.
isSignificantis true when the new score falls outside that band. Build alerts on this, not on raw changes.- Until 4 earlier scores exist, the engine is
isWarmingUp: there is no band (bandLowandbandHighare null) and nothing is flagged.
Core vs Carousel
For each prompt and engine, every name the engine produces is scored by the share of cycles it appeared in:
| Placement | Share of cycles | Meaning |
|---|---|---|
core | 70% or more | A durable position. The engine names it nearly every week. |
emerging | 40% to under 70% | Contested: on its way in, or on its way out. |
carousel | under 40% | Rotation. Named some weeks, which is luck, not position. |
absent | never | Not named for this prompt on this engine. |
The core lists at most 5 names. A placement needs 4 cycles of history before it means anything, and until then isWarmingUp is true.
Share of voice and confidence intervals
Share of voice is estimated from a finite number of answers. Every percentage comes with a 95% Wilson confidence interval (lowPct, highPct). When two intervals overlap, the gap between those names is noise:
tiedWithBrandmarks competitors you are statistically tied with.leaderslists everyone tied for first. Two or more names means there is no real number one.noiseFloorPpis the smallest gap that means anything at the current sample size.
