# Google Search Scraper — SERP, Ads, PAA & AI Overview (`hipersoft/google-search-scraper`) Actor

Scrape Google Search results for any keyword: organic rankings with destination URLs, People Also Ask, related queries, paid ads, AI Overview and knowledge panel. Bulk keywords, any country, language, device, date range and site filter. Export to JSON, CSV or Excel.

- **URL**: https://apify.com/hipersoft/google-search-scraper.md
- **Developed by:** [Hipersoft](https://apify.com/hipersoft) (community)
- **Categories:** SEO tools, Developer tools
- **Features:** Limited permissions
- **Stats:** 9 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.0005 / result scraped

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Google Search Scraper — SERP Results, Ads, People Also Ask & AI Overview

Google Search Scraper extracts **organic rankings, destination URLs, snippets, paid ads, People Also Ask questions, related queries, AI Overviews and knowledge panels** from Google Search results pages for any keyword. Run one query or thousands, target any country, language, device or date range, and export clean **JSON, CSV, Excel or XML**. Fast and reliable, with billing only for results delivered.

![Google Search Scraper input — keywords, results per query, SERP features and location settings in the Apify Console](https://api.apify.com/v2/key-value-stores/SUfvnaFLd9z9eBCtV/records/google-search-scraper-input.png?v=3)

### What does Google Search Scraper do?

Google Search Scraper is a SERP scraper and a no-code alternative to a Google Search API. Give it keywords, advanced search operators or pasted Google Search URLs, and it crawls the results pages and returns structured data: one row per organic result, in rank order, plus an optional row per query with everything else Google shows on the SERP. Use it through the Console, the Apify API, a schedule or an integration.

### What data can you scrape from Google Search?

| Data | What you get |
| --- | --- |
| Organic results | Position, title, URL, domain, displayed URL, snippet, site name, publish date, highlighted keywords |
| Rich result data | Rating, review count and sitelinks when Google shows them |
| Paid results (ads) | Ad position, top or bottom block, title, advertiser URL, domain, ad copy |
| Product ads | Title, price, original price, merchant and domain |
| People Also Ask | The questions Google lists for the keyword |
| Related queries | "People also search for" keywords, with a search link for each |
| AI Overview | The answer text and its cited sources, when the page includes one |
| Knowledge panel | Title, subtitle, description, website and facts for companies, places and topics |
| Search context | Query, page, device, country, language, search URL and timestamp |

### What you get

![Google Search Scraper output example — organic SERP result with URL, snippet, date and rank position as structured JSON](https://api.apify.com/v2/key-value-stores/SUfvnaFLd9z9eBCtV/records/google-search-scraper-output.png?v=6)

Each organic result is one row, so the dataset opens directly as a rank-tracking table.

### Use cases

- **SEO rank tracking:** record where your pages rank for each keyword, by country and device, on a schedule.
- **Competitor monitoring:** see who ranks and who buys ads on your most valuable keywords.
- **AI Overview visibility:** check which keywords trigger an AI Overview and which domains it cites.
- **Content research:** turn People Also Ask questions and related queries into content briefs and keyword lists.
- **Lead and link prospecting:** build lists of company websites that rank for a topic, a file type or a site filter.
- **Index audits:** run `site:` queries to see which pages of a domain Google shows.
- **Market and news research:** use date filters to collect what was published about a topic this week.
- **AI agents and RAG pipelines:** give an agent fresh Google results in structured JSON.

### How to scrape Google Search results

1. Open Google Search Scraper in the Apify Console.
2. Add your keywords to `queries`, one per line. Operators and full Google Search URLs work too.
3. Set `resultsPerQuery`, and your country, language, device and filters.
4. Turn on `includeSerpFeatures` if you want ads, People Also Ask, related queries, AI Overview and knowledge panels.
5. Click **Start**, then export the dataset as JSON, CSV, Excel or XML, or read it through the Apify API.

### Input

Example input:

```json
{
  "queries": ["electric bikes", "best crm software"],
  "resultsPerQuery": 20,
  "includeSerpFeatures": true
}
```

| Field | Description |
| --- | --- |
| `queries` | Keywords, advanced operators or full Google Search URLs (required). Each is scraped separately. |
| `resultsPerQuery` | Organic results per query, 1–500. Default `10`. |
| `maxPagesPerQuery` | Collect this many Google pages per query instead of a result count. |
| `includeSerpFeatures` | Add one `serp` row per query with ads, People Also Ask, related queries, AI Overview and knowledge panel. Off by default for API runs. |
| `countryCode` | Country of the results (`gl`), for example `us`, `gb`, `de`. Default `us`. |
| `languageCode` | Language of the Google interface (`hl`). Default `en`. |
| `searchLanguage` | Only pages written in this language (`lr`), for example `de`. |
| `googleDomain` | Google country domain, for example `google.co.uk`. Default `google.com`. |
| `locationUule` | UULE location code (`uule`). Google treats it as a location hint, so results are biased toward the place but not limited to it. |
| `mobileResults` | Return mobile results instead of desktop. |
| `site` / `relatedToSite` | Limit results to one site, or find pages related to a site. |
| `forceExactMatch` | Search for the exact phrase. |
| `wordsInTitle` / `wordsInText` / `wordsInUrl` | Only pages with these words in the title, body or URL. |
| `fileTypes` | Only these file types, for example `pdf`, `xlsx`. |
| `quickDateRange` | Only recent results: `d7`, `w2`, `m6`, `y1` and so on. |
| `afterDate` / `beforeDate` | Only results after or before a date, such as `2026-01-31` or `3 months`. |
| `includeUnfilteredResults` | Include the similar results Google normally hides. |
| `saveHtmlToKeyValueStore` | Store the HTML of each results page and add its link to each result. |
| `maxConcurrency` | Queries to run in parallel, 1–20. Default `5`. |

#### Scrape Google Search by URL

Paste any Google Search URL, on any country domain, and its parameters are kept:

```json
{
  "queries": ["https://www.google.de/search?q=hotel+berlin&gl=de&hl=de"]
}
```

#### Filter Google results by date, file type and title

```json
{
  "queries": ["annual report"],
  "fileTypes": ["pdf"],
  "afterDate": "2025-01-01",
  "beforeDate": "2026-01-01",
  "wordsInTitle": ["annual"]
}
```

### Output

#### Organic result row

Real row from a cloud run (`type: "organic"`):

```json
{
  "query": "best crm software",
  "position": 2,
  "title": "Best CRM Tools for Small Businesses",
  "url": "https://boostedcrm.com/best-crm/",
  "domain": "boostedcrm.com",
  "displayedUrl": "https://boostedcrm.com › best-crm",
  "snippet": "Mar 27, 2025 — Zoho CRM is renowned for its robust functionality and affordability, making it one of the best CRM solutions available. It offers a range of ...Read more",
  "type": "organic",
  "siteName": "Boosted CRM",
  "date": "Mar 27, 2025",
  "emphasizedKeywords": ["Zoho CRM"],
  "rating": null,
  "reviewCount": null,
  "sitelinks": [],
  "countryCode": "us",
  "languageCode": "en",
  "scrapedAt": "2026-11-04T10:08:31.903Z",
  "page": 1,
  "device": "DESKTOP",
  "searchUrl": "https://www.google.com/search?q=best%20crm%20software&hl=en&gl=us"
}
```

#### SERP features row

With `includeSerpFeatures` on, each query also gets one row with `type: "serp"`. Real row from the same run, with its lists shortened here:

```json
{
  "query": "best crm software",
  "type": "serp",
  "device": "DESKTOP",
  "countryCode": "us",
  "languageCode": "en",
  "relatedQueries": [
    { "title": "Best crm software free", "url": "https://www.google.com/search?q=Best+crm+software+free" }
  ],
  "peopleAlsoAsk": [
    { "question": "What are the four types of CRM?" },
    { "question": "What is the #1 CRM platform?" }
  ],
  "paidResults": [
    {
      "adPosition": 1,
      "block": "bottom",
      "title": "All-in-one CRM - CRM Software Made Easy",
      "url": "https://www.vtiger.com/",
      "domain": "vtiger.com",
      "displayedUrl": "https://www.vtiger.com › crm › software",
      "description": "Simplify marketing, sales & support with one CRM. No credit card needed! Powerful, easy CRM trusted by 400K+ businesses. Start your 15-day free trial. Get demo! Start Your Free Trial."
    }
  ],
  "paidProducts": [],
  "aiOverview": {
    "text": "Choosing the best CRM (Customer Relationship Management) software depends heavily on your company size, budget, and primary goals (such as sales pipelines, customer support, or marketing automation).",
    "sources": [
      {
        "title": "Choosing The Best CRM Software In 2026 | Salesforce",
        "url": "https://www.salesforce.com/crm/best-crm/",
        "domain": "salesforce.com",
        "snippet": "Salesforce Core Purpose: Unified customer view, profitability, and workflow alignment across sales, marketing, and service. Key Features: Sin..."
      }
    ]
  },
  "knowledgePanel": null,
  "scrapedAt": "2026-11-04T10:08:44.318Z"
}
```

#### Output schema

Organic rows:

| Field | Type | Description |
| --- | --- | --- |
| `query` | string | The search term this result belongs to. |
| `position` | integer | Organic rank within the query, across pages. |
| `title` | string | Result title. |
| `url` | string (URL) or null | Destination URL. Occasionally null when Google doesn't expose the link; `domain` and `displayedUrl` still identify the result. |
| `domain` | string | Domain of the result. |
| `displayedUrl` | string | The URL as shown in the results. |
| `snippet` | string | Description shown under the title. |
| `type` | string | `organic`. |
| `siteName` | string | Site name shown by Google. |
| `date` | string or null | Publish date shown in the snippet. |
| `emphasizedKeywords` | array | Words Google highlighted in the snippet. |
| `rating` | number or null | Rating, when shown. |
| `reviewCount` | integer or null | Review count, when shown. |
| `sitelinks` | array | Sub-links under the result, with title, URL and description. |
| `countryCode` | string | Country used for the search. |
| `languageCode` | string | Interface language used. |
| `scrapedAt` | string (ISO date) | When the result was collected. |
| `page` | integer | Google results page, starting at 1. |
| `device` | string | `DESKTOP` or `MOBILE`. |
| `searchUrl` | string (URL) | The Google Search URL of that page. |
| `htmlSnapshotUrl` | string (URL) | Link to the stored page HTML, when enabled. |

SERP features rows:

| Field | Type | Description |
| --- | --- | --- |
| `query`, `device`, `countryCode`, `languageCode`, `searchUrl`, `scrapedAt` | mixed | Same as above. |
| `type` | string | `serp`. |
| `relatedQueries` | array | Related keywords, each with `title` and `url`. |
| `peopleAlsoAsk` | array | Questions, each with `question`. |
| `paidResults` | array | Ads with `adPosition`, `block`, `title`, `url`, `domain`, `displayedUrl`, `description`. |
| `paidProducts` | array | Product ads with `title`, `price`, `originalPrice`, `merchant`, `domain`. |
| `aiOverview` | object or null | `text` and `sources` (each with `title`, `url`, `domain`, `snippet`). |
| `knowledgePanel` | object or null | `title`, `subtitle`, `description`, `website`, `facts`. Panels about individual people are not returned. |

### Need more Google data?

- [Google Maps Scraper](https://apify.com/hipersoft/google-maps-scraper)
- [Google News Scraper](https://apify.com/hipersoft/google-news-scraper)
- [Google Trends Scraper](https://apify.com/hipersoft/google-trends-scraper)
- [Google Autocomplete Scraper](https://apify.com/hipersoft/google-autocomplete-scraper)
- [Google Ads Transparency Scraper](https://apify.com/hipersoft/google-ads-transparency-scraper)

### FAQ

**How much does scraping Google Search cost?**
You pay per result delivered and per results page that produced results; see the Pricing tab for current prices. Failed or empty searches aren't billed for results or pages. If Google shows fewer than 10 organic results on a page, extra pages may be read to reach your count, and those extra pages aren't billed. With `includeSerpFeatures`, the features row counts as one result, and only when it has content.

**Will I go over my budget?**
No. When your maximum cost per run is reached, the run stops cleanly and keeps only the results that were paid for.

**How many results can I get per query?**
Up to 500, as far as Google paginates for that keyword. Google often ends well before that, and `site:` searches can end early. You get what Google returns, and you can pass many queries in one run.

**Can I get ads and People Also Ask results?**
Yes. Turn on `includeSerpFeatures`. Google decides per search whether ads are shown, so the same keyword can show different ads between runs. People Also Ask returns the questions, without the expanded answers.

**Does it capture the Google AI Overview?**
Yes, when the results page includes one. Google doesn't show an AI Overview for every keyword or every search. Answers from Google AI Mode, ChatGPT, Perplexity or other AI search tools are not included.

**Can I target a country, city or language?**
Yes. Use `countryCode`, `languageCode`, `searchLanguage` and `googleDomain`. `locationUule` adds a location hint, which Google applies loosely.

**Can I use my existing Google Search URLs?**
Yes. Paste them into `queries` and their parameters are kept.

**How fresh is the data?**
Every run reads live search results. Rankings vary between searches, as they do for any Google user.

**Is it legal to scrape Google Search?**
The Actor returns publicly visible search results and doesn't return panels about individual people. You're responsible for complying with Google's terms and the laws that apply to your use. Results can contain personal data if a page Google ranks does, so consult your lawyer if that applies to you.

**Can Google Search Scraper connect to my other tools?**
The Google Search Scraper can be connected with almost any cloud service or web app thanks to [integrations on the Apify platform](https://apify.com/integrations). It works with [Make](https://apify.com/integrations/make), [Zapier](https://apify.com/integrations/zapier), [Slack](https://docs.apify.com/platform/integrations/slack), [Airbyte](https://docs.apify.com/platform/integrations/airbyte), [GitHub](https://docs.apify.com/platform/integrations/github), [Google Drive](https://docs.apify.com/platform/integrations/drive) and [many more](https://apify.com/integrations), plus the [Apify API](https://docs.apify.com/api/v2), JavaScript/Python clients and MCP. Or use [webhooks](https://docs.apify.com/platform/integrations/webhooks) to trigger an action whenever a run finishes.

### Related Actors

- [Website Contact Scraper](https://apify.com/hipersoft/website-contact-scraper)
- [Tech Stack Detector](https://apify.com/hipersoft/tech-stack-detector)
- [Web to Markdown](https://apify.com/hipersoft/web-to-markdown)
- [Google Shopping Scraper](https://apify.com/hipersoft/google-shopping-scraper)

### Notes

Original clean-room implementation. Returns only public data; you are responsible for compliance with Google's terms. Not affiliated with Google.

# Actor input Schema

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

One or more Google search queries, each scraped separately. You can also paste full Google Search URLs (any country domain) and advanced operators such as site:example.com or "exact phrase".

## `resultsPerQuery` (type: `integer`):

Number of organic results to collect per query, up to 500. You are billed for at most one page per 10 requested results.

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

Optional. Collect this many Google pages per query (about 10 results each) instead of a result count. Overrides Results per query.

## `includeSerpFeatures` (type: `boolean`):

Adds one extra row per query with type "serp" holding related queries, People Also Ask questions, paid results, product ads, the AI Overview and the knowledge panel when Google shows them. That row is billed as one result, and only when it has content.

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

Two-letter country code for geolocated results (Google gl parameter), e.g. us, gb, de.

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

Language of the Google interface (Google hl parameter), e.g. en, es, de, zh-CN.

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

Only return pages written in this language (Google lr parameter), e.g. de, fr, ja, zh-CN.

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

Google country domain to search, e.g. google.co.uk, google.de, google.com.au. Defaults to google.com.

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

Google UULE location code (Google uule parameter), e.g. w+CAIQICIfU2VhdHRsZSxXYXNoaW5ndG9uLFVuaXRlZCBTdGF0ZXM for Seattle. Google biases results toward the place but does not limit them to it.

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

Return the mobile version of the results instead of desktop.

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

Limit results to one site, e.g. example.com (adds site:example.com).

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

Find pages related to a site, e.g. example.com. Ignored when Only this site is set.

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

Search for the exact phrase by wrapping each query in quotes. May return fewer results.

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

Only pages with these words in the title (intitle:).

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

Only pages with these words in the body text (intext:).

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

Only pages with these words in the URL (inurl:).

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

Only files of these types, e.g. pdf, docx, xlsx, csv (filetype:). Several types are combined with OR.

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

Only recent results: h, d, w, m or y plus an optional number, e.g. d7 for the past 7 days, w2 for 2 weeks, m6 for 6 months, y1 for a year.

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

Only results after this date: an absolute date such as 2026-01-31, or relative such as 8 days or 3 months.

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

Only results before this date: an absolute date such as 2026-01-31, or relative such as 8 days or 3 months.

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

Include the similar and lower-quality results Google normally hides.

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

Store the HTML of each results page in the run's key-value store and add a link to it (htmlSnapshotUrl) on each result.

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

How many queries to run in parallel.

## Actor input object example

```json
{
  "queries": [
    "site:example.com pricing"
  ],
  "resultsPerQuery": 10,
  "includeSerpFeatures": true,
  "countryCode": "us",
  "languageCode": "en",
  "mobileResults": false,
  "forceExactMatch": false,
  "includeUnfilteredResults": false,
  "saveHtmlToKeyValueStore": false,
  "maxConcurrency": 5
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `serpFeatures` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "queries": [
        "best crm software",
        "site:apify.com pricing"
    ],
    "includeSerpFeatures": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("hipersoft/google-search-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "queries": [
        "best crm software",
        "site:apify.com pricing",
    ],
    "includeSerpFeatures": True,
}

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

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "queries": [
    "best crm software",
    "site:apify.com pricing"
  ],
  "includeSerpFeatures": true
}' |
apify call hipersoft/google-search-scraper --silent --output-dataset

```

## MCP server setup

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

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/963u5AQmglYylRHhp/builds/QiDXGMYfg8FNbgHN7/openapi.json
