# Google AI Overview Tracker | Citations, Brands & Changes (`alexmorain/google-ai-overview-tracker`) Actor

Track which sources, domains and brands Google AI Overviews cite for your queries. Each query is searched several times to measure citation rates instead of trusting one snapshot, with full answers, organic rank and changes since your last run.

- **URL**: https://apify.com/alexmorain/google-ai-overview-tracker.md
- **Developed by:** [Alexis Morain](https://apify.com/alexmorain) (community)
- **Categories:** SEO tools, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $15.00 / 1,000 three-capture checks

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does Google AI Overview Tracker do?

Google AI Overview Tracker checks which websites, domains and brands **Google AI Overviews** cite for your search queries. You give it queries like `best crm for small business`. For each one it returns the full AI Overview answer, every cited source, and a citation rate per domain and per brand, measured over several searches of the same query.

It works as an AI search visibility API for SEO and GEO (generative engine optimization) reporting. Add your own domain and your competitors, schedule it weekly, and each run tells you what changed since the last one.

It does not cover ChatGPT, Perplexity or Gemini. It reads Google Search result pages through Apify's Google SERP proxy. No browser, no account, no login.

### Why use Google AI Overview Tracker?

One capture is not a measurement. Google rotates the sources of an AI Overview from one search to the next. We searched 30 commercial and informational queries three times each, in parallel, on October 18, 2026:

| Run | Queries with an AI Overview | Queries where at least one cited domain was missing from a capture | Domain citations seen in only 1 or 2 captures out of 3 |
|---|---|---|---|
| Run 1 | 26 | 11 (42%) | 52 of 161 (32%) |
| Run 2, 20 minutes later | 28 | 17 (61%) | 75 of 170 (44%) |

A tool that searches once and reports "cited" or "not cited" turns this rotation into fake wins and fake losses. This Actor searches each query 1, 3 or 5 times and gives every source, domain and brand a rate: 0.67 means cited in 2 captures out of 3. In compare mode, a domain counts as gained only when it goes from absent to cited in at least half the captures, and as lost in the reverse case.

The second reason is completeness. Google sends only the first part of the AI Overview in the page itself. The rest of the answer, and the sources it cites, arrive in deferred fragments at the end of the page that a browser injects later. A parser that reads the initial HTML misses them without any error. On 8 recorded pages, the initial HTML held 31 of the 42 cited sources: 11 sources (26%) were only in the deferred part. On `best project management software`, the initial HTML names 3 tools; the full answer names 8, including Jira, Smartsheet, Wrike and Trello, and cites forbes.com. This Actor injects the deferred fragments before reading anything.

What you get on top:

- Tracked domains: citation rate, best position in the source list, and best **organic** position on the same results page. You see at once when you rank second organically but the AI Overview cites someone else.
- Tracked brands: how often each brand name appears in the answer text, cited or not.
- Compare mode: domains gained, domains lost, and old and new rates of your tracked domains and brands since the previous run.
- Any country and language Google serves AI Overviews in, through the `gl` and `hl` settings.
- Scheduling, API access, webhooks and integrations (Make, Zapier, n8n, Google Sheets) from the Apify platform.

### What data can Google AI Overview Tracker extract?

One result per query:

| Field | Type | Description |
|---|---|---|
| `query` | string | The search query |
| `status` | string | `ai-overview`, `no-ai-overview` or `failed` |
| `aiOverviewRate` | number | Share of captures that showed an AI Overview |
| `answerText` | string | Full AI Overview text, deferred part included |
| `citedDomains` | array | Each cited domain with its captures, rate and best position |
| `sources` | array | Each cited page: title, URL when Google shows it, site name, snippet, rate |
| `trackedDomains` | array | Your domains: citation rate, best source position, best organic position |
| `trackedBrands` | array | Your brands: mention rate in the answer text |
| `changes` | object | Compare mode: gained and lost domains, tracked rates before and after |
| `organicResults` | array | Optional: organic results of the first capture |

### How to track Google AI Overview citations

1. Open the Actor and type your search queries, one per line.
2. Set the Google country and language, for example `us` and `en`, or `de` and `de`.
3. Keep 3 captures per query, or pick 1 for a quick snapshot or 5 for the most reliable rates.
4. Add your domain and competitor domains in Domains to track, and brand names in Brands to track.
5. Switch on Compare with previous run if you plan to run it on a schedule.
6. Press Start, then download the results as JSON, CSV or Excel, or read them through the API.

### How much does it cost to track AI Overviews?

You pay per query checked, plus a start fee of $0.001 per run. The price depends on the number of captures, because each capture is a real Google search:

| Captures per query | Free plan | Bronze | Silver | Gold and above |
|---|---|---|---|---|
| 1 (snapshot) | $0.008 | $0.007 | $0.0065 | $0.006 |
| 3 (recommended) | $0.020 | $0.018 | $0.0165 | $0.015 |
| 5 (most reliable) | $0.030 | $0.027 | $0.0255 | $0.024 |

Checking 100 queries with 3 captures costs $2.00 on the Free plan and $1.50 on Gold. Platform usage is included.

A query is charged only when at least one capture worked. Failed captures are retried for free. If some still fail, the query is charged at the level it reached: 3 asked and 2 obtained is charged as 1 capture. A query with no usable page comes back with `status: failed` and is not charged.

### Input

See the Input tab for every option. The only required field is the list of queries, up to 1,000 per run. Country is a two-letter code (`us`, `gb`, `de`, `fr`, `in`), language a Google `hl` code (`en`, `de`, `fr`, `pt-br`).

```json
{
    "queries": ["best crm for small business", "best project management software"],
    "countryCode": "us",
    "languageCode": "en",
    "capturesPerQuery": "3",
    "trackDomains": ["hubspot.com", "zoho.com"],
    "trackBrands": ["HubSpot", "Salesforce"],
    "compareWithPreviousRun": true,
    "historyKey": "crm-weekly"
}
```

### Output

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel. Example, shortened:

```json
{
    "query": "best crm for small business",
    "countryCode": "us",
    "languageCode": "en",
    "checkedAt": "2026-10-18T14:20:11Z",
    "status": "ai-overview",
    "capturesRequested": 3,
    "capturesSucceeded": 3,
    "aiOverviewCaptures": 3,
    "aiOverviewRate": 1.0,
    "answerText": "The best CRM software for a small business depends on your budget, team size, and primary goal: HubSpot CRM: Best for free all-in-one startup tools...",
    "citedDomains": [
        {"domain": "reddit.com", "captures": 3, "rate": 1.0, "bestPosition": 1, "citedInline": true},
        {"domain": "zoho.com", "captures": 2, "rate": 0.67, "bestPosition": 4, "citedInline": true},
        {"domain": "pcmag.com", "captures": 1, "rate": 0.33, "bestPosition": 2, "citedInline": true}
    ],
    "trackedDomains": [
        {"domain": "hubspot.com", "citedCaptures": 0, "citationRate": 0.0, "bestSourcePosition": null, "bestOrganicPosition": 7}
    ],
    "trackedBrands": [
        {"brand": "HubSpot", "mentionedCaptures": 3, "mentionRate": 1.0}
    ],
    "changes": {
        "previousCheckedAt": "2026-10-11T14:18:40Z",
        "gainedDomains": [],
        "lostDomains": [{"domain": "startups.co.uk", "previousRate": 0.67}],
        "trackedDomains": [{"domain": "hubspot.com", "previousRate": 0.0, "rate": 0.0}]
    }
}
```

The dataset has three views: Overview (one line per query), Cited domains (one line per query and domain) and Changes.

### Tips

- Use 3 captures for weekly monitoring. 1 capture is fine to see whether a query shows an AI Overview at all, not to compare runs.
- Give each client or project its own History name, so compare mode keeps their histories apart.
- Match the language to the queries: a French query on `us` and `en` often gets no AI Overview at all.
- A run checks about 15 queries per minute with 3 captures. The default timeout of 2 hours covers about 1,000 queries; raise it for more.

### FAQ, limits and support

#### Does it track ChatGPT, Perplexity or Gemini?

No. Only Google AI Overviews on Google Search. AI Mode (the separate chat tab) is not covered either.

#### Why is the URL of some sources null?

Google shows the exact page URL for most cited sources. For some, mostly YouTube videos listed twice from the same site, it only gives the site, the title and a redirect link. The domain, title and snippet are always there. In the United States, organic result links are redirect links too, so `organicResults` gives the domain and title with a null URL.

#### Why does a query show no AI Overview?

Google decides per query, country and language, and it changes over time. Navigational queries (`facebook login`), weather and many local queries rarely get one. `aiOverviewRate` tells you how often it appeared across the captures.

#### Is it legal?

Our Actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our Actors, when used for ethical purposes by Apify users, are safe. However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

#### Something is wrong or missing?

Open an issue in the Issues tab. Google changes its result pages often, and reports get fixed fast. To call the Actor from your own code, see the API tab.

# Actor input Schema

## `queries` (type: `array`):

What people type in Google, one query per line: <code>best crm for small business</code>, <code>how does a heat pump work</code>. Up to 1,000 per run. Duplicates are removed.

## `countryCode` (type: `string`):

Google country as a two-letter code: <code>us</code>, <code>gb</code>, <code>de</code>, <code>fr</code>, <code>in</code>... AI Overviews are not shown in every country.

## `languageCode` (type: `string`):

Google interface language: <code>en</code>, <code>de</code>, <code>fr</code>, <code>es</code>, <code>pt-br</code>... Match it to the language of your queries.

## `capturesPerQuery` (type: `string`):

How many times each query is searched. Google cites different sources almost every time: in our tests two searches a few minutes apart shared under a quarter of their cited URLs on 4 commercial queries out of 5. With 3 or 5 captures, every source, domain and brand gets a rate (0.67 = cited in 2 captures out of 3) instead of a yes or no.<br><br>Each capture is a real Google search, so the price per query grows with it. If some captures fail after retries, the query is charged at the lower level it reached.

## `trackDomains` (type: `array`):

Your website and your competitors, one per line: <code>hubspot.com</code>. A full URL works too, only the domain is kept, and subdomains count (<code>blog.hubspot.com</code> counts for <code>hubspot.com</code>). Each query gets a citation rate per domain and its best organic position on the same page.

## `trackBrands` (type: `array`):

Brand or product names to look for in the AI Overview text, one per line: <code>HubSpot</code>, <code>monday.com</code>. Whole-word match, case ignored. Each query gets a mention rate per brand.

## `compareWithPreviousRun` (type: `boolean`):

Keep the results of this run and compare the next one with it. Each query then gets a <code>changes</code> object: domains gained (now cited in at least half the captures, never before), domains lost, and the old and new rates of your tracked domains and brands. The first run saves the baseline. Use it with a schedule for weekly monitoring.

## `historyKey` (type: `string`):

Name of the saved history used by <b>Compare with previous run</b>. Leave empty to share one history across your runs (queries are kept apart by country and language). Give each client or project its own name to keep them separate.

## `includeAnswerText` (type: `boolean`):

Add the AI Overview text (the longest of the captures) to each result.

## `includeSources` (type: `boolean`):

Add every cited source with its title, URL when Google shows it, snippet and citation rate. Turn it off to keep only the per-domain summary.

## `includeOrganicResults` (type: `boolean`):

Add the organic results of the first capture (position, domain, title). The organic position of tracked domains is always computed, this only adds the full list.

## `webhookUrl` (type: `string`):

Optional. A URL that receives a short JSON summary when the run ends (Slack, Discord, Make, Zapier, n8n). It is never written to the log or the results.

## Actor input object example

```json
{
  "queries": [
    "best project management software",
    "how does a heat pump work"
  ],
  "countryCode": "us",
  "languageCode": "en",
  "capturesPerQuery": "3",
  "compareWithPreviousRun": false,
  "includeAnswerText": true,
  "includeSources": true,
  "includeOrganicResults": false
}
```

# Actor output Schema

## `results` (type: `string`):

One item per query in the default dataset

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "queries": [
        "best project management software",
        "how does a heat pump work"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("alexmorain/google-ai-overview-tracker").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "queries": [
        "best project management software",
        "how does a heat pump work",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("alexmorain/google-ai-overview-tracker").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "queries": [
    "best project management software",
    "how does a heat pump work"
  ]
}' |
apify call alexmorain/google-ai-overview-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,alexmorain/google-ai-overview-tracker"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/r61aJZPJ9BWnFdqai/builds/fSzaA7ePCqCj5BwRA/openapi.json
