Google Search Results Scraper — SERP API avatar

Google Search Results Scraper — SERP API

Pricing

from $3.00 / 1,000 results

Go to Apify Store
Google Search Results Scraper — SERP API

Google Search Results Scraper — SERP API

Google Search Results Scraper returns organic results (title, real URL, snippet, position) for any query through the Apify GOOGLE_SERP proxy — one row per SERP page, priced per page not per result.

Pricing

from $3.00 / 1,000 results

Rating

0.0

(0)

Developer

Murat Uzun

Murat Uzun

Maintained by Community

Actor stats

0

Bookmarked

11

Total users

6

Monthly active users

2 days ago

Last modified

Share

What is Google Search Results Scraper?

Google Search Results Scraper is an Apify Actor that fetches Google search result pages (SERPs) and returns organic results with real, ready-to-click destination URLs as one clean, structured row per page. It works through the Apify Proxy GOOGLE_SERP group — the proxy pool Google accepts requests through — using Google's &gbv=1 ("basic HTML") rendering, the one request shape (of six tested through that proxy) that returns organic links as a decodable /url?q=<url> redirect instead of Google's newer opaque /goto?url=<protobuf> click tracker that most scrapers cannot read. Priced per SERP page fetched, not per result, so a 10-result page and a 100-result page cost the same.

Pricing: Google Search Results Scraper costs $5.00 per 1,000 results (pay per result, no subscription; Apify's free plan credit covers small runs).

What data does Google Search Results Scraper extract?

Google Search Results Scraper extracts the organic result list for every query/page combination you give it:

FieldTypeDescription
query, page, countryCode, languageCode, devicestring, numberThe request that produced this row
searchUrlstringThe exact Google URL fetched through the proxy
organicResults, organicCountarray, number{position, title, url, displayedUrl, snippet, date, sitelinks[]} per organic listing
peopleAlsoAsk, relatedSearches, ads, adCount, featuredSnippet, knowledgePanelTitlearray/object/nullParsed when present — see the FAQ, they are near-always empty on this Actor's leaner rendering
totalResultsText, htmlLengthstring, numberGoogle's own results-count text (rarely present) and the raw HTML size fetched
error, scrapedAtstringSet on a fetch/parse/blocked-page failure, and the ISO timestamp of the request

How to use Google Search Results Scraper

  1. Enter your search terms into Search queries, e.g. apify web scraping. One row comes back per query per result page.
  2. Set Results per page (up to 100) and Max pages per query (up to 10) if you need more than the first page.
  3. Pick Device (desktop or mobile User-Agent), click Start, then export as JSON, CSV, Excel or HTML — every organicResults[].url is a real https:// link, ready to open or crawl further.

Example input

{
"queries": ["apify web scraping", "best crm for startups"],
"countryCode": "us",
"languageCode": "en",
"resultsPerPage": 10,
"maxPagesPerQuery": 1,
"device": "desktop"
}

Example output

{
"query": "apify web scraping",
"page": 1,
"device": "desktop",
"searchUrl": "http://www.google.com/search?q=apify+web+scraping&hl=en&gl=us&num=10&gbv=1",
"organicResults": [
{
"position": 1,
"title": "Apify: The largest marketplace of trusted tools for AI",
"url": "https://apify.com/",
"displayedUrl": "apify.com",
"snippet": "68,172 tools for your AI ... Apify is the largest marketplace of trusted tools for AI. Get real-time...",
"date": null,
"sitelinks": []
},
{
"position": 2,
"title": "Apify - GitHub",
"url": "https://github.com/apify",
"displayedUrl": "github.com › apify",
"snippet": null,
"date": null,
"sitelinks": []
}
],
"organicCount": 6,
"peopleAlsoAsk": [],
"relatedSearches": [],
"adCount": 0,
"error": null,
"scrapedAt": "2026-09-12T18:23:45.000Z"
}

Input parameters

ParameterTypeDefaultDescription
queriesarray["apify web scraping"]Search queries, one or more result pages per query
countryCodestring"us"2-letter country code (gl)
languageCodestring"en"2-letter language code (hl)
resultsPerPageinteger10Results requested per page (10-100)
maxPagesPerQueryinteger1Result pages fetched per query (1-10)
devicestring"desktop"desktop or mobile User-Agent
includePeopleAlsoAskbooleantrueParse the People Also Ask box, when Google renders one
includeRelatedSearchesbooleantrueParse related-search suggestions, when Google renders any
safeSearchbooleanfalseRequest SafeSearch filtering
maxConcurrencyinteger3SERP pages fetched in parallel (1-10)

There is no proxy configuration input — every request goes through the Apify Proxy GOOGLE_SERP group automatically, and that proxy cost is already included in the price below.

Pricing

Google Search Results Scraper uses pay-per-event pricing: $0.005 per SERP page fetched, i.e. $5 per 1,000 pages ($0.50 per 1,000 organic results at 10 results/page), Apify SERP proxy included — you never see a separate proxy bill. The underlying GOOGLE_SERP proxy traffic costs Apify (and therefore this Actor) about $0.0025 per page, so pricing leaves roughly half the price as margin while staying well below a self-hosted proxy-plus-CAPTCHA-solving setup. Set Maximum cost per run and the Actor trims the query/page list to what the budget covers instead of overspending.

Google Search Results Scraper vs. apify/google-search-scraper

The popular apify/google-search-scraper Actor is priced by compute-unit usage, which is harder to estimate up front and can vary with proxy retries. Google Search Results Scraper is flat pay-per-event: you always know a page costs $0.005 before you run it, and a failed or blocked page never pushes a duplicate billed row — it pushes exactly one row with the reason in error. It also deliberately fetches Google's leaner &gbv=1 rendering so organicResults[].url is a real link every time, rather than the newer opaque click-tracker link many scrapers pass through unresolved.

Using Google Search Results Scraper with AI agents and MCP

Google Search Results Scraper is pay-per-event with limited permissions — the two requirements for an Actor to be callable through the Apify MCP server at mcp.apify.com. An agent passes queries and gets back structured organic results with real destination URLs per page — ready for competitive research, content-gap analysis, or a lead-generation pipeline that needs to actually visit or crawl the result. The same run works from n8n, Make, Zapier and LangChain through Apify's integrations.

FAQ

Why does this Actor use Google's &gbv=1 mode instead of the normal results page? We tested 6 request variants through the Apify GOOGLE_SERP proxy (different User-Agents — Lynx, old Firefox, Googlebot — and query parameters — pws=0, a CONSENT cookie). Every variant except &gbv=1 returned organic links as /goto?url=<protobuf> — an encrypted, undecodable click tracker. Only &gbv=1 ("basic HTML version") returned the classic, decodable /url?q=<url>&sa=U... redirect. &gbv=1 is requested on every fetch, but Google does not always honor it (it is more consistent for desktop; a mobile request occasionally gets the normal, heavier page back instead) — when that happens the parser still recognizes the older markup and falls back to the displayedUrl breadcrumb guess. Across our live verification runs this added up to roughly 90% of organic results getting a fully real, decoded url, with the rest getting a best-effort guess or, rarely, null.

Why are peopleAlsoAsk, relatedSearches, ads and featuredSnippet almost always empty? This is the trade-off for real URLs: Google's &gbv=1 rendering is a leaner page that does not include those widgets at all — not even the People Also Ask question text survives, unlike the default page. The fields stay in the schema (parsed and populated whenever Google does include them) so nothing breaks if that ever changes, but expect them empty on a typical run today. If your use case specifically needs PAA/ads/related searches rather than real URLs, this Actor is not the right fit yet.

Why is url occasionally still null? In rare cases the /url?q= redirect itself is missing or malformed. When that happens the Actor falls back to a best-effort guess from the displayedUrl breadcrumb (e.g. github.com › apify → https://github.com); when even that isn't URL-shaped, url stays null but displayedUrl is still populated.

What happens if Google shows a CAPTCHA or cookie-consent page? The row's error says so ("Blocked by Google (captcha page detected)...") and the raw HTML is saved to the run's key-value store as DEBUG_<n>.html so it can be inspected; lower Max concurrency and try again later.

What if Google changes its markup? Every selector has 2-3 fallbacks. If a page still comes back with 0 organic results despite being a real (large) response, the row gets error: "Could not parse results (markup changed?)" and the HTML is likewise saved as DEBUG_<n>.html — open an issue with that file attached.

Is this legal to run? Scraping publicly visible search results is generally lower-risk than scraping logged-in content, but you are responsible for complying with Google's Terms of Service and your local laws for your use case.

Can I export to CSV or Excel? Yes, from the Output tab or the API, with a ready-made Overview view.

Part of the webdatatools web-intelligence suite — every Actor is pay-per-event, reads public data without a login, and returns one clean row per entity:

Browse the whole suite at webdatatools, or call ten of these Actors straight from Claude, Cursor or Cline with the webdatatools MCP server.

Website & domain intelligence

Content for AI, LLMs and RAG

Search, video and social

Leads, jobs and company data

Developer, app and research data

Support and feedback

Found a query pattern that returns a parse error, a selector Google changed, or a field worth adding? Open an issue on the Issues tab — attach the DEBUG_<n>.html file from the run's key-value store if you have one.