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

Google Search Results Scraper extracts structured data from Google search pages in real time. Collect titles, URLs, snippets, rankings, ads, and related queries in JSON or CSV. Ideal for SEO tracking, competitor research, and keyword performance analysis.

- **URL**: https://apify.com/scraper-engine/google-search-results-scraper.md
- **Developed by:** [Scraper Engine](https://apify.com/scraper-engine) (community)
- **Categories:** Automation, SEO tools, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.99 / 1,000 results

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

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

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

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

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

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

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

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

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

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

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

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

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


# README

### Google Search Results Scraper

The Google Search Results Scraper is a fast, reliable Google SERP scraper that extracts structured data from Google search pages in real time. It solves the hassle of manual SERP copy-paste by returning clean JSON/CSV with titles, URLs, snippets, rankings, ads, related queries, and more. Built for marketers, developers, data analysts, and researchers, this Google search results scraping API helps you scale SEO tracking, competitor research, and keyword performance analysis across countries, languages, and devices.

### What data / output can you get?

Below are the primary JSON fields the scraper pushes to the Apify dataset. You can export results to JSON or CSV.

| Data type | Description | Example value |
| --- | --- | --- |
| searchQuery | Context for the current page/query | {"term":"javascript intitle:\"guide\"","url":"http://www.google.com/search?...","device":"DESKTOP","page":1,"type":"SEARCH","domain":"google.com","countryCode":"US","languageCode":"en","locationUule":null,"resultsPerPage":10} |
| searchQueryTerm | The full query string sent to Google (with applied filters) | "javascript intitle:\"guide\"" |
| url | The final Google Search URL for the page | "http://www.google.com/search?q=javascript+intitle%3A%22guide%22&gl=us&hl=en&udm=14" |
| hasNextPage | Whether another page of results is available | false |
| serpProviderCode | Source identifier | "O" |
| resultsTotal | Parsed “About X results” count | 2380000000 |
| relatedQueries | List of related query links (built from top organic titles) | [{"title":"JavaScript - MDN Web Docs - Mozilla","url":"https://www.google.com/search?q=JavaScript+-+MDN..."}] |
| organicResults | Organic results with position, title, URL, snippet, and more | [{"title":"JavaScript - MDN","url":"https://developer.mozilla.org/...","displayedUrl":"developer.mozilla.org/...","description":"JavaScript (JS) is...","emphasizedKeywords":["javascript"],"siteLinks":[{"title":"Read more","url":"https://developer.mozilla.org/...","description":""}],"productInfo":{},"type":"organic","position":1}] |
| paidResults | Paid ad links if detected | [{"title":"Best JS Courses","url":"https://example.com/...","displayedUrl":"example.com","description":"","emphasizedKeywords":["javascript"],"siteLinks":[],"productInfo":{},"type":"paid","position":1}] |
| paidProducts | Shopping/commerce blocks with titles and price snippets | [{"title":"JavaScript Handbook","displayedUrl":"shop.example.com/item/123","prices":["$19.99"]}] |
| suggestedResults | Organic suggestions derived from related queries | [{"title":"JavaScript - MDN","url":"https://www.google.com/search?q=JavaScript+-+MDN...","type":"organic","position":1}] |
| peopleAlsoAsk | PAA questions with optional URLs | [{"answer":null,"question":"What is JavaScript?","title":"What is JavaScript?","url":"https://developer.mozilla.org/...","date":null}] |
| aiOverview | AI summary and references (if AI Mode + SerpApi key enabled) | {"text":"JavaScript is a programming language...","references":[{"title":"MDN Web Docs","url":"https://developer.mozilla.org/..."}]} |
| customData | Echoes add-on settings for Perplexity/ChatGPT and leads filters | {"perplexitySearch":{"enablePerplexity":false,"searchRecency":null,"returnImages":false,"returnRelatedQuestions":false},"chatGptSearch":{"enableChatGpt":false},"maximumLeadsEnrichmentRecords":0,"leadsEnrichmentDepartments":[]} |
| htmlSnapshotUrl | HTML snapshot key in the key-value store (if enabled) | "javascript_20260222_065327_p1.html" |
| html | Full HTML of fetched page(s) (if enabled) | "<!doctype html>..." |

Notes:
- Optional fields like aiOverview, htmlSnapshotUrl, and html appear only if the corresponding add-ons/settings are enabled.
- Icons for results can be included when includeIcons is enabled (field key: icon on individual result items).

### Key features

- 🚀 Real-time SERP extraction & streaming
  Pushes data page-by-page as it’s scraped with Actor.pushData, so you can monitor and integrate results immediately.

- 🌍 Country, language, and location controls
  Use countryCode, searchLanguage (lr), languageCode (hl), and locationUule to tailor results like a precise Google SERP crawler for GEO/AEO targeting.

- 🎯 Advanced query filters
  Apply forceExactMatch, site, relatedToSite, wordsInTitle (intitle:), wordsInText (intext:), wordsInUrl (inurl:), fileTypes (filetype:), quickDateRange, beforeDate, and afterDate. Perfect for a structured Google search result extractor.

- 📱 Desktop or mobile results
  Toggle mobileResults to emulate device types and compare SERP layouts.

- 💰 Paid results (ads) focus add-on
  Enable focusOnPaidAds for enhanced paidResults/paidProducts detection with specialized proxy logic and retries.

- 🤖 AI Overview support (add-on)
  When aiMode is active and serpApiKey is provided, aiOverview text and references are returned alongside organic results—ideal for modern AEO/GEO workflows.

- 🧩 AI comparison flags in output
  Perplexity and ChatGPT add-ons are captured under customData (enable flags, recency, etc.) for cross-platform analysis and downstream automation.

- 💾 Debug & audit-ready
  Save HTML to dataset (html) and/or to key-value store (htmlSnapshotUrl). Great for QA, parsing tests, and reproducibility.

- 🔐 Production-ready proxying
  Always uses proxies. Defaults to GOOGLE_SERP and automatically falls back to RESIDENTIAL with retries on blocks—robust Google SERP scraping tool behavior.

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

1) Create your Apify account
- Sign up or log in to Apify.

2) Open the actor
- Find “Google Search Results Scraper” and click Try for free.

3) Add your queries
- In queries, enter one search term or a full Google search URL per line.
- Tip: 1 page ≈ 10 results. For ~100 results, set maxPagesPerQuery to 10.

4) Configure location and language
- Set countryCode, languageCode (hl), and optional searchLanguage (lr).
- For precise local targeting, set locationUule.

5) Apply filters (optional)
- Use forceExactMatch, site or relatedToSite, wordsInTitle / wordsInText / wordsInUrl, fileTypes, quickDateRange, beforeDate, afterDate, and includeUnfilteredResults.

6) Choose device and ads focus
- Toggle mobileResults for mobile SERPs.
- Enable focusOnPaidAds to improve ad detection across retries.

7) Enable AI add-ons (optional)
- Set aiMode and provide serpApiKey to populate aiOverview.
- Configure perplexitySearch and chatGptSearch as needed (settings echoed in customData).

8) Run and monitor
- Click Start. The actor pushes structured results for each page (organicResults, paidResults, peopleAlsoAsk, etc.) into the dataset in real time.

9) Download results
- Export your dataset as JSON or CSV from the Apify UI or via API.

Pro tip: Use proxyConfiguration defaults (GOOGLE_SERP) for best stability, and switch to RESIDENTIAL automatically on blocks—no manual proxy tuning required.

### Use cases

| Use case name | Description |
| --- | --- |
| SEO teams – keyword tracking & SERP analysis | Collect organicResults with positions, snippets, and relatedQueries to track keyword performance at scale. |
| PPC analysts – ad visibility & product blocks | Extract paidResults and paidProducts to audit ad coverage and pricing signals. |
| Content teams – questions & topic ideation | Mine peopleAlsoAsk and suggestedResults to discover question clusters and content gaps. |
| Competitive intelligence – global SERP comparison | Apply countryCode, searchLanguage, languageCode, and locationUule to compare SERPs by market. |
| Data engineers – Google SERP scraping API pipeline | Stream structured records and export to JSON/CSV for automated ingestion. |
| Researchers – time-bounded corpus building | Filter by quickDateRange, beforeDate, afterDate to capture time-scoped SERPs for studies. |
| E-commerce – offer monitoring | Use paidProducts with prices and displayedUrl to track marketplace positioning. |

### Why choose Google Search Results Scraper?

Purpose-built for precision, scale, and reliability—no brittle extensions or manual scraping.

- 🎯 Accurate, structured output: Clean JSON with stable keys like organicResults, paidResults, peopleAlsoAsk, aiOverview, and more.
- 🌐 Multilingual & geo targeting: Control languageCode (hl), searchLanguage (lr), countryCode (gl), and locationUule for true local search emulation.
- 📈 Scales from single queries to bulk runs: Manage maxPagesPerQuery and resultsPerPage; real-time dataset updates per page.
- 💻 Developer friendly: Export to JSON/CSV, consume via API, and integrate with your pipelines.
- 🛡️ Robust proxying: Starts with GOOGLE_SERP and falls back to RESIDENTIAL on blocks with retries—built for resilience.
- 🧩 Add-on ready: AI Overview via SerpApi when aiMode is enabled; Perplexity/ChatGPT settings captured in customData.
- 💾 Auditable: Save HTML to dataset or key-value store for debugging and QA.

In short: a production-grade Google search results scraper tool that outperforms browser extensions and unstable scripts.

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

Yes—when done responsibly. This actor retrieves publicly available Google search results and offers controls to align with your compliance needs.

Guidelines:
- Review and respect Google’s terms of service for automated access.
- Use the data ethically and for legitimate purposes.
- Be mindful of personal data. The maximumLeadsEnrichmentRecords option includes a GDPR notice—consult legal counsel if unsure.
- Ensure your use complies with applicable laws (e.g., GDPR, CCPA).

### Input parameters & output format

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

Parameter reference (all fields from the schema):

- queries (string, required): Use regular search words or full Google Search URLs. One per line. Max ~32 words per query.
- resultsPerPage (integer, default 100): Desired num per page (1–100). Actual results may vary due to Google filtering.
- maxPagesPerQuery (integer, default 1): Maximum pages to scrape per query. ~10 results per page.
- aiMode (string, default "aiModeOff", enum: "aiModeOff" | "aiModeWithSearchResults" | "aiModeOnly"): Enable Google AI Mode add-on.
- serpApiKey (string, optional): SerpApi key to fetch AI Overview when aiMode is active.
- perplexitySearch (object): Perplexity add-on settings (captured in customData).
  - perplexitySearch.enablePerplexity (boolean, default false)
  - perplexitySearch.searchRecency (string, enum: "", "day", "week", "month", "year")
  - perplexitySearch.returnImages (boolean, default false)
  - perplexitySearch.returnRelatedQuestions (boolean, default false)
- chatGptSearch (object): ChatGPT add-on settings (captured in customData).
  - chatGptSearch.enableChatGpt (boolean, default false)
- maximumLeadsEnrichmentRecords (integer, default 0): Leads enrichment limit per domain (see GDPR warning in description).
- leadsEnrichmentDepartments (array\[string], default \[]): Department filters for leads enrichment (e.g., "marketing", "sales", "c-suite").
- focusOnPaidAds (boolean, default false): Use ad-specialized proxy behavior to improve paid ads detection.
- countryCode (string, default "us"): Country for gl parameter and Google domain.
- searchLanguage (string, optional): Restrict results to a language via lr (e.g., "lang\_de"). Empty string = none.
- languageCode (string, default "en"): Interface language (hl).
- locationUule (string, optional): Exact location UULE code.
- forceExactMatch (boolean, default false): Wrap queries in quotes for exact matches.
- site (string, optional): Apply site: filter.
- relatedToSite (string, optional): Apply related: filter (ignored if site is set).
- wordsInTitle (array\[string], default \[]): Adds intitle:"..." filters.
- wordsInText (array\[string], default \[]): Adds intext:"..." filters.
- wordsInUrl (array\[string], default \[]): Adds inurl:"..." filters.
- quickDateRange (string, optional): Shorthand date range (e.g., d10, m1, y1) via tbs=qdr:.
- beforeDate (string, optional): Filter before date (YYYY-MM-DD or relative like "3 months").
- afterDate (string, optional): Filter after date (YYYY-MM-DD or relative like "8 days").
- fileTypes (array\[string], default \[]): One or more filetype: filters (e.g., pdf, csv, md, etc.).
- mobileResults (boolean, default false): Toggle mobile SERP.
- includeUnfilteredResults (boolean, default false): Include results Google normally filters out (tbs=li:1).
- saveHtml (boolean, default false): Store full HTML in the dataset under html.
- saveHtmlToKeyValueStore (boolean, default true): Store HTML in key-value store and link under htmlSnapshotUrl.
- includeIcons (boolean, default false): Include icon data for results if found.
- proxyConfiguration (object): Proxy settings. Prefill uses Apify Proxy with GOOGLE\_SERP group; actor falls back to RESIDENTIAL on blocks.

Example output JSON

```json
{
  "searchQuery": {
    "term": "javascript intitle:\"guide\"",
    "url": "http://www.google.com/search?q=javascript+intitle%3A%22guide%22&gl=us&hl=en&udm=14",
    "device": "DESKTOP",
    "page": 1,
    "type": "SEARCH",
    "domain": "google.com",
    "countryCode": "US",
    "languageCode": "en",
    "locationUule": null,
    "resultsPerPage": 10
  },
  "searchQueryTerm": "javascript intitle:\"guide\"",
  "url": "http://www.google.com/search?q=javascript+intitle%3A%22guide%22&gl=us&hl=en&udm=14",
  "hasNextPage": false,
  "serpProviderCode": "O",
  "resultsTotal": 2380000000,
  "relatedQueries": [
    {
      "title": "JavaScript - MDN Web Docs - Mozilla",
      "url": "https://www.google.com/search?q=JavaScript+-+MDN+Web+Docs+-+Mozilla&hl=en&gl=us"
    }
  ],
  "paidResults": [],
  "paidProducts": [],
  "aiOverview": null,
  "organicResults": [
    {
      "title": "JavaScript - MDN Web Docs - Mozilla",
      "url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript",
      "displayedUrl": "developer.mozilla.org/en-US/docs/Web/JavaScript",
      "description": "JavaScript (JS) is a lightweight interpreted programming language with first-class functions.",
      "emphasizedKeywords": ["javascript"],
      "siteLinks": [],
      "productInfo": {},
      "type": "organic",
      "position": 1
    }
  ],
  "suggestedResults": [
    {
      "title": "JavaScript - MDN Web Docs - Mozilla",
      "url": "https://www.google.com/search?q=JavaScript+-+MDN+Web+Docs+-+Mozilla&hl=en&gl=us",
      "type": "organic",
      "position": 1
    }
  ],
  "peopleAlsoAsk": [],
  "customData": {
    "perplexitySearch": {
      "enablePerplexity": false,
      "searchRecency": null,
      "returnImages": false,
      "returnRelatedQuestions": false
    },
    "chatGptSearch": {
      "enableChatGpt": false
    },
    "maximumLeadsEnrichmentRecords": 0,
    "leadsEnrichmentDepartments": []
  },
  "htmlSnapshotUrl": "javascript_20260222_065327_p1.html"
}
```

Notes:

- html appears only when saveHtml is true.
- aiOverview includes text and references only when aiMode ≠ aiModeOff and serpApiKey is provided.

### FAQ

#### Do I need to provide queries as URLs or keywords?

You can use either. Enter one search term or a full Google Search URL per line in the queries field. The actor resolves Google URLs to the q parameter automatically.

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

Use resultsPerPage (1–100) and maxPagesPerQuery. As a rule of thumb, 1 page ≈ 10 results. For ~100 results, set maxPagesPerQuery to 10.

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

Yes. Set countryCode for gl, languageCode for the interface (hl), and optionally searchLanguage for lr. You can also provide locationUule for exact local targeting.

#### Does it scrape mobile SERPs?

Yes. Enable mobileResults to switch to mobile user agents and retrieve mobile-optimized SERPs.

#### How do I capture AI Overviews?

Enable aiMode and provide serpApiKey. When active, aiOverview will include a text summary and references fetched via SerpApi.

#### Can it focus on paid ads and shopping results?

Yes. Enable focusOnPaidAds to improve paidResults and paidProducts detection using specialized proxy behavior and retries.

#### Can I export the data to CSV?

Yes. Results are stored in an Apify dataset that you can export to JSON or CSV. You can also access them programmatically via API.

#### Is there a way to debug the HTML?

Enable saveHtml to include HTML in the dataset, or saveHtmlToKeyValueStore to store page snapshots and link them under htmlSnapshotUrl for easy inspection.

### Closing thoughts

The Google Search Results Scraper is built to extract structured Google SERP data at scale. With robust proxying, granular filters, GEO/language controls, and optional AI Overview support, it’s ideal for SEO teams, PPC analysts, researchers, and developers. Export clean JSON/CSV to power dashboards, models, and pipelines—or stream results to your own Google search engine scraper workflows with real-time dataset updates. Start extracting smarter SERP insights today.

# 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("scraper-engine/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("scraper-engine/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 scraper-engine/google-search-results-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Search Results Scraper",
        "description": "Google Search Results Scraper extracts structured data from Google search pages in real time. Collect titles, URLs, snippets, rankings, ads, and related queries in JSON or CSV. Ideal for SEO tracking, competitor research, and keyword performance analysis.",
        "version": "0.1",
        "x-build-id": "pxCSD2gVf6oCtyZWF"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/scraper-engine~google-search-results-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-scraper-engine-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/scraper-engine~google-search-results-scraper/runs": {
            "post": {
                "operationId": "runs-sync-scraper-engine-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/scraper-engine~google-search-results-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-scraper-engine-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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
