# Google AI Overview Tracker: Citations, Rank & Changes (`foxlabs/google-ai-overview-scraper`) Actor

Track if Google's AI Overview cites your domain or your competitors for your keywords, by country and language: the full answer, every source with its full URL, citation rank, and the citations gained or lost since your last run. Batch keywords, no Google account.

- **URL**: https://apify.com/foxlabs/google-ai-overview-scraper.md
- **Developed by:** [Berkan Kaplan](https://apify.com/foxlabs) (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 $8.00 / 1,000 keyword checkeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Google AI Overview Tracker: Citations, Rank & Changes

Track **Google's AI Overview** for your keywords: whether it appears, the **full answer**, **every cited source with its full URL** (where Google links a page), whether it cites **your domain** or **your competitors** and at which **citation rank**, and **what changed since your last run** (citations gained and lost, "cited in 3 of the last 5 runs").

Built for SEO and GEO agencies, in-house SEO and content teams, and tools that report AI search visibility. One row per keyword, 50 countries and 26 interface languages, batch keyword lists. No Google account, no API key, no browser: searches go through Apify's Google SERP proxy.

### Quick start (API)

```bash
curl -X POST "https://api.apify.com/v2/acts/foxlabs~google-ai-overview-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"keywords": ["how to do keyword research", "best seo tools for small business"], "targetDomains": ["semrush.com"], "competitorDomains": ["ahrefs.com", "moz.com"], "country": "us", "trackingId": "seo-tools-us"}'
```

Run the same input again later (daily or weekly, for example with an Apify schedule) and every checked keyword tells you what changed since the previous run.

### What you get

One row per keyword:

| Group | Fields |
|---|---|
| Keyword & market | `keyword`, `keywordIndex` (0-based position in your list after duplicates are removed), `country`, `language`, `checkedAt`, `searchUrl` |
| AI Overview | `overviewState` (`present`, `present_no_sources`, `absent`), `overviewNote`, `answerText`, `answerMarkdown` (headings and bullets kept), `answerHash`, `answerChars` |
| Your domain | `targetState` (`cited`, `competitor_cited`, `not_cited`, `no_overview`, `overview_no_sources`), `targetRank`, `targetPanelRank`, `targetNamedInText`, `targetCitedUrls` |
| Competitors | `competitorsCited`, `competitors[]` (per domain: `cited`, `citedUrls`, `rank`, `panelRank`, `namedInText`) |
| Sources | `sourcesCount`, `sourceDomains`, `sources[]` (per source: `rank`, `panelRank`, `namedInText`, `title`, `siteName`, `channel` (video channel), `domain`, `url`, `urlSource` (`page` = link was on the page, `goto` / `url-redirect` = resolved from a Google redirect, empty = not resolved), `origin` (the site's home address), `snippet`, `type` (`page`, `video`, `product` = a Google Shopping product card, which has no page URL, `item` = an entry of a list in the answer, linked to its source page), `isVideo`, `matches` = `target` / `competitor`) |
| Changes vs last run | `changeStatus` (`baseline`, `unchanged`, `changed`; `not_tracked` when `trackChanges` is off, `not_checked` on failed rows), `targetChange` (`gained`, `lost`, `still_cited`, `still_not_cited`), `targetCitedInLastRuns` ("3/5"), `gainedDomainsText`, `lostDomainsText`, `changes` (gained and lost domains and URLs, `answerChanged`, `overviewChange`, `previousCheckedAt`), `trackingId` |
| Status | `checkStatus` (`ok` or `failed`), `error` |

`...Text` fields repeat a list as one comma-separated cell for CSV and Excel.

#### Sample output

A real row from a test run on 2026-09-30 (`how to stop snoring`, US, target `mayoclinic.org`, competitors `clevelandclinic.org` and `webmd.com`, second run of the same tracking ID; trimmed: 3 of 10 sources shown, some source fields left out, answer shortened):

```json
{
  "keyword": "how to stop snoring",
  "country": "us",
  "language": "en",
  "checkStatus": "ok",
  "overviewState": "present",
  "targetDomains": ["mayoclinic.org"],
  "targetState": "cited",
  "targetRank": 7,
  "targetPanelRank": 1,
  "targetNamedInText": true,
  "targetCitedUrls": ["https://www.mayoclinic.org/diseases-conditions/snoring/diagnosis-treatment/drc-20377701"],
  "competitorsCited": ["clevelandclinic.org", "webmd.com"],
  "competitors": [
    { "domain": "clevelandclinic.org", "cited": true, "citedUrls": ["https://my.clevelandclinic.org/health/diseases/15580-snoring"], "rank": 1, "panelRank": 3, "namedInText": true },
    { "domain": "webmd.com", "cited": true, "citedUrls": ["https://www.webmd.com/sleep-disorders/understanding-snoring-prevention"], "rank": 4, "panelRank": 6, "namedInText": false }
  ],
  "sourcesCount": 10,
  "sourceDomainsText": "mayoclinic.org, sleepbetterillinois.com, my.clevelandclinic.org, es.cvs.com, stanfordhealthcare.org, webmd.com, youtube.com, gpdentalteam.com",
  "sources": [
    { "rank": 7, "panelRank": 1, "namedInText": true, "title": "Snoring - Diagnosis and treatment - Mayo Clinic", "siteName": "Mayo Clinic", "domain": "mayoclinic.org", "url": "https://www.mayoclinic.org/diseases-conditions/snoring/diagnosis-treatment/drc-20377701", "urlSource": "page", "type": "page", "isVideo": false, "matches": "target" },
    { "rank": 4, "panelRank": 6, "namedInText": false, "title": "How To Prevent Snoring While You Sleep", "siteName": "WebMD", "domain": "webmd.com", "url": "https://www.webmd.com/sleep-disorders/understanding-snoring-prevention", "urlSource": "goto", "type": "page", "isVideo": false, "matches": "competitor" },
    { "rank": 3, "panelRank": 10, "namedInText": false, "title": "Silence the Roar: 10 Game-Changing Tips to Tackle Snoring", "siteName": "YouTube", "channel": "Medical Centric Podcast", "domain": "youtube.com", "url": "https://www.youtube.com/watch?v=IU4TNTyJ6lo&t=14", "urlSource": "page", "type": "video", "isVideo": true, "matches": null }
  ],
  "answerText": "To stop snoring, change your sleep position, avoid alcohol before bed, and treat nasal congestion.\nSleep Adjustments\n- Sleep on your side instead of your back to keep your airway open.\n…",
  "answerHash": "0fa06f8b405a8a76",
  "changeStatus": "unchanged",
  "targetChange": "still_cited",
  "targetCitedInLastRuns": "2/2",
  "trackingId": "qa-verify-014",
  "checkedAt": "2026-09-30T21:49:58.748Z"
}
```

### How it works

1. **One Google search per keyword** through Apify's Google SERP proxy, from the country you choose (`gl` and `hl` set to your country and language). Five keywords run in parallel.
2. **The AI Overview is read in full.** Google puts a large part of the answer at the end of the page and moves it into place with JavaScript. On 58 of 58 pages saved from our platform test runs, 14–79% of the answer text sat there (median 53%). The Actor reads those parts too; a parser that skips them loses about half of the answer.
3. **Sources** are the cards of the AI Overview's source panel, with title, site name, domain and snippet. Google links most of them through redirect tokens (`/goto?url=…`). With `resolveSourceUrls` on, each token is turned into the real page URL with one short request through a residential proxy. The source page itself is never visited. When Google lists the same URL twice (a video in the video group and again among the web results), it becomes one source once the URL is known; a video can still appear twice when one card links a moment of it (`&t=…`) and the other the whole video. Google Shopping product cards are sources too (`type: "product"`, domain `google.com`) but link to no page, so they have no URL.
4. **Your domain and competitors** match by domain, subdomains included: `semrush.com` matches `www.semrush.com` and `blog.semrush.com`.
5. **Change tracking** keeps the last checks of every keyword in your own Apify account and compares each check with the previous one (see [Change tracking](#change-tracking)).
6. **Nothing is dropped silently.** A keyword with no AI Overview comes back as `overviewState: "absent"` with a note. Sometimes Google is still generating the AI Overview when the page is served and loads it later; such a keyword is fetched again right away and, if needed, once more at the end of the run (at least a minute later). A keyword that still could not be checked (the search failed, Google answered with a page that cannot be read, or the answer was still being generated) comes back as `checkStatus: "failed"` with the reason, and is not billed. In our 250-keyword test this was 6% of the keywords (see [Performance](#performance--coverage)). If the run gets close to its timeout, it stops starting new keywords so that there is time to save the results, the change history and the report. If your maximum charge per run is reached, Apify ends the run right away: the keywords delivered until then are kept and billed, but that run's change history and run report are not saved. The run report (`SOURCE_REPORT` in the run's key-value store) lists every keyword's status, duplicates skipped and request counts.

### Citation rank: `rank`, `panelRank`, `namedInText`

- **`rank`**: the order in which the answer text first cites a source (1 = first cited). Google shows citations as chips after the sentences they support ("Mailchimp +3"); the chip names one source and hides the others behind "+N". Both count, in the order they appear. `null` means the source is listed in the source panel but no sentence cites it: in our 250-keyword test that was 7% of the sources, mostly videos at the end of the panel, and on 58 saved pages none of the 79 such sources appeared in any citation of the answer. Some answers have no citations at all; then every `rank` is `null`.
- **`panelRank`**: the source's position in the source panel as Google served it for this check (counted after a URL listed twice is merged).
- **`namedInText`**: `true` when the source is the one a chip shows by name; `false` otherwise (only among the "+N" sources, or not cited).

Why two ranks: when we fetched the same AI Overview with two different browser identities, the answer and the 7 sources were identical, but the panel order changed (5 of 7 sources moved). The text order stayed the same. `rank` follows the answer; `panelRank` follows the page layout. Ranks compare only within the same answer (`answerHash`): when Google rewrites the answer, the order starts over.

### Change tracking

- The history lives in the key-value store **`google-ai-overview-tracker`** of your Apify account, one record per **`trackingId`** (record key `tracking-<trackingId>`). Named key-value stores are kept until you delete them. Delete the record to start over.
- Leave `trackingId` empty and the Actor derives one from the keyword list, country and language (shown in every row and in the run report). Adding or removing a keyword then starts a new history, so **set your own `trackingId`** (for example `acme-us`) for long-term tracking. Keywords are stored per country and language, so one ID can hold several markets.
- The first run of a keyword returns `changeStatus: "baseline"` with a note that there is no previous run yet.
- Later runs return `unchanged` or `changed` with the domains and URLs gained and lost, `answerChanged`, `overviewChange` (`appeared` / `disappeared`), `targetChange`, and `targetCitedInLastRuns` over the last `historyDepth` checks (default 10).
- **One check is one sample.** When we ran the same 39 keywords twice, 16 to 28 minutes apart (US, Turkey, Germany), 8 answers had been rewritten and 1 AI Overview had disappeared. Watch `targetCitedInLastRuns` rather than a single change.
- A source whose URL could not be resolved in one of the two runs is not reported as a gained or lost URL.

### Input

| Field | Default | Description |
|---|---|---|
| `keywords` | — | One search per line. Duplicates (case and spacing ignored) are skipped and listed in the run report. |
| `targetDomains` | — | Your site(s). Leave empty to only collect AI Overviews. |
| `competitorDomains` | — | Competitors to check on the same keywords. |
| `country` | `us` | Which country's Google to search (50 countries in the list). |
| `language` | country's main language | Google's interface language. |
| `trackChanges` | `true` | Compare with the previous run of the same tracking ID. |
| `trackingId` | derived | History name, for example a client or project. |
| `historyDepth` | `10` | Checks kept per keyword (2–30). |
| `resolveSourceUrls` | `true` | Resolve Google's redirect tokens to full source URLs. |
| `maxKeywords` | `100` | Upper limit of keywords per run. |

### Example inputs (copy & paste)

Weekly client report, US:

```json
{ "keywords": ["best crm for small business", "crm pricing comparison", "how to choose a crm"], "targetDomains": ["hubspot.com"], "competitorDomains": ["salesforce.com", "zoho.com", "pipedrive.com"], "country": "us", "trackingId": "crm-client-us" }
```

A Turkish market (one run per country; the same `trackingId` can hold both):

```json
{ "keywords": ["diş eti çekilmesi neden olur", "implant tedavisi ne kadar sürer"], "country": "tr", "targetDomains": ["medipol.com.tr"], "competitorDomains": ["memorial.com.tr", "acibadem.com.tr"], "trackingId": "dental-tr" }
```

One-off look at who Google cites, no history:

```json
{ "keywords": ["what is generative engine optimization"], "trackChanges": false }
```

### Use cases

- **AI Overview visibility reports**: per keyword, are you cited, where, with which page, and which competitors are cited instead.
- **Content gaps**: `competitor_cited` rows are the keywords where Google answers with someone else's page.
- **Change alerts**: filter `targetChange = "lost"` or `changeStatus = "changed"` after each scheduled run.
- **Source research**: which domains and pages Google trusts for a topic, in each country and language.

### Performance & coverage

Measured on the Apify platform on 2026-09-30, mainly in one run of 250 US keywords (questions about health, money, home, tech, travel, cooking, business, careers, products and science, plus 5 brand names such as "gmail"):

- **AI Overview found:** 231 of the 235 keywords that could be read had an AI Overview (1 of them without sources); 4 had none, 2 of them brand names. Brand searches are mixed: of 16 checks across our tests ("facebook login", "amazon", "gmail", "youtube" …), 7 had an AI Overview, 3 were still being generated and 6 had none (all 5 checks of "youtube").
- **Still being generated:** 25 of 250 keywords came back with an AI Overview Google was still generating. 10 were read when fetched again (6 right away, 4 at the end of the run); **15 (6%) stayed unreadable** and came back as `failed`, not billed. Run those keywords again later.
- **Speed:** the 250 keywords took 24 minutes (5 in parallel; one Google search took 7 s at the median). Runs of 10 to 20 keywords took 54 to 140 seconds.
- **Full source URLs:** 1,979 of the 1,984 sources that link to a page (99.7%); the other 32 sources were Google Shopping products, which have no page URL.
- **Source details:** title, domain and snippet for 2,016 of 2,016 sources.
- **Citation rank (`rank`):** 93% of the sources were cited in the answer text; the others are listed only in the source panel.
- The source counts of this run were taken before sources listed twice under the same URL were merged (25 such repeats).
- **Answer text:** in a sample of 29 answers, all 337 sentences were found in the page Google served (9 of them are table rows, whose cells were found one by one).
- **Countries tested:** United States, United Kingdom, India, Japan, Brazil, France, Spain, Germany and Turkey, each with an AI Overview. Google shows AI Overviews only in some countries and languages; elsewhere the result is `absent`.

### Pricing

Pay per event. **Each keyword checked with a definitive result (AI Overview present, present without sources, or no AI Overview) is one `keyword-checked` event**; "no AI Overview" is tracking data too. Keywords that could not be checked (`checkStatus: "failed"`), duplicates and the run report are free, and full source URLs and change tracking are included. The price per event is on the Actor's Pricing tab. When your maximum charge per run is reached, Apify ends the run: the keywords delivered until then are billed and nothing more is charged (in our test with room for 2 keywords, 2 were delivered and 2 billed). That run's change history and run report are not saved, so set the maximum charge above what the keyword list needs.

### FAQ

**Does it work in my country?** Any country in the list can be selected. We have tested the United States, the United Kingdom, India, Japan, Brazil, France, Spain, Germany and Turkey. If Google does not show AI Overviews in a market, the keywords come back as `absent`.

**Why does the AI Overview in my browser look different?** Google rewrites AI Overviews often (see [Change tracking](#change-tracking)). This Actor searches without a Google account from an IP in the chosen country; your browser may be signed in or in another location.

**Why is `rank` null for a source?** The source is in the source panel, but no sentence of the answer cites it.

**How do I keep my history when I edit the keyword list?** Set `trackingId` yourself.

**Does it report organic rankings?** No. We measured it: when the same query was fetched twice, the page-1 organic list changed almost completely in 9 of 15 cases (0 or 1 of 8 results in common), and in 8 of those 9 the AI Overview was identical. A single check's organic position is not a reliable ranking, so this Actor reports the AI Overview only. Use a rank tracker for organic rankings.

**Does it cover Google AI Mode?** No. AI Mode needs a real browser and fails often on proxy IPs; in our tests it cost several times the market price per answer, so it is not offered.

### Troubleshooting

- `checkStatus: "failed"` with "The Google search failed": a network, proxy or Google error (timeouts, network errors, rate limits and server errors are retried once). Run the keyword again.
- `checkStatus: "failed"` with "Google was still generating this AI Overview": Google builds some AI Overviews after the page is served, and this Actor reads the page as served. In our 250-keyword test 6% of the keywords stayed in this state through the run, even when they were fetched again up to 20 minutes later; these rows are not billed. Run them again later.
- `overviewState: "absent"` with a note about an empty placeholder: the page had a slot for content Google loads after the page, but no AI Overview heading. We saw this for "youtube".
- A run with a long keyword list ends before the last keywords: it stopped near its timeout to save the results and the history (the log and `SOURCE_REPORT` say how many were not checked). Raise the timeout or split the list.
- Every row `absent`: Google may not show AI Overviews in that country or language, or for those keywords.
- `changeStatus` is always `baseline`: the tracking ID changed between runs (the keyword list changed and no `trackingId` was set), or the history store was deleted.

### Notes, limits & legal

- The Actor reads Google's public search results page. It does not log in and does not visit the cited pages.
- AI Overviews change often; one check is one sample.
- Google Shopping product cards have no page URL; list entries in the answer have no site name (`siteName` is empty), only their domain.
- A Standby (real-time API) mode is built into the code (`GET /check`) and described in the OpenAPI file; this listing runs in batch mode.
- You are responsible for how you use the data, in line with the terms of the sites involved and applicable law.

### Support

Open an issue on the Issues tab with the run ID and the input, or write to info@foxlabs.com.tr.

### Changelog

See [CHANGELOG.md](./CHANGELOG.md).

# Changelog

This Actor's version history is a separate document: https://apify.com/foxlabs/google-ai-overview-scraper/changelog.md

# Actor input Schema

## `keywords` (type: `array`):

One search per line, as people type it into Google ("what is generative engine optimization", "best crm for small business"). Each keyword is one Google search and one result row. Duplicates are skipped.

## `targetDomains` (type: `array`):

The site(s) you want to see cited, one per line ("example.com"). Subdomains and every page count (blog.example.com, example.com/guide). Each row says whether the AI Overview cites you, at which rank and which of your pages. Leave empty to only collect the AI Overviews.

## `competitorDomains` (type: `array`):

Competitors to check on the same keywords, one per line. Each row lists which of them the AI Overview cites, with rank and cited pages.

## `country` (type: `string`):

Which country's Google to search: the search runs from an IP in that country. Google shows AI Overviews only in some countries and languages; elsewhere the result is overviewState "absent".

## `language` (type: `string`):

Google's interface language for the search. Leave empty to use the country's main language (English for the US, German for Germany, Turkish for Turkey).

## `trackChanges` (type: `boolean`):

Compare every keyword with its previous check: citations gained and lost, whether the answer changed, and how often your domain was cited in the last runs ("3/5"). The history is kept in your Apify account, in the key-value store "google-ai-overview-tracker", under the tracking ID below. The first run is the baseline.

## `trackingId` (type: `string`):

Name of the history to compare with, for example a client or project name ("acme-us"). Letters, digits, "-", "\_" and ".". Leave empty to derive it from the keyword list, country and language: editing the keyword list then starts a new history, so set your own ID for long-term tracking.

## `historyDepth` (type: `integer`):

How many past checks of each keyword the history keeps (used for "cited in the last runs").

## `resolveSourceUrls` (type: `boolean`):

Google links most sources through redirect tokens. On: each token is resolved to the real page URL with one short request (the page itself is not visited). Off: those sources keep only their domain.

## `maxKeywords` (type: `integer`):

Upper limit of keywords checked in one run, to keep costs predictable. Each keyword is one check. 250 keywords took about 25 minutes in our tests; a run stops starting new keywords shortly before its timeout and saves what it has, so raise the timeout for long lists.

## Actor input object example

```json
{
  "keywords": [
    "what is generative engine optimization",
    "best seo tools for small business",
    "how to do keyword research"
  ],
  "targetDomains": [
    "semrush.com"
  ],
  "competitorDomains": [
    "ahrefs.com",
    "moz.com"
  ],
  "country": "us",
  "trackChanges": true,
  "historyDepth": 10,
  "resolveSourceUrls": true,
  "maxKeywords": 100
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `sourceReport` (type: `string`):

No description

# 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 = {
    "keywords": [
        "what is generative engine optimization",
        "best seo tools for small business",
        "how to do keyword research"
    ],
    "targetDomains": [
        "semrush.com"
    ],
    "competitorDomains": [
        "ahrefs.com",
        "moz.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("foxlabs/google-ai-overview-scraper").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 = {
    "keywords": [
        "what is generative engine optimization",
        "best seo tools for small business",
        "how to do keyword research",
    ],
    "targetDomains": ["semrush.com"],
    "competitorDomains": [
        "ahrefs.com",
        "moz.com",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("foxlabs/google-ai-overview-scraper").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 '{
  "keywords": [
    "what is generative engine optimization",
    "best seo tools for small business",
    "how to do keyword research"
  ],
  "targetDomains": [
    "semrush.com"
  ],
  "competitorDomains": [
    "ahrefs.com",
    "moz.com"
  ]
}' |
apify call foxlabs/google-ai-overview-scraper --silent --output-dataset

```

## MCP server setup

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

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/ZJU3vaub5gud8iNz8/builds/17ZrxS9mT0baIjphW/openapi.json
