# Google Search Scraper (`vortex_data/google-search`) Actor

Fast Google SERP scraper for SEO teams, marketers, and agencies. Collect live organic rankings, ads, People Also Ask, related searches, and knowledge panels by keyword, country, and language in clean page-based output.

- **URL**: https://apify.com/vortex\_data/google-search.md
- **Developed by:** [VortexData](https://apify.com/vortex_data) (community)
- **Categories:** SEO tools, Developer tools, Automation
- **Stats:** 35 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

### What does Google Search Results Scraper do?

Google Search Results Scraper collects live [Google Search](https://www.google.com/search?q=nike) SERP data for any keyword. Use it to monitor SEO rankings, analyze competitors, discover keyword ideas, check search ads, or build search result reports without opening Google manually.

Enter one or more search terms, choose a country, language, and result depth, then download structured results from Apify in JSON, CSV, Excel, HTML, XML, or RSS.

### Why use this Google SERP scraper?

- 🔎 **Live Google results** for keywords, brands, products, locations, and competitors
- 📈 **SEO-ready output** with positions, titles, URLs, descriptions, ratings, reviews, and sitelinks
- 📢 **Ads and shopping results** when they appear on the page
- ❓ **People Also Ask**, related searches, and knowledge panel data
- 🌍 **Localized SERPs** by country and language
- 📄 **Simple page-based rows**: page 1, page 2, page 3, and so on

### How to scrape Google Search results

1. Add keywords in **Search queries**. Use one search per line.
2. Choose **Results to request**: `10`, `20`, `30`, `40`, `50`, `100`, or `all`.
3. Select **Country** and **Language**.
4. Optionally enable mobile results, freshness filters, exact match, site search, or file type filters.
5. Click **Start** and export the dataset.

### Input example

```json
{
  "keyword": "nike\nbest running shoes",
  "limit": "20",
  "country": "US",
  "language": "en"
}
```

With this input, the Actor collects the first two Google results pages for each keyword.

### Output example

Each dataset item represents one Google results page.

```json
{
  "page_number": 1,
  "search_term": "nike",
  "results": [
    {
      "position": 1,
      "title": "Nike. Just Do It. Nike.com",
      "url": "https://www.nike.com/",
      "description": "Inspiring the world's athletes, Nike delivers innovative products, experiences and services."
    }
  ],
  "related_keywords": {
    "keywords": [
      { "position": 1, "keyword": "Nike shoes" }
    ]
  },
  "next_page": 2,
  "next_start": 10
}
```

### What can you use the data for?

- 📊 Track keyword rankings over time
- 🥊 Compare your website with competitors
- 🔁 Find related search terms for content planning
- 📢 Review ads shown for commercial keywords
- ❓ Collect People Also Ask questions for FAQs
- 🌍 Compare SERPs across countries and languages

### Notes

Google results can vary by location, language, device, personalization, and time. For audits or debugging, enable **Save page snapshots** to keep the original Google HTML returned during the run.

# Actor input Schema

## `keyword` (type: `string`):

Enter one Google search per line. You can also paste a full Google Search URL.

## `limit` (type: `string`):

How many results to request per search. Each 10 results equals one Google page. Select all to collect up to the standard Google result depth.

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

Two-letter country code such as US, GB, DE, FR, CA, AU, or BR. This selects the Google country domain and local results.

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

Language of the Google interface and result hints.

## `dateRange` (type: `string`):

Limit results to a recent time period.

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

Fetch the mobile version of Google results.

## `exactMatch` (type: `boolean`):

Search for each query as an exact phrase.

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

Limit results to a single domain, for example example.com.

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

Optional file extensions such as pdf, docx, xlsx, or csv.

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

Ask Google to include similar results that are normally hidden.

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

Keep a copy of the original Google page. Useful when you want to review exactly what was returned.

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

How many searches can run at the same time. Keep the default unless you are running a large list.

## `requestTimeoutSecs` (type: `integer`):

Maximum time in seconds to wait for one Google response.

## `maxRequestRetries` (type: `integer`):

How many times to retry a failed search before saving an error row.

## Actor input object example

```json
{
  "keyword": "Nike\nbest SEO tools",
  "limit": "10",
  "country": "US",
  "language": "en",
  "dateRange": "any",
  "mobileResults": false,
  "exactMatch": false,
  "site": "example.com",
  "fileTypes": [],
  "includeUnfilteredResults": false,
  "saveHtmlToKeyValueStore": false,
  "maxConcurrency": 5,
  "requestTimeoutSecs": 60,
  "maxRequestRetries": 2
}
```

# Actor output Schema

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

Main table with one row per Google results page.

## `htmlSnapshots` (type: `string`):

Key-value store records. Present only when HTML snapshots are enabled.

# 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 = {
    "keyword": `Nike
best SEO tools`
};

// Run the Actor and wait for it to finish
const run = await client.actor("vortex_data/google-search").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 = { "keyword": """Nike
best SEO tools""" }

# Run the Actor and wait for it to finish
run = client.actor("vortex_data/google-search").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 '{
  "keyword": "Nike\\nbest SEO tools"
}' |
apify call vortex_data/google-search --silent --output-dataset

```

## MCP server setup

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

```

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/5eKuJAu52NAq22uVG/builds/ktAHaBrWiXzY6cAaF/openapi.json
