Google Search Results Scraper (Question & Keyword Discovery)
Pricing
from $2.99 / 1,000 results
Google Search Results Scraper (Question & Keyword Discovery)
Google Search Results Scraper for Question & Keyword Discovery extracts search results, related questions, autocomplete suggestions, titles, URLs, snippets, and keyword insights. Discover content opportunities, search intent, long-tail keywords, and topics for SEO and market research.
Pricing
from $2.99 / 1,000 results
Rating
0.0
(0)
Developer
SimpleAPI
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
0
Monthly active users
2 days ago
Last modified
Categories
Share
Google Search Results Scraper โ SERPs, Questions and Keyword Ideas
Google Search Results Scraper (Question & Keyword Discovery) scrapes live www.google.com results pages and returns organicResults, paidResults, paidProducts and peopleAlsoAsk for every seed keyword โ plus a discovery pass most Google SERP scrapers skip: genuine relatedSearches pulled from Google's own #botstuff block, autocompleteSuggestions from Google's completion service, and expandedQuestions pulled straight off the results page. Every phrase collected is also merged into one deduplicated keywordIdeas[] array with its source attached. It's built for SEO teams, content strategists and PPC analysts who need real keyword and question coverage next to the SERP itself, not a second tool. No Google account or API key is required to run it.
What is Google Search Results Scraper (Question & Keyword Discovery)?
It's an Apify Actor that submits your seed keywords to Google Search over a proxy, parses the resulting HTML, and returns one structured row per query per page โ organic listings, paid ads, shopping products, People-Also-Ask questions โ along with a second, dedicated fetch that reads Google's related-searches block, autocomplete completions, and question text. No login or Google account is needed; the Actor authenticates only against Apify's own proxy network. Everything is delivered as a standard Apify dataset that exports to JSON, CSV, Excel/XLSX, XML or RSS.
Key features:
- ๐ Flexible seeds โ plain keywords, Google search operators (
site:example.com,javascript OR python), or a pastedgoogle.com/searchURL, one per line - โ Real People-Also-Ask questions โ collected straight from the results page, not simulated
- ๐ Genuine related searches and autocomplete โ parsed from Google's own
#botstuffblock and its/complete/searchcompletion service, with an optional AโZ alphabet fan-out for autocomplete - ๐ก Merged keyword ideas โ
keywordIdeas[]unions related searches, autocomplete completions and PAA question text into one deduplicated list with provenance per phrase - ๐ Country, language and location targeting โ
gl,hl,lrand UULE location codes, plussite:,intitle:,intext:,inurl:andfiletype:operators and date filters - ๐ Automatic proxy escalation โ starts on Apify's Google SERP proxy and escalates to residential (3 retries, then sticky) whenever a page comes back without a result container
What data can I extract with Google Search Results Scraper?
Every seed keyword returns a row with the base SERP fields plus the discovery fields the Actor adds on top. Field names below are the exact JSON keys pushed to the dataset โ the default dataset view only shows 8 of them (searchQueryTerm, resultsTotal, relatedQueries, aiOverview, paidResults, paidProducts, organicResults, peopleAlsoAsk); every row carries the full set.
| Field | Example value | Use case |
|---|---|---|
searchQuery | {"term": "best running shoes", "page": 1, "countryCode": "US", ...} | Trace which query, page, country and language produced the row |
searchQueryTerm | "best running shoes" | Group or filter rows by seed |
url | "https://www.google.com/search?q=..." | The exact SERP URL that was fetched |
hasNextPage | true | Detect whether a further page exists (respects maxPagesPerQuery) |
serpProviderCode | "O" | Base actor's provider code, carried through unchanged |
resultsTotal | 184000000 | Google's reported "About X results" count |
organicResults | [{"title": "...", "url": "...", "position": 1, ...}] | The organic listings โ title, url, description, position, site links |
relatedQueries | [{"title": "running shoes for flat feet", "url": "..."}] | Base-compatible shape, now built from Google's real related-searches block |
suggestedResults | [{"title": "...", "url": "...", "type": "organic", "position": 1}] | Same related-search data reshaped to match the base actor's field |
paidResults | [{"title": "...", "url": "...", "position": 1}] | Text ads parsed from #tads |
paidProducts | [{"title": "...", "displayedUrl": "...", "prices": ["$129.99"]}] | Shopping/product cards with parsed prices |
peopleAlsoAsk | [{"question": "What running shoes...", "answer": null, "url": "..."}] | Base PAA field โ question text and link only; answer is always null (see limits below) |
aiOverview | {"text": "...", "references": [...]} or null | Only populated when aiMode is not off and serpApiKey is supplied |
customData | {"perplexitySearch": {...}, "chatGptSearch": {...}, ...} | Echo of unimplemented add-on inputs, kept for schema compatibility |
htmlSnapshotUrl | "running_shoes_20260816_101500_p1.html" | Key-value store record key of the first saved SERP page (when saveHtmlToKeyValueStore is on) |
html | "<!-- PAGE 1 -->..." | Raw page HTML, only present when saveHtml is on |
relatedSearches | [{"position": 1, "query": "running shoes for flat feet", "url": "..."}] | Google's genuine related-searches block, or null if Google served none |
relatedSearchesCount | 8 | Row count of relatedSearches |
autocompleteSuggestions | [{"position": 1, "suggestion": "running shoes for women", "type": "QUERY", "seed": "running shoes"}] | Completions from Google's /complete/search endpoint |
autocompleteSuggestionsCount | 10 | Row count of autocompleteSuggestions |
expandedQuestions | [{"position": 1, "question": "What running shoes are best for beginners?"}] | Real PAA question text, capped by maxQuestionsPerQuery |
expandedQuestionsCount | 5 | Row count of expandedQuestions |
keywordIdeas | [{"position": 1, "keyword": "running shoes for flat feet", "sources": ["relatedSearch", "autocomplete"]}] | Deduplicated union of every real phrase collected, with source(s) |
hasRelatedSearches | true | Quick boolean check without counting the array |
hasExpandedQuestions | true | Quick boolean check without counting the array |
discoveryPageUrl | "https://www.google.com/search?q=..." | URL of the separate discovery request (no udm=14) |
discoveryNotes | ["relatedSearches_selector=botstuff-ngTNl", "questions_selector=related-question-pair"] | Diagnostic notes on which selector rung matched, or why discovery was skipped |
errorReason | null | null on every charged row; set to a reason string only on the uncharged fallback row |
Questions and keyword ideas
expandedQuestions, relatedSearches and autocompleteSuggestions are collected on one extra request per seed (the discovery page, fetched without udm=14) and merged into every page row of that query, so raising maxPagesPerQuery never multiplies discovery requests. Answers to People-Also-Ask questions are not returned โ see the limits note below. All three arrays feed keywordIdeas[], so a content team can pull one flat, de-duplicated keyword list per seed with each phrase's origin (relatedSearch, autocomplete, peopleAlsoAsk) attached, instead of cross-referencing three separate fields by hand.
Targeting fields
countryCode (gl) and languageCode (hl) decide the market and language for every result, including which country's autocomplete and related searches come back. site / relatedToSite, wordsInTitle / wordsInText / wordsInUrl, and fileTypes compile into site:, intitle:, intext:, inurl: and filetype: operators appended to the query. quickDateRange, beforeDate and afterDate narrow by recency via Google's tbs parameter. Together these let you scope a seed to one country, one site, one file type or one time window without changing the seed text itself.
How does Google Search Results Scraper differ from the official Google Search API?
Google's own Custom Search JSON API caps every query at 10 results per request and never returns more than 100 results total for any query, even with pagination โ and it is closed to new customers and scheduled for full shutdown on January 1, 2027, per Google's own developer documentation. It is also built on a curated Programmable Search Engine, not the open web index, so it has no related-searches, People-Also-Ask or autocomplete surface at all. This Actor scrapes the actual www.google.com results page for any query โ no Custom Search Engine to configure โ and adds a dedicated discovery pass for the data the official API never exposed in the first place.
| Feature | Custom Search JSON API | Google Search Results Scraper |
|---|---|---|
| New signups | Closed since 2025; full shutdown Jan 1, 2027 | Available now on Apify |
| Max results per query | 10 per request, 100 total (hard error beyond that) | Up to 100 per page (resultsPerPage), pages capped only by maxPagesPerQuery |
| Search scope | A configured Custom Search Engine (often site-restricted) | Any query against the live www.google.com index |
| Related searches / autocomplete / PAA | Not available | relatedSearches, autocompleteSuggestions, expandedQuestions, merged into keywordIdeas[] |
| AI Overview | Not available | Optional, via your own SerpApi key (aiMode + serpApiKey) |
| Query operators | Limited to CSE configuration | site:, intitle:, intext:, inurl:, filetype:, exact-match, date range |
| Pricing | $5 per 1,000 queries beyond 100 free/day | Pay-per-result on Apify (row_result event) |
Why is the Custom Search JSON API being shut down?
Google closed the Custom Search JSON API to new customers in 2025 and announced it will be fully discontinued on January 1, 2027, according to Google's own developer documentation. Even for existing customers, it was never a substitute for reading the real results page: it returns at most 100 results per query because it queries a curated Programmable Search Engine index rather than the open web, and it has no endpoint for related searches, People-Also-Ask questions or autocomplete at any price. This Actor fetches the genuine www.google.com results page instead, so it isn't affected by the shutdown and returns the discovery data the official API never had.
Use the Custom Search JSON API only if you already have a grandfathered account and a narrowly scoped Custom Search Engine you need to keep running before 2027. Use this Actor for open-web queries, ongoing keyword research, or any workflow that needs related searches, autocomplete or PAA questions alongside the SERP.
How to use data extracted from Google Search?
SEO and content teams
Feed queries with a topic cluster's seed terms, turn on expandPeopleAlsoAsk and includeKeywordIdeas, and pull keywordIdeas[] plus expandedQuestions[] straight into a content brief. Each keyword idea carries its sources array, so a writer can see at a glance whether a phrase came from Google's own related-searches block, autocomplete, or a real PAA question โ useful for prioritizing head terms versus long-tail question content without opening Google manually for every seed.
Agencies and service providers
Run the same seed list on a schedule across client accounts or verticals, and diff relatedSearches and keywordIdeas[] run over run to flag when Google surfaces new related terms or drops old ones for a client's target keywords. discoveryNotes records which selector matched (or why discovery was skipped), which is useful evidence when a client asks why a particular run returned fewer questions than usual.
Market research and intelligence
Compare paidResults and paidProducts counts across a basket of seed keywords to map which topics carry ad pressure, or track resultsTotal and organicResults[].displayedUrl domains over time to see which sites are gaining or losing organic share for a category. focusOnPaidAds forces a retry when a page parses zero ads, which matters because Google injects ad markup with JavaScript and the plain HTTP path often misses it on the first pass.
AI agents and automated pipelines
Because the Actor is a standard Apify Actor with a JSON input and output, it's directly callable as a tool from an agent framework or through Apify's MCP server โ an agent researching a topic can call it with a batch of seed terms and get back organic sources, related questions, and keyword ideas to ground a RAG pipeline or a content-generation step, without scraping Google itself.
๐ผ Input sample
queries is the only required field. Every other input keeps the base actor's name, type and default so existing integrations don't break; discovery-specific inputs are listed at the bottom.
| Parameter | Required | Type | Description | Example value |
|---|---|---|---|---|
queries | Yes | string | One seed per line โ keywords, Google operators, or pasted google.com/search URLs. Keep every line under 32 words. | "best running shoes\nhow to train for a marathon" |
resultsPerPage | No | integer | Sent as Google's num param. Default 100, min 1, max 100. Does not affect discovery blocks. | 20 |
maxPagesPerQuery | No | integer | How many result pages to walk per seed. Default 1, min 1, no maximum. Discovery still runs once per seed. | 2 |
aiMode | No | string | aiModeOff (default), aiModeWithSearchResults, or aiModeOnly. Non-off drops udm=14 and, with serpApiKey, fills aiOverview. | "aiModeOff" |
serpApiKey | No | string | Your own SerpApi key. Only used when aiMode is not off. | "" |
perplexitySearch | No | object | Not implemented โ echoed into customData for backward compatibility. Default {"enablePerplexity": false, "searchRecency": "", "returnImages": false, "returnRelatedQuestions": false}. | default |
chatGptSearch | No | object | Not implemented โ echoed into customData. Default {"enableChatGpt": false}. | default |
maximumLeadsEnrichmentRecords | No | integer | Not implemented โ echoed into customData. Default 0, min 0. | 0 |
leadsEnrichmentDepartments | No | array | Not implemented โ echoed into customData. Default []. | [] |
focusOnPaidAds | No | boolean | Retries a page once on the same proxy if it parsed zero ads and zero shopping products. Default false. | true |
countryCode | No | string | Sent as gl. Default "us". Full ISO country enum. Also decides the market for autocomplete and related searches. | "gb" |
searchLanguage | No | string | Restricts results to one language, sent as lr=lang_xx. No default (empty = none). | "en" |
languageCode | No | string | Sent as hl. Default "en". Drives the language of questions, related searches and autocomplete. | "es" |
locationUule | No | string | Google UULE location code, sent as uule. | "" |
forceExactMatch | No | boolean | Wraps the seed in quotes for an exact-phrase search. Default false. | false |
site | No | string | Adds site:example.com. Takes precedence over relatedToSite. | "nike.com" |
relatedToSite | No | string | Adds related:example.com. Ignored if site is set. | "" |
wordsInTitle | No | array | Each entry becomes intitle:"word". Default [], max 32 items. | ["review"] |
wordsInText | No | array | Each entry becomes intext:"word". Default [], max 32 items. | [] |
wordsInUrl | No | array | Each entry becomes inurl:"word". Default [], max 32 items. | [] |
quickDateRange | No | string | qdr: value (d7, w2, m6, y1...). Don't combine with before/after dates. | "m6" |
beforeDate | No | string | Absolute (2024-05-03) or relative ("8 days") date, UTC. | "" |
afterDate | No | string | Absolute or relative date, UTC. | "" |
fileTypes | No | array | OR-joined into filetype: operators. Default [], max 10 items. | [] |
mobileResults | No | boolean | Switches the user-agent pool. searchQuery.device still always reports DESKTOP. Default false. | false |
includeUnfilteredResults | No | boolean | Sends tbs=li:1 โ Google's VERBATIM switch, which narrows results. Default false. | false |
saveHtml | No | boolean | Attaches raw SERP HTML to the html field on every row. Default false. | false |
saveHtmlToKeyValueStore | No | boolean | Writes each SERP page to the run's key-value store; htmlSnapshotUrl carries the first page's key. Default true. | true |
includeIcons | No | boolean | Adds an icon field to organic results whose card exposes a favicon URL. Default false. | false |
proxyConfiguration | No | object | Apify proxy config. Defaults to the Google SERP proxy group, escalating to residential on a block. | {"useApifyProxy": true} |
includeRelatedSearches | No | boolean | Collects Google's genuine related-searches block into relatedSearches[]. Default true. | true |
includeAutocompleteSuggestions | No | boolean | Calls Google's completion service and attaches results as autocompleteSuggestions[]. Default true. | true |
autocompleteAlphabetFanOut | No | boolean | Also requests <seed> a through <seed> z โ adds 26 keyless requests per seed. Default false. | false |
expandPeopleAlsoAsk | No | boolean | Collects real PAA questions into expandedQuestions[]. Default true. | true |
maxQuestionsPerQuery | No | integer | Caps questions returned per seed. Default 5, min 0, max 100. Set 0 to skip questions. | 10 |
includeKeywordIdeas | No | boolean | Builds the deduplicated keywordIdeas[] union. Default true. | true |
useFullResultsPage | No | boolean | Issues one extra request per seed without udm=14 to read PAA/related searches. Default true. Off makes discovery fields null except autocomplete. | true |
deduplicateResultsAcrossPages | No | boolean | Default false keeps the base behavior (each page re-contains earlier pages' results). true makes each row carry only its own page. | false |
saveQuestionsToSeparateDataset | No | boolean | Also mirrors question rows (uncharged) to a named <runId>-questions dataset. Default false. | false |
{"queries": "best running shoes\nhow to train for a marathon","resultsPerPage": 20,"maxPagesPerQuery": 1,"countryCode": "us","languageCode": "en","expandPeopleAlsoAsk": true,"maxQuestionsPerQuery": 5,"includeRelatedSearches": true,"includeAutocompleteSuggestions": true,"includeKeywordIdeas": true}
Common pitfall: useFullResultsPage defaults to true and issues the one extra request per seed that relatedSearches and expandedQuestions depend on. Turn it off and the Actor sends exactly the same request as the base actor โ relatedSearches, expandedQuestions and keywordIdeas's non-autocomplete sources all come back null, with only autocompleteSuggestions still populated.
๐ฝ Output sample
Each seed keyword produces one dataset row per page (up to maxPagesPerQuery), delivered as typed JSON with a consistent schema across runs. Export straight from the Apify dataset to JSON, CSV, Excel/XLSX, XML or RSS.
{"searchQuery": {"term": "best running shoes","url": "https://www.google.com/search?q=best+running+shoes&gl=us&hl=en","device": "DESKTOP","page": 1,"type": "SEARCH","domain": "google.com","countryCode": "US","languageCode": "en","locationUule": null,"resultsPerPage": 18},"searchQueryTerm": "best running shoes","url": "https://www.google.com/search?q=best+running+shoes&gl=us&hl=en","hasNextPage": false,"serpProviderCode": "O","resultsTotal": 184000000,"relatedQueries": [{"title": "running shoes for flat feet", "url": "https://www.google.com/search?q=running+shoes+for+flat+feet"}],"paidResults": [],"paidProducts": [{"title": "Nike Pegasus 41", "displayedUrl": "nike.com", "prices": ["$139.97"]}],"aiOverview": null,"organicResults": [{"title": "The Best Running Shoes of 2026","url": "https://example.com/best-running-shoes","displayedUrl": "example.com/best-running-shoes","description": "We tested dozens of pairs to find...","emphasizedKeywords": ["best running shoes"],"siteLinks": [],"productInfo": {},"type": "organic","position": 1}],"suggestedResults": [{"title": "running shoes for flat feet", "url": "https://www.google.com/search?q=running+shoes+for+flat+feet", "type": "organic", "position": 1}],"peopleAlsoAsk": [{"answer": null, "question": "What running shoes do podiatrists recommend?", "title": "What running shoes do podiatrists recommend?", "url": null, "date": null}],"customData": {"perplexitySearch": {"enablePerplexity": false, "searchRecency": null, "returnImages": false, "returnRelatedQuestions": false},"chatGptSearch": {"enableChatGpt": false},"maximumLeadsEnrichmentRecords": 0,"leadsEnrichmentDepartments": []},"htmlSnapshotUrl": "best_running_shoes_20260816_101500_p1.html","relatedSearches": [{"position": 1, "query": "running shoes for flat feet", "url": "https://www.google.com/search?q=running+shoes+for+flat+feet"}],"relatedSearchesCount": 8,"autocompleteSuggestions": [{"position": 1, "suggestion": "best running shoes for women", "type": "QUERY", "seed": "best running shoes"}],"autocompleteSuggestionsCount": 10,"expandedQuestions": [{"position": 1, "question": "What running shoes do podiatrists recommend?"}],"expandedQuestionsCount": 5,"keywordIdeas": [{"position": 1, "keyword": "running shoes for flat feet", "sources": ["relatedSearch"]},{"position": 2, "keyword": "best running shoes for women", "sources": ["autocomplete"]},{"position": 3, "keyword": "What running shoes do podiatrists recommend?", "sources": ["peopleAlsoAsk"]}],"hasRelatedSearches": true,"hasExpandedQuestions": true,"discoveryPageUrl": "https://www.google.com/search?q=best+running+shoes&gl=us&hl=en","discoveryNotes": ["relatedSearches_selector=botstuff-ngTNl", "questions_selector=related-question-pair"],"errorReason": null}
How do you filter and target specific search results?
The seed itself is the primary filter: a plain keyword returns Google's default ranking, while a query built from site, wordsInTitle, wordsInUrl or fileTypes narrows to a specific slice of the index โ site takes precedence over relatedToSite if both are set, and each filetype: entry is OR-joined when you supply more than one. countryCode (gl) and languageCode (hl) scope both the SERP and the discovery data to a market โ autocomplete and related searches change with them, not just the organic results. quickDateRange, beforeDate and afterDate add a recency window via tbs, but the source explicitly warns not to combine quickDateRange with the before/after pair. resultsPerPage (up to 100) and maxPagesPerQuery control volume per seed; deduplicateResultsAcrossPages decides whether each page row repeats earlier pages' organic results (the default) or carries only its own page.
{ "queries": "site:reddit.com best running shoes", "site": "reddit.com" }
{ "queries": "running shoes", "countryCode": "de", "languageCode": "de", "quickDateRange": "m6" }
{ "queries": "running shoes review", "wordsInTitle": ["review"], "fileTypes": ["pdf"] }
โถ๏ธ Want to try other Google scrapers?
| Scraper | What it extracts |
|---|---|
| Google Search Results (SERP) Scraper & Shopping Prices | Organic results, ads and shopping prices from a Google Search page |
| Google Maps Reviews Scraper (Bad Review Finder) | Business reviews and ratings from Google Maps, flagged by rating |
| Google Play Scraper: Country Pricing & In-App Purchases | App store listings, country pricing and in-app purchase data |
| Google Scholar Scraper With Institution & Journal Data | Academic paper citations, authors, institutions and journals |
| Baidu Search Scraper By Site & File Type | Organic results from Baidu, filterable by site and file type |
| DuckDuckGo Scraper - Fresh News By Date & Source | Organic and news results from DuckDuckGo, filterable by date and source |
How to extract Google Search data programmatically
The Actor runs like any Apify Actor: one API call starts a run, one Bearer token authenticates it, and structured JSON comes back through the dataset endpoint.
Python example
from apify_client import ApifyClientclient = ApifyClient("<APIFY_TOKEN>")run = client.actor("<YOUR_USERNAME>/google-search-results-scraper-question-and-keyword-discovery").call(run_input={"queries": "best running shoes\nmarathon training plan","expandPeopleAlsoAsk": True,"includeKeywordIdeas": True,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["searchQueryTerm"], len(item["organicResults"]), item["expandedQuestionsCount"])
MCP for AI agents
Reachable through Apify's hosted MCP server at https://mcp.apify.com โ an agent can search-actors for this Actor and call-actor by name without pre-configuring it, then use the returned keywordIdeas[] and expandedQuestions[] to ground a content-brief or RAG step. Compatible clients include Claude Desktop, Claude Code, Cursor, VS Code (GitHub Copilot agent mode) and the Apify CLI.
Export to spreadsheets or CRM
Download the dataset as CSV or Excel/XLSX directly from the Apify run, or fetch it via the API. Map searchQueryTerm to a keyword column, organicResults[].url / .title to a rankings sheet, and keywordIdeas[].keyword / .sources to a content-planning tab.
Is it legal to scrape Google Search results?
Yes. Google Search results pages are public web pages โ anyone with a browser can view the same organic listings, ads, related searches and questions this Actor collects, and public search-result data is not personal or private information. The relevant framework is Google's Terms of Service and general database-rights law, not GDPR, since these are business/product listings rather than personal data about identifiable individuals. Scraping public data is broadly legal in most jurisdictions (see hiQ Labs v. LinkedIn), but bulk automated access to Google specifically can still run into its Terms of Service, so avoid excessive request volume and don't republish scraped SERP content as your own. Consult legal counsel for commercial applications involving bulk storage of personal data.
โ FAQ
What happens if Google delists or reranks a page between runs?
The Actor returns Google's SERP exactly as rendered at request time โ there's no "delisted" flag, because organic ranking is a live snapshot, not a status field. Re-run the same seed on a schedule and compare organicResults[].position and .url across runs to detect ranking changes or a page dropping out of the results entirely.
Can I get People-Also-Ask questions along with the search results?
Yes โ with expandPeopleAlsoAsk on (default), real question text is collected into expandedQuestions[], capped by maxQuestionsPerQuery (default 5, max 100). Answer text is not returned: the async endpoint Google uses to render PAA answers pays out only to a cookied browser origin, so it was measured returning a 59-byte control frame with no payload on every available proxy. Any answer text you need has to come from the matching organic snippet, which is already in organicResults.
How accurate is the keyword and question data?
The Actor returns Google's related searches, autocomplete completions and PAA questions exactly as Google served them for that query, country and language at request time. Google's discovery surfaces change frequently and vary by market, so treat a single run as a snapshot โ re-run periodically if you're tracking keyword trends rather than a point-in-time list.
How many results can I get per run?
There's no fixed cap on the number of seeds in queries or on maxPagesPerQuery (minimum 1, no maximum in the schema) โ each additional page is a separate charged row. resultsPerPage is capped at 100 by Google's own num parameter, though Google applies its own filtering so the actual count per page often comes in lower.
How does the site: and intitle: operator targeting work?
site compiles to site:example.com and takes precedence if relatedToSite is also set; wordsInTitle, wordsInText and wordsInUrl each compile their entries into intitle:"word", intext:"word" and inurl:"word" operators (up to 32 entries each), and multiple fileTypes are OR-joined into filetype: clauses. All of them are appended to the seed query before it's sent to Google, so you can combine several at once in a single request.
Does this Actor work with Claude, ChatGPT and AI agent frameworks?
Yes. It's reachable through Apify's hosted MCP server (https://mcp.apify.com), where an agent can call it by name via call-actor โ compatible with Claude Desktop, Claude Code, Cursor and VS Code's agent mode. It's also callable as a plain HTTP endpoint from any agent framework that can make an authenticated API call.
How does this Actor compare to other Google SERP scrapers?
Most Google SERP scrapers on Apify parse organicResults, paidResults and the base peopleAlsoAsk field the same way. This Actor's distinct addition is the discovery layer: genuine relatedSearches read from Google's own related-searches block (not the base actor's practice of relabeling organic titles as related queries), real autocomplete completions, and PAA question text merged into one deduplicated keywordIdeas[] array โ features not present in the base SERP actor this one extends.
Can I use this Actor without a Google API key or developer account?
Yes. No Google account, API key or Custom Search Engine setup is required โ the Actor only needs an Apify account to run. The optional serpApiKey field is only needed if you want aiOverview populated, which uses your own SerpApi account and is billed separately by SerpApi.
Conclusion
Google Search Results Scraper (Question & Keyword Discovery) returns the full Google SERP โ organic, paid, shopping and AI Overview โ alongside genuine related searches, autocomplete completions and People-Also-Ask questions merged into one keyword-ideas list, without needing a Custom Search Engine or a soon-to-be-retired API key. It's built for SEO teams, content strategists, and agencies who need real keyword and question coverage attached to the SERP in one run. Start it from the Apify Store with a list of seed keywords, or call it programmatically through the Apify API or MCP.