get_ai_visibility_trend
Track how AI model answers moved over a chosen window: see which companies are named more or less often and whether your brand's standing changed.
Instructions
How the AI models' market MOVED over a window: who is recommended more or less often, and whether the customer's standing changed. A move is a change in how the AI models answered, never a fact about a third party's business.
item.companies: the customer (isOwn), every tracked competitor (isTracked) and up to 3 untracked companies, ordered by presence on the latest map (ties stay ties); one with no reading takes no row. now is the latest map and pools its own checksAnalysed checks: never the latest check alone (get_ai_visibility_history limit=1 has that). start is the earliest map in the window. presenceChange is in points of share, rankChange (places, positive = climbed) and scoreChange.
Call presenceChange a rise or a fall ONLY when presenceChangeSeparable is true. Otherwise give both shares and say the ranges overlap.
A reading is presence.answersNaming of presence.answersReceived, never of queries sent, with a 95% range and a zone. Overlapping ranges are not a settled order. Say the zone's condition ('named in under a tenth of answers'), never 'irrelevant' or 'tail'.
start null: 'one reading, no movement to compare', never zero change.
Read enginesBacking before saying a company is named across the market. An EMPTY enginesBacking means no model named it on the latest map.
score is WHERE a brand lands when named (top 5 only), never who is ahead: standing rests on presence. null means not measured, never zero; a measured zero ships as 0. Except rank and rankChange: null on a company no answer named is a measured absence. Say 'not named', never a place or a fall. item.events: standingChanges are the customer's alerts (a standing held two checks): 'your standing moved from X to Y on '. incompleteCycles: report expectedAnswers minus measuredAnswers and absentAnswers apart, never as a fraction. promptsLastChangedAt: the questions changed then, so a move across it is not the market moving. item.window: quote answers and checks, never days.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| dateTo | No | End of the window, ISO-8601 (e.g., 2026-03-15). | |
| detail | No | `series` adds each company's share check by check (at most 12 evenly spaced points). Omit unless the shape between the ends matters: the rows already carry the reading now, the reading at the start, and the difference. A null presence on a series point means the model returned no usable answer in that check's window. | |
| dateFrom | No | Start of the window, ISO-8601 (e.g., 2026-01-01). Omit for the whole history. The window reads at most the newest 200 published checks, readings and events.incompleteCycles alike, so on a long history set dateFrom and dateTo to keep both on one span. | |
| provider | No | Read one AI model's own slice of every map; omit for every model at once. Under one model, rank and score are null on every reading and enginesBacking is left off the rows, because one model's slice cannot answer them; never read that as 'no model named them'. A company with no measured reading for that model in the window is left out, and window.answersReceived is null when that model had no usable answer in the latest window. | |
| projectId | Yes | Project ID (from list_projects) |