# Google SERP Scraper: Results, People Also Ask & AI Overviews (`vncntlabs/google-serp-scraper`) Actor

Scrape Google search results for up to 1,000 queries: every organic result with position, title, URL, domain and snippet, plus People Also Ask, related searches, AI Overviews with sources, featured snippets, local pack and ads. Any country, city, language or device. Pay per page.

- **URL**: https://apify.com/vncntlabs/google-serp-scraper.md
- **Developed by:** [VNCNT Labs](https://apify.com/vncntlabs) (community)
- **Categories:** SEO tools, Marketing, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 search results page (10 results)s

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/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 SERP Scraper: Results, People Also Ask & AI Overviews

Put in your search queries and get **Google's results page as clean data**: every organic result with its **position, title, URL, domain, snippet, date and sitelinks**, plus one summary row per query with **People Also Ask questions, related searches, the AI Overview and the sites it cites, the featured snippet, the local pack (map results), ads, videos and top stories**.

Search from **any country, city or region, in any language, on desktop or mobile**, from the top 10 to the top 100. Up to 1,000 queries per run. No proxies, no CAPTCHAs, no Google account. **$2 per 1,000 result pages**, and you only pay for pages Google actually had.

Built for:

- **SEO and content teams**: see who ranks for your keywords, which questions people ask, and which sites Google's AI Overview cites.
- **Agencies and freelancers**: pull local results for a client's city ("plumber near me" in Columbus) without a VPN.
- **Etsy, Amazon and print-on-demand sellers**: find the guides, marketplaces and competitors that own the search results in your niche.
- **Developers and AI agents**: one call returns structured JSON for a rank checker, a content brief or a research agent.

### What you get

| Row (`type`) | What's in it | Charged |
|---|---|---|
| `organic` | `query`, `position`, `absolutePosition`, `page`, `title`, `url`, `domain`, `domainFrom`, `breadcrumb`, `websiteName`, `description`, `date`, `isFeaturedSnippet`, `isVideo`, `rating`, `ratingCount`, `sitelinks`, `urlIsGoogleRedirect`, `country`, `location`, `device`, `checkedAt` | covered by the page price |
| `serp` (one per query) | `status`, `organicCount`, `topDomains`, `aiOverview` (`text`, `sources`, `loadedAsync`), `featuredSnippet`, `peopleAlsoAsk` (`question`, `answer`, `url`), `relatedSearches`, `peopleAlsoSearch`, `localPack` (`title`, `phone`, `rating`, `reviews`, `url`), `ads`, `videos`, `topStories`, `knowledgeGraph`, `serpFeatures`, `totalResults`, `spellCorrection`, `googleUrl`, `pagesCharged`, `chargedEvents` | `search-page` per page of 10 results |
| `skipped` | inputs that weren't searched, with the reason (duplicates, search operators, too long) | free |

Turn off **One row per organic result** to get one row per query with the results nested in `organicResults`.

**About `domain`:** Google now shows some organic links as `google.com/goto?url=...` redirects. For those, `url` is the link Google served, `urlIsGoogleRedirect` is `true`, and `domain` is the real site taken from the breadcrumb or site name Google displays (`domainFrom` says which). If Google gives no clue, `domain` is empty rather than wrongly saying google.com.

### Input examples

Page 1 for a few queries, in about 30 seconds:

```json
{ "queries": ["how to sell on etsy", "best print on demand companies"], "resultsPerQuery": 10, "fastMode": true }
```

Top 30 local results on mobile:

```json
{ "queries": ["plumber near me", "emergency electrician"], "resultsPerQuery": 30,
  "location": "Columbus,Ohio,United States", "device": "mobile" }
```

Top 100 in Germany, in German:

```json
{ "queries": ["laufschuhe test"], "resultsPerQuery": 100, "country": "Germany", "language": "de" }
```

**Tips**

- **Results per query** is your cost dial: top 10 = 1 page ($0.002), top 100 = 10 pages ($0.02). Google sometimes has fewer pages than you ask for, and you're only charged for the pages it returned.
- Without fast mode, results usually take 1 to 5 minutes, which is fine for big or scheduled batches. Fast mode gets them in about 30 seconds for $0.0012 more per page.
- Plain queries only. `site:`, `intitle:`, `inurl:` and similar operators are skipped (free) because the data provider bills them at 5x.
- For a city, use `City,Region,Country`, like `Austin,Texas,United States` or `Manchester,England,United Kingdom`.
- Some AI Overviews load after the page does. Those show `loadedAsync: true` with their sources when Google included them, and no text.

### Output examples

An organic row (real output, Oct 31 2026):

```json
{
  "type": "organic", "query": "how to sell on etsy", "position": 1, "absolutePosition": 3, "page": 1,
  "title": "The Beginner's Guide to Selling on Etsy", "url": "https://google.com/goto?url=CAESfQHrOzAV...",
  "domain": "emilyretro.com", "domainFrom": "breadcrumb",
  "breadcrumb": "https://www.emilyretro.com › blog › beginners-guide-t...", "urlIsGoogleRedirect": true,
  "description": "You have to create an invoice on Paypal, send it and then wait for them to pay...",
  "sitelinks": [], "country": "United States", "device": "desktop", "checkedAt": "2026-10-31T13:54:44Z"
}
```

The summary row for the same query (trimmed):

```json
{
  "type": "serp", "query": "how to sell on etsy", "status": "ok", "organicCount": 7, "pagesCharged": 1,
  "topDomains": ["emilyretro.com", "createandthrive.com", "youtube.com", "reddit.com", "quora.com"],
  "aiOverview": { "present": true, "loadedAsync": false,
                  "text": "To begin selling on Etsy, go to the [Etsy Sell Page](https://www.etsy.com/sell) to register...",
                  "sources": [{ "domain": "etsy.com", "url": "https://www.etsy.com/sell",
                                "title": "How to sell on Etsy United States", "source": "Etsy" }] },
  "peopleAlsoAsk": [{ "question": "Do Etsy inform HMRC?", "answer": null, "url": null, "domain": null }],
  "relatedSearches": ["How much does it cost to sell on Etsy", "How to sell on Etsy digital products"],
  "localPack": [], "ads": [],
  "serpFeatures": ["ai_overview", "video", "organic", "people_also_ask", "discussions_and_forums", "related_searches"],
  "chargedEvents": ["search-page", "fast-mode"]
}
```

People Also Ask answers are filled in when Google puts the answer text on the page. Many now load as AI answers after the page does, so `answer` is often empty while the question is always there.

The dataset has four views: **Overview**, **SERP features per query**, **Organic results** and **Questions and related searches**. Export to CSV, Excel or JSON, or send results to Google Sheets, Slack or email with Apify integrations. The run summary (counts per SERP feature, cost, warnings) is in the `OUTPUT` record.

### Pricing (pay per event)

| Event | Price | When it is charged |
|---|---|---|
| Actor start | $0.005 | once per run |
| `search-page` | $0.002 | one page of up to 10 organic results for one query, with all of that query's SERP features |
| `fast-mode` | $0.0012 | only with fast mode on, per charged page |

So 100 queries at the top 10 cost $0.205, and 100 queries at the top 100 cost $2.005. With fast mode, 100 queries at the top 10 cost $0.325.

You are not charged for:

- queries Google has no results for, searches that fail, and pages Google didn't have;
- skipped inputs, and anything beyond your run's maximum charge. The run stops at your maximum charge and lists what it didn't search.

**Apify free plan:** 20 queries and the top 30 results per query per run. Any paid Apify plan unlocks 1,000 queries and the top 100.

### Use from AI agents (MCP)

AI assistants such as Claude, ChatGPT and Cursor can run this Actor through [Apify's MCP server](https://docs.apify.com/platform/integrations/mcp) (`https://mcp.apify.com`). The agent can look up the Actor, read its input schema, run it and read the results. Runs use your own Apify account and are charged at the prices on this page.

- **Actor name:** `vncntlabs/google-serp-scraper`
- **Server URL with only this tool:** `https://mcp.apify.com?tools=vncntlabs/google-serp-scraper`. The default `https://mcp.apify.com` also works; the agent can then search Apify Store and call the Actor by name.
- **Claude** (desktop app or claude.ai): Settings > Connectors > Add custom connector, paste the server URL, then sign in to Apify.
- **ChatGPT:** turn on Developer mode, then Settings > Apps & Connectors > Create, paste the server URL and choose OAuth.
- **Cursor:** run `/add-plugin apify` in Cursor chat and connect the Apify MCP server under Cursor Settings > Tools & MCPs, or add the server to `mcp.json`:

```json
{ "mcpServers": { "apify": { "url": "https://mcp.apify.com?tools=vncntlabs/google-serp-scraper" } } }
```

Example prompt: *"Use the Apify Actor vncntlabs/google-serp-scraper to get the top 10 Google results and People Also Ask questions for 'best print on demand companies', then outline an article that covers what the top pages miss."*

To cap the cost of an agent's run, it can pass `maxTotalChargeUsd` in the run options.

### FAQ

**Where does the data come from?** From DataForSEO's licensed Google SERP API, which loads real Google results pages for the location, language and device you pick. You get what Google showed at `checkedAt`. Results shift with time and personalisation, so two runs a few hours apart can differ a little.

**Why are some URLs google.com/goto links?** That's how Google served those results. The `domain` field still tells you the real site. Open the link in a browser and Google forwards you to the page.

**How is this different from the Google Rank Tracker?** The [Google Rank Tracker](https://apify.com/vncntlabs/google-rank-tracker) watches where one website ranks and what changed since last time. This Actor gives you the whole results page for any query, with no domain needed.

**Can I search Google Shopping, Images or News?** Use the [Google Shopping Scraper](https://apify.com/vncntlabs/google-shopping-scraper), [Google Images Scraper](https://apify.com/vncntlabs/google-images-scraper) or [Google News Scraper](https://apify.com/vncntlabs/google-news-scraper). For search demand, try [Keyword Search Volume](https://apify.com/vncntlabs/keyword-search-volume).

Questions or a field you'd like added? Email hello@vncntlabs.com.

Not affiliated with or endorsed by Google.

# Actor input Schema

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

One Google search per line, up to 1,000. Plain queries only: search operators like <code>site:</code> or <code>intitle:</code> are skipped.

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

How deep to go: 10 = page 1, 100 = the top 100. Rounded up to a multiple of 10. Each 10 results is one charged page; you only pay for pages Google actually had.

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

Google country edition.

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

For local results, e.g. <code>Austin,Texas,United States</code> or <code>London,England,United Kingdom</code> (city,region,country). Leave empty for country-wide results.

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

Optional language code (en, de, fr, es, pt-BR...). Defaults to the country's main language.

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

Desktop and mobile results often differ.

## `fastMode` (type: `boolean`):

Results in about 30 seconds instead of 1-5 minutes, at a small extra charge per page. Big scheduled batches don't need it.

## `organicRows` (type: `boolean`):

On: every organic result is its own dataset row (easy to export to a sheet), plus one summary row per query. Off: one row per query with the results nested in <code>organicResults</code>.

## Actor input object example

```json
{
  "queries": [
    "how to sell on etsy",
    "best print on demand companies"
  ],
  "resultsPerQuery": 10,
  "country": "United States",
  "device": "desktop",
  "fastMode": true,
  "organicRows": true
}
```

# Actor output Schema

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

No description

## `serp` (type: `string`):

No description

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

No description

## `summary` (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": [
        "how to sell on etsy",
        "best print on demand companies"
    ],
    "resultsPerQuery": 10,
    "fastMode": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("vncntlabs/google-serp-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": [
        "how to sell on etsy",
        "best print on demand companies",
    ],
    "resultsPerQuery": 10,
    "fastMode": True,
}

# Run the Actor and wait for it to finish
run = client.actor("vncntlabs/google-serp-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": [
    "how to sell on etsy",
    "best print on demand companies"
  ],
  "resultsPerQuery": 10,
  "fastMode": true
}' |
apify call vncntlabs/google-serp-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,vncntlabs/google-serp-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/99NDolzz9dzZI3yvd/builds/dTfZUA2yUAsPmZG9g/openapi.json
