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

Scrape Google Search results (SERP) for any keyword: organic rank, title, real URL, snippet, date, sitelinks, related searches and AI Overview, page after page, any country and language. Fast, cheap, no login.

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

## Pricing

from $0.12 / 1,000 search results

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: Google SERP results by keyword

Type keywords, get Google's organic results in Google's order: rank, title, the real destination URL, snippet, date, sitelinks, related searches and the AI Overview, in any country and language.

| Query | Rank | Title | Domain | Snippet | Date |
|---|---|---|---|---|---|
| best crm | 1 | The Best 21 CRM Systems in 2026 - Axon Garside | axongarside.com | The Best 21 CRM Systems in 2026 · 1. HubSpot CRM · 2. Salesforce CRM · 3. Pipedrive · 4. Zoho · 5. Monday.com CRM... | Jun 16, 2025 |
| best crm | 2 | Best CRM Tools for Small Businesses | boostedcrm.com | Zoho CRM is renowned for its robust functionality and affordability, making it one of the best CRM solutions available... | Mar 27, 2025 |
| best crm | 3 | What's the best CRM software on the market? - G2 | g2.com | the best solutions seem to be: Salesforce Sales Cloud. Salesforce Sales Cloud was ranked as the top software product... | Apr 1, 2025 |

<sub>Collected 2026-10-30 (US, English, page 1).</sub>

**$0.15 per 1,000 results on Starter** ($0.18 Free, $0.13 Scale, $0.12 Business). The prefilled run (5 queries, 2 pages each, about 95 results) costs about $0.014. No login, no API key; failed and empty searches are free.

#### What you get (a real row, `email marketing software`, US, English, page 1)

```json
{
  "searchQuery": "email marketing software",
  "countryCode": "us",
  "languageCode": "en",
  "page": 1,
  "position": 1,
  "positionOnPage": 1,
  "type": "organic",
  "isPaid": false,
  "title": "13 Best Free Email Marketing Platforms Compared [2026] - Mailtrap",
  "url": "https://mailtrap.io/blog/free-email-marketing-platforms/",
  "domain": "mailtrap.io",
  "displayedUrl": "mailtrap.io › blog › free-email-marketing-platforms",
  "description": "Mailmodo is an email marketing software that helps businesses create, automate, and optimize email campaigns using AI. It combines AI-powered...",
  "date": "Jun 18, 2026",
  "sitelinks": [],
  "searchUrl": "https://www.google.com/search?q=email+marketing+software&hl=en&gl=us",
  "scrapedAt": "2026-10-29T23:32:49+00:00",
  "relatedQueries": ["Email marketing software free", "Best email marketing software",
                     "Best email marketing software for small business", "Types of email marketing software"],
  "aiOverview": {
    "text": "Choosing the right email marketing software depends on your business model, budget, and automation needs. ...",
    "sources": [
      {"title": "10 Best Email Marketing Software for...", "source": "Venture Harbour",
       "url": "https://ventureharbour.com/email-marketing-software-tools-one-best/"}
    ]
  }
}
```

Top of `crm software` (US, same run): 1 technologymagazine.com, 2 getvoip.com, 3 uschamber.com, 4 striven.com,
5 youtube.com, 6 wrike.com, 7 softwareadvice.com, 8 softr.io, 9 techradar.com.

A result with sitelinks (`email marketing software`, position 8):

```json
{"title": "5 Best Email Marketing Platforms in 2026 (Inbound/Outbound)",
 "url": "https://blog.answersocrates.com/best-email-marketing-platforms/",
 "sitelinks": [{"title": "1. Mailmodo: Best Ai-Powered...",
                "url": "https://blog.answersocrates.com/best-email-marketing-platforms/#:~:text=1.%20Mailmodo..."}]}
```

#### Why this scraper

- **Real URLs.** Google no longer puts the destination in its result links; every result here carries the page's
  real URL and its domain, not a Google redirect.
- **AI Overview and related searches included**, at no extra charge, on the first result of each page.
- **Fast.** The first results are saved within seconds; queries run in parallel.
- **Google's order kept.** `position` counts across pages (11 = the first result of page 2), `positionOnPage` within
  the page; every row says which query, country, language and page it came from.
- **Charged once.** The same result is never saved or charged twice, even when the run restarts.

#### Input

| Field | What it does |
|---|---|
| Search queries | One keyword per line, as you would type it into Google, operators included (see below). Duplicates are searched once. |
| Pages per query | Result pages to read per query (about 10 results each). |
| Maximum results | Stop after this many results across all queries. |
| Country / Language | Google's `gl` and `hl` codes, e.g. `us` / `en`, `de` / `de`, `gb` / `en`. |
| Page type | **Basic** (default): results, related searches and AI Overview. **Full**: also People also ask and emphasized keywords for page 1 (one extra page per query). |

#### Search operators

Next to keywords, Google's default answer treats operators as optional: `site:linkedin.com/in/ Stripe` comes back mostly
from other sites, in a browser too. So a query with operators is asked the way Google keeps them. Plain keywords stay on
Google's default answer.

| In your query | How it is asked | What to expect |
|---|---|---|
| `site:`, `-site:`, `"quotes"`, `intitle:`, `allintitle:`, `-word`, `OR`, `after:`, `before:`, `filetype:`, `ext:`, `intext:`, `allintext:` | Google's Verbatim tool | Strict. The other words match as typed: no synonyms and no spelling fixes |
| `inurl:`, `allinurl:` | Google's Web filter (reads Google's full page, so these queries are a little slower) | Google treats it as a hint, not a rule: many results don't have the word in their URL, and next to `site:` later pages can leave the site. Check `operatorMatch` |

- **`operatorMatch`** on each row: `true` or `false` when the real URL meets or misses the query's `site:` and `inurl:`
  terms, `null` when the query has none. Rows marked `false` are still Google's results in Google's order and are charged
  like the others; the run's status says how many there are, and `OUTPUT` counts them per query (`offTarget`).
- Google shows AI Overview, related searches and People also ask less often for these queries. `inurl:` queries have no
  related searches at all.
- Google's index is what limits them: a `site:` query returns what Google has indexed there, not everything on the site.

#### Output fields

| Field | Meaning |
|---|---|
| `searchQuery`, `countryCode`, `languageCode`, `page` | Where the result came from |
| `position`, `positionOnPage` | Google's rank across pages / within the page |
| `title`, `url`, `domain`, `displayedUrl` | The result, its real URL and the breadcrumb Google shows |
| `description`, `date` | The snippet and its date when Google shows one ("3 days ago", "Jun 18, 2026") |
| `operatorMatch` | Whether the real URL meets the query's `site:` and `inurl:` terms; `null` when it has none |
| `sitelinks` | Extra links Google shows under the result (title, URL) |
| `type`, `isPaid` | `organic` (Google shows no ads on the pages this reads) |
| `relatedQueries`, `relatedSearches` | "People also search for": the query texts, and each with its Google search URL (`query`, `url`; first row of each page) |
| `aiOverview` | The AI Overview text and its sources (first row of each page, when Google shows one) |
| `peopleAlsoAsk` | The People also ask questions (Full page type, first row of page 1) |
| `emphasizedKeywords` | The words Google emphasises in the snippet (Full page type, page 1; `null` when Google's full page doesn't show that result's snippet, the basic page has no emphasis) |
| `searchUrl`, `scrapedAt` | The Google page this came from, and when |

The dataset has three views: Results, Results with sitelinks, and Related searches / AI Overview / People also ask.

#### Status and errors

The run's status says how many results each query gave. A query Google has no results for is reported as such (not
an error, and free). Narrow operator queries often end that way. If Google is refusing IPs, the run slows down and keeps
what it gets; if it could deliver nothing, it stops with a status that starts NO RESULTS, charges nothing and lists the
unfinished queries in OUTPUT. If Google changes its page or its check so results can't be read, the run says so plainly
and fails. It never returns a quiet empty dataset.

#### FAQ

**Do I need a Google account or an API key?** No.

**How many results per page?** Google shows about 10 organic results per page (9-10 on page 1 when an AI Overview is
shown). Use more pages for deeper rankings.

**Can I track rankings over time?** Yes: schedule the Actor with the same queries; `position` and `url` make each
day's ranking comparable.

# Actor input Schema

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

Keywords to search on Google, one per line, exactly as you would type them. site:, quotes, intitle:, -word, OR, after:, before: and filetype: are kept strict (the other words then match as typed). Google treats inurl: as a hint: each result says if it matched in operatorMatch. Each query's results keep Google's order.

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

How many Google result pages to read per query (about 10 results each). Page 1 = the top 10.

## `maxResults` (type: `integer`):

Stop after this many results across all queries. Empty = no limit.

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

Two-letter country code Google localizes results for (gl), e.g. us, gb, de, fr, in.

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

Two-letter language code for Google's interface and results (hl), e.g. en, de, fr, es.

## `pageType` (type: `string`):

Basic (recommended): organic results with real URLs, snippets, dates, sitelinks, related searches and the AI Overview summary, fast and light. Full: also reads Google's full page 1 of each query for the People also ask questions and the emphasized keywords of each snippet (one extra page per query, slower).

## Actor input object example

```json
{
  "queries": [
    "crm software",
    "project management software",
    "email marketing software",
    "web hosting",
    "accounting software"
  ],
  "maxPagesPerQuery": 2,
  "countryCode": "us",
  "languageCode": "en",
  "pageType": "basic"
}
```

# Actor output Schema

## `results` (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": [
        "crm software",
        "project management software",
        "email marketing software",
        "web hosting",
        "accounting software"
    ],
    "maxPagesPerQuery": 2
};

// Run the Actor and wait for it to finish
const run = await client.actor("deepmine/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": [
        "crm software",
        "project management software",
        "email marketing software",
        "web hosting",
        "accounting software",
    ],
    "maxPagesPerQuery": 2,
}

# Run the Actor and wait for it to finish
run = client.actor("deepmine/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": [
    "crm software",
    "project management software",
    "email marketing software",
    "web hosting",
    "accounting software"
  ],
  "maxPagesPerQuery": 2
}' |
apify call deepmine/google-search-scraper --silent --output-dataset

```

## MCP server setup

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