Google Search Results Scraper avatar

Google Search Results Scraper

Pricing

from $0.97 / 1,000 search results

Go to Apify Store
Google Search Results Scraper

Google Search Results Scraper

Scrape Google search results for one query: organic results with their rank, ads, People Also Ask questions and related searches, page by page. Pick the country, the language and the Google domain, and use operators like site: and OR. $1.00 per 1,000 organic results.

Pricing

from $0.97 / 1,000 search results

Rating

0.0

(0)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

22

Total users

14

Monthly active users

3 days ago

Last modified

Share

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.

The url on an organic row is the address of the page itself. Now and then Google won't give one up. That row still arrives, with url and domain set to null, and it is not billed.

InputOne Google query, operators like site:, quotes and OR included
OutputOne row per organic result, ad, People Also Ask entry or related search
Ceiling100 rows per run, across up to 10 pages
Account neededNone, and no Google API key
Price$1.00 per 1,000 organic results on the Free plan, a little less on paid plans. Ads, People Also Ask and related searches come free. The free plan's $5 a month covers about 5,000

🔍 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 page's address, the displayed source, the snippet and the rank. Ad rows carry the same shape for the paid results Google marks as such, without the advertiser's address: Google prints only its own click link for an ad and we don't follow it, so url and domain are null there. People Also Ask rows carry the question, and the answer text when Google puts it in the page. 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 data you get from each Google search result

What you getField
Which kind of row it istype
The listing: title, the page's address and its host, the source Google displays, the snippettitle, url, domain, displayedUrl, snippet
Position within its page, and which pagerank, page
People Also Ask: the question and the answer textquestion, answer
The search and its settings, on every rowquery, countryCode, language, googleDomain
When the page was readfetchedAt

▶️ How to scrape Google search results

  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.

An empty query writes one labelled sample row and stops, so you can see the shape first.

💰 How much does it cost to scrape Google search results?

$1.00 per 1,000 organic results on the Free plan. Paid plans pay a little less: $0.99 on Starter, $0.98 on Scale and $0.97 on Business. On the free plan, the $5 Apify gives you each month covers about 5,000 organic results.

Only organic results are billed. Ads, People Also Ask entries and related searches arrive free beside them. maxResults caps all four kinds together, so it also caps what a run can bill: set it to 10 and ten organic results is the most you can be charged for, however many pages get read.

The sample row, every diagnostic row, an organic result that came without its address and a query that finds nothing are not billed.

📥 What you give it

{
"query": "best running shoes site:runnersworld.com",
"countryCode": "US",
"language": "en",
"googleDomain": "google.com",
"maxResults": 20,
"maxPages": 2
}
FieldDefaultWhat it is
querynone, the box starts at best running shoesYour search. site:, intitle:, quoted phrases, OR and minus terms all work.
googleDomaingoogle.comThe Google host, without https://. google.co.uk, google.ca and the rest are fine.
countryCodeUSTwo-letter country, sent as Google's gl.
languageenInterface language, sent as Google's hl.
maxResults10Total rows, 1 to 100, counting all four kinds together. It is also the most a run can bill you.
maxPages1Follow Google's pagination this far, 1 to 10.
includeAdsonReturn the paid results Google marks as ads.
includePeopleAlsoAskonReturn the People Also Ask questions, with answer text when the page carries it.
includeRelatedSearchesonReturn the related phrases from the foot of the page. Read the limit below first.
enableProxyFallbackonOn by default. Switched off, runs can come back with no results.
proxyConfigurationleave it aloneOptional. Your own servers are used exactly as given.

📤 What you get back

A real organic row from a run on 11 October 2026:

{
"ok": true,
"type": "organic",
"title": "Best of Road Running Shoes",
"url": "https://believeintherun.com/shoe-reviews/type/best-of-road/",
"domain": "believeintherun.com",
"displayedUrl": "Believe in the Run",
"snippet": "Independent, run-tested reviews of running shoes, Popular Brands New Balance Nike Asics Hoka Saucony Puma Adidas. These are the Best On Running Shoes Right Now ...",
"rank": 4,
"page": 1,
"query": "best running shoes",
"countryCode": "US",
"language": "en",
"googleDomain": "google.com",
"fetchedAt": "2026-10-11T18:43:56.264Z"
}
FieldHow to read it
urlThe page's own address. null on a result Google gave no address for, and that row is not billed.
domainThe host of url, without www.. null when url is.
rankPosition within its own page, so page 2 starts counting again.
answerPeople Also Ask rows only, and usually null: on our test runs none of the 12 questions came with answer text.
queryThe search you typed. On a related_search row this overwrites the related phrase, which survives only inside url.
snippetGoogle's own description text, trailing Read more and all.

🧾 Reading the output

Four kinds of row can land in your dataset.

RowHow to spot itBilled as a result
An organic resultok: true, a type of organic and a urlyes
An organic result Google gave no address fora type of organic and url set to nullno
An ad, a People Also Ask entry or a related searchok: true and a type of ad, people_also_ask or related_searchno
The sample row_sample: trueno
A diagnosticok: false and an errorCodeno

Filter on ok being true with _sample absent. For the billed results alone, keep the organic rows that have a url.

CodeWhat it means
NO_RESULTSThe page loaded and nothing usable was on it. A query with no matches lands here.
NOT_SERVEDThis search page was not served this run. Re-run it later. Until 12 October 2026 this code was called BLOCKED or JS_REQUIRED.
RATE_LIMITEDGoogle answered with a rate limit. Wait and re-run.
NETWORKGoogle was unreachable or answered badly. A googleDomain that is not a real Google host also lands here rather than saying the value is wrong.
TIME_LIMITThe run got close to its time limit and stopped on its own. The results delivered before that are complete. Give the run more time, or ask for fewer pages, to get the rest.
INCOMPLETEGoogle did not return a later page (failedPage says which). The results of the pages before it are delivered and billed as usual; nothing is billed for the missing pages.

A diagnostic never fails the run, except one: when the time limit stopped the run before any result came back, the run ends as failed, with a TIME_LIMIT row saying so.

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.

💡 What people use it for

  • Tracking where a page ranks for a keyword, week by week, with rank and page already 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.uk and google.de to compare what each country sees.

From a seed word to who ranks for it, in three runs:

  1. Run Keyword Autocomplete Scraper on a seed with expandQuestions on, and keep the suggestion values you care about.
  2. Put the best few into Google Trends Scraper's searchTerms with compareKeywords on, to see which one is growing.
  3. Run the winner here as query to see who ranks for it today.

🚧 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.
  • 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 reading 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.
  • It is not an official Google tool. Dami's Studio is independent and is not affiliated with or endorsed by Google, or by any other company named on this page.

🧭 Which Google scraper do you need?

If you wantUse
The web results page for a keyword: organic, ads, People Also AskThis one
What a search box suggests as people typeKeyword Autocomplete Scraper
Interest in a keyword over time and by regionGoogle Trends Scraper
News articles with the publisher's real linkGoogle News Scraper
Image results and the pages they sit onGoogle Images Scraper
The ads a brand runs on GoogleGoogle Ads Transparency Scraper
The same job on Yandex, by regionYandex Search Engine Scraper
Businesses and placesGoogle Maps Scraper

❓ Questions people ask

Do I need a Google API key to scrape Google search results?

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.

Why don't the rankings match what I see on Google?

Google tailors results to where you are, your language and your history. The run sees what a logged-out visitor sees for the googleDomain, countryCode and language you set. To compare, search in a private browser window with the same Google domain.

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 call it from code or connect it to an AI assistant?

Yes. The API tab has ready-made code for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/google-search-results-scraper. Either way the run happens on your Apify account at the same price.

These are public search results. Apify's write-up on the legality of web scraping 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.