# Google AI Overviews Scraper (`khadinakbar/google-ai-overviews-scraper`) Actor

Scrape Google AI Overview (AIO) for any query — get the AI-generated answer text, cited source domains/URLs/titles, citation positions, and optional brand-match detection. Multi-country, desktop/mobile, MCP-ready for AI agents. Hybrid Camoufox scrape + optional SerpApi BYOK fallback.

- **URL**: https://apify.com/khadinakbar/google-ai-overviews-scraper.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** SEO tools, AI, MCP servers
- **Stats:** 1 total users, 1 monthly users, 0.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $15.00 / 1,000 ai overview query checkeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Google AI Overviews Scraper — AIO Citations & Brand Visibility

**Scrape Google AI Overview (AIO) for any query.** Returns the AI-generated answer text, every cited source (domain, URL, title, position), and optional **brand-match detection** to see whether your domain is cited — and at what rank. Multi-country, desktop/mobile, MCP-ready for Claude and other AI agents.

Built for SEO/AEO agencies, in-house GEO (Generative Engine Optimization) teams, and brand monitors who need a clean, programmatic way to track visibility in Google's zero-click AI Overview era.

> **Reliability:** Camoufox + Apify residential is the default scrape path. When Google captcha blocks the request, we transparently fall back to our managed SerpApi infrastructure to deliver the result — no setup required from you. Bring your own SerpApi key (`serpApiKey` input) to pay only the standard $0.015 rate on every query.

### What does Google AI Overviews Scraper do?

Sends one or many Google search queries against `google.com/search`, waits for the AI Overview block to render, then parses:

- The full AIO answer text and individual text blocks
- Every cited source: domain, full URL (Google `/url?q=` redirects decoded), citation position (1-based), title shown on the citation card
- Optional brand match against your `targetDomain` (or comma-separated multiple domains)
- Country, language, device — all configurable per run

The scraper uses a **hybrid path**: a Camoufox (stealth Firefox) browser scrape over Apify residential proxies as the primary, with an optional **SerpApi BYOK fallback** when a query fails after retries. You only pay for the SerpApi side if you bring your own key — most queries succeed on Camoufox.

| Field | Type | Example |
|---|---|---|
| `query` | string | `"best CRM software 2026"` |
| `aioPresent` | boolean | `true` |
| `aioText` | string \| null | `"The best CRM software in 2026 includes HubSpot…"` |
| `aioTextBlocks` | string[] | `["Block 1 text…", "Block 2 text…"]` |
| `sources[]` | array | see below |
| `sources[].position` | integer | `1` |
| `sources[].domain` | string | `"hubspot.com"` |
| `sources[].url` | string | `"https://www.hubspot.com/products/crm"` |
| `sources[].title` | string \| null | `"HubSpot CRM — Free Forever"` |
| `sourceCount` | integer | `8` |
| `uniqueDomainCount` | integer | `7` |
| `brandMatch.matched` | boolean | `true` |
| `brandMatch.position` | integer \| null | `3` |
| `brandMatch.citedUrl` | string \| null | `"https://apify.com/blog/best-crm"` |
| `brandMatch.matchCount` | integer | `2` |
| `source` | `"camoufox" \| "serpapi"` | `"camoufox"` |
| `scrapedAt` | ISO 8601 | `"2026-05-29T14:32:11.000Z"` |

### How much does it cost to scrape Google AI Overviews?

- **Actor start**: $0.00005 per GB RAM (default 2 GB → $0.0001 per run start)
- **AI Overview query checked**: **$0.015 per query** — when Camoufox succeeds, OR when you bring your own SerpApi key (BYOK) for the fallback.
- **AI Overview query (managed SerpApi fallback)**: **$0.10 per query** — when our Camoufox is captcha-blocked and you didn't provide a SerpApi key, we use our managed SerpApi infrastructure to still deliver the result. Covers SerpApi API cost + reliability margin.
- **Brand match detected**: **$0.005 bonus** only when `targetDomain` matches one or more citations

**Typical cost (no SerpApi key):** Mix of $0.015 (Camoufox success) and $0.10 (managed SerpApi fallback). Real-world Google captcha rate on Apify residential is ~50%, so blended ≈ $0.057/query. A 100-keyword brand-visibility report runs about $5.70.

**Typical cost (with your own SerpApi key):** Flat **$0.015 per query** regardless of which path delivers — you pay SerpApi directly for your queries (free tier covers 100/mo at serpapi.com). A 100-keyword report runs about $1.50 on our side + your SerpApi spend.

**Never charged:** Queries that fail on both paths (rare). You only pay for results we deliver.

### Why use Google AI Overviews Scraper?

- **Zero-click visibility is the new SERP.** AIO replaces organic clicks for informational and how-to queries. If you're not cited, you're invisible.
- **Built for AEO/GEO reporting.** Brand match per query → share-of-voice dashboards.
- **MCP-ready.** AI agents (Claude, ChatGPT, Cursor) can call this as a tool — single query in, structured JSON out.
- **Hybrid reliability.** Camoufox + residential proxies handle the majority of queries. SerpApi BYOK kicks in only when needed.
- **Multi-country, multi-device.** AIO varies by country and device — we surface both axes.

### How to use Google AI Overviews Scraper

1. Open the Apify Console and create a new run.
2. Fill **Search queries** — one per line, max 50.
3. (Optional) Set **Brand domain to detect** — e.g., `yourbrand.com`.
4. Pick **Country code** and **Language code** (defaults: `us` / `en`).
5. Choose **Device** — desktop or mobile.
6. (Optional) Paste a **SerpApi key** for fallback.
7. Click **Save & Start**. Results appear in the dataset; the `SUMMARY` key holds run-level counters.

### Input

```json
{
  "queries": [
    "best project management software 2026",
    "how does generative AI work",
    "top SEO tools for agencies"
  ],
  "targetDomain": "apify.com",
  "countryCode": "us",
  "languageCode": "en",
  "device": "desktop"
}
````

See the **Input** tab in Apify Console for the form, including SerpApi BYOK and proxy overrides.

### Output

Dataset items can be downloaded as JSON, CSV, Excel, RSS, or HTML. Example row:

```json
{
  "query": "best project management software 2026",
  "countryCode": "us",
  "languageCode": "en",
  "device": "desktop",
  "serpUrl": "https://www.google.com/search?q=best+project+management+software+2026&hl=en&gl=us&num=10",
  "aioPresent": true,
  "aioText": "Top project management tools in 2026 include Asana, Monday.com, ClickUp, and Notion — each with distinct strengths for team size and workflow complexity…",
  "aioTextBlocks": [
    "Top project management tools in 2026 include Asana, Monday.com, ClickUp, and Notion…",
    "For small teams under 10 people, ClickUp's free tier and Notion's project templates are commonly recommended…"
  ],
  "sources": [
    { "position": 1, "domain": "asana.com", "url": "https://asana.com/guide", "title": "Project Management Guide — Asana" },
    { "position": 2, "domain": "monday.com", "url": "https://monday.com/blog/project-management/", "title": "Monday.com — Best for Teams" },
    { "position": 3, "domain": "clickup.com", "url": "https://clickup.com/blog/best-pm-tools/", "title": "ClickUp Best PM Tools 2026" }
  ],
  "sourceCount": 3,
  "uniqueDomainCount": 3,
  "brandMatch": { "targetDomain": "apify.com", "matched": false, "position": null, "citedUrl": null, "matchCount": 0 },
  "source": "camoufox",
  "scrapedAt": "2026-05-29T14:32:11.000Z",
  "warnings": []
}
```

### Use with AI agents (MCP)

This actor is MCP-first. Connect it from Claude or another MCP-aware client:

```
https://mcp.apify.com?tools=khadinakbar/google-ai-overviews-scraper
```

Then ask the agent: *"Check the Google AI Overview for 'best CRM software 2026' and tell me if apify.com is cited."* The agent will call the actor, parse the JSON, and answer with citation rank.

```python
## Direct Apify API call
from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("khadinakbar/google-ai-overviews-scraper").call(run_input={
    "queries": ["best CRM software 2026", "top SEO tools 2026"],
    "targetDomain": "apify.com",
    "countryCode": "us",
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["query"], "→ AIO:", item["aioPresent"], "match:", item["brandMatch"])
```

```javascript
// Node.js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('khadinakbar/google-ai-overviews-scraper').call({
  queries: ['best CRM software 2026'],
  targetDomain: 'apify.com',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);
```

### Tips & advanced options

- **AIO doesn't render for every query.** Google shows AIO mainly on informational, how-to, and comparison queries. Commercial, navigational, and ambiguous queries often skip it. `aioPresent: false` is a valid result — you're still charged for the check (this is industry-standard for AIO trackers).
- **Use `device: "mobile"` for B2C queries.** Google sometimes shows different AIO content on mobile.
- **Bring a SerpApi key for ~99% reliability.** Camoufox + residential gets us into the high 90s on most queries; SerpApi handles the long tail.
- **Multi-domain brand match.** Pass `"apify.com,docs.apify.com,blog.apify.com"` to match any of them.
- **Schedule daily/weekly runs** via Apify Schedules for citation-trend dashboards.

### Portfolio cross-sell

This actor pairs well with our other AI-search and SEO tools:

- [`khadinakbar/ai-search-brand-monitor`](https://apify.com/khadinakbar/ai-search-brand-monitor) — track brand mentions across Perplexity, ChatGPT, Claude, Gemini
- [`khadinakbar/ai-search-visibility-tracker`](https://apify.com/khadinakbar/ai-search-visibility-tracker) — track domain citations across AI engines
- [`khadinakbar/scrape-google-serp`](https://apify.com/khadinakbar/scrape-google-serp) — full Google SERP scraper
- [`khadinakbar/google-trends-scraper`](https://apify.com/khadinakbar/google-trends-scraper) — Google Trends data
- [`khadinakbar/google-news-scraper`](https://apify.com/khadinakbar/google-news-scraper) — Google News articles

### FAQ

**Q: Does AIO render for every query?**
A: No. AIO appears on a subset of queries — mainly informational, how-to, and comparison. Commercial and navigational queries often skip it. `aioPresent: false` is a normal result.

**Q: Why is brand match `null` for some rows?**
A: Brand match is computed only when `targetDomain` is set in input. Leave it unset to skip matching.

**Q: How accurate is the citation parsing?**
A: We use structural selectors (heading text + data attributes) plus link extraction inside the AIO container. Google rotates CSS class names frequently — structural anchors stay stable. If you spot drift, open an issue with the affected query.

**Q: Do I need a SerpApi key?**
A: No — we provide a managed SerpApi fallback automatically when Google captcha blocks. You'll just pay $0.10/query for those queries instead of $0.015. Bring your own SerpApi key (free tier 100/mo at serpapi.com) to get the flat $0.015 rate on every query.

**Q: What's the difference between the $0.015 and $0.10 events?**
A: $0.015 = Camoufox direct scrape OR your own SerpApi key. $0.10 = our managed SerpApi key (used only when Camoufox is captcha-blocked and you didn't bring a key). Same data quality; different cost path.

**Q: Why $0.015/query even when AIO is absent?**
A: You're paying for the check — proxy bandwidth, browser CPU, parse time — not for the AIO hit. Industry-standard pricing across all AIO trackers.

**Q: Can I run this on a schedule?**
A: Yes. Use Apify Schedules to run weekly/daily citation-trend reports.

### Legal disclaimer

This actor scrapes publicly available Google search result pages. It does not bypass authentication, paywalls, or access private data. You are responsible for ensuring your use complies with Google's Terms of Service and your local laws. The actor enforces residential proxies and rate-limited concurrency to minimize impact on Google's infrastructure. No personal data is collected beyond what Google publishes in its public AI Overview citations.

### Support & feedback

Open an issue on the Apify Store **Issues** tab. We typically respond within 24h.

# Actor input Schema

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

List of Google search queries to check for AI Overviews (e.g., \['best CRM software 2026', 'how to scrape Google AI Overviews']). One record per query is returned. Max 50 queries per run. NOT a list of full Google URLs — pass plain text queries; the actor builds the SERP URL with countryCode/languageCode.

## `targetDomain` (type: `string`):

Your brand domain to match against AIO source citations (e.g., 'apify.com', or comma-separated 'apify.com,docs.apify.com'). When set, output includes brandMatch.matched, position, citedUrl, matchCount. Leave empty to skip brand matching. NOT a full URL — pass bare domains only.

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

Two-letter ISO 3166-1 alpha-2 country code for geo-targeting Google SERP (e.g., 'us', 'gb', 'de'). Affects which results and which AIO variant Google returns. Defaults to 'us'. NOT a country name — use ISO codes only.

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

Two-letter ISO 639-1 language code for Google interface language (e.g., 'en', 'de', 'es'). Sets the hl= URL param. Defaults to 'en'. NOT a locale string like 'en-US' — use the bare language code.

## `device` (type: `string`):

Browser viewport to emulate when fetching the SERP. Google sometimes shows different AIO content for mobile vs desktop. Defaults to 'desktop'. NOT a specific phone model — only 'desktop' or 'mobile' accepted.

## `serpApiKey` (type: `string`):

Optional SerpApi.com key for hybrid fallback when the Camoufox scrape is blocked. Get one free at serpapi.com (100/mo free). When provided, failed queries are retried via SerpApi automatically. Leave empty to use Camoufox-only — most queries succeed. NOT a Google API key — must be a SerpApi.com key.

## `maxRetries` (type: `integer`):

How many times to retry a query that fails to load AIO or returns no answer container. Helps with intermittent rendering. Defaults to 2 (3 attempts total). NOT a global cap — applies per query.

## `forceSerpapi` (type: `boolean`):

Skip the Camoufox scrape attempt entirely and go straight to SerpApi (managed if you don't bring a key, BYOK otherwise). Saves ~7 seconds per query when you already know Google residential blocks. Defaults to false. NOT recommended for normal use — automatic circuit breaker handles persistent blocking.

## `proxyConfiguration` (type: `object`):

Proxy setup. Defaults to Apify residential (mandatory for Google scraping). Override only if you know what you're doing — datacenter proxies get blocked instantly by Google. NOT optional in practice.

## Actor input object example

```json
{
  "queries": [
    "best CRM for startups",
    "what is generative AI",
    "top SEO tools 2026"
  ],
  "targetDomain": "apify.com",
  "countryCode": "us",
  "languageCode": "en",
  "device": "desktop",
  "maxRetries": 2,
  "forceSerpapi": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

No description

## `usage` (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 = {
    "queries": [
        "best project management software for small teams"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/google-ai-overviews-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 = {
    "queries": ["best project management software for small teams"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

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

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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 for small teams"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call khadinakbar/google-ai-overviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=khadinakbar/google-ai-overviews-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google AI Overviews Scraper",
        "description": "Scrape Google AI Overview (AIO) for any query — get the AI-generated answer text, cited source domains/URLs/titles, citation positions, and optional brand-match detection. Multi-country, desktop/mobile, MCP-ready for AI agents. Hybrid Camoufox scrape + optional SerpApi BYOK fallback.",
        "version": "0.1",
        "x-build-id": "5s5mv4F7Yo4nqui0j"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/khadinakbar~google-ai-overviews-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-khadinakbar-google-ai-overviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/khadinakbar~google-ai-overviews-scraper/runs": {
            "post": {
                "operationId": "runs-sync-khadinakbar-google-ai-overviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/khadinakbar~google-ai-overviews-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-khadinakbar-google-ai-overviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "queries"
                ],
                "properties": {
                    "queries": {
                        "title": "Search queries",
                        "minItems": 1,
                        "maxItems": 50,
                        "type": "array",
                        "description": "List of Google search queries to check for AI Overviews (e.g., ['best CRM software 2026', 'how to scrape Google AI Overviews']). One record per query is returned. Max 50 queries per run. NOT a list of full Google URLs — pass plain text queries; the actor builds the SERP URL with countryCode/languageCode.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "targetDomain": {
                        "title": "Brand domain to detect (optional)",
                        "type": "string",
                        "description": "Your brand domain to match against AIO source citations (e.g., 'apify.com', or comma-separated 'apify.com,docs.apify.com'). When set, output includes brandMatch.matched, position, citedUrl, matchCount. Leave empty to skip brand matching. NOT a full URL — pass bare domains only."
                    },
                    "countryCode": {
                        "title": "Country code",
                        "enum": [
                            "us",
                            "gb",
                            "de",
                            "fr",
                            "es",
                            "it",
                            "nl",
                            "br",
                            "in",
                            "au",
                            "ca",
                            "jp",
                            "kr",
                            "mx",
                            "ar",
                            "co",
                            "pl",
                            "ru",
                            "tr",
                            "ae",
                            "sa",
                            "za",
                            "se",
                            "no",
                            "fi",
                            "dk",
                            "ch",
                            "at",
                            "be",
                            "ie",
                            "nz",
                            "sg",
                            "hk",
                            "tw",
                            "th",
                            "id",
                            "vn",
                            "ph",
                            "my",
                            "il"
                        ],
                        "type": "string",
                        "description": "Two-letter ISO 3166-1 alpha-2 country code for geo-targeting Google SERP (e.g., 'us', 'gb', 'de'). Affects which results and which AIO variant Google returns. Defaults to 'us'. NOT a country name — use ISO codes only.",
                        "default": "us"
                    },
                    "languageCode": {
                        "title": "Language code",
                        "enum": [
                            "en",
                            "de",
                            "es",
                            "fr",
                            "it",
                            "nl",
                            "pt",
                            "ru",
                            "ja",
                            "ko",
                            "zh",
                            "ar",
                            "hi",
                            "tr",
                            "pl",
                            "sv",
                            "no",
                            "fi",
                            "da",
                            "el",
                            "he",
                            "th",
                            "vi",
                            "id",
                            "ms",
                            "cs"
                        ],
                        "type": "string",
                        "description": "Two-letter ISO 639-1 language code for Google interface language (e.g., 'en', 'de', 'es'). Sets the hl= URL param. Defaults to 'en'. NOT a locale string like 'en-US' — use the bare language code.",
                        "default": "en"
                    },
                    "device": {
                        "title": "Device emulation",
                        "enum": [
                            "desktop",
                            "mobile"
                        ],
                        "type": "string",
                        "description": "Browser viewport to emulate when fetching the SERP. Google sometimes shows different AIO content for mobile vs desktop. Defaults to 'desktop'. NOT a specific phone model — only 'desktop' or 'mobile' accepted.",
                        "default": "desktop"
                    },
                    "serpApiKey": {
                        "title": "SerpApi key (BYOK fallback, optional)",
                        "type": "string",
                        "description": "Optional SerpApi.com key for hybrid fallback when the Camoufox scrape is blocked. Get one free at serpapi.com (100/mo free). When provided, failed queries are retried via SerpApi automatically. Leave empty to use Camoufox-only — most queries succeed. NOT a Google API key — must be a SerpApi.com key."
                    },
                    "maxRetries": {
                        "title": "Max retries per query",
                        "minimum": 0,
                        "maximum": 5,
                        "type": "integer",
                        "description": "How many times to retry a query that fails to load AIO or returns no answer container. Helps with intermittent rendering. Defaults to 2 (3 attempts total). NOT a global cap — applies per query.",
                        "default": 2
                    },
                    "forceSerpapi": {
                        "title": "Skip Camoufox, use SerpApi directly",
                        "type": "boolean",
                        "description": "Skip the Camoufox scrape attempt entirely and go straight to SerpApi (managed if you don't bring a key, BYOK otherwise). Saves ~7 seconds per query when you already know Google residential blocks. Defaults to false. NOT recommended for normal use — automatic circuit breaker handles persistent blocking.",
                        "default": false
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy setup. Defaults to Apify residential (mandatory for Google scraping). Override only if you know what you're doing — datacenter proxies get blocked instantly by Google. NOT optional in practice.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
