Google Search Results Scraper: Knowledge Panel & Answer Box
Pricing
from $4.99 / 1,000 results
Google Search Results Scraper: Knowledge Panel & Answer Box
Scrape Google Search results with Knowledge Panels, Answer Boxes, featured snippets, organic results, ads, URLs, titles, and descriptions. Extract structured SERP data for SEO research, competitor analysis, keyword tracking, and search intelligence.
Pricing
from $4.99 / 1,000 results
Rating
0.0
(0)
Developer
API Empire
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Google Search Results Scraper — Organic, Answer Box & Knowledge Panel
Google search results scraper that returns three distinct pieces of the SERP as typed JSON: every organic result, the featured snippet (answerBox), and the right-hand entity card (knowledgePanel) — plus paid ads, People Also Ask, and Google's own related-searches block. Every response is normalized, no HTML, no CSS selectors, no parsing step. There is no login wall and no API key required to run it. Point it at a keyword list or a batch of Google Search URLs and get back organic results, the answer box, and the knowledge panel in the same structured row.
What is Google Search Results Scraper With Knowledge Panel & Answer Box?
It is a Google SERP scraper built on top of a base organic-results scraper, extended to also parse the featured snippet and the right-hand knowledge/entity panel that Google renders next to the ten blue links. Both blocks are stripped by udm=14, the URL parameter the base organic request sends by default, so this Actor fires a second, udm-free request (page 1 only) to read them. No Google account or login is required — it reads the public SERP the same way a browser would.
- Scrape organic results — title, URL, description, site links, position
- Scrape the answer box — featured-snippet type, answer text/HTML, list or table rows, citation
- Scrape the knowledge panel — entity title, subtitle, description with source, official website,
kc:fact rows, social profiles - Also returns paid ads, paid shopping products, People Also Ask, and Google's real related-searches block
- Export as JSON, CSV, Excel, or XML from the Apify dataset — no proxy management, no parsing
What data does Google Search Results Scraper With Knowledge Panel & Answer Box collect?
Every dataset row can carry organic results, the answer box, and the knowledge panel side by side, plus the supporting SERP blocks below.
| Data Type | Key Fields | JSON Field Names |
|---|---|---|
| Organic results | title, URL, description, site links, position | organicResults[].title, .url, .description, .siteLinks, .position |
| Answer box (featured snippet) | snippet type, answer text/HTML, list/table rows, citation | answerBox.type, .answer, .listItems, .tableRows, .sourceUrl |
| Knowledge panel | entity title/subtitle/type, description + source, website, fact rows, social profiles | knowledgePanel.title, .entityType, .facts[].label, .facts[].value, .socialProfiles[] |
| Paid results & products | ad title, URL, price | paidResults[], paidProducts[].prices |
| People Also Ask | related question, link | peopleAlsoAsk[].question, .url |
| Related searches | Google's own related-search phrases | relatedSearches[].title, .url |
⚠️ The answer box and knowledge panel are parsed from page 1 only of each query, even when maxPagesPerQuery is set higher — Google only ever renders these two blocks on the first results page, so a second fetch on page 2+ would just find nothing there.
Need more Google data?
If you also need business reviews, app-store listings, or academic citations, API-Empire publishes dedicated Actors for those: Google Maps Reviews Scraper With Reviewer Profile Details for review data, Google Play Scraper & Developer Catalog for app listings, and Google Scholar Scraper: Native Citations & Versions for citation data. For a lighter organic-only scrape without the entity/answer-box layer, see Google Search Results (SERP) Scraper By Site & File Type, the base this Actor extends.
How does Google Search Results Scraper With Knowledge Panel & Answer Box differ from Google's official Search API?
Google's own Custom Search JSON API is closed to new customers and is being sunset: per Google's developer documentation (checked 2026-08-16), existing customers have until January 1, 2027 to move off it, and it never exposed a featured-snippet or knowledge-panel field to begin with — it returns curated results from a Programmable Search Engine, not the live public SERP.
| Feature | Custom Search JSON API | This Actor |
|---|---|---|
| Open to new signups | Closed to new customers | Open — run it from the Apify Console with no account approval |
| Service lifetime | Discontinued for existing customers on Jan 1, 2027 | No sunset date published |
| Search scope | A configured Programmable Search Engine (custom index or whole-web mode) | The live google.com SERP for any query |
| Answer box / featured snippet | Not documented in the API reference | answerBox object with type, text/HTML, citation |
| Knowledge panel / entity card | Not documented in the API reference | knowledgePanel object with facts and social profiles |
| Setup | Google Cloud project, API key, Search Engine ID (cx) | Apify account, no Google credentials |
If you already hold a grandfathered Custom Search API key and only need indexed-page metadata, it remains usable until the 2027 cutoff. For a live SERP with the answer box and knowledge panel, or if you never had API access to begin with, this Actor is the practical option.
Why do developers and teams scrape Google search results?
🤖 For AI engineers and agent builders
The answerBox and knowledgePanel blocks are the two SERP elements Google itself uses to answer a query directly — exactly the signal an AEO/GEO workflow needs to track whether a brand's page is being cited as the source of a featured snippet or shown inside an entity panel. Feed answerBox.sourceUrl, answerBox.answer, and knowledgePanel.facts straight into a RAG index or an agent's tool-call response; combine with the aiMode and perplexitySearch/chatGptSearch add-ons to compare how Google AI Mode, Perplexity, and ChatGPT answer the same query side by side.
📈 For SEO teams and marketers
hasAnswerBox and hasKnowledgePanel flag which of your tracked keywords currently show a featured snippet or an entity panel, and answerBox.sourceUrl tells you who owns it. Run the same keyword list on a schedule and diff the knowledgePanel.facts array to catch when a competitor's entity card picks up a new fact row, a new social profile, or loses its knowledge panel entirely.
🔬 For researchers and analysts
Because every field comes straight off the public SERP — no login, no personalization applied beyond countryCode/languageCode/locationUule — this is public-data-only scope suited to studying how Google surfaces information for a given query set: how often an answer box appears for a topic, which domains it cites, and how resultsTotal and organic composition shift by country or by date range (beforeDate/afterDate).
🏗️ For developers building data products
organicResults, answerBox, and knowledgePanel are stable, typed JSON keys you can pipe straight into a database or dashboard without an HTML-parsing layer of your own to maintain. Combine with the maximumLeadsEnrichmentRecords add-on to turn a keyword list into a domain-to-contact pipeline in the same run, and schedule it on Apify Schedules for a recurring rank/entity-tracking product.
How to scrape Google search results (step by step)
- Open the Actor's page on the Apify Store and click Try for free (or Run if you already have it saved).
- Fill in
queries— one search term or a full Google Search URL per line; this is the only required input. - Optionally set filters —
countryCode,languageCode,site,wordsInTitle/wordsInText/wordsInUrl,fileTypes,beforeDate/afterDate— and togglecaptureAnswerBox/captureKnowledgePanel(both on by default). - Click Start and watch rows arrive in the dataset in real time, one per query per page.
- Export the results from the Storage tab as JSON, CSV, Excel, or XML, or pull them programmatically with the Apify API.
What to do when Google changes its SERP structure
The Actor is maintained and its output schema is kept stable — organicResults, answerBox, and knowledgePanel keep the same field names and types even when Google changes the underlying HTML, so integrations built against this schema keep working without changes on your end.
What changed in Google search recently?
Two access-model changes affect anyone scraping Google right now. First, Google's Custom Search JSON API — the only official way to query Google Search programmatically — closed to new customers in 2025 and, per Google's own developer documentation (checked 2026-08-16), is fully discontinued for existing customers on January 1, 2027. Second, Google AI Mode moved from a Labs experiment (March 2025) to a default part of the search experience, rolled out broadly in the US at Google I/O in May 2025 and progressively to more countries since. For DIY scrapers this means the official API path is closing entirely, and any HTML scraper has to account for the udm=14 AI-Mode-era layout that strips the answer box and knowledge panel from the default organic response — which is exactly the split request this Actor already implements via entityRequestMode. The public SERP itself — organic results, ads, the answer box, the knowledge panel — remains reachable without a login; maintenance of the parsing layer against future layout changes is ongoing.
⬇️ Input
queries is the only required field. Everything else has a working default.
| Parameter | Required | Type | Description |
|---|---|---|---|
queries | Yes | string (textarea) | One search term or full Google Search URL per line. Supports Google operators (site:, OR, quotes). Keep each query under 32 words. |
resultsPerPage | No | integer | Requested results per page, passed as Google's num param. Default 100, min 1, max 100; clamped to that range even if bypassed. Google's own filtering means the actual count returned may be lower. |
maxPagesPerQuery | No | integer | Pages to walk per query (~10 results/page). Default 1, min 1, no maximum in the schema. |
aiMode | No | string (select) | Google AI Mode add-on ($). Default "aiModeOff". Enum: "aiModeOff" (AI Mode off), "aiModeWithSearchResults" (AI Mode with search results), "aiModeOnly" (AI Mode only). |
serpApiKey | No | string (secret) | Optional SerpApi key. Used only when aiMode is not off, to fetch the AI Overview via SerpApi. |
perplexitySearch | No | object | Perplexity AI search add-on ($). Default {"enablePerplexity": false, "searchRecency": "", "returnImages": false, "returnRelatedQuestions": false}. Sub-fields: enablePerplexity (boolean, default false), searchRecency (string enum ""/"day"/"week"/"month"/"year", no default), returnImages (boolean, default false), returnRelatedQuestions (boolean, default false). |
chatGptSearch | No | object | ChatGPT Search add-on ($). Default {"enableChatGpt": false}. Sub-field: enableChatGpt (boolean, default false). Adds queryFanOut to the output when enabled. |
maximumLeadsEnrichmentRecords | No | integer | Business-leads enrichment add-on ($) — max leads to find per domain in the results. Default 0 (off), min 0. Multiplies cost: 10 leads × 1,000 domains attempts 10,000 lookups; billed only for leads actually found. |
leadsEnrichmentDepartments | No | array (select) | Restrict leads to departments. Default []. Enum: c-suite, product, engineering-technical, design, education, finance, human-resources, information-technology, legal, marketing, medical-health, operations, sales, consulting. Only applies when maximumLeadsEnrichmentRecords > 0. |
focusOnPaidAds | No | boolean | Ad-detection add-on ($) using an ad-specialized proxy and up to 3 retries per query. Default false. Extra cost per page applies when enabled, regardless of ads found. |
countryCode | No | string (select) | Search country / Google domain, sent as gl. Default "us". Full ISO country-code enum (~240 entries, e.g. "gb", "de", "in") available in the input UI. |
searchLanguage | No | string (select) | Restrict results to a language, sent as lr. No default (blank = unrestricted). ~35-entry language enum in the input UI. |
languageCode | No | string (select) | Interface language (menus, not results), sent as hl. Default "en". ~90-entry language enum in the input UI. |
locationUule | No | string | Exact location code, sent as uule. Generate with a UULE code generator. |
forceExactMatch | No | boolean | Wrap the query in quotes for an exact-phrase search. Default false. |
site | No | string | Adds site:<value>. Takes precedence over relatedToSite if both are set. |
relatedToSite | No | string | Adds related:<value>. Ignored if site is also set. |
wordsInTitle | No | array of strings | Adds intitle:"<word>" per entry. Default [], max 32 items. |
wordsInText | No | array of strings | Adds intext:"<word>" per entry. Default [], max 32 items. |
wordsInUrl | No | array of strings | Adds inurl:"<word>" per entry. Default [], max 32 items. |
quickDateRange | No | string | Adds tbs=qdr:<value>, e.g. d10, y1. Avoid combining with beforeDate/afterDate. |
beforeDate | No | string (date picker) | Absolute (2024-05-03) or relative (8 days, 3 months) date, UTC. Adds a cd_max filter. |
afterDate | No | string (date picker) | Absolute or relative date, UTC. Adds a cd_min filter. |
fileTypes | No | array (select) | Adds filetype: operators, OR-combined when multiple selected. Default [], max 10 items. Enum includes pdf, csv, doc, docx, xls, xlsx, ppt, pptx, html, txt, xml, md, sql, mkv, mov, and more (38 values total). |
mobileResults | No | boolean | Mobile SERP layout instead of desktop. Default false. |
includeUnfilteredResults | No | boolean | Include lower-quality results Google normally filters out (tbs=li:1). Default false. |
saveHtml | No | boolean | Attach the raw page HTML to each dataset row under html. Default false — makes the dataset large. |
saveHtmlToKeyValueStore | No | boolean | Store page HTML in the key-value store and link it via htmlSnapshotUrl. Default true. |
includeIcons | No | boolean | Include Base64 favicon/icon data on results when found. Default false. |
proxyConfiguration | No | object (proxy editor) | Requests always go through a proxy; prefilled to the GOOGLE_SERP Apify Proxy group. Escalates to RESIDENTIAL (with retries) when a response isn't a real results page. |
captureAnswerBox | No | boolean | Parse the featured snippet into answerBox. Default true. Google only serves one on a minority of queries — expect hasAnswerBox: false on many rows. |
captureKnowledgePanel | No | boolean | Parse the right-hand entity card into knowledgePanel. Default true. Entity queries only; reads #rhs, never the local/map pack. |
entityRequestMode | No | string (select) | Default "separate". Enum: "separate" (one extra udm-free request per query, page 1 only; organic output stays identical to the base), "merged" (drops udm=14 from the one organic request — cheaper, but changes the organic result layout), "off" (no second request, no entity parsing). |
maxPanelFacts | No | integer | Cap on knowledgePanel.facts entries. Default 25, min 0, max 100. Panels typically expose 6–10 rows. |
onlyQueriesWithPanel | No | boolean | Skip pushing (and charging for) any row with neither an answer box nor a knowledge panel. Default false. |
deduplicateAcrossPages | No | boolean | Off (default): each page's row repeats every organic result from pages 1..n, matching the base Actor. On: each page's row carries only results first seen on that page. Charging is one row_result event per page either way. |
Example input:
{"queries": "apple inc\nbest running shoes 2026","resultsPerPage": 100,"maxPagesPerQuery": 1,"aiMode": "aiModeOff","serpApiKey": "","perplexitySearch": {"enablePerplexity": false,"searchRecency": "","returnImages": false,"returnRelatedQuestions": false},"chatGptSearch": {"enableChatGpt": false},"maximumLeadsEnrichmentRecords": 0,"leadsEnrichmentDepartments": [],"focusOnPaidAds": false,"countryCode": "us","searchLanguage": "","languageCode": "en","locationUule": "","forceExactMatch": false,"site": "","relatedToSite": "","wordsInTitle": [],"wordsInText": [],"wordsInUrl": [],"quickDateRange": "","beforeDate": "","afterDate": "","fileTypes": [],"mobileResults": false,"includeUnfilteredResults": false,"saveHtml": false,"saveHtmlToKeyValueStore": true,"includeIcons": false,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["GOOGLE_SERP"]},"captureAnswerBox": true,"captureKnowledgePanel": true,"entityRequestMode": "separate","maxPanelFacts": 25,"onlyQueriesWithPanel": false,"deduplicateAcrossPages": false}
The most common input mistake: setting maxPagesPerQuery above 1 expecting more answer-box/knowledge-panel rows — those two blocks are only ever read from page 1, so raising page count only adds more organic results, not more entity data.
⬆️ Output
Every run pushes typed, normalized JSON rows to the default dataset — no HTML, no selectors. Export as JSON, CSV, Excel, or XML from the Storage tab or the Apify API. A charged row uses the row_result pay-per-event; a failed query pushes an uncharged accounting row instead (see below).
Scraped search result row
{"searchQuery": {"term": "apple inc","url": "https://www.google.com/search?q=apple+inc&gl=us&hl=en&num=100","device": "DESKTOP","page": 1,"type": "SEARCH","domain": "google.com","countryCode": "US","languageCode": "en","locationUule": null,"resultsPerPage": 8},"searchQueryTerm": "apple inc","url": "https://www.google.com/search?q=apple+inc&gl=us&hl=en&num=100","hasNextPage": false,"serpProviderCode": "O","resultsTotal": 1450000000,"relatedQueries": [{ "title": "apple inc careers", "url": "https://www.google.com/search?q=apple+inc+careers" }],"paidResults": [],"paidProducts": [],"aiOverview": null,"organicResults": [{"title": "Apple","url": "https://www.apple.com/","displayedUrl": "www.apple.com","description": "Discover the innovative world of Apple and shop everything iPhone, iPad, Apple Watch, Mac and Apple TV.","emphasizedKeywords": ["apple inc"],"siteLinks": [{ "title": "iPhone", "url": "https://www.apple.com/iphone/", "description": "" }],"productInfo": {},"type": "organic","position": 1}],"suggestedResults": [{ "title": "apple inc careers", "url": "https://www.google.com/search?q=apple+inc+careers", "type": "related", "position": 1 }],"peopleAlsoAsk": [{ "answer": null, "question": "Who is the CEO of Apple Inc?", "title": "Who is the CEO of Apple Inc?", "url": "https://www.apple.com/leadership/", "date": null }],"customData": {"perplexitySearch": { "enablePerplexity": false, "searchRecency": null, "returnImages": false, "returnRelatedQuestions": false },"chatGptSearch": { "enableChatGpt": false },"maximumLeadsEnrichmentRecords": 0,"leadsEnrichmentDepartments": []},"htmlSnapshotUrl": "apple_inc_20260816_101530_p1.html","hasAnswerBox": false,"answerBox": null,"hasKnowledgePanel": true,"knowledgePanel": {"title": "Apple Inc.","subtitle": "Technology company","entityType": "organization","description": "Apple Inc. is an American multinational technology company headquartered in Cupertino, California.","descriptionSource": "Wikipedia","descriptionUrl": "https://en.wikipedia.org/wiki/Apple_Inc.","website": "https://www.apple.com/","facts": [{ "label": "CEO", "value": "Tim Cook", "valueUrl": null, "attrId": "kc:/organization/organization:ceo" },{ "label": "Founded", "value": "April 1, 1976, Los Altos, CA", "valueUrl": null, "attrId": "kc:/organization/organization:founded" },{ "label": "Headquarters", "value": "Cupertino, CA", "valueUrl": null, "attrId": "kc:/organization/organization:headquarters" }],"socialProfiles": [{ "network": "Twitter", "url": "https://twitter.com/Apple", "isGoogleRedirect": false }]},"relatedSearches": [{ "title": "apple inc careers", "url": "https://www.google.com/search?q=apple+inc+careers" }],"entityExtraction": {"requestMode": "separate","surfaceUrl": "https://www.google.com/search?q=apple+inc&gl=us&hl=en","answerBoxSelector": null,"knowledgePanelContainer": "#rhs","htmlSnapshotKey": "apple_inc_20260816_101530_entity.html","error": null},"errorReason": null}
peopleAlsoAsk.answer and peopleAlsoAsk.date are always null in the current parser — only question/title and url are populated. Add saveHtml: true to get the raw page HTML on the row itself (property html), on top of searchQuery, url, hasNextPage, serpProviderCode, resultsTotal, relatedQueries, paidResults, paidProducts, aiOverview, organicResults, suggestedResults, peopleAlsoAsk, customData, htmlSnapshotUrl, hasAnswerBox, answerBox, hasKnowledgePanel, knowledgePanel, relatedSearches, entityExtraction, and errorReason shown above.
Featured snippet (answerBox)
{"type": "paragraph","answer": "The capital of France is Paris, a major European city and a global center for art, fashion, gastronomy and culture.","answerHtml": "<div class=\"g-blk\">…</div>","listItems": [],"tableRows": [],"sourceTitle": "Paris - Wikipedia","sourceUrl": "https://en.wikipedia.org/wiki/Paris","sourceDisplayedUrl": "en.wikipedia.org/wiki/Paris"}
type is one of "paragraph", "list", "table", or "video", detected from the block's own structure.
Knowledge panel (knowledgePanel)
{"title": "Apple Inc.","subtitle": "Technology company","entityType": "organization","description": "Apple Inc. is an American multinational technology company headquartered in Cupertino, California.","descriptionSource": "Wikipedia","descriptionUrl": "https://en.wikipedia.org/wiki/Apple_Inc.","website": "https://www.apple.com/","facts": [{ "label": "CEO", "value": "Tim Cook", "valueUrl": null, "attrId": "kc:/organization/organization:ceo" }],"socialProfiles": [{ "network": "Twitter", "url": "https://twitter.com/Apple", "isGoogleRedirect": false }]}
⚠️ Google A/B-serves social-profile links in the panel two ways: a direct profile URL, or a /goto?url=<opaque token> redirect wrapper that cannot be decoded offline. socialProfiles[].isGoogleRedirect flags which one you got so it is never mistaken for a resolvable profile URL.
Uncharged failure row
A query that stays blocked through every retry rung, or resolves with no valid response, is never silently dropped and never billed — it is pushed with a distinct, smaller shape:
{"searchQuery": { "term": "example query", "url": "", "device": "DESKTOP", "page": 1, "type": "SEARCH", "domain": "google.com", "countryCode": "US", "languageCode": "en", "locationUule": null, "resultsPerPage": 0 },"searchQueryTerm": "example query","url": "","status": "failed","errorReason": "blocked_or_challenge_page","charged": false,"hasAnswerBox": false,"answerBox": null,"hasKnowledgePanel": false,"knowledgePanel": null,"entityExtraction": { "requestMode": "separate", "surfaceUrl": null, "answerBoxSelector": null, "knowledgePanelContainer": null, "htmlSnapshotKey": null, "error": null }}
Filter these out of a paid-row analysis with item.charged !== false (or equivalently, skip rows where status === "failed"). Note that onlyQueriesWithPanel: true behaves differently again: a page with neither block simply isn't pushed at all — it is skipped, not written as a failure row.
How does Google Search Results Scraper With Knowledge Panel & Answer Box compare to other Google scrapers?
| Feature | This Actor | Generic alternative |
|---|---|---|
| Answer box as a discrete field | ✅ answerBox object (type, text/HTML, citation) plus hasAnswerBox flag | ❌ Not documented as a separate field on Apify's own apify/google-search-scraper listing (checked 2026-08-16) |
| Knowledge panel granularity | ✅ Title, subtitle, entity type, sourced description, website, facts[], socialProfiles[] | ❌ dataharvest/google-search-scraper documents a single flat knowledgePanel field without a documented facts/social-profile breakdown (checked 2026-08-16) |
| Snippet kept separate from organic results | ✅ Distinct answerBox block outside organicResults | ❌ scrape.badger/google-search-scraper documents the featured snippet as folded "within organic results' rich metadata" rather than a discrete block (checked 2026-08-16) |
| Cost/fidelity control over the panel fetch | ✅ entityRequestMode: separate request (byte-identical organic output) vs. merged (cheaper, changes organic layout) vs. off | ❌ Not documented as a configurable trade-off on any of the three listings checked 2026-08-16 |
| Uncharged failure accounting | ✅ Blocked/failed queries pushed as an uncharged row (charged: false) with errorReason, never silently dropped | ❌ Not documented on any of the three listings checked 2026-08-16 |
If you're building an AI agent or RAG pipeline, the output-format row is the decision-maker — parsing HTML for an answer box or entity card inside an agent loop is a reliability failure mode, not a feature.
How many results can you scrape with Google Search Results Scraper With Knowledge Panel & Answer Box?
resultsPerPage is capped at 100 by the input schema (Google's num parameter) and clamped to 1–100 at runtime either way. maxPagesPerQuery has no maximum in the schema — set it as high as you need, and the Actor keeps paginating until Google's own next-page control (#pnnext) disappears from the SERP, or it hits the page you configured. Each page is roughly 10 organic results, though Google's own filtering can return fewer, especially on page 1; enabling includeUnfilteredResults can recover some of the difference. answerBox and knowledgePanel are read once per query, from page 1 only, regardless of maxPagesPerQuery. There is no measured throughput figure to report — actual results per run depend on your query list, resultsPerPage, and maxPagesPerQuery.
Integrate Google Search Results Scraper With Knowledge Panel & Answer Box and automate your workflow
Google Search Results Scraper With Knowledge Panel & Answer Box works with any language or tool that can send an HTTP request to the Apify API.
REST API integration
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_API_TOKEN>")run = client.actor("YOUR_USERNAME/google-search-results-scraper-knowledge-panel-answer-box").call(run_input={"queries": "apple inc\nbest running shoes 2026","captureAnswerBox": True,"captureKnowledgePanel": True,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["searchQueryTerm"], item["hasAnswerBox"], item["hasKnowledgePanel"])
Works in Python, Node.js, Go, Ruby, cURL.
Automation platforms (n8n, Make)
n8n's built-in Apify node and Make's Apify module can both call this Actor by name, poll the run, and drop dataset items straight into a downstream workflow — a scheduled rank/entity-tracking flow with no custom HTTP code needed.
⚖️ Is it legal to scrape Google search results?
Yes. Google Search Results Scraper With Knowledge Panel & Answer Box returns only what is publicly rendered on the Google SERP — organic results, ads, the answer box, the knowledge panel — the same information any visitor sees without logging in. This is business/product data, not personal data about identifiable individuals, so it sits under Google's Terms of Service and database/content-rights considerations rather than GDPR or CCPA, which govern personal data. The one exception is the optional business-leads enrichment add-on (maximumLeadsEnrichmentRecords): when enabled it returns names, emails, phone numbers, and LinkedIn profiles, which is personal data subject to GDPR/CCPA where applicable. Consult legal counsel for commercial use cases involving bulk personal data.
❓ Frequently asked questions
Does this Actor work without a Google account?
Yes. It reads the public Google SERP with no login and no Google API key. The only optional credential is a SerpApi key (serpApiKey), needed only if you enable the AI Mode add-on and want the AI Overview text.
How often is the scraped data updated?
Live. Every run sends a fresh request to google.com for each query — nothing is cached or replayed from a prior run.
What happens if a query has no answer box or no knowledge panel?
That's the common case, not an error. hasAnswerBox/hasKnowledgePanel are false and answerBox/knowledgePanel are null on that row; the organic results, ads, and People Also Ask are still returned normally. Set onlyQueriesWithPanel: true to skip (and avoid being charged for) rows with neither block.
Can this Actor return personalized or login-gated search results?
No. Only the public, unauthenticated SERP is scraped — no personalized results, no Search Console data, no content behind a site's own login wall. countryCode, languageCode, and locationUule change the market/locale Google serves, not personalization.
Do I need a Google API key to use this Actor?
No. It scrapes the public SERP directly rather than calling a Google API. The optional serpApiKey field is only for the AI Overview add-on, which uses a third-party service (SerpApi), not a Google credential.
Does this Actor work for AI agent workflows and LLM pipelines?
Yes. It's callable as an HTTP endpoint by any agent framework via the Apify API or apify_client. Every response is typed JSON — organicResults, answerBox, knowledgePanel — ready to pass into an LLM context window or agent tool call with no HTML parsing step.
How does this Actor handle Google's anti-bot defenses?
It runs through Apify's GOOGLE_SERP proxy group by default and escalates to RESIDENTIAL proxies (with retries and session rotation) when a response resolves to a /sorry/ interstitial or Google's JS-challenge shell page — a real HTTP 200 response of roughly 92 KB that carries zero result containers. A page that clears that check but still parses to zero organic rows is treated as a soft block and retried with a fresh session before anything is pushed for that query.
How does this Actor compare to other Google scrapers?
Checked on the Apify Store on 2026-08-16: Apify's own apify/google-search-scraper documents organic results, ads, People Also Ask, and AI Overview, but not a separate answer-box or knowledge-panel field. dataharvest/google-search-scraper and scrape.badger/google-search-scraper both document a knowledge panel and snippet, but neither documents the separate-request vs. merged-request cost/fidelity trade-off (entityRequestMode) or an uncharged-failure-row guarantee that this Actor documents.
Does this Actor return data in a format LLMs can use directly?
Yes. Typed, normalized JSON with stable field names — no HTML, no selectors, no parsing. Pass it directly into an LLM context window, index it into a vector store, or route it through an agent tool.
Can I use this Actor without managing proxies?
Yes. Proxying, including the escalation from Google SERP to residential proxies on a block, is handled internally. You can supply your own proxy configuration in proxyConfiguration, but it isn't required.
What happens when Google changes its SERP structure or blocks the scraper?
The Actor is maintained and the output schema stays stable — field names and types don't change on your end even when the underlying parsing logic has to adapt to a Google layout change.
💬 Your feedback
Found a bug or missing a field in the answer box or knowledge panel output? We want to know. Open an issue on the Actor's Apify Store page or contact API-Empire through the Console's built-in support channel — it's how this Actor stays maintained against Google's next layout change.