# Google Search Results Scraper: Real SERP + AI Overview (`s_actors/google-search-scraper`) Actor

The real Google result page, not a cheap substitute: organic results with real URLs, AI Overview with sources, People also ask, local pack, products, videos, news, related searches and ads in one price. Any country and city. Rank tracker with changes. $4/1K pages.

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

## Pricing

from $3.80 / 1,000 result pages

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 Results Scraper & SERP API: Real Google, AI Overview Included

Scrape the **real Google search results page** for any keyword, country and city to Excel, CSV or JSON: organic results with their **real URLs**, the **AI Overview** answer with its source links, **People also ask**, the local pack, products, videos, news and posts, discussions, related searches and ads, all in **one price: $4 per 1,000 pages**. Add your domains and it doubles as a **Google rank tracker** that shows how each position changed since the last run.

```json
{ "queries": ["best running shoes"], "maxPagesPerQuery": 1, "country": "us" }
```

#### Real Google, not a cheap substitute

Google stopped serving its results page to simple scripts in 2025. Since then a "Google search API" can only be cheap if it doesn't actually read Google. Many low-priced scrapers return results from **Google Programmable Search (CSE), DuckDuckGo or Startpage** instead, or a stripped-down mobile page. The ranking differs from what people see on google.com, and AI Overview, People also ask, the local pack and the other blocks are missing.

This Actor reads the **same desktop result page your customers see** on google.com, google.co.uk or google.de, pinned to the **country and city** you choose, and checks every page really comes from that market (Google otherwise answers for the proxy's country). That costs more to run, and the price reflects it. In return, every block of the page is included:

| | This Actor | Cheap "Google" scrapers | Big SERP scrapers with add-ons |
|---|---|---|---|
| Source | ✅ **Real google.com desktop page** | ⚠️ Often CSE, DuckDuckGo, Startpage or a light mobile page | ✅ Real page |
| Ranking matches google.com | ✅ | ⚠️ Different order | ✅ |
| Organic results with real URLs, dates, ratings, sitelinks | ✅ | ⚠️ Title, URL, snippet | ✅ |
| **AI Overview** text + source links | ✅ **Included** | ❌ | ⚠️ +$2 per 1,000 |
| People also ask, related searches | ✅ Included | ❌ | ✅ |
| Local pack (places, rating, reviews, address) | ✅ Included | ❌ | ✅ |
| Products, videos, news, posts, forum discussions | ✅ Included | ❌ | ⚠️ Some |
| Ads (paid results) | ✅ Included when Google shows them, never extra | ❌ | ⚠️ +$5 per 1,000 pages, charged per attempt |
| City-level location (`Austin, Texas`) | ✅ | ⚠️ Country at best | ✅ |
| Rank tracker with change since last run | ✅ Built in | ❌ | ❌ |
| Price per 1,000 result pages | **$4, everything included** | $0.50-$1.50 | $2.50 + add-ons (up to $9.50 with AI Overview and ads) |

#### What you get

**One row per result page** (about 10 organic results), with every Google block as a list. Real example, "best running shoes", Austin, Texas, October 2026:

| # | Title | URL | Date |
|---|---|---|---|
| 1 | The 15 Best Running Shoes of 2026 | https://www.runnersworld.com/gear/a19663621/best-running-shoes/ | Aug 3, 2026 |
| 2 | 7 Best Running Shoes in 2026 | https://runrepeat.com/guides/best-running-shoes | Sep 12, 2026 |
| 3 | What are the best running shoes that you'd actually buy again? | https://www.reddit.com/r/runninglifestyle/comments/1u5x7mx/… | |
| 4 | Best Running Shoes of the Year: 6 Top-Shelf Models | https://sixminutemile.com/post/six-of-the-best-running-shoes-of-the-year | Dec 12, 2025 |
| 6 | Men's Best Sellers Running Shoes (★ 4.7) | https://www.nike.com/w/mens-best-running-shoes-37v7jz76m50znik1zy7ok | |

The same page also had:

| Block | What came with it |
|---|---|
| `aiOverview` | "The best running shoes right now include top options like the New Balance 1080 v15 for daily comfort and the Nike Pegasus 42…", with sources newbalance.com, nike.com, hoka.com… |
| `peopleAlsoAsk` | "What are the top 5 best running shoes?", "Is Hoka or Asics better?", "What brand of shoes is best for running?" |
| `productResults` | 22 products: "Nike Men's Vomero 18", $116.97, Nike, ★ 4.7 (4,000), nearby 22 mi… |
| `relatedSearches` | "Best running shoes men", "Best running shoes long distance", "Best running shoes for beginners"… |
| `paidResults` (page 2) | Salomon "Runner's World Best New Shoe - Advanced Road Running Gear", NOBULL "Running Shoes, Built for Running & Walking" |

And for "dentist" in Austin the `localResults` pack: Lucent Dentistry ★ 4.9 (534), 3909 N Interstate Hwy 35; Access Dental ★ 3.8 (326), 1923 E 7th St; Austin Emergency Dental ★ 4.9 (849).

| Field | Description |
|---|---|
| `searchQuery` | `term`, `page`, `country`, `language`, `location`, `timeRange`, the Google `url` of the page, `googleLocation` (the place Google says it used) and `locationMatched` |
| `organicResults` | `position` (across pages: page 2 starts at 11), `title`, `url` (the real address, not a Google redirect), `domain`, `displayedUrl`, `source`, `snippet`, `date`, `rating`, `reviewsCount`, `richSnippet`, `sitelinks` |
| `aiOverview` | `text` of Google's AI Overview and its `sources` (title, url, domain); `null` when Google shows none |
| `peopleAlsoAsk` | The questions Google lists (Google loads the answers only when a question is clicked) |
| `paidResults` | Ads: `position`, `block` (top or bottom), `title`, `url`, `displayedUrl`, `domain`, `advertiser`, `description` |
| `localResults` | Map pack: `title`, `category`, `address`, `rating`, `reviewsCount`, `reviewQuote`, `kgmid` |
| `productResults` | `title`, `price`, `seller`, `rating`, `reviewsCount`, `delivery`, `nearby` |
| `videoResults` | `title`, `url`, `platform`, `channel`, `date`, `duration` |
| `storiesAndPosts` | News and social cards with the `section` they came from ("Top stories", "Latest from openai.com", "What people are saying") |
| `discussions` | "Discussions and forums": `title`, `url`, `source` (Reddit, Quora…), `community`, `comments`, `date` |
| `relatedSearches` | `query` and `sponsored` (Google's "Find related products & services" suggestions) |
| `trackedDomains` | Rank tracker: see below |
| `hasAiOverview`, `hasAds`, `blockCounts`, `hasNextPage`, `scrapedAt` | Quick filters: which blocks the page has |

Five table views: **Pages**, **Organic results** (one line per result), **AI Overview**, **People also ask** and **Rank tracker**. Prefer a flat spreadsheet? Set **Output format** to **One row per organic result**.

#### Google rank tracker

Add your site and competitors to **Track these domains**. The **Pages** table then gets a `trackedSummary` column (`runrepeat.com #2 (↑4) · nike.com #8 (=) · geico.com —`), the **Rank tracker** table one row per domain and query, and every organic result `isTrackedDomain`. Real example, same search:

| Domain | Position | URL | Previous | Change | Status |
|---|---|---|---|---|---|
| runrepeat.com | 2 | https://runrepeat.com/guides/best-running-shoes | — | — | new |
| nike.com | 6 | https://www.nike.com/w/mens-best-running-shoes-37v7jz76m50znik1zy7ok | — | — | new |
| geico.com | — | — | — | — | not found (top 19 checked) |

Schedule the run daily or weekly: `previousPosition`, `change` (+3 = moved up three places) and `status` (up, down, same, new, lost, not found) come from the last run with the same query, country, city, language and time range. Use a different **Project name** for each site or client: each keeps its own position history (shown in every row as `searchQuery.project`). **Pages per query** sets how deep to look: 1 page = top 10, 10 pages = top 100.

#### Input

| Field | Example | Notes |
|---|---|---|
| Search queries | `best running shoes`, `site:reddit.com best crm`, a Google search URL | Every Google operator works: `site:`, `"exact phrase"`, `-minus`, `intitle:`, `OR` |
| Pages per query | `3` | ~10 organic results per page (Google no longer shows 100 per page) |
| Country | `us`, `gb`, `de`, `fr`, `in`… | 32 Google markets |
| City | `Austin, Texas` | Local results and rankings as seen from that city; empty = the country's largest city |
| Language | `en`, `de`, `es`… | Empty = the country's main language |
| Time range | `week` | Past hour, 24 hours, week, month or year |

#### How it works

| Step | What happens |
|---|---|
| 1. Request | Each page is requested from Google through Apify's Google SERP proxy, with the location set to your city |
| 2. Market and city check | A page from another country or city (now and then Google ignores the location and answers for the proxy's own place) is retried, free for you; `googleLocation` shows the place Google used |
| 3. Parsing | Every block of the page is read: organic, AI Overview, People also ask, local pack, products, videos, stories, discussions, related searches, ads |
| 4. Real URLs | Google writes result links as its own redirects; the Actor resolves each to the real address |
| 5. Pages and ranks | Further pages until your limit or the last page; positions continue across pages; tracked domains are compared with the last run |

#### Pricing

Pay per event, no subscription needed. Apify Scale and Business plans pay less:

| Event | Free plan | Starter plan | Scale plan | Business plan |
|---|---|---|---|---|
| Run start | $0.001 | $0.001 | $0.001 | $0.001 |
| Result page (~10 organic results, every block included) | $0.0045 | $0.004 | $0.0039 | $0.0038 |

**1,000 result pages = $4** on Starter ($3.90 on Scale, $3.80 on Business, $4.50 on the Free plan). Top 10 for 1,000 keywords = $4; top 30 = $12. Nothing is charged extra for AI Overview, ads, People also ask, local results, products or the rank tracker. Pages Google refuses and retries are not charged. Platform usage is included. Set a maximum cost per run in the run options: the Actor stops there.

Why not cheaper? Every page is a real Google result page bought through a paid SERP proxy. Scrapers that cost a few cents per 1,000 results get them elsewhere (see the comparison above).

#### Ready-made tasks

| Task | What it does |
|---|---|
| [Google Rank Tracker for Keywords](https://apify.com/s_actors/google-search-scraper/examples/google-rank-tracker) | Positions of your site and competitors for a keyword list, and the change since the last check |

#### FAQ

**Are the results personalized?** No. Each page is requested without a Google account or history, as a new visitor from your chosen city would see it. Like on google.com itself, two checks a few minutes apart can differ by a position or two. Google also tests other versions of its results page: in our October 2026 tests about 1 in 3 checks of the same query came back as a forum- and social-heavy version (Reddit, Facebook groups, Quora on top, with a "What people are saying" block), which moves many positions. For rank tracking, schedule daily runs and look at the trend over several days, not at a single check.

**Why are there no ads on some pages?** Google shows ads to automated traffic much less often than to people: in our tests about 1 in 10 commercial queries came with ads. When Google shows them you get them, and they never cost extra. Don't rely on this Actor for complete ad monitoring; use the [Google Ads Transparency Center Scraper](https://apify.com/s_actors/google-ads-transparency-scraper) to see every ad an advertiser runs.

**Why are People also ask answers missing?** Google sends only the questions with the page; each answer loads when someone clicks it. The questions are the valuable part for content and SEO research.

**How many results per query?** About 10 per page and up to 10 pages (top ~100). Google has not offered 100 results on one page since 2025.

**Do operators work on every page?** `site:`, quotes, `-minus` and the others work on page 1. On deeper pages Google itself sometimes drops `site:` and mixes in other sites (seen in October 2026 for `site:reddit.com best crm`, page 2); check `domain` when you go past page 1.

**Mobile results?** The Actor returns desktop results, the standard for rank tracking.

**Do I need a Google account, API key or proxy?** No. Everything is included.

#### Use with the API and AI agents

Run it from the Apify API, the JavaScript or Python client, **n8n**, Make or Zapier, or from AI agents through the [Apify MCP server](https://mcp.apify.com) (Claude, ChatGPT, Cursor): fresh Google results for RAG and research agents, with AI Overview and sources. One call: `POST https://api.apify.com/v2/acts/s_actors~google-search-scraper/run-sync-get-dataset-items` with the input above returns the pages as JSON.

#### Other Google tools

| Actor | What it does |
|---|---|
| [Google AI Overview Scraper & Tracker](https://apify.com/s_actors/google-ai-overview-scraper) | Full Google AI Overview answers with real source URLs; is your brand mentioned or cited |
| [Google Jobs Scraper](https://apify.com/s_actors/google-jobs-scraper) | Jobs from every board in Google Jobs with all apply links, salary per year, job alerts |
| [Google Maps Scraper](https://apify.com/s_actors/google-maps-scraper) | Places with phone, website, rating, reviews and hours, beyond the 120 limit |
| [Google Maps Email Extractor](https://apify.com/s_actors/google-maps-email-extractor) | Emails and social profiles of local businesses |
| [Google Ads Transparency Center Scraper](https://apify.com/s_actors/google-ads-transparency-scraper) | Every ad of an advertiser with the ad copy and videos |
| [Google Shopping Price Tracker](https://apify.com/s_actors/google-shopping-price-tracker) | Google Shopping prices and sellers, price changes |
| [Google Hotels Scraper](https://apify.com/s_actors/google-hotels-scraper) | Hotel prices from every booking site |
| [Google Flights Scraper](https://apify.com/s_actors/google-flights-scraper) | Flight prices, cheapest dates, price alerts |
| [Google Play Scraper](https://apify.com/s_actors/google-play-scraper) | Apps, ratings, reviews, keyword rankings |
| [Bulk Image Downloader](https://apify.com/s_actors/bulk-image-downloader) | Google Images and image links to a ZIP file |

#### Is it legal?

The Actor reads public Google search result pages, the same pages anyone can open without logging in. Use the data according to the laws that apply to you and Google's terms. This Actor is not affiliated with Google.

# Actor input Schema

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

What you would type into Google, one per line: "best running shoes", "plumber austin", "site:reddit.com crm". Every Google operator works (site:, "quotes", -minus, intitle:, OR). You can also paste a Google search URL (https://www.google.com/search?q=...): its query, time filter and page are used.

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

Result pages to read for each query (~10 organic results per page; Google no longer shows 100 per page). 1 page = top 10, 3 = top 30, 10 = top 100. Each page is one charge. The Actor stops early when Google has no next page.

## `country` (type: `string`):

Google of this country: its domain, its market and its local results. Every page is checked to really come from this market (Google otherwise answers for the proxy IP country) and retried if not.

## `location` (type: `string`):

Search as if you were in this city: "Austin, Texas", "Manchester, England", "Munich, Bavaria". Local packs, "near me" queries and rankings follow it. Empty = the country's largest city (New York for the US, London, Berlin...).

## `language` (type: `string`):

Google interface language code (hl): en, de, fr, es, pt, it, nl, ja... Empty = the country's main language. Labels of Google blocks follow it; the results are what Google shows in that language.

## `timeRange` (type: `string`):

Only pages Google dated within this time (the "Tools > Any time" menu of Google): brand monitoring, fresh content, news.

## `outputFormat` (type: `string`):

Pages = the full page in one row, with every Google block as a list. Organic = one row per organic result (position, title, URL, snippet), easiest for Excel and Google Sheets; the other blocks are then left out. The price is per page in both cases.

## `trackDomains` (type: `array`):

Your domains and competitors, one per line: "nike.com", "runrepeat.com". Each page row gets trackedSummary ("runrepeat.com #2 (↑4) · nike.com #8 · geico.com —", in the Pages table) and trackedDomains (first page row of each query, Rank tracker table): the best position of each domain in the pages read, its URL, the position in the previous run, the change (+3 = moved up 3) and a status (up, down, same, new, lost, not found). Subdomains count (blog.nike.com = nike.com).

## `historyName` (type: `string`):

Where the Actor keeps the positions of this run, to compare them next time. previousPosition and change come from the last run with the same project name, query, country, city, language and time range. Use one name per site or client ("client-a", "shoes-us") so their histories never mix. Shown in every row as searchQuery.project.

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

Queries searched at once.

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

Log every retry and save the HTML of every result page to the run key-value store.

## Actor input object example

```json
{
  "queries": [
    "best running shoes"
  ],
  "maxPagesPerQuery": 1,
  "country": "us",
  "timeRange": "anytime",
  "outputFormat": "pages",
  "historyName": "default",
  "maxConcurrency": 5,
  "debugLog": false
}
```

# Actor output Schema

## `overview` (type: `string`):

One row per result page: which Google blocks it has.

## `organic` (type: `string`):

Every organic result: position, title, real URL, snippet, date.

## `aiOverview` (type: `string`):

Google AI Overview answer and its source links.

## `questions` (type: `string`):

People also ask questions and related searches.

## `ranks` (type: `string`):

Position of each tracked domain and the change since the last run.

## `all` (type: `string`):

Every block of every result page.

# 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 running shoes"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("s_actors/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 running shoes"] }

# Run the Actor and wait for it to finish
run = client.actor("s_actors/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 running shoes"
  ]
}' |
apify call s_actors/google-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,s_actors/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/XRAByWQqeCEr8WUbZ/builds/gbPNIHJwwIJFbwZ9x/openapi.json
