# Google Search Results Scraper (`scrapapi/google-search-results-scraper`) Actor

Extract Google search results for any keyword using this scraper. Collect titles, URLs, descriptions, rankings, and featured snippets from SERPs. Useful for SEO research, keyword tracking, competitor analysis, and monitoring search result changes across Google queries.

- **URL**: https://apify.com/scrapapi/google-search-results-scraper.md
- **Developed by:** [ScrapAPI](https://apify.com/scrapapi) (community)
- **Categories:** SEO tools, Automation, Developer tools
- **Stats:** 4 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$19.99/month + usage

To use this Actor, you pay a monthly rental fee to the developer. The rent is subtracted from your prepaid usage every month after the free trial period.You also pay for the Apify platform usage, which gets cheaper the higher Apify subscription plan you have.

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

## 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 Search Results Scraper

The Google Search Results Scraper is a production-ready Google SERP scraper that extracts structured search engine results pages (SERPs) at scale — including organic listings, paid ads, shopping products, People Also Ask, related queries, and optional AI Overviews — in clean JSON. It solves the challenge of turning live Google results into analyzable data for SEO monitoring, keyword tracking, and competitive research. Built for marketers, developers, data analysts, and researchers, this Google search results scraping tool acts as a Google SERP data extractor that you can automate, integrate, and export to CSV/JSON for downstream analysis.

### What data / output can you get?

Below are the primary fields the actor pushes to the dataset on each page. Field names match the output exactly as pushed during the run.

| Data type | Description | Example value |
| --- | --- | --- |
| searchQuery.term | Full search term sent to Google (with applied filters) | "python intitle:\"tutorial\"" |
| url | Final SERP URL for the page | "https://www.google.com/search?q=python&hl=en&gl=us" |
| resultsTotal | Parsed “About X results” count (if detected) | 123000000 |
| hasNextPage | Whether another results page is available and allowed | true |
| organicResults[].title | Organic result title | "Welcome to Python.org" |
| organicResults[].url | Cleaned target URL | "https://www.python.org" |
| organicResults[].displayedUrl | URL displayed without protocol | "www.python.org" |
| organicResults[].description | Snippet extracted from the result | "Python is a programming language..." |
| paidResults[].url | Google Ads final URL (when present) | "https://example.com/offer" |
| paidProducts[].prices | Detected product price texts | ["$19.99", "$24.99"] |
| relatedQueries[].title | Titles of related/suggested queries | "learn python" |
| peopleAlsoAsk[].question | PAA question text (with optional link) | "What is Python used for?" |
| aiOverview.text | AI Overview summary text (when enabled) | "Python is a popular programming language..." |

Bonus fields:
- suggestedResults: SERP suggestions derived from related queries (with type and position)
- customData: Add-on settings echo (Perplexity/ChatGPT toggles, leads enrichment parameters)
- html / htmlSnapshotUrl / _htmlPayloads: Full HTML snapshot in dataset and/or links saved to key-value store
- In organicResults, an optional icon field may appear when includeIcons is enabled

You can export the dataset in JSON, CSV, or Excel from Apify to extract Google search results to CSV for SEO workflows.

### Key features

- ⚡ Real-time SERP streaming
  Pushes results page-by-page with each iteration of the crawl. This enables real-time pipelines for dashboards and monitoring.

- 🧠 Optional AI Overview (via SerpApi)
  Turn on aiMode and provide serpApiKey to retrieve aiOverview { text, references } alongside results for AEO/GEO tracking.

- 🌍 Location & language targeting
  Control gl (countryCode), hl (languageCode), lr (searchLanguage), and exact location using UULE (locationUule) to build a local Google search results scraper.

- 🎯 Advanced filters
  Apply forceExactMatch, site, relatedToSite, wordsInTitle, wordsInText, wordsInUrl, fileTypes, and date filters quickDateRange / beforeDate / afterDate.

- 📱 Mobile or desktop modes
  Choose mobileResults for mobile SERPs or stick with desktop to emulate different devices.

- 🧹 Include unfiltered results
  includeUnfilteredResults adds results Google typically filters out to expand coverage.

- 🛡️ Robust proxy handling
  Always-on proxies with automatic fallback. Starts with GOOGLE_SERP proxy and, if blocked, switches to RESIDENTIAL with retries and persistence for reliability in real-time Google SERP scraping.

- 🧩 Add-on toggles in output
  customData echoes Perplexity and ChatGPT add-on settings as part of each item for cross-platform analysis pipelines.

- 💾 HTML snapshots for debugging
  Save HTML directly in the dataset (html) and/or to the key-value store with links in htmlSnapshotUrl for easy browser review.

- 👩‍💻 Developer-friendly and scalable
  Works great as a Google search results scraper API within the Apify platform, integrates with Python workflows, and supports bulk Google search scraper runs.

### How to use Google Search Results Scraper - step by step

1. Sign in to Apify
   Create or log into your Apify account at console.apify.com.

2. Open the actor
   Find “Google Search Results Scraper” in the Apify Store or your workspace and open it.

3. Enter input data
   In the Input tab, paste your queries into “queries” — one search term or full Google Search URL per line. You can use advanced operators (site:, OR, etc.) directly.

4. Configure scope & limits
   - resultsPerPage (1–100) and maxPagesPerQuery control volume (≈10 organic per page).
   - Adjust countryCode, languageCode, searchLanguage, and locationUule for local targeting.
   - Set quickDateRange, beforeDate, and/or afterDate to filter by time.

5. Fine-tune filters & settings
   Toggle forceExactMatch, site/relatedToSite, wordsInTitle/Text/Url, fileTypes, and includeUnfilteredResults. Choose mobileResults if needed.

6. Optional add-ons
   - aiMode + serpApiKey to capture AI Overview text and references.
   - focusOnPaidAds to emphasize ad retrieval attempts (with retry logic).
   - Save HTML to dataset (html) and/or key-value store (htmlSnapshotUrl).

7. Start the run
   Click Start. The actor will use proxies automatically (GOOGLE_SERP → RESIDENTIAL fallback on block). Watch logs for progress.

8. Export results
   Open the Output tab to download your dataset as JSON/CSV/Excel. Use it in SEO analysis, dashboards, or data pipelines.

Pro Tip: Use the Apify API to schedule runs, stream results into your data warehouse, or connect this Google search results crawler to Make.com/n8n workflows for automation.

### Use cases

| Use case name | Description |
| --- | --- |
| SEO teams – ranking & SERP tracking | Monitor organic listings, paid ads, and PAA for keywords at scale using a Google search ranking data scraper. |
| Content strategy – keyword discovery | Analyze related queries and PAA to uncover content gaps with a Google search results parser. |
| Competitor monitoring – ads & offers | Track paidResults and paidProducts to see messaging and price points over time. |
| Local SEO – geo-targeted audits | Emulate precise locations via locationUule for a local Google search results scraper that reflects on-the-ground SERPs. |
| Market research – product pricing | Extract paidProducts pricing signals for pricing intelligence and product monitoring. |
| Data engineering – bulk pipelines | Use as a bulk Google search scraper to build datasets and export to CSV/JSON for analytics. |
| Academic & trend analysis | Track query ecosystems and result shifts over time, including peopleAlsoAsk and relatedQueries. |
| Developer workflows – API ingestion | Integrate this Google search results scraper API into Python or ETL for real-time dashboards. |

### Why choose Google Search Results Scraper?

- 🎯 Precision SERP JSON
  Structured fields for organicResults, paidResults, paidProducts, peopleAlsoAsk, relatedQueries, and suggestedResults — ready for analysis.

- 🌐 True geo & language control
  Target gl/hl/lr and exact-location UULE to reflect local SERPs globally.

- 📈 Built for scale
  Bulk input with one query per line and configurable pagination for large keyword sets.

- 🔌 Developer-friendly
  Works seamlessly with the Apify API and Python-based pipelines for programmatic runs.

- 🧪 Debuggability
  Save HTML to dataset and/or key-value store for quick inspection and reproducibility.

- 🛡️ Reliable infrastructure
  Always-on Google SERP proxy with automatic fallback to RESIDENTIAL when blocked (with retries), then persistent use for the rest of the run.

Compared to brittle browser extensions or ad-hoc scripts, this Google search scraping software is a stable, production-grade Google SERP scraper for repeatable, automated workflows.

### Is it legal / ethical to use Google Search Results Scraper?

Yes — when done responsibly. This actor collects data from publicly available Google Search result pages.

Guidelines to follow:
- Only scrape publicly available data and respect platform terms and applicable laws (e.g., GDPR/CCPA).
- Avoid using scraped data for spam or unethical purposes.
- Configure location/language responsibly and do not attempt to access private or authenticated content.
- Consult your legal team for jurisdiction-specific compliance questions.

### Input parameters & output format

Example JSON input

```json
{
  "queries": "python\nsite:apify.com google scraper",
  "resultsPerPage": 50,
  "maxPagesPerQuery": 2,
  "countryCode": "us",
  "languageCode": "en",
  "searchLanguage": "en",
  "forceExactMatch": false,
  "site": null,
  "relatedToSite": null,
  "wordsInTitle": ["tutorial"],
  "wordsInText": [],
  "wordsInUrl": [],
  "fileTypes": ["pdf"],
  "quickDateRange": "m1",
  "beforeDate": null,
  "afterDate": null,
  "mobileResults": false,
  "includeUnfilteredResults": false,
  "aiMode": "aiModeOff",
  "serpApiKey": null,
  "perplexitySearch": {
    "enablePerplexity": false,
    "searchRecency": "",
    "returnImages": false,
    "returnRelatedQuestions": false
  },
  "chatGptSearch": {
    "enableChatGpt": false
  },
  "maximumLeadsEnrichmentRecords": 0,
  "leadsEnrichmentDepartments": [],
  "focusOnPaidAds": false,
  "locationUule": null,
  "saveHtml": false,
  "saveHtmlToKeyValueStore": true,
  "includeIcons": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["GOOGLE_SERP"]
  }
}
````

Input parameter reference

- queries (string, required)
  Description: Use regular search words or enter Google Search URLs. Advanced search operators supported. Ensure queries do not exceed 32 words. Default: none.

- resultsPerPage (integer)
  Description: Desired results per page (num parameter). Actual count may vary; enable Unfiltered results to include more. Default: 100. Min: 1, Max: 100.

- maxPagesPerQuery (integer)
  Description: Maximum number of pages to scrape per query (≈10 results per page). Default: 1. Min: 1.

- aiMode (string)
  Description: Enable scraping of Google's AI Mode for AEO/GEO tracking and competitor analysis. Default: "aiModeOff". Enum: "aiModeOff", "aiModeWithSearchResults", "aiModeOnly".

- serpApiKey (string, nullable, secret)
  Description: Optional. When set and AI Mode is not off, fetches AI Overview via SerpApi. Default: null.

- perplexitySearch (object)
  Description: Add-on settings for Perplexity AI. Default: { "enablePerplexity": false, "searchRecency": "", "returnImages": false, "returnRelatedQuestions": false }.
  - enablePerplexity (boolean) — Default: false.
  - searchRecency (string, nullable) — Enum: "", "day", "week", "month", "year".
  - returnImages (boolean) — Default: false.
  - returnRelatedQuestions (boolean) — Default: false.

- chatGptSearch (object)
  Description: Add-on settings for ChatGPT Search. Default: { "enableChatGpt": false }.
  - enableChatGpt (boolean) — Default: false.

- maximumLeadsEnrichmentRecords (integer)
  Description: Maximum number of business leads per domain to enrich. Default: 0 (disabled). Min: 0.

- leadsEnrichmentDepartments (array)
  Description: Filter leads by departments (works only if maximumLeadsEnrichmentRecords > 0). Default: \[].
  Allowed values include: "c-suite", "product", "engineering-technical", "design", "education", "finance", "human-resources", "information-technology", "legal", "marketing", "medical-health", "operations", "sales", "consulting".

- focusOnPaidAds (boolean)
  Description: Enable paid results (Google Ads) extraction with enhanced retry strategy. Default: false.

- countryCode (string)
  Description: Country for the search and domain (e.g., google.es for Spain). Default: "us". Enum includes global country codes.

- searchLanguage (string, nullable)
  Description: Restrict results to a specific language (lr parameter). Default: null. Enum includes "", "ar", "de", "en", etc.

- languageCode (string)
  Description: Interface language for Google (hl parameter). Default: "en". Enum includes "en", "de", "es", etc.

- locationUule (string, nullable)
  Description: Exact location (UULE parameter). Default: null.

- forceExactMatch (boolean)
  Description: Wraps the query in quotes to enforce exact match. Default: false.

- site (string, nullable)
  Description: Limits search to a specific site (site:). Default: null.

- relatedToSite (string, nullable)
  Description: Filters pages related to a site (related:). Ignored if site is set. Default: null.

- wordsInTitle (array)
  Description: intitle:"..." filters (multiple allowed). Default: \[].

- wordsInText (array)
  Description: intext:"..." filters (multiple allowed). Default: \[].

- wordsInUrl (array)
  Description: inurl:"..." filters (multiple allowed). Default: \[].

- quickDateRange (string, nullable)
  Description: Quick date range (qdr: d/h/w/m/y). Default: null.

- beforeDate (string, nullable)
  Description: Filter results before a date (YYYY-MM-DD) or relative (e.g., "8 days", "3 months"). Default: null.

- afterDate (string, nullable)
  Description: Filter results after a date (YYYY-MM-DD) or relative. Default: null.

- fileTypes (array)
  Description: filetype: filters (supports multiple). Default: \[] (max 10).

- mobileResults (boolean)
  Description: Return mobile SERPs if true; otherwise desktop. Default: false.

- includeUnfilteredResults (boolean)
  Description: Include lower-quality results Google normally filters out. Default: false.

- saveHtml (boolean)
  Description: Save page HTML directly to the dataset under html (increases dataset size). Default: false.

- saveHtmlToKeyValueStore (boolean)
  Description: Save page HTML to the key-value store and link via htmlSnapshotUrl (may slow the run). Default: true.

- includeIcons (boolean)
  Description: Include icon image data if found. Default: false.

- proxyConfiguration (object)
  Description: Always uses proxies. Starts with GOOGLE\_SERP and falls back to RESIDENTIAL (with 3 retries); persists on residential if used. Prefill: { "useApifyProxy": true, "apifyProxyGroups": \["GOOGLE\_SERP"] }.

Example JSON output

```json
{
  "searchQuery": {
    "term": "python",
    "url": "https://www.google.com/search?q=python&hl=en&gl=us",
    "device": "DESKTOP",
    "page": 1,
    "type": "SEARCH",
    "domain": "google.com",
    "countryCode": "US",
    "languageCode": "en",
    "locationUule": null,
    "resultsPerPage": 10
  },
  "searchQueryTerm": "python",
  "url": "https://www.google.com/search?q=python&hl=en&gl=us",
  "hasNextPage": true,
  "serpProviderCode": "O",
  "resultsTotal": 123000000,
  "relatedQueries": [
    {
      "title": "learn python",
      "url": "https://www.google.com/search?q=learn+python&hl=en&gl=us"
    }
  ],
  "paidResults": [
    {
      "title": "Start Coding with Python",
      "url": "https://example.com/python-course",
      "displayedUrl": "example.com/python-course",
      "description": "",
      "emphasizedKeywords": ["python"],
      "siteLinks": [],
      "productInfo": {},
      "type": "paid",
      "position": 1
    }
  ],
  "paidProducts": [
    {
      "title": "Python Programming Book",
      "displayedUrl": "store.example.com/python-book",
      "prices": ["$19.99"]
    }
  ],
  "aiOverview": {
    "text": "Python is a popular, high-level programming language...",
    "references": [
      {
        "title": "Python.org",
        "url": "https://www.python.org"
      }
    ]
  },
  "organicResults": [
    {
      "title": "Welcome to Python.org",
      "url": "https://www.python.org",
      "displayedUrl": "www.python.org",
      "description": "Python is a programming language that lets you work quickly...",
      "emphasizedKeywords": ["python"],
      "siteLinks": [],
      "productInfo": {},
      "type": "organic",
      "position": 1,
      "icon": "https://www.google.com/s2/favicons?domain=python.org"
    }
  ],
  "suggestedResults": [
    {
      "title": "Welcome to Python.org",
      "url": "https://www.google.com/search?q=Welcome+to+Python.org&hl=en&gl=us",
      "type": "organic",
      "position": 1
    }
  ],
  "peopleAlsoAsk": [
    {
      "answer": null,
      "question": "What is Python used for?",
      "title": "What is Python used for?",
      "url": "https://example.com/what-is-python-used-for",
      "date": null
    }
  ],
  "customData": {
    "perplexitySearch": {
      "enablePerplexity": false,
      "searchRecency": null,
      "returnImages": false,
      "returnRelatedQuestions": false
    },
    "chatGptSearch": {
      "enableChatGpt": false
    },
    "maximumLeadsEnrichmentRecords": 0,
    "leadsEnrichmentDepartments": []
  },
  "htmlSnapshotUrl": "python_20260416_120000_p1.html",
  "html": "<!-- PAGE 1 --> ...",
  "_htmlPayloads": [
    ["python_20260416_120000_p1.html", "<html>...</html>"]
  ]
}
```

Note:

- aiOverview appears only when aiMode is not off and serpApiKey is provided.
- html appears only when saveHtml is true; htmlSnapshotUrl/\_htmlPayloads appear only when saveHtmlToKeyValueStore is true.
- An icon field may be present on organicResults when includeIcons is true.

### FAQ

#### Is there a free tier or trial?

Yes. You can run the actor on Apify and use trial minutes to evaluate performance and output. Billing is based on platform usage and the number of pages navigated.

#### Do I need to log in to Google or use cookies?

No. The actor scrapes publicly available Google Search result pages and does not require Google login or cookies.

#### Can I use it with Python or via API?

Yes. You can control this Google search results scraper API through Apify’s REST API, integrate into Python pipelines, and automate exports to JSON/CSV/Excel.

#### How many results can I collect per query?

Set resultsPerPage (1–100) and maxPagesPerQuery (e.g., 10 for ≈100 organic results). Actual per-page counts may vary due to Google filtering; enable includeUnfilteredResults to include more items Google normally filters out.

#### How does proxy handling work?

The actor always uses proxies for reliability. It starts with the GOOGLE\_SERP proxy group and, if blocked, switches to RESIDENTIAL with retries and persists with residential for subsequent requests.

#### Can I target specific countries or languages?

Yes. Use countryCode (gl), languageCode (hl), and searchLanguage (lr). For hyperlocal results, set locationUule to emulate precise location.

#### Does it capture AI Overviews?

Yes, optionally. Set aiMode to a non-off value and provide serpApiKey to include aiOverview { text, references } in the output for cross-engine AEO/GEO analysis.

#### Can I extract paid ads and shopping products?

Yes. The output includes paidResults (ads) and paidProducts (pricing information) when present on the page. You can also enable focusOnPaidAds to emphasize ad retrieval attempts with retry logic.

#### How do I export results to CSV or Excel?

Open the Output tab of your run on Apify and choose your preferred export format (JSON, CSV, or Excel). This makes it easy to extract Google search results to CSV for analysis.

#### What data does customData contain?

customData echoes your add-on settings and enrichment preferences: perplexitySearch, chatGptSearch, maximumLeadsEnrichmentRecords, and leadsEnrichmentDepartments. This helps downstream systems understand contextual run settings.

### Closing CTA / Final thoughts

The Google Search Results Scraper is built for accurate, scalable extraction of Google SERPs into structured, analytics-ready data. With robust proxy handling, advanced filters, optional AI Overviews, and real-time streaming, it’s a dependable Google search results crawler for marketers, developers, analysts, and researchers. Run it from the Apify console, integrate via API into Python workflows, and automate bulk runs for ongoing SERP intelligence. Start extracting smarter SERP data today and turn Google into a reliable data source for your SEO and research pipelines.

# Actor input Schema

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

Use regular search words or enter Google Search URLs. You can also apply advanced Google search techniques, such as AI site:twitter.com or javascript OR python. You can also define selected search filters as separate fields below (in the Advanced search filters section). Just ensure that your queries do not exceed 32 words to comply with Google Search limits.

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

Specifies the desired number of results per page that is passed to Google Search as the num parameter. However, Google applies its own internal filtering and quality checks, so the actual number of returned results may differ from this value, especially on the first page. To potentially retrieve more results closer to your desired count, consider enabling the "Unfiltered results" option from the "Additional settings" section below, which includes results that Google normally filters out.

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

Maximum number of pages to scrape per search query. Each page contains approximately 10 results.

## `aiMode` (type: `string`):

Enable scraping of Google's AI Mode to perform Answer Engine Optimization (AEO), GEO targeting, track brand visibility, and analyze competitors.

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

Optional. When set and AI Mode is not off, fetches AI Overview via SerpApi.

## `perplexitySearch` (type: `object`):

Enable Perplexity to retrieve AI-generated answers and citations using the Sonar model. This feature is designed for cross-platform analysis, allowing you to directly compare Google AI Mode and ChatGPT results against Perplexity's perspective to identify narrative differences and coverage gaps.

Note: An additional fee applies per result when this feature is active. Please refer to the Pricing tab for your specific rate.

## `chatGptSearch` (type: `object`):

Enable ChatGPT to retrieve AI-generated answers powered by OpenAI's search model. This feature is designed for cross-platform analysis, allowing you to directly compare Google AI Mode and Perplexity results against ChatGPT's perspective to identify narrative differences, coverage gaps, and search engine biases.

The output includes query fan-out under queryFanOut, showing additional search queries the model generated to answer your question.

Note: An additional fee applies per result when this feature is active. Please refer to the Pricing tab for your specific rate.

## `maximumLeadsEnrichmentRecords` (type: `integer`):

Enrich your results with detailed contact and company information, including employee names, job titles, emails, phone numbers, LinkedIn profiles, and key company data like industry and number of employees.

This setting allows you to set the maximum number of leads records you want to scrape per each domain found. By default, it's set to 0 which means that no leads information will be scraped.

⚠️ Note that some of the fields contain personal data. GDPR protects personal data in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your use case is legitimate, please consult an attorney.

To keep your leads relevant, we automatically filter out large chains and online platforms (e.g., social media, retail giants, food delivery services).

⚠️ Cost warning: This is a multiplier. Requesting 10 leads for 1,000 domains will attempt to find 10,000 total leads. You are only charged for leads successfully found.

## `leadsEnrichmentDepartments` (type: `array`):

You can use this filter to include only specific departments (like Sales, Marketing, or C-Suite). Note: This will only work if the ⏩ Add-on: Extract business leads information - Maximum leads per domain (maximumLeadsEnrichmentRecords) option is enabled. Please note that some job titles are sometimes miscategorized in the wrong departments.

## `focusOnPaidAds` (type: `boolean`):

Enable extraction of paid results (Google Ads). This feature improves ad detection accuracy by using an ad-specialized proxy to perform up to 3 retries for each search query. Best used for queries likely to show ads. An extra cost per search page applies when enabled, regardless of ads found. Pricing depends on your Apify subscription plan.

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

Specifies the country used for the search and the Google Search domain (e.g. google.es for Spain). By default, the Actor uses United States (google.com).

## `searchLanguage` (type: `string`):

Restricts search results to pages in a specific language. For example, choosing 'German' results in pages only in German. Passed to Google Search as the lr URL query parameter. Read more here.

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

Language of the Google Search interface (menus, buttons, etc. - not the search results themselves). Passed to Google Search as the hl URL query parameter. From Google Reference: You can use the hl request parameter to identify the language of your graphical interface. The hl parameter value may affect search results, especially on international queries when language restriction (using the lr parameter) is not explicitly specified. Read more here.

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

The code for the exact location for the Google search. It's passed to Google Search as the uule URL query parameter. You can use the UULE code generator. Learn more about emulating local search.

## `forceExactMatch` (type: `boolean`):

If checked, the scraper will search for the exact phrase in the query. This is done by wrapping the query in quotes. Note that this may return fewer results. Also note that if you're using operators such as OR or AND, the whole query will be wrapped in quotes, such as "Windows AND macOS". If you want to search for queries such as "Windows" AND "macOS", you need to specify them directly in the queries field.

## `site` (type: `string`):

Limits the search to a specific site, such as: site:example.com. Note that the site filter takes precedence over the relatedToSite filter. If both filters are set, the relatedToSite filter will be ignored and not added to the search queries.

## `relatedToSite` (type: `string`):

Filters pages related to a specific site, such as: related:example.com. Note that the site filter takes precedence over the relatedToSite filter. If both filters are set, the relatedToSite filter will be ignored and not added to the search queries.

## `wordsInTitle` (type: `array`):

Filters pages with specific words in the title. The scraper uses the intitle: operator, even for multiple words (e.g. recipe site:allrecipes.com intitle:"easy apple" intitle:pie). There's also a allintitle: operator available, but it's problematic when combined with other search filters, so the scraper avoids using it. If you need to use the allintitle: operator specifically, you can include it in your custom queries from the queries field.

## `wordsInText` (type: `array`):

Filters pages with specific words in the text. The scraper uses the intext: operator, even for multiple words (e.g. cartoon site:wikipedia.com intext:cat intext:mouse). There's also a allintext: operator available, but it's problematic when combined with other search filters, so the scraper avoids using it. If you need to use the allintext: operator specifically, you can include it in your custom queries from the queries field.

## `wordsInUrl` (type: `array`):

Filters pages with specific words in the URL. The scraper uses the inurl: operator, even for multiple words (e.g. recipe site:allrecipes.com inurl:apple inurl:pie). There's also a allinurl: operator available, but it's problematic when combined with other search filters, so the scraper avoids using it. If you need to use the allinurl: operator specifically, you can include it in your custom queries from the queries field.

## `quickDateRange` (type: `string`):

Filters results from a specific date range. d\[number] specifies the number of past days (e.g. the past 10 days can be written as d10). The same applies to hours, weeks, months, and years: h\[number], w\[number], m\[number], y\[number]. Example for the past year: 'y1' or even 'y'. The value is passed to Google Search using the tbs URL query parameter, prefixed with qdr:. You should avoid combining this filter with the beforeDate and afterDate filters to prevent conflicts.

## `beforeDate` (type: `string`):

Filters results from before the specified date. Either absolute date (e.g. 2024-05-03) or relative date from now into the past (e.g. 8 days, 3 months). Absolute time is always interpreted in the UTC timezone, not your local timezone - please convert accordingly. Supported relative date & time units: days, weeks, months, years. You should avoid combining this filter with the quickDateRange filter to prevent conflicts.

## `afterDate` (type: `string`):

Filters results from after the specified date. Either absolute date (e.g. 2024-05-03) or relative date from now into the past (e.g. 8 days, 3 months). Absolute time is always interpreted in the UTC timezone, not your local timezone - please convert accordingly. Supported relative date & time units: days, weeks, months, years. You should avoid combining this filter with the quickDateRange filter to prevent conflicts.

## `fileTypes` (type: `array`):

Filters results of specific file types using the filetype: operator, such as filetype:pdf. You can select multiple file types as well. They will be combined with the OR operator, for example: filetype:doc OR filetype:txt. If you need to use a file type that is not in the list (such as a source code file type), you can include it in your custom queries from the queries field, using the filetype: operator.

## `mobileResults` (type: `boolean`):

If checked the scraper will return results for mobile version of Google search. Otherwise desktop results are returned.

## `includeUnfilteredResults` (type: `boolean`):

If checked the lower quality results that Google normally filters out will be included.

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

If checked the HTML of the Google Search results pages will be stored to the default dataset, under the html property. This is useful if you need to process the HTML, but it makes the dataset large.

## `saveHtmlToKeyValueStore` (type: `boolean`):

If checked the HTML of the Google Search results pages will be stored to the default key-value store and links to the files stored to the dataset under the htmlSnapshotUrl property. This is useful for debugging since you can easily view the pages in the browser. However, the use of this feature may slow down the Actor.

## `includeIcons` (type: `boolean`):

If checked, all of the results (organicResults, paidResults, suggestedResults) will contain Base64-encoded icon image data if found.

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

This actor always uses proxies to maximize success rates. By default, it starts with a Google SERP proxy and falls back to residential proxy (with 3 retries) if blocked. Once a residential proxy is used, it will stick to it for all subsequent requests.

## Actor input object example

```json
{
  "queries": "javascript\ntypescript\npython",
  "resultsPerPage": 100,
  "maxPagesPerQuery": 1,
  "aiMode": "aiModeOff",
  "perplexitySearch": {
    "enablePerplexity": false,
    "searchRecency": "",
    "returnImages": false,
    "returnRelatedQuestions": false
  },
  "chatGptSearch": {
    "enableChatGpt": false
  },
  "maximumLeadsEnrichmentRecords": 0,
  "leadsEnrichmentDepartments": [],
  "focusOnPaidAds": false,
  "countryCode": "us",
  "languageCode": "en",
  "forceExactMatch": false,
  "wordsInTitle": [],
  "wordsInText": [],
  "wordsInUrl": [],
  "fileTypes": [],
  "mobileResults": false,
  "includeUnfilteredResults": false,
  "saveHtml": false,
  "saveHtmlToKeyValueStore": true,
  "includeIcons": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "GOOGLE_SERP"
    ]
  }
}
```

# 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": `javascript
typescript
python`,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "GOOGLE_SERP"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapapi/google-search-results-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": """javascript
typescript
python""",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["GOOGLE_SERP"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapapi/google-search-results-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": "javascript\\ntypescript\\npython",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "GOOGLE_SERP"
    ]
  }
}' |
apify call scrapapi/google-search-results-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Search Results Scraper",
        "description": "Extract Google search results for any keyword using this scraper. Collect titles, URLs, descriptions, rankings, and featured snippets from SERPs. Useful for SEO research, keyword tracking, competitor analysis, and monitoring search result changes across Google queries.",
        "version": "0.1",
        "x-build-id": "gJ2cqKIMHahADAgSE"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/scrapapi~google-search-results-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-scrapapi-google-search-results-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/scrapapi~google-search-results-scraper/runs": {
            "post": {
                "operationId": "runs-sync-scrapapi-google-search-results-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/scrapapi~google-search-results-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-scrapapi-google-search-results-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 term(s)",
                        "type": "string",
                        "description": "Use regular search words or enter Google Search URLs. You can also apply advanced Google search techniques, such as AI site:twitter.com or javascript OR python. You can also define selected search filters as separate fields below (in the Advanced search filters section). Just ensure that your queries do not exceed 32 words to comply with Google Search limits."
                    },
                    "resultsPerPage": {
                        "title": "📊 Results per page",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Specifies the desired number of results per page that is passed to Google Search as the num parameter. However, Google applies its own internal filtering and quality checks, so the actual number of returned results may differ from this value, especially on the first page. To potentially retrieve more results closer to your desired count, consider enabling the \"Unfiltered results\" option from the \"Additional settings\" section below, which includes results that Google normally filters out.",
                        "default": 100
                    },
                    "maxPagesPerQuery": {
                        "title": "📄 Max pages per search",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of pages to scrape per search query. Each page contains approximately 10 results.",
                        "default": 1
                    },
                    "aiMode": {
                        "title": "⏩ Add-on: Google AI Mode ($)",
                        "enum": [
                            "aiModeOff",
                            "aiModeWithSearchResults",
                            "aiModeOnly"
                        ],
                        "type": "string",
                        "description": "Enable scraping of Google's AI Mode to perform Answer Engine Optimization (AEO), GEO targeting, track brand visibility, and analyze competitors.",
                        "default": "aiModeOff"
                    },
                    "serpApiKey": {
                        "title": "🔑 SerpApi key (for AI Overview)",
                        "type": "string",
                        "description": "Optional. When set and AI Mode is not off, fetches AI Overview via SerpApi."
                    },
                    "perplexitySearch": {
                        "title": "⏩ Add-on: Perplexity AI search ($)",
                        "type": "object",
                        "description": "Enable Perplexity to retrieve AI-generated answers and citations using the Sonar model. This feature is designed for cross-platform analysis, allowing you to directly compare Google AI Mode and ChatGPT results against Perplexity's perspective to identify narrative differences and coverage gaps.\n\nNote: An additional fee applies per result when this feature is active. Please refer to the Pricing tab for your specific rate.",
                        "properties": {
                            "enablePerplexity": {
                                "title": "✨ Enable Perplexity AI",
                                "type": "boolean",
                                "description": "Fetch AI answer using Perplexity Sonar model.",
                                "default": false
                            },
                            "searchRecency": {
                                "title": "🔍 Search Recency",
                                "type": "string",
                                "description": "Specify the time range for Perplexity search results.",
                                "editor": "select",
                                "nullable": true,
                                "enum": [
                                    "",
                                    "day",
                                    "week",
                                    "month",
                                    "year"
                                ],
                                "enumTitles": [
                                    "None",
                                    "day",
                                    "week",
                                    "month",
                                    "year"
                                ]
                            },
                            "returnImages": {
                                "title": "🖼️ Include images in Perplexity AI answers",
                                "type": "boolean",
                                "description": "Include images in Perplexity response.",
                                "default": false
                            },
                            "returnRelatedQuestions": {
                                "title": "❓ Include related questions in Perplexity AI answers",
                                "type": "boolean",
                                "description": "Include related questions in Perplexity response.",
                                "default": false
                            }
                        },
                        "default": {
                            "enablePerplexity": false,
                            "searchRecency": "",
                            "returnImages": false,
                            "returnRelatedQuestions": false
                        }
                    },
                    "chatGptSearch": {
                        "title": "⏩ Add-on: ChatGPT Search ($)",
                        "type": "object",
                        "description": "Enable ChatGPT to retrieve AI-generated answers powered by OpenAI's search model. This feature is designed for cross-platform analysis, allowing you to directly compare Google AI Mode and Perplexity results against ChatGPT's perspective to identify narrative differences, coverage gaps, and search engine biases.\n\nThe output includes query fan-out under queryFanOut, showing additional search queries the model generated to answer your question.\n\nNote: An additional fee applies per result when this feature is active. Please refer to the Pricing tab for your specific rate.",
                        "properties": {
                            "enableChatGpt": {
                                "title": "💬 Enable ChatGPT search",
                                "type": "boolean",
                                "description": "Fetch AI answer using OpenAI search model.",
                                "default": false
                            }
                        },
                        "default": {
                            "enableChatGpt": false
                        }
                    },
                    "maximumLeadsEnrichmentRecords": {
                        "title": "⏩ Add-on: Extract Business Leads Information - Maximum leads per domain ($)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Enrich your results with detailed contact and company information, including employee names, job titles, emails, phone numbers, LinkedIn profiles, and key company data like industry and number of employees.\n\nThis setting allows you to set the maximum number of leads records you want to scrape per each domain found. By default, it's set to 0 which means that no leads information will be scraped.\n\n⚠️ Note that some of the fields contain personal data. GDPR protects personal data in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your use case is legitimate, please consult an attorney.\n\nTo keep your leads relevant, we automatically filter out large chains and online platforms (e.g., social media, retail giants, food delivery services).\n\n⚠️ Cost warning: This is a multiplier. Requesting 10 leads for 1,000 domains will attempt to find 10,000 total leads. You are only charged for leads successfully found.",
                        "default": 0
                    },
                    "leadsEnrichmentDepartments": {
                        "title": "🏢 Leads departments selection",
                        "type": "array",
                        "description": "You can use this filter to include only specific departments (like Sales, Marketing, or C-Suite). Note: This will only work if the ⏩ Add-on: Extract business leads information - Maximum leads per domain (maximumLeadsEnrichmentRecords) option is enabled. Please note that some job titles are sometimes miscategorized in the wrong departments.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "c-suite",
                                "product",
                                "engineering-technical",
                                "design",
                                "education",
                                "finance",
                                "human-resources",
                                "information-technology",
                                "legal",
                                "marketing",
                                "medical-health",
                                "operations",
                                "sales",
                                "consulting"
                            ],
                            "enumTitles": [
                                "C-Suite",
                                "Product",
                                "Engineering & Technical",
                                "Design",
                                "Education",
                                "Finance",
                                "Human Resources",
                                "Information Technology",
                                "Legal",
                                "Marketing",
                                "Medical & Health",
                                "Operations",
                                "Sales",
                                "Consulting"
                            ]
                        },
                        "default": []
                    },
                    "focusOnPaidAds": {
                        "title": "⏩ Add-on: Enable paid results (ads) extraction ($)",
                        "type": "boolean",
                        "description": "Enable extraction of paid results (Google Ads). This feature improves ad detection accuracy by using an ad-specialized proxy to perform up to 3 retries for each search query. Best used for queries likely to show ads. An extra cost per search page applies when enabled, regardless of ads found. Pricing depends on your Apify subscription plan.",
                        "default": false
                    },
                    "countryCode": {
                        "title": "🌍 Country",
                        "enum": [
                            "af",
                            "al",
                            "dz",
                            "as",
                            "ad",
                            "ao",
                            "ai",
                            "aq",
                            "ag",
                            "ar",
                            "am",
                            "aw",
                            "au",
                            "at",
                            "az",
                            "bs",
                            "bh",
                            "bd",
                            "bb",
                            "by",
                            "be",
                            "bz",
                            "bj",
                            "bm",
                            "bt",
                            "bo",
                            "ba",
                            "bw",
                            "bv",
                            "br",
                            "io",
                            "bn",
                            "bg",
                            "bf",
                            "bi",
                            "kh",
                            "cm",
                            "ca",
                            "cv",
                            "ky",
                            "cf",
                            "td",
                            "cl",
                            "cn",
                            "cx",
                            "cc",
                            "co",
                            "km",
                            "cg",
                            "cd",
                            "ck",
                            "cr",
                            "ci",
                            "hr",
                            "cu",
                            "cy",
                            "cz",
                            "dk",
                            "dj",
                            "dm",
                            "do",
                            "ec",
                            "eg",
                            "sv",
                            "gq",
                            "er",
                            "ee",
                            "et",
                            "fk",
                            "fo",
                            "fj",
                            "fi",
                            "fr",
                            "gf",
                            "pf",
                            "tf",
                            "ga",
                            "gm",
                            "ge",
                            "de",
                            "gh",
                            "gi",
                            "gr",
                            "gl",
                            "gd",
                            "gp",
                            "gu",
                            "gt",
                            "gn",
                            "gw",
                            "gy",
                            "ht",
                            "hm",
                            "va",
                            "hn",
                            "hk",
                            "hu",
                            "is",
                            "in",
                            "id",
                            "ir",
                            "iq",
                            "ie",
                            "il",
                            "it",
                            "jm",
                            "jp",
                            "jo",
                            "kz",
                            "ke",
                            "ki",
                            "kp",
                            "kr",
                            "kw",
                            "kg",
                            "la",
                            "lv",
                            "lb",
                            "ls",
                            "lr",
                            "ly",
                            "li",
                            "lt",
                            "lu",
                            "mo",
                            "mk",
                            "mg",
                            "mw",
                            "my",
                            "mv",
                            "ml",
                            "mt",
                            "mh",
                            "mq",
                            "mr",
                            "mu",
                            "yt",
                            "mx",
                            "fm",
                            "md",
                            "mc",
                            "mn",
                            "ms",
                            "ma",
                            "mz",
                            "mm",
                            "na",
                            "nr",
                            "np",
                            "nl",
                            "an",
                            "nc",
                            "nz",
                            "ni",
                            "ne",
                            "ng",
                            "nu",
                            "nf",
                            "mp",
                            "no",
                            "om",
                            "pk",
                            "pw",
                            "ps",
                            "pa",
                            "pg",
                            "py",
                            "pe",
                            "ph",
                            "pn",
                            "pl",
                            "pt",
                            "pr",
                            "qa",
                            "re",
                            "ro",
                            "ru",
                            "rw",
                            "sh",
                            "kn",
                            "lc",
                            "pm",
                            "vc",
                            "ws",
                            "sm",
                            "st",
                            "sa",
                            "sn",
                            "cs",
                            "sc",
                            "sl",
                            "sg",
                            "sk",
                            "si",
                            "sb",
                            "so",
                            "za",
                            "gs",
                            "es",
                            "lk",
                            "sd",
                            "sr",
                            "sj",
                            "sz",
                            "se",
                            "ch",
                            "sy",
                            "tw",
                            "tj",
                            "tz",
                            "th",
                            "tl",
                            "tg",
                            "tk",
                            "to",
                            "tt",
                            "tn",
                            "tr",
                            "tm",
                            "tc",
                            "tv",
                            "ug",
                            "ua",
                            "ae",
                            "gb",
                            "us",
                            "um",
                            "uy",
                            "uz",
                            "vu",
                            "ve",
                            "vn",
                            "vg",
                            "vi",
                            "wf",
                            "eh",
                            "ye",
                            "zm",
                            "zw"
                        ],
                        "type": "string",
                        "description": "Specifies the country used for the search and the Google Search domain (e.g. google.es for Spain). By default, the Actor uses United States (google.com).",
                        "default": "us"
                    },
                    "searchLanguage": {
                        "title": "🔤 Search language",
                        "enum": [
                            "",
                            "ar",
                            "bg",
                            "ca",
                            "cs",
                            "da",
                            "de",
                            "el",
                            "en",
                            "es",
                            "et",
                            "fi",
                            "fr",
                            "hr",
                            "hu",
                            "id",
                            "is",
                            "it",
                            "iw",
                            "ja",
                            "ko",
                            "lt",
                            "lv",
                            "nl",
                            "no",
                            "pl",
                            "pt",
                            "ro",
                            "ru",
                            "sk",
                            "sl",
                            "sr",
                            "sv",
                            "tr",
                            "zh-CN",
                            "zh-TW"
                        ],
                        "type": "string",
                        "description": "Restricts search results to pages in a specific language. For example, choosing 'German' results in pages only in German. Passed to Google Search as the lr URL query parameter. Read more here."
                    },
                    "languageCode": {
                        "title": "🌐 Interface Language",
                        "enum": [
                            "af",
                            "sq",
                            "sm",
                            "ar",
                            "az",
                            "eu",
                            "be",
                            "bn",
                            "bh",
                            "bs",
                            "bg",
                            "ca",
                            "zh-CN",
                            "zh-TW",
                            "hr",
                            "cs",
                            "da",
                            "nl",
                            "en",
                            "eo",
                            "et",
                            "fo",
                            "fi",
                            "fr",
                            "fy",
                            "gl",
                            "ka",
                            "de",
                            "el",
                            "gu",
                            "iw",
                            "hi",
                            "hu",
                            "is",
                            "id",
                            "ia",
                            "ga",
                            "it",
                            "ja",
                            "jw",
                            "kn",
                            "ko",
                            "la",
                            "lv",
                            "lt",
                            "mk",
                            "ms",
                            "ml",
                            "mt",
                            "mr",
                            "ne",
                            "no",
                            "nn",
                            "oc",
                            "fa",
                            "pl",
                            "pt-BR",
                            "pt-PT",
                            "pa",
                            "ro",
                            "ru",
                            "gd",
                            "sr",
                            "si",
                            "sk",
                            "sl",
                            "es",
                            "su",
                            "sw",
                            "sv",
                            "tl",
                            "ta",
                            "te",
                            "th",
                            "ti",
                            "tr",
                            "uk",
                            "ur",
                            "uz",
                            "vi",
                            "cy",
                            "xh",
                            "zu"
                        ],
                        "type": "string",
                        "description": "Language of the Google Search interface (menus, buttons, etc. - not the search results themselves). Passed to Google Search as the hl URL query parameter. From Google Reference: You can use the hl request parameter to identify the language of your graphical interface. The hl parameter value may affect search results, especially on international queries when language restriction (using the lr parameter) is not explicitly specified. Read more here.",
                        "default": "en"
                    },
                    "locationUule": {
                        "title": "📍 Exact location (Google UULE parameter)",
                        "type": "string",
                        "description": "The code for the exact location for the Google search. It's passed to Google Search as the uule URL query parameter. You can use the UULE code generator. Learn more about emulating local search."
                    },
                    "forceExactMatch": {
                        "title": "🎯 Force exact match",
                        "type": "boolean",
                        "description": "If checked, the scraper will search for the exact phrase in the query. This is done by wrapping the query in quotes. Note that this may return fewer results. Also note that if you're using operators such as OR or AND, the whole query will be wrapped in quotes, such as \"Windows AND macOS\". If you want to search for queries such as \"Windows\" AND \"macOS\", you need to specify them directly in the queries field.",
                        "default": false
                    },
                    "site": {
                        "title": "🌐 Site",
                        "type": "string",
                        "description": "Limits the search to a specific site, such as: site:example.com. Note that the site filter takes precedence over the relatedToSite filter. If both filters are set, the relatedToSite filter will be ignored and not added to the search queries."
                    },
                    "relatedToSite": {
                        "title": "🔗 Related to site",
                        "type": "string",
                        "description": "Filters pages related to a specific site, such as: related:example.com. Note that the site filter takes precedence over the relatedToSite filter. If both filters are set, the relatedToSite filter will be ignored and not added to the search queries."
                    },
                    "wordsInTitle": {
                        "title": "📝 Words in title",
                        "maxItems": 32,
                        "type": "array",
                        "description": "Filters pages with specific words in the title. The scraper uses the intitle: operator, even for multiple words (e.g. recipe site:allrecipes.com intitle:\"easy apple\" intitle:pie). There's also a allintitle: operator available, but it's problematic when combined with other search filters, so the scraper avoids using it. If you need to use the allintitle: operator specifically, you can include it in your custom queries from the queries field.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "wordsInText": {
                        "title": "📄 Words in text",
                        "maxItems": 32,
                        "type": "array",
                        "description": "Filters pages with specific words in the text. The scraper uses the intext: operator, even for multiple words (e.g. cartoon site:wikipedia.com intext:cat intext:mouse). There's also a allintext: operator available, but it's problematic when combined with other search filters, so the scraper avoids using it. If you need to use the allintext: operator specifically, you can include it in your custom queries from the queries field.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "wordsInUrl": {
                        "title": "🔗 Words in URL",
                        "maxItems": 32,
                        "type": "array",
                        "description": "Filters pages with specific words in the URL. The scraper uses the inurl: operator, even for multiple words (e.g. recipe site:allrecipes.com inurl:apple inurl:pie). There's also a allinurl: operator available, but it's problematic when combined with other search filters, so the scraper avoids using it. If you need to use the allinurl: operator specifically, you can include it in your custom queries from the queries field.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "quickDateRange": {
                        "title": "⏱️ Quick date range",
                        "type": "string",
                        "description": "Filters results from a specific date range. d[number] specifies the number of past days (e.g. the past 10 days can be written as d10). The same applies to hours, weeks, months, and years: h[number], w[number], m[number], y[number]. Example for the past year: 'y1' or even 'y'. The value is passed to Google Search using the tbs URL query parameter, prefixed with qdr:. You should avoid combining this filter with the beforeDate and afterDate filters to prevent conflicts."
                    },
                    "beforeDate": {
                        "title": "📅 Before date",
                        "pattern": "^(\\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$|^(\\d+)\\s*(day|week|month|year)s?$",
                        "type": "string",
                        "description": "Filters results from before the specified date. Either absolute date (e.g. 2024-05-03) or relative date from now into the past (e.g. 8 days, 3 months). Absolute time is always interpreted in the UTC timezone, not your local timezone - please convert accordingly. Supported relative date & time units: days, weeks, months, years. You should avoid combining this filter with the quickDateRange filter to prevent conflicts."
                    },
                    "afterDate": {
                        "title": "📆 After date",
                        "pattern": "^(\\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$|^(\\d+)\\s*(day|week|month|year)s?$",
                        "type": "string",
                        "description": "Filters results from after the specified date. Either absolute date (e.g. 2024-05-03) or relative date from now into the past (e.g. 8 days, 3 months). Absolute time is always interpreted in the UTC timezone, not your local timezone - please convert accordingly. Supported relative date & time units: days, weeks, months, years. You should avoid combining this filter with the quickDateRange filter to prevent conflicts."
                    },
                    "fileTypes": {
                        "title": "📎 File types",
                        "maxItems": 10,
                        "type": "array",
                        "description": "Filters results of specific file types using the filetype: operator, such as filetype:pdf. You can select multiple file types as well. They will be combined with the OR operator, for example: filetype:doc OR filetype:txt. If you need to use a file type that is not in the list (such as a source code file type), you can include it in your custom queries from the queries field, using the filetype: operator.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "pdf",
                                "csv",
                                "epub",
                                "ps",
                                "htm",
                                "html",
                                "xls",
                                "xlsx",
                                "ppt",
                                "pptx",
                                "doc",
                                "docx",
                                "odp",
                                "ods",
                                "odt",
                                "rtf",
                                "svg",
                                "tex",
                                "txt",
                                "wml",
                                "wap",
                                "xml",
                                "xps",
                                "md",
                                "readme",
                                "log",
                                "yml",
                                "yaml",
                                "toml",
                                "ipynb",
                                "sas",
                                "sql",
                                "rdf",
                                "avif",
                                "avi",
                                "mkv",
                                "mov",
                                "flv",
                                "asf",
                                "ogv"
                            ],
                            "enumTitles": [
                                "Adobe Portable Document Format (pdf)",
                                "Comma-Separated Values (csv)",
                                "Electronic Publication (epub)",
                                "Adobe PostScript (ps)",
                                "HTML (htm)",
                                "HTML (html)",
                                "Microsoft Excel (xls)",
                                "Microsoft Excel (xlsx)",
                                "Microsoft PowerPoint (ppt)",
                                "Microsoft PowerPoint (pptx)",
                                "Microsoft Word (doc)",
                                "Microsoft Word (docx)",
                                "OpenOffice presentation (odp)",
                                "OpenOffice spreadsheet (ods)",
                                "OpenOffice text (odt)",
                                "Rich Text Format (rtf)",
                                "Scalable Vector Graphics (svg)",
                                "TeX/LaTeX (tex)",
                                "Text (txt)",
                                "Wireless Markup Language (wml)",
                                "Wireless Markup Language (wap)",
                                "XML (xml)",
                                "XML Paper Specification (xps)",
                                "Markdown (md)",
                                "Readme (readme)",
                                "Log file (log)",
                                "YAML (yml)",
                                "YAML (yaml)",
                                "TOML (toml)",
                                "Jupyter Notebook (ipynb)",
                                "SAS (sas)",
                                "SQL (sql)",
                                "Resource Description Framework (rdf)",
                                "AV1 Image File Format (avif)",
                                "Audio Video Interleave (avi)",
                                "Matroska Multimedia Container (mkv)",
                                "QuickTime Movie (mov)",
                                "Flash Video (flv)",
                                "Advanced Systems Format (asf)",
                                "Ogg Video (ogv)"
                            ]
                        },
                        "default": []
                    },
                    "mobileResults": {
                        "title": "📱 Mobile results",
                        "type": "boolean",
                        "description": "If checked the scraper will return results for mobile version of Google search. Otherwise desktop results are returned.",
                        "default": false
                    },
                    "includeUnfilteredResults": {
                        "title": "🔓 Unfiltered results",
                        "type": "boolean",
                        "description": "If checked the lower quality results that Google normally filters out will be included.",
                        "default": false
                    },
                    "saveHtml": {
                        "title": "💾 Save HTML to dataset",
                        "type": "boolean",
                        "description": "If checked the HTML of the Google Search results pages will be stored to the default dataset, under the html property. This is useful if you need to process the HTML, but it makes the dataset large.",
                        "default": false
                    },
                    "saveHtmlToKeyValueStore": {
                        "title": "🗄️ Save HTML to key-value store",
                        "type": "boolean",
                        "description": "If checked the HTML of the Google Search results pages will be stored to the default key-value store and links to the files stored to the dataset under the htmlSnapshotUrl property. This is useful for debugging since you can easily view the pages in the browser. However, the use of this feature may slow down the Actor.",
                        "default": true
                    },
                    "includeIcons": {
                        "title": "🖼️ Include icon image data (base64)",
                        "type": "boolean",
                        "description": "If checked, all of the results (organicResults, paidResults, suggestedResults) will contain Base64-encoded icon image data if found.",
                        "default": false
                    },
                    "proxyConfiguration": {
                        "title": "🔒 Proxy configuration",
                        "type": "object",
                        "description": "This actor always uses proxies to maximize success rates. By default, it starts with a Google SERP proxy and falls back to residential proxy (with 3 retries) if blocked. Once a residential proxy is used, it will stick to it for all subsequent requests."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
