# Search Intelligence & AI Visibility Scraper (`qaseemiqbal/google-search-intelligence-scraper`) Actor

Collect Google SERPs, paid ads, shopping products, PAA, related queries, and extract AI Overviews. Compare AI search engines and enrich lead contacts.

- **URL**: https://apify.com/qaseemiqbal/google-search-intelligence-scraper.md
- **Developed by:** [Muhammad Qaseem Iqbal](https://apify.com/qaseemiqbal) (community)
- **Categories:** AI, Lead generation, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 ai answer retrievals

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/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

## Search Intelligence & AI Visibility Scraper

The Search Intelligence & AI Visibility Scraper is a premium, all-in-one data collection tool that gathers search results, paid ads, shopping products, and AI answers from Google and leading AI search engines. 

With this scraper, you can keep track of how your brand ranks in organic search, monitor competitor ads, see how AI assistants describe your business, and instantly find contact details for potential B2B leads.

---

### What can you do with this Scraper?

- **🌱 Track Search Performance**: Collect organic search rankings, titles, description text, and suggested sitelinks.
- **🛍 Monitor Ads & Products**: Capture paid text ads and shopping carousel products (including prices, merchant names, and ratings).
- **🙋‍♀️ Extract Questions & Recommendations**: Save People Also Ask (PAA) accordion questions and Google's related search suggestions.
- **🤖 Audit AI Search Engines (AEO/GEO)**: Retrieve and compare AI-generated answers side-by-side across Google AI Mode, ChatGPT Search, Gemini, Copilot, and Perplexity.
- **🎯 Generate Contact Leads**: Discover business domains, automatically filter out directories, and extract professional contacts (full name, job title, email, phone, and LinkedIn).
- **✅ Verify Emails**: Check if discovered emails are valid and deliverable, preventing bounces.
- **📊 Multi-Format Export**: Download your data as **JSON, CSV, Excel, or HTML** for easy integration into spreadsheets, CRM platforms, or automation tools like Make/Zapier.

---

### What data can you extract?

| | |
|---|---|
| 🌱 Organic Search Listings | 🛍 Paid Text Ads |
| 🤖 Google AI Overviews & AI Mode | 📢 Shopping Product Ads |
| ❓ Related Search Queries | 🙋‍♀️ People Also Ask Accordions |
| 🎯 Business Contact Leads | ⭐️ Review Ratings & Price Snippets |
| 🔍 Custom Page Attributes | ✅ Email Deliverability Verification |

---

### Deep Dive: AI & Lead Generation Add-Ons

#### 🤖 Google AI Overviews & AI Mode
Extracts Google's native generative response panels and source citations. Track how your brand appears when users switch to Google's AI-assisted search experience.

#### 💬 ChatGPT Search
Fetches answers using OpenAI's search engine. Allows you to check how ChatGPT answers user queries about your industry, complete with the list of websites it cited.

#### ⏩ Gemini & Copilot Search
Retrieves answers from Google Gemini and Microsoft Copilot. Compare how different AI platforms summarize your products or services, and see which reference links they display.

#### 🧠 Perplexity AI Search
Queries the Perplexity engine to see how it answers search questions, making it easy to identify visibility gaps across multiple AI search assistants.

#### 👥 Business Lead Enrichment & Email Check
This feature looks up business contact information for the domains found in search results. When enabled, it appends:
- Full Name & Job Title
- Work Email Address & Phone Number
- LinkedIn Profile URL

If **Email Verification** is active, the scraper validates email deliverability, marking them clearly so you don't waste time on dead leads:
- `ok` – Valid, deliverable email address.
- `invalid` – Non-existent email mailbox.
- `disposable` – Temporary or fake email address.

---

### How to use the Scraper

You don't need any coding experience to use this scraper. Just follow these simple steps:

1. **Create a free account** on Apify.
2. Open the **Search Intelligence & AI Visibility Scraper** page.
3. **Configure your search**: Type in your keywords (one per line) or paste raw Google Search URLs.
4. **Choose your target**: Select a country, language, device (desktop or mobile), or a specific city location.
5. **Select features**: Toggle paid ads, AI comparisons, or lead enrichment as needed.
6. Click the **Start** button. Once completed, download your data in Excel, CSV, or JSON format.

---

### Pricing Model (Pay Per Event)

This scraper uses a simple Pay-Per-Event (PPE) pricing model. Instead of paying for computer running time, you only pay for the exact data milestones you successfully retrieve:

| Event | Description |
|---|---|
| `serp-page` | Per successfully crawled and parsed Google Search results page. |
| `ai-answer` | Per AI search answer collected from a provider (ChatGPT, Gemini, etc.). |
| `lead-enrichment` | Per enriched business domain contact listing. |
| `email-verification` | Per verified email address deliverability check outcome. |

---

### Input Example

Here is an example input configuration in JSON format:

```json
{
  "queries": "best crm software\ncrm for small business",
  "countryCode": "us",
  "languageCode": "en",
  "device": "desktop",
  "maxPagesPerQuery": 1,
  "includeOrganicResults": true,
  "includePaidResults": true,
  "includeAiOverview": true,
  "aiProviders": ["chatgpt", "perplexity", "gemini"],
  "trackedEntities": ["HubSpot", "Salesforce", "Pipedrive"],
  "leadEnrichment": {
    "enabled": true,
    "maxLeadsPerDomain": 3,
    "verifyEmails": true
  }
}
````

***

### Output Views

Your data is stored in a clean dataset. The Apify Console will organize the output into five convenient tabular tabs:

1. **Organic & Paid Rows (`serp_result`)**: A simple, unified list of standard search and ad rankings.
2. **Page Snapshots (`serp_page`)**: High-level page metadata and complete page layout blocks.
3. **AI Answers (`ai_answer` / `ai_comparison`)**: Brand mentions, sentiment analysis, and cited source URLs.
4. **Business Leads (`lead`)**: Verified professional contacts and company info.
5. **Errors (`error`)**: Debugging logs if a request got blocked or failed.

# Actor input Schema

## `queries` (type: `string`):

One search query per line. Use this for keyword-based SERP collection.

## `searchUrls` (type: `array`):

Optional raw Google search URLs. Use this when you need exact URL-level control.

## `inputFile` (type: `string`):

Optional file containing queries or URLs. The Actor supports TXT, CSV, and JSON files uploaded to a key-value store.

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

Two-letter country code used for localized search.

## `googleDomain` (type: `string`):

Google domain to use. If omitted, the Actor derives it from countryCode.

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

Two-letter language code for search interface and results.

## `locationName` (type: `string`):

Optional precise location, such as 'Seattle, Washington, United States'. Used for local SEO simulations.

## `locationUule` (type: `string`):

Optional raw UULE parameter. Takes precedence over locationName.

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

Choose desktop or mobile SERP rendering.

## `resultsPerPage` (type: `integer`):

Number of search results requested per Google results page.

## `maxPagesPerQuery` (type: `integer`):

How many SERP pages to collect per query.

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

Extract standard organic search results.

## `includePaidResults` (type: `boolean`):

Extract paid text ads when present.

## `includeProductAds` (type: `boolean`):

Extract shopping/product ad units when present.

## `includePeopleAlsoAsk` (type: `boolean`):

Extract People Also Ask questions and answers where available.

## `expandPeopleAlsoAsk` (type: `boolean`):

Click/expand PAA items in browser mode. Increases runtime and cost.

## `includeRelatedQueries` (type: `boolean`):

Extract related search queries.

## `includeAiOverview` (type: `boolean`):

Attempt to extract AI Overview or AI Mode content when available.

## `aiProviders` (type: `array`):

Optional AI-answer providers for cross-platform comparison.

## `copilotMode` (type: `string`):

Response style for Copilot adapter.

## `trackedEntities` (type: `array`):

Brand, product, competitor, or person names to detect in SERPs and AI answers.

## `openaiApiKey` (type: `string`):

Optional OpenAI API Key for ChatGPT search queries.

## `perplexityApiKey` (type: `string`):

Optional Perplexity API Key for Perplexity comparison queries.

## `geminiApiKey` (type: `string`):

Optional Gemini API Key for Gemini comparison queries.

## `leadEnrichmentApiKey` (type: `string`):

Optional API Key for lead enrichment database.

## `domainFilters` (type: `object`):

Optional domain filtering rules.

## `leadEnrichment` (type: `object`):

Optional business lead enrichment for discovered result domains.

## `customDataFunction` (type: `string`):

Optional JavaScript function executed on each SERP page. Must return a JSON-serializable object.

## `outputMode` (type: `string`):

Choose whether to push page-level records, row-level records, or both.

## `saveHtml` (type: `boolean`):

Save raw SERP HTML for debugging and auditability.

## `saveScreenshots` (type: `boolean`):

Save screenshots for visual QA. Requires browser mode.

## `crawlerType` (type: `string`):

Use HTTP parsing first for speed, browser mode for dynamic features, or auto fallback.

## `maxConcurrency` (type: `integer`):

Maximum number of SERP pages processed in parallel.

## `requestTimeoutSecs` (type: `integer`):

Maximum time per request in seconds.

## `maxRequestRetries` (type: `integer`):

How many times to retry failed SERP requests.

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

Proxy settings. Google SERP or residential proxies are recommended for reliable localized search.

## `debugLog` (type: `boolean`):

Enable verbose logs for parser/debugging.

## Actor input object example

```json
{
  "queries": "hotels in Seattle\nbest project management software\nsite:example.com pricing",
  "searchUrls": [
    {
      "url": "https://www.google.com/search?q=hotels+in+Seattle&num=10"
    }
  ],
  "countryCode": "us",
  "googleDomain": "google.com",
  "languageCode": "en",
  "device": "desktop",
  "resultsPerPage": 10,
  "maxPagesPerQuery": 1,
  "includeOrganicResults": true,
  "includePaidResults": true,
  "includeProductAds": true,
  "includePeopleAlsoAsk": true,
  "expandPeopleAlsoAsk": false,
  "includeRelatedQueries": true,
  "includeAiOverview": false,
  "aiProviders": [
    "google_ai_mode",
    "perplexity",
    "chatgpt",
    "copilot",
    "gemini"
  ],
  "copilotMode": "smart",
  "trackedEntities": [],
  "customDataFunction": "async ({ input, $, request, response, html }) => {\n  return { pageTitle: $('title').text() };\n};",
  "outputMode": "both",
  "saveHtml": false,
  "saveScreenshots": false,
  "crawlerType": "auto",
  "maxConcurrency": 5,
  "requestTimeoutSecs": 60,
  "maxRequestRetries": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "GOOGLE_SERP"
    ]
  },
  "debugLog": false
}
```

# Actor output Schema

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

All records produced by the Actor. Use dataset views to export page-level, row-level, AI, lead, and error records.

## `summary` (type: `string`):

Run-level metrics and links to exported data.

# 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": `hotels in Seattle
best project management software
site:example.com pricing`,
    "searchUrls": [
        {
            "url": "https://www.google.com/search?q=hotels+in+Seattle&num=10"
        }
    ],
    "aiProviders": [
        "google_ai_mode",
        "perplexity",
        "chatgpt",
        "copilot",
        "gemini"
    ],
    "customDataFunction": async ({ input, $, request, response, html }) => {
      return { pageTitle: $('title').text() };
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("qaseemiqbal/google-search-intelligence-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": """hotels in Seattle
best project management software
site:example.com pricing""",
    "searchUrls": [{ "url": "https://www.google.com/search?q=hotels+in+Seattle&num=10" }],
    "aiProviders": [
        "google_ai_mode",
        "perplexity",
        "chatgpt",
        "copilot",
        "gemini",
    ],
    "customDataFunction": """async ({ input, $, request, response, html }) => {
  return { pageTitle: $('title').text() };
};""",
}

# Run the Actor and wait for it to finish
run = client.actor("qaseemiqbal/google-search-intelligence-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": "hotels in Seattle\\nbest project management software\\nsite:example.com pricing",
  "searchUrls": [
    {
      "url": "https://www.google.com/search?q=hotels+in+Seattle&num=10"
    }
  ],
  "aiProviders": [
    "google_ai_mode",
    "perplexity",
    "chatgpt",
    "copilot",
    "gemini"
  ],
  "customDataFunction": "async ({ input, $, request, response, html }) => {\\n  return { pageTitle: $('\''title'\'').text() };\\n};"
}' |
apify call qaseemiqbal/google-search-intelligence-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Search Intelligence & AI Visibility Scraper",
        "description": "Collect Google SERPs, paid ads, shopping products, PAA, related queries, and extract AI Overviews. Compare AI search engines and enrich lead contacts.",
        "version": "1.0",
        "x-build-id": "Y9qDElozyifpydVkn"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/qaseemiqbal~google-search-intelligence-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-qaseemiqbal-google-search-intelligence-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/qaseemiqbal~google-search-intelligence-scraper/runs": {
            "post": {
                "operationId": "runs-sync-qaseemiqbal-google-search-intelligence-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/qaseemiqbal~google-search-intelligence-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-qaseemiqbal-google-search-intelligence-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",
                "properties": {
                    "queries": {
                        "title": "Search queries",
                        "type": "string",
                        "description": "One search query per line. Use this for keyword-based SERP collection."
                    },
                    "searchUrls": {
                        "title": "Search URLs",
                        "type": "array",
                        "description": "Optional raw Google search URLs. Use this when you need exact URL-level control.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "inputFile": {
                        "title": "Input file",
                        "type": "string",
                        "description": "Optional file containing queries or URLs. The Actor supports TXT, CSV, and JSON files uploaded to a key-value store."
                    },
                    "countryCode": {
                        "title": "Country code",
                        "enum": [
                            "us",
                            "gb",
                            "ca",
                            "au",
                            "de",
                            "fr",
                            "es",
                            "it",
                            "nl",
                            "br",
                            "mx",
                            "in",
                            "jp"
                        ],
                        "type": "string",
                        "description": "Two-letter country code used for localized search.",
                        "default": "us"
                    },
                    "googleDomain": {
                        "title": "Google domain",
                        "type": "string",
                        "description": "Google domain to use. If omitted, the Actor derives it from countryCode.",
                        "default": "google.com"
                    },
                    "languageCode": {
                        "title": "Language code",
                        "enum": [
                            "en",
                            "es",
                            "fr",
                            "de",
                            "it",
                            "pt",
                            "nl",
                            "ja",
                            "ko",
                            "zh-CN",
                            "zh-TW"
                        ],
                        "type": "string",
                        "description": "Two-letter language code for search interface and results.",
                        "default": "en"
                    },
                    "locationName": {
                        "title": "Exact location",
                        "type": "string",
                        "description": "Optional precise location, such as 'Seattle, Washington, United States'. Used for local SEO simulations."
                    },
                    "locationUule": {
                        "title": "UULE location parameter",
                        "type": "string",
                        "description": "Optional raw UULE parameter. Takes precedence over locationName."
                    },
                    "device": {
                        "title": "Device",
                        "enum": [
                            "desktop",
                            "mobile"
                        ],
                        "type": "string",
                        "description": "Choose desktop or mobile SERP rendering.",
                        "default": "desktop"
                    },
                    "resultsPerPage": {
                        "title": "Results per page",
                        "minimum": 10,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Number of search results requested per Google results page.",
                        "default": 10
                    },
                    "maxPagesPerQuery": {
                        "title": "Maximum pages per query",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "How many SERP pages to collect per query.",
                        "default": 1
                    },
                    "includeOrganicResults": {
                        "title": "Include organic results",
                        "type": "boolean",
                        "description": "Extract standard organic search results.",
                        "default": true
                    },
                    "includePaidResults": {
                        "title": "Include paid results",
                        "type": "boolean",
                        "description": "Extract paid text ads when present.",
                        "default": true
                    },
                    "includeProductAds": {
                        "title": "Include product ads",
                        "type": "boolean",
                        "description": "Extract shopping/product ad units when present.",
                        "default": true
                    },
                    "includePeopleAlsoAsk": {
                        "title": "Include People Also Ask",
                        "type": "boolean",
                        "description": "Extract People Also Ask questions and answers where available.",
                        "default": true
                    },
                    "expandPeopleAlsoAsk": {
                        "title": "Expand People Also Ask",
                        "type": "boolean",
                        "description": "Click/expand PAA items in browser mode. Increases runtime and cost.",
                        "default": false
                    },
                    "includeRelatedQueries": {
                        "title": "Include related queries",
                        "type": "boolean",
                        "description": "Extract related search queries.",
                        "default": true
                    },
                    "includeAiOverview": {
                        "title": "Include Google AI Overview / AI Mode",
                        "type": "boolean",
                        "description": "Attempt to extract AI Overview or AI Mode content when available.",
                        "default": false
                    },
                    "aiProviders": {
                        "title": "AI answer providers",
                        "type": "array",
                        "description": "Optional AI-answer providers for cross-platform comparison.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "copilotMode": {
                        "title": "Copilot response mode",
                        "enum": [
                            "chat",
                            "reasoning",
                            "smart",
                            "study"
                        ],
                        "type": "string",
                        "description": "Response style for Copilot adapter.",
                        "default": "smart"
                    },
                    "trackedEntities": {
                        "title": "Tracked entities",
                        "type": "array",
                        "description": "Brand, product, competitor, or person names to detect in SERPs and AI answers.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "openaiApiKey": {
                        "title": "OpenAI API Key",
                        "type": "string",
                        "description": "Optional OpenAI API Key for ChatGPT search queries."
                    },
                    "perplexityApiKey": {
                        "title": "Perplexity API Key",
                        "type": "string",
                        "description": "Optional Perplexity API Key for Perplexity comparison queries."
                    },
                    "geminiApiKey": {
                        "title": "Gemini API Key",
                        "type": "string",
                        "description": "Optional Gemini API Key for Gemini comparison queries."
                    },
                    "leadEnrichmentApiKey": {
                        "title": "Lead Enrichment API Key",
                        "type": "string",
                        "description": "Optional API Key for lead enrichment database."
                    },
                    "domainFilters": {
                        "title": "Domain filters",
                        "type": "object",
                        "description": "Optional domain filtering rules.",
                        "properties": {
                            "includeDomains": {
                                "title": "Include domains",
                                "type": "array",
                                "description": "Only keep results from these domains when non-empty.",
                                "editor": "stringList"
                            },
                            "excludeDomains": {
                                "title": "Exclude domains",
                                "type": "array",
                                "description": "Drop results from these domains.",
                                "editor": "stringList"
                            },
                            "excludeLargePlatforms": {
                                "title": "Exclude large platforms",
                                "type": "boolean",
                                "description": "Exclude common platforms, directories, social networks, and marketplaces from lead enrichment.",
                                "default": true
                            }
                        },
                        "additionalProperties": false
                    },
                    "leadEnrichment": {
                        "title": "Lead enrichment",
                        "type": "object",
                        "description": "Optional business lead enrichment for discovered result domains.",
                        "properties": {
                            "enabled": {
                                "title": "Enable lead enrichment",
                                "type": "boolean",
                                "description": "Find business contact details for discovered domains.",
                                "default": false
                            },
                            "maxLeadsPerDomain": {
                                "title": "Maximum leads per domain",
                                "type": "integer",
                                "description": "Maximum enriched contacts per domain.",
                                "default": 3,
                                "minimum": 1,
                                "maximum": 20
                            },
                            "verifyEmails": {
                                "title": "Verify emails",
                                "type": "boolean",
                                "description": "Verify email deliverability when enrichment returns email addresses.",
                                "default": false
                            },
                            "jobTitles": {
                                "title": "Target job titles",
                                "type": "array",
                                "description": "Optional job titles to prioritize.",
                                "editor": "stringList",
                                "default": []
                            }
                        },
                        "additionalProperties": false
                    },
                    "customDataFunction": {
                        "title": "Custom data function",
                        "type": "string",
                        "description": "Optional JavaScript function executed on each SERP page. Must return a JSON-serializable object."
                    },
                    "outputMode": {
                        "title": "Output mode",
                        "enum": [
                            "page",
                            "rows",
                            "both"
                        ],
                        "type": "string",
                        "description": "Choose whether to push page-level records, row-level records, or both.",
                        "default": "both"
                    },
                    "saveHtml": {
                        "title": "Save HTML",
                        "type": "boolean",
                        "description": "Save raw SERP HTML for debugging and auditability.",
                        "default": false
                    },
                    "saveScreenshots": {
                        "title": "Save screenshots",
                        "type": "boolean",
                        "description": "Save screenshots for visual QA. Requires browser mode.",
                        "default": false
                    },
                    "crawlerType": {
                        "title": "Crawler type",
                        "enum": [
                            "http",
                            "browser",
                            "auto"
                        ],
                        "type": "string",
                        "description": "Use HTTP parsing first for speed, browser mode for dynamic features, or auto fallback.",
                        "default": "auto"
                    },
                    "maxConcurrency": {
                        "title": "Maximum concurrency",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Maximum number of SERP pages processed in parallel.",
                        "default": 5
                    },
                    "requestTimeoutSecs": {
                        "title": "Request timeout",
                        "minimum": 10,
                        "maximum": 300,
                        "type": "integer",
                        "description": "Maximum time per request in seconds.",
                        "default": 60
                    },
                    "maxRequestRetries": {
                        "title": "Maximum request retries",
                        "minimum": 0,
                        "maximum": 10,
                        "type": "integer",
                        "description": "How many times to retry failed SERP requests.",
                        "default": 3
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings. Google SERP or residential proxies are recommended for reliable localized search.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "GOOGLE_SERP"
                            ]
                        }
                    },
                    "debugLog": {
                        "title": "Debug log",
                        "type": "boolean",
                        "description": "Enable verbose logs for parser/debugging.",
                        "default": false
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
