Google Search Results Scraper
Scrape Google Search results: organic listings, ads, People Also Ask, related searches and next pages. No API key needed.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
query,googleDomain,countryCode(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.001 per search result = $1 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Search result | Charged once per organic search result returned. Ads, People Also Ask, related searches, sample rows and failure diagnostics are never charged. | $0.001 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-08-22, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
query | Google query. Supports operators such as site:, intitle:, quotes, OR, and minus terms. | string |
googleDomain | Google host without protocol, for example google.com, google.ca, or google.co.uk. | string |
countryCode | Google country edition passed as gl, for example US, CA, GB, or DE. | string |
language | Google interface language passed as hl, for example en, fr, or de. | string |
maxResults | Maximum rows to return in total, counting organic results, ads, People Also Ask and related searches together. Google may provide fewer. This is also the cap on how many rows a run can charge for. | integer |
maxPages | Follow Google pagination up to this many pages. Each page is fetched only as needed. | integer |
includeAds | Return detectable paid search ads in addition to organic results. | boolean |
includePeopleAlsoAsk | Return visible PAA questions and answer text when present in the HTML. | boolean |
includeRelatedSearches | Return related-search phrases from the bottom of each page. | boolean |
enableProxyFallback | Retry through the proxy lanes when the direct request cannot be read. Google now serves its "Enable JavaScript to use search" gate to every plain-HTTP client on every address, so the direct lane alone returns no results and this must stay on for the Actor to produce rows. | boolean |
What you get
A structured dataset — each result includes fields like:
typetitlequestionqueryurldomainsnippetpageranktransportokExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
1 ready-to-run use cases
Google SERP with People Also Ask
Scrape Google results for a keyword plus the People Also Ask questions and related searches. Useful for content research.
Related tools in Developer & Research Tools
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
GitHub Scraper
Search GitHub repos and users: stars, forks, language, topics, licence, plus user bio, company and followers. No token needed. $0.90 per 1,000 rows.
Stack Overflow / Stack Exchange Scraper
Search Stack Overflow and Stack Exchange by keyword or tag. Score, answer count, views, reputation and body text. $2 per 1,000 questions.
Package Registry Scraper (npm + PyPI)
Get npm and PyPI package metadata as JSON. Version, license, author, repo, keywords and npm monthly downloads. $2 per 1,000 packages.
arXiv Scraper
Search arXiv papers by title, author, abstract or category. Get full abstracts, authors, categories, DOI, dates and PDF links. $2 per 1,000 papers.
OpenAlex Scholarly Works Scraper
Search 250M+ OpenAlex papers with no API key. Get titles, authors, venue, year, citations, DOI, OA links and full abstracts. $2.00 per 1,000 papers.
Crossref Scholarly Works Scraper
Search 150M+ papers on Crossref: DOI, title, authors, journal, publisher, date, citations and abstract. No API key. $1.00 per 1,000 works.
Where this tool sits
- Categories
- Developer & Research Tools
Google Search Results Scraper: organic listings, ads and People Also Ask for one query
Type one Google query and get the results page back as rows: organic listings with their rank, the ads above them, the People Also Ask questions and the related searches at the bottom. You pick the country, the language, the Google domain and how many pages to follow.
One thing to check before you wire it into anything. The url on a result row is the link exactly as Google printed it, and that is not always the destination: in the real row below it came back as a google.com/goto?url=... redirect, with the publisher's name sitting in displayedUrl instead.
| Input | One Google query, operators like site:, quotes and OR included |
| Output | One row per organic result, ad, People Also Ask entry or related search |
| Ceiling | 100 rows per run, across up to 10 pages |
| Account needed | None, and no Google API key |
| Price | $1.00 per 1,000 rows, flat on every plan |
🔍 What Google Search Results Scraper does
It runs your query against the Google domain you name, reads the results page, and turns it into four kinds of row.
Organic rows carry the title, the link, the domain, the displayed URL, the snippet and the rank. Ad rows carry the same shape for the paid results Google marks as such. People Also Ask rows carry the question and the answer text Google shows when the box is expanded in the HTML. Related search rows carry the phrases printed at the bottom.
Set maxPages above 1 and it follows Google's own Next link, page by page, stopping when your row limit is reached or Google runs out of pages. Duplicate links are dropped across pages, so a listing that appears twice arrives once.
📥 What you give it
{
"query": "best running shoes site:runnersworld.com",
"countryCode": "US",
"language": "en",
"googleDomain": "google.com",
"maxResults": 20,
"maxPages": 2
}
| Field | Default | What it is |
|---|---|---|
query | box starts at best running shoes | Your search. site:, intitle:, quoted phrases, OR and minus terms all work. |
googleDomain | google.com | The Google host, without https://. google.co.uk, google.ca and the rest are fine. |
countryCode | US | Two-letter country, sent as Google's gl. |
language | en | Interface language, sent as Google's hl. |
maxResults | 10 | Total rows, 1 to 100, counting all four kinds together. It is also the most a run can bill you. |
maxPages | 1 | Follow Google's pagination this far, 1 to 10. |
includeAds | on | Return the paid results Google marks as ads. |
includePeopleAlsoAsk | on | Return the People Also Ask questions and their answer text. |
includeRelatedSearches | on | Return the related phrases from the foot of the page. Read the limit below first. |
enableProxyFallback | on | Leave it on. Switched off, runs come back with a JS_REQUIRED row and no results. |
proxyConfiguration | leave it alone | Optional. Your own servers are used exactly as given. |
There is one more field the schema does not show: proxyUrls, an array of your own server URLs. Pass it and those are tried first, verbatim.
Setting useApifyProxy to false inside proxyConfiguration does not take effect. The run routes itself either way. If you want your own servers used, list them rather than switching the object off.
📤 What you get back
A real organic row from a recent run, with the long link and the snippet cut short:
{
"ok": true,
"type": "organic",
"title": "The 15 Best Running Shoes of 2026",
"url": "https://google.com/goto?url=CAESdwHrOzAV7FPP0O3re4bWugQoRsUlWFw65cAN47wAxFn...",
"domain": "google.com",
"displayedUrl": "Runner's World",
"snippet": "Aug 3, 2026 ... For new runners we recommend a shoe like the Brooks Ghost or Nike Pegasus as a starting point. ...Read more",
"rank": 1,
"page": 1,
"query": "best running shoes",
"countryCode": "US",
"language": "en",
"googleDomain": "google.com",
"transport": "proxy_fallback_serp",
"fetchedAt": "2026-09-14T05:43:56.720Z"
}
| Field | What it is |
|---|---|
type | organic, ad, people_also_ask or related_search. All four land in the same dataset. |
url | The link as Google gave it. Follow it, or read displayedUrl, before treating it as the destination. |
rank | Position within its own page, so page 2 starts counting again. |
question, answer | People Also Ask rows only. answer is whatever text Google put in the HTML, which is sometimes empty. |
query | The search you typed. On a related_search row this overwrites the related phrase, which survives only inside url. |
page | Which Google page the row came from, counting from 1. |
snippet | Google's own description text, trailing Read more and all. |
🧾 Reading the output
Three kinds of row can land in your dataset.
| Row | How to spot it | Billed as a result |
|---|---|---|
| A real result | ok: true and a type of organic, ad, people_also_ask or related_search | yes |
| The sample row | _sample: true | no |
| A diagnostic | ok: false and an errorCode | no |
Filter on ok being true with _sample absent. An empty query writes the sample row and stops, so you can see the shape first.
| Code | What it means |
|---|---|
NO_RESULTS | The page loaded and nothing usable was on it. A query with no matches lands here. |
BLOCKED | Google would not serve that request. Re-run it or reword the query. |
RATE_LIMITED | Google answered with a rate limit. Wait and re-run. |
JS_REQUIRED | Google served its JavaScript gate instead of a results page. Turn enableProxyFallback back on. |
NETWORK | Google was unreachable or answered badly. A googleDomain that is not a real Google host also lands here rather than saying the value is wrong. |
The Overview table hides answer, displayedUrl and the diagnostic fields, so a run that produced only a diagnostic looks almost blank there. Switch the dataset to JSON to read it.
▶️ How to run it
1. Open Google Search Results Scraper and click Try for free. 2. Put your search in Search query, replacing the example. 3. Set Maximum results. Ten is a sensible first run. 4. Change Google domain, Country code and Language if you want another country's view, then click Start. 5. Download the dataset as JSON, CSV or Excel, or read it from the Apify API.
💰 How much does it cost?
$1.00 per 1,000 rows. Flat on every Apify plan, no volume tiers.
Every row that lands is one result, whether it is organic, an ad, a People Also Ask entry or a related search. maxResults caps all four together, so it also caps what a run can bill: set it to 10 and ten rows is the most you can be charged for, however many pages get read.
The sample row, every diagnostic row and a query that finds nothing are not billed as results.
💡 What people use it for
- Tracking where a page ranks for a keyword, week by week, with
rankandpagealready split out. - Pulling the People Also Ask questions for a topic to see what the audience actually asks.
- Checking which advertisers sit above the organic results for a commercial term in one country.
- Running the same query across
google.com,google.co.ukandgoogle.deto compare what each
country sees.
🚧 What it does not do
- Related searches collapse into one row. Measured on a page carrying nine related phrases: one
related_search row came out, and its query held the search that was typed, not the phrase. The phrase is only readable inside url. Turn includeRelatedSearches off if you do not need it.
- With a small
maxResults, ads are taken first. Cap a run at 5 on an advert-heavy term and ads
can use most of the budget. Switch includeAds off if you only want organic rows.
- A failure on page two or later throws away the earlier rows. With
maxPagesabove 1, a run
that trips on a later page writes a diagnostic and no results. Keep maxPages at 1 when one page is better than nothing.
- Four kinds of row, and no more. No local pack, no shopping carousel, no news box, no knowledge
panel.
- Ads and People Also Ask are spotted from how Google marks them up, so a layout change on
Google's side can leave some of them out until the parser catches up.
- One query per run. Feed a keyword list by scheduling or looping runs.
- Rows are a snapshot of that page at that moment. Rankings move daily.
🧭 Which Google scraper do you need?
| If you want | Use |
|---|---|
| The web results page for a keyword | This one |
| News articles, with the publisher's real link | Google News Scraper |
| Images and where they are hosted | Google Images Scraper |
| Job postings from the jobs box | Google Jobs Scraper |
| Businesses and places | Google Maps Scraper |
❓ Questions people ask
Do I need a Google API key? No. Nothing to apply for, no quota to watch.
Can I search more than one keyword at a time? Not in one run. query takes a single search. Use a schedule or a loop for a list.
Do Google search operators work? Yes. site:, intitle:, quoted phrases, OR and minus terms all go straight through.
Why did I get fewer rows than maxResults? Google decides how much it prints. A narrow query, or one with site: on a small domain, often runs out before your limit does.
Can I schedule it? Yes. Runs are independent, so a daily rank check is just a schedule with the same query.
Is scraping Google Search legal? These are public search results. Apify's write-up on scraping and the law is a good starting point, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Send the query and the run ID. The errorCode on the diagnostic row usually names the problem on its own.