Engines and routes
The apps and Google's results pages are collected through DataForSEO at the location we set; exact model versions of ChatGPT, Claude, Gemini and Perplexity go through DataForSEO's API routes; Grok, DeepSeek, Llama, Mistral and other models go through OpenRouter with web search on. We never run our own browsers against ChatGPT, Gemini or Google. Each brand chooses its engines and models in Settings, within its plan's engine count and budget.
| Engine | Route | Fan-out searches | Read vs cited | Weight |
|---|---|---|---|---|
| Consumer app (LLM Scraper), web search on | Yes | Both | 0.45 | |
| Google results page, AI Overview item | No | Cited | 0.25 | |
| Google AI Mode results | No | Cited | 0.1 | |
| Consumer app (LLM Scraper) | No | Cited | 0.08 | |
| Sonar via LLM Responses, Live only; any Sonar model | When returned | Cited | 0.08 | |
| Newest Sonnet via LLM Responses, web search on; any Claude model | Yes | Cited | 0.04 | |
| LLM Responses, web search on; any OpenAI model | Yes | Cited | 0 beside the ChatGPT app; 0.04 without it | |
| LLM Responses, Google Search grounding; any Gemini model | When returned | Cited | 0.03 | |
| OpenRouter, web search on; any model of the family | No | Cited | 0.03 | |
| OpenRouter, web search on | No | Cited | 0.02 |
Weights reflect each engine's audience and are renormalised over the engines a brand tracks; a picked model weighs what its family weighs and is its own series. Gemini (API) and the OpenRouter models take no location: they search the web from wherever they run. A route never changes silently: if a route fails, the run is marked failed and retried later on the same route. A route change starts a new series, and charts mark every model change the engines report.
Location
Each project has a market: a country and, for local businesses, a city. Each engine gets the closest location it accepts. ChatGPT accepts a country (DataForSEO lists 191 countries and no cities for it), so its answers are country level. Google's AI Overviews, AI Mode and Gemini get the city centre as coordinates. Claude and ChatGPT (API) get a country code and the city name. Perplexity gets a country code. The question text never carries the location unless a buyer would type it ("best plumber in Cape Town"); every answer records the location it used.
Runs
| Situation | Runs per question per engine |
|---|---|
| Free check | 1 (labelled a snapshot) |
| Baseline, a new project's first run | 5 (2 on Claude and ChatGPT API) |
| Weekly | ChatGPT 3, Gemini 3, AI Overviews 2, AI Mode 2, Perplexity 1; Claude and ChatGPT API once every 8 weeks |
| Daily (Growth, Agency) | 1 on ChatGPT and AI Overviews, for the 10 key questions |
Every run is clean: a fresh context, no conversation history, no memory and no system message beyond what the route requires. We record the temperature and never re-run to get a better answer. AI Overviews run twice a week because two same-day runs of the same question shared only 24% of their cited sources in our tests (9 pairs).
Brand detection
Each brand has a name, aliases, product names and domains. We test, in order, and record which test decided: (1) the domain among the cited or retrieved links; (2) the engine's own brand or local-business cards; (3) an exact or alias match on word boundaries, possessives included; (4) for ambiguous names only (common words such as Sage or Apex, or a name seen only at the start of a sentence), a small model that reads the sentence and says whether it means the company, cached per answer. Rank is the order in which brands are first named. Sentiment (positive, neutral or negative, with a reason of 20 words or fewer) comes from the same small model.
Statistics
- Mention rate = answers naming the brand ÷ answers. Citation rate = answers citing its domain ÷ answers. Share of voice = its mentions ÷ all tracked brands' mentions.
- Every rate shows n and a Wilson score 95% interval.
- A change between periods is tested with a two-proportion z test, or Fisher's exact test when any cell is below 5, and called up or down only at p < 0.05; otherwise "no clear change".
- Searches where an engine shows no AI answer are counted as their own outcome and never dilute the mention rate.
- Brand-direct questions ("what does X charge?") check accuracy against your own site and are reported separately.
Visibility score
For each engine e, the demand-weighted mention rate is re = Σ dq·kq,e ÷ Σ dq·nq,e, where k is answers naming you, n is answers, and dq is the question's demand weight. The score is 100 × Σ we·re ÷ Σ we over the engines measured. Its interval combines each engine's Wilson interval, using Kish's effective sample size for the demand weights.
The demand weight of a question is the monthly search volume of its nearest keyword (DataForSEO Labs), normalised as max(1, 10 × volume ÷ the set's top volume): the most-searched question counts ten times a question nobody searches, and no question counts for less than 1.
Fan-out searches and the gap check
Every fan-out search is stored with its engine, run, question and location, lower-cased and stripped of punctuation, and clustered with a token-set similarity (no embeddings). Clusters are ranked by the share of runs that issued them. For the top clusters we pull Google's organic top 20 (and Bing's top 10 on Growth and Agency) at your market's location, cached per query, location and day, and record your rank, the competitors that rank and the third-party pages that rank. ChatGPT returned fan-out searches in 100% of the 25 answers we have measured.
Sources
Links are normalised (tracking parameters removed, Google grounding redirects resolved) and each domain is classed as your site, a competitor, a review or rating site, a directory, a marketplace, Reddit or a forum, video, Wikipedia, news, government or education, or other. Retrieved and cited are kept apart.
Site checks
Weekly, at no cost: robots.txt rules for twelve AI crawlers; your pages fetched with each search crawler's user agent (indicative, since real crawlers use their own IP addresses); raw HTML compared with a browser render; noindex, canonical, sitemap and status codes; llms.txt and structured data, both reported as optional. When we read your site we identify ourselves as Sightings-SiteReader/1.0 (+https://sightings.io/methodology#crawler) and obey robots.txt.
Limits
- Answers are collected through DataForSEO, a third party; we store every raw response, hashed, so any number can be traced and re-parsed.
- ChatGPT is measured at country level. Copilot and Meta AI are not offered by our providers yet; Grok, DeepSeek and the OpenRouter models answer through their APIs, not their apps.
- Recommendations are evidence-based suggestions, not guarantees. We never promise rankings.
Questions about the method: see about us.