# Google Keyword Data Scraper (Bulk) (`googleapi/google-keyword-data-scraper`) Actor

Collect public Google autocomplete and search-result keyword signals in bulk for SEO research.

- **URL**: https://apify.com/googleapi/google-keyword-data-scraper.md
- **Developed by:** [Google API](https://apify.com/googleapi) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.99 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

### What does Google Keyword Data Scraper do?

This Actor analyzes keyword phrases with public [Google autocomplete](https://suggestqueries.google.com/) and [Google Search](https://www.google.com/search) pages. It returns Google's suggestions and the public result content and related modules visible for each phrase. It is intended for keyword discovery, content planning, and manual SERP research—not for inventing advertising or search-volume statistics.

Google's public pages do not expose Google Ads CPC, monthly search volume, competition scores, or paid campaign forecasts in the pages this Actor reads. Those fields are intentionally not estimated or fabricated.

### Why use Google Keyword Data Scraper?

Submit one phrase or a bounded list. Each normal dataset row combines autocomplete suggestions with the visible Google Search results for that phrase. Depending on the query and locale, the result can include organic cards, People also ask, People also search for, Related searches, videos, Top stories, discussions, Things to know, local place cards, query-refinement chips, and an AI Overview with its public citations. Modules Google does not show are represented by absent arrays and the corresponding `has...` flags; their values are never filled from unrelated sources.

Results can be localized by country and language. The Actor reads public Google pages only and does not sign in or bypass access controls. Google may limit or omit results.

### What data can it extract?

| Group | Example fields | Meaning |
| --- | --- | --- |
| Keyword and locale | `keyword`, `normalizedKeyword`, `country`, `language`, `searchLocale`, `searchEngine` | The searched phrase and requested Google locale. |
| Autocomplete | `suggestions`, `suggestionCount`, `firstSuggestion`, `containsExactSuggestion`, `exactSuggestionRank`, `suggestionDetails`, `googleVerbatimRelevance` | Google-returned phrases and ordering. Details retain raw Google relevance, type, and subtype codes when supplied, alongside documented text comparisons. Verbatim relevance belongs to the whole response; none of these scores is search volume. |
| Search estimate | `searchResultCount`, `searchResultCountText`, `searchResultCountIsApproximate` | The count phrase only when Google visibly supplies one. |
| Organic results | `organicResults`, `organicResultCount` | Rank, title, destination, display URL, domain, publisher, snippet, date text, and visible nested result links. |
| Related questions | `peopleAlsoAsk`, `peopleAlsoSearchFor`, `relatedSearches`, `thingsToKnow` | Public question prompts and related/refinement query text. |
| Search modules | `serpFeatures`, `hasAiOverview`, `hasPeopleAlsoAsk`, `hasTopStories`, `hasLocalPack`, `hasVideo` and compatibility flags | Visible module presence, not paid SEO metrics. |
| News and video | `newsResults`, `videoResults`, `discussionResults` | Visible titles, destinations, source names, date labels, snippets, durations, and engagement labels when present. |
| Local results | `localResults` | Public place names and card text, ratings, review counts, business type, price range, address, hours, service options, review excerpt, sponsorship label, and thumbnail when exposed. |
| Refinements and overview | `refinementSuggestions`, `aiOverview` | Google's visible query refinements and optional public overview text/citations. |

Optional modules may be absent for a particular keyword. Result arrays are capped; most retain up to 50 entries, while local cards retain up to 20.

### How to scrape Google keyword results

1. Enter phrases in `keywords` (or use one of the documented compatibility aliases).
2. Choose a two-letter country and Google language code.
3. Set `maxItems` and `maxPages` conservatively. `page` selects the first Google Search page; `maxPages` controls the number of pages per keyword.
4. Run the Actor and review the available keyword data in the dataset.
5. If Google serves a boundary, reduce the request volume and wait. Do not try to bypass it.

### How much does a run cost?

Cost depends mainly on the number of keywords and Search pages collected. Reduce `maxItems` or `maxPages` for a smaller run. Check current Apify pricing for your account.

### Input

The input accepts these fields. Unknown properties are rejected.

| Field | Default | Type and bounds | Behavior |
| --- | --- | --- | --- |
| `keywords` | `[]` | Array, up to 1,000 phrases, each 1–300 characters | Preferred list of keyword phrases. At least one phrase is required across the aliases. |
| `queries` | — | Array, same phrase bounds | Compatibility alias for multiple phrases. |
| `query` | — | String, up to 300 characters | Compatibility alias for one phrase. |
| `searchQuery` | — | String, up to 300 characters | Compatibility alias for one phrase. |
| `country` | `US` | Two letters | Uppercased before use. |
| `language` | `en` | 2–20 letters/hyphens | Google language code. |
| `maxKeywords` | `1000` | Integer, 1–1,000 | Maximum unique keyword phrases accepted. |
| `maxItems` | `25` | Integer, 1–500 | Maximum keyword records processed and emitted. The smaller of `maxKeywords` and `maxItems` applies. |
| `page` | `1` | Integer, 1–100 | First Search page per keyword; the corresponding Google `start` offset advances in steps of 10. |
| `maxPages` | `1` | Integer, 1–10 | Search pages per keyword. `page + maxPages - 1` cannot exceed 100. |
| `includeSuggestions` | `true` | Boolean | When false, skips the autocomplete request and suggestion fields. |
| `includeSearchSignals` | `true` | Boolean | When false, skips Google Search and all SERP content/module fields. |
| `proxyConfiguration` | — | Apify proxy object | Optional proxy settings for autocomplete and Search. Use proxy groups available to your account. Proxy use does not bypass Google restrictions. |

Enter keyword phrases and choose a country and language. This Actor accepts keyword inputs rather than custom page URLs. `queries`, `query`, and `searchQuery` are alternate names for the phrase inputs.

#### Input examples

Minimal public search:

```json
{
  "keywords": ["web scraping"],
  "country": "US",
  "language": "en",
  "maxItems": 1,
  "maxPages": 1
}
```

Several localized topics:

```json
{
  "keywords": ["coffee shops in Seattle", "latest AI news"],
  "country": "US",
  "language": "en",
  "maxItems": 2,
  "maxPages": 1
}
```

Inspect later Search pages for one phrase:

```json
{
  "keywords": ["web scraping"],
  "page": 2,
  "maxPages": 3,
  "maxItems": 1
}
```

Autocomplete-only run:

```json
{
  "keywords": ["web scraping"],
  "includeSuggestions": true,
  "includeSearchSignals": false,
  "maxItems": 1
}
```

Search-only run:

```json
{
  "keywords": ["web scraping"],
  "includeSuggestions": false,
  "includeSearchSignals": true,
  "maxItems": 1,
  "maxPages": 1
}
```

### Output

Each dataset row combines autocomplete suggestions with public Google Search modules for one keyword. Available results depend on Google's public pages and the selected country and language.

Illustrative rich row (values are examples; modules are conditional, so one keyword may not expose every field; arrays are abbreviated for readability):

```json
{
  "keyword": "web scraping",
  "normalizedKeyword": "web scraping",
  "country": "US",
  "language": "en",
  "searchLocale": "en-US",
  "searchEngine": "Google",
  "suggestions": ["web scraping", "web scraping tools"],
  "suggestionCount": 10,
  "firstSuggestion": "web scraping",
  "containsExactSuggestion": true,
  "exactSuggestionRank": 1,
  "suggestionDetails": [{"suggestion":"web scraping tools","rank":4,"isExactMatch":false,"startsWithKeyword":true,"containsKeyword":true,"isQuestion":false}],
  "searchResultCount": 1234000,
  "searchResultCountText": "About 1,234,000 results",
  "searchResultCountIsApproximate": true,
  "organicResults": [{"rank":1,"title":"A guide to web scraping","resultUrl":"https://example.com/web-scraping","displayUrl":"example.com › web-scraping","domain":"example.com","sourceName":"Example publication","snippet":"A public overview of extracting website information.","publishedAtText":"3 days ago","siteLinks":[{"title":"Getting started","resultUrl":"https://example.com/web-scraping/start"}]}],
  "organicResultCount": 10,
  "peopleAlsoAsk": [{"question":"Which tools are used for web scraping?","rank":1}],
  "peopleAlsoAskCount": 4,
  "relatedSearches": ["web scraping python", "web scraping tools"],
  "peopleAlsoSearchFor": ["web scraping extension", "web scraping project"],
  "videoResults": [{"rank":1,"title":"Web scraping explained","resultUrl":"https://www.youtube.com/watch?v=example","sourceName":"Example channel","publishedAtText":"2 days ago","durationText":"4:53","keyMomentsCount":17}],
  "newsResults": [{"rank":1,"title":"A public technology story","resultUrl":"https://example.com/news/story","sourceName":"Example News","publishedAtText":"10 hours ago"}],
  "discussionResults": [{"rank":1,"title":"A public community discussion","resultUrl":"https://example.com/community/topic","sourceName":"Example community","engagementText":"10+ comments"}],
  "thingsToKnow": [{"title":"How it works","question":"How does web scraping work?","rank":1}],
  "localResults": [{"rank":1,"businessName":"Example Coffee House","ratingValue":4.6,"reviewCount":3200,"businessType":"Coffee shop","priceRangeText":"$10–20","address":"100 Main Street","openStatusText":"Open · Closes 5 PM","serviceOptions":["Dine-in","Takeout"],"isSponsored":false}],
  "refinementSuggestions": ["Open now", "Top rated"],
  "aiOverview": {"summaryText":"Visible public overview text.","sources":[{"title":"A guide to web scraping","resultUrl":"https://example.com/guide","sourceName":"Example publication"}]},
  "hasImage": true,
  "hasMap": true,
  "hasNews": true,
  "hasShopping": false,
  "hasVideo": true,
  "hasAiOverview": true,
  "hasPeopleAlsoAsk": true,
  "hasPeopleAlsoSearchFor": true,
  "hasTopStories": true,
  "hasDiscussionsAndForums": true,
  "hasThingsToKnow": true,
  "hasLocalPack": true,
  "hasAds": false,
  "serpFeatures": ["ai_overview", "people_also_ask", "videos", "local_pack"]
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

### Tips and advanced options

Start with one or a few phrases and one Search page. Increase `maxPages` when you need deeper results; each page advances the Google result offset by ten. `maxItems` is the global keyword-record limit, and each record contains that keyword's collected result arrays. Setting `includeSuggestions` or `includeSearchSignals` to `false` skips the corresponding data. Large runs can take longer and may be limited by Google.

### FAQ, support, and responsible use

Result snippets retain all text exposed by Google, with paragraph and bullet formatting. Optional `snippetHtml` contains sanitized formatting-only markup of the same fragment. Neither representation fetches destination pages. Video cards can also expose public accessible descriptions and `keyMoments` chapter titles, exact start-time phrases and timestamped destinations. These are conditional source fields; HTML alternatives, aliases and derived counts do not establish independent richness.

#### Does it provide search volume, CPC, or competition?

No. Those advertising metrics are not exposed by the public autocomplete/Search pages inspected here. This Actor only reports text and result modules Google visibly provides.

#### Why do some result arrays or metrics not appear?

Google changes modules by keyword, country, language, and time. Optional arrays and their counts are emitted only after a Google Search page is successfully parsed; on such a page, a count of `0` means the module was checked and no matching cards were visible. If Search is blocked or unavailable, its arrays and counts are omitted rather than represented as false zeros. The approximate result count can also be absent. Access boundaries appear in the run summary and logs; they do not become error rows.

#### Can I supply a custom URL or start-URL list?

No. This Actor constructs only its public Google endpoints from the keyword and locale. It does not accept arbitrary domains or URLs.

#### Is the Actor affiliated with Google?

No. It is an independent tool and is not affiliated with Google. Use it only for lawful public-page research, respect Google's terms and access policies, and keep request rates reasonable. Public result pages can contain personal information; do not collect or use it without a legitimate lawful basis. Follow applicable privacy laws and seek qualified legal guidance when unsure.

For issues or feature requests, use the Actor's Issues tab and include a run ID and a short summary. For integrations, scheduling, monitoring, and API access, use the Apify Console and the Actor's API tab. Google page structures and availability can change without notice; completeness and ranking are not guaranteed.

# Actor input Schema

## `keywords` (type: `array`):

Keywords to analyze, one per line or item.

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

Compatibility alias for keyword phrases.

## `query` (type: `string`):

Compatibility alias for one keyword phrase.

## `searchQuery` (type: `string`):

Compatibility alias for one keyword phrase.

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

Two-letter Google country code used for localized suggestions and results.

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

Google language code, for example en or de.

## `maxKeywords` (type: `integer`):

Maximum number of unique keyword phrases accepted from the supplied aliases before the output-record limit is applied.

## `includeSuggestions` (type: `boolean`):

Keep public Google autocomplete suggestions.

## `includeSearchSignals` (type: `boolean`):

Keep visible Google Search result cards, related questions/searches, refinements, local/news/video modules, and public feature flags.

## `requestDelayMs` (type: `integer`):

Delay between sequential keyword requests.

## `timeoutMs` (type: `integer`):

Bounded timeout for each public endpoint request.

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

Compatibility alias for timeoutMs.

## `timeoutSecs` (type: `integer`):

Legacy alias for requestTimeoutSecs.

## `maxRetries` (type: `integer`):

Finite retries for ordinary network failures.

## `maxResponseBytes` (type: `integer`):

Bound the amount of public JSON/HTML retained per response.

## `userAgent` (type: `string`):

Optional ordinary HTTP user-agent string; it is not used for evasion. Browser rendering always keeps Chrome's native user agent.

## `acceptLanguage` (type: `string`):

Optional language preference for public requests.

## `renderJavaScript` (type: `boolean`):

Use a standard Playwright browser when direct public HTML is a consent, JavaScript, or access-boundary shell; no stealth or CAPTCHA handling.

## `browserWaitMs` (type: `integer`):

Bounded post-navigation wait for rendered public content.

## `browserScrolls` (type: `integer`):

Bounded ordinary page scrolls used to reveal public SERP feature signals.

## `searchProxyConfiguration` (type: `object`):

Default off: Search shares the main proxy. Explicitly enable this separate route for Search only; GOOGLE_SERP uses the documented HTTP-only, no-session protocol. Autocomplete stays on the main route. No automatic route switching or direct fallback.

## `proxyConfiguration` (type: `object`):

Applies to autocomplete HTTP, Search HTTP and standard browser navigation. Uses only account-enabled proxy groups or custom URLs. Residential routing requires account access. No silent direct fallback; omit or explicitly disable for direct access. Credentials are not logged.

## `page` (type: `integer`):

One-based first Google Search results page inspected for each keyword.

## `maxItems` (type: `integer`):

Maximum number of keyword-analysis records to emit; each record contains bounded public suggestions and SERP result arrays.

## `maxPages` (type: `integer`):

Maximum number of sequential Google Search pages to inspect per keyword. Page offsets advance by 10 results and remain bounded.

## Actor input object example

```json
{
  "keywords": [],
  "country": "US",
  "language": "en",
  "maxKeywords": 1000,
  "includeSuggestions": true,
  "includeSearchSignals": true,
  "requestDelayMs": 200,
  "timeoutMs": 30000,
  "maxRetries": 2,
  "maxResponseBytes": 4000000,
  "acceptLanguage": "en-US,en;q=0.8",
  "renderJavaScript": true,
  "browserWaitMs": 2500,
  "browserScrolls": 1,
  "searchProxyConfiguration": {
    "useApifyProxy": false
  },
  "page": 1,
  "maxItems": 25,
  "maxPages": 1
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `runSummary` (type: `string`):

No description

## `runHealth` (type: `string`):

No description

## `outputSummary` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("googleapi/google-keyword-data-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("googleapi/google-keyword-data-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 '{}' |
apify call googleapi/google-keyword-data-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,googleapi/google-keyword-data-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/4xEJTUrp1rxKLIfRo/builds/bq5FdlmGRfPuTbIRn/openapi.json
