Google Search SERP Scraper avatar

Google Search SERP Scraper

Pricing

from $1.79 / 1,000 results

Go to Apify Store
Google Search SERP Scraper

Google Search SERP Scraper

Scrape Google Search pages for keywords or google.com/search URLs: position, title, URL, displayed URL, site name and snippet per organic result, by country and language. Optional ads, People Also Ask, related searches and AI Overview flag are saved to a separate serp-pages dataset.

Pricing

from $1.79 / 1,000 results

Rating

0.0

(0)

Developer

Axiom Works

Axiom Works

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

9 hours ago

Last modified

Categories

Share

What does Google Search SERP Scraper do?

Google Search SERP Scraper turns Google search result pages into structured data. You give it one or more search phrases, or full google.com/search links, and it returns one dataset row for every organic result: the title, the real target URL, the address line shown under the title, the site name, the snippet, and the date when Google shows one at the start of the snippet.

You choose the country (the gl parameter) and the interface language (the hl parameter), so you can see what searchers in Germany, the United Kingdom or the United States are shown for the same phrase. Each row repeats the query, country, language, result page and absolute rank, so rows from many searches can live in one dataset without losing track of where they came from.

Google links most results through a redirect address. By default the Actor follows each one with a single lightweight request and stores the final address in url. You can switch this off to save time, in which case url holds Google's redirect link.

The Actor can also save the extra parts of each results page as additional rows in the same dataset (recordType serpPage): paid results (ads), People Also Ask questions, related searches, the total number of results Google reports, and a flag showing whether an AI Overview block was present. It does not use a login and only reads public results pages.

This Actor is an independent tool and is not affiliated with, endorsed by or sponsored by Google.

Typical uses:

  • Rank tracking. Run the same phrases on a schedule and compare the position of your pages and your competitors' pages.
  • Content research. Read the titles and snippets that already rank for a topic before you write about it.
  • Competitor monitoring. See which sites appear for the phrases that matter to you, and in which country.
  • Lead and source lists. Collect the sites that rank for a niche query and use the url field as a starting list.
  • Market comparison. Run one phrase with several country and language codes and compare the results.

What data can you get?

Every organic result becomes one row in the default dataset.

FieldDescription
recordTypeorganic for organic results, serpPage for per-page SERP feature rows
idStable id derived from query, country, language and position
searchQueryThe search phrase that produced the row
countryCodeCountry code used for the search (gl)
languageCodeLanguage code used for the search (hl)
pageResults page the row came from, starting at 1
positionAbsolute rank among organic results for that search
titleResult title
urlTarget URL of the result. If it could not be resolved, or Resolve result URLs is off, this is Google's redirect link
displayedUrlThe address line shown under the title
siteNameSite name shown next to the result
descriptionResult snippet
dateDate shown at the start of the snippet, when present
sourceUrlThe Google results page the row came from
scrapedAtISO timestamp of when the row was saved

Fields that Google does not show for a result, such as date or siteName, can be empty for that row.

With Include SERP features switched on, the default dataset also gets one row per results page, marked "recordType": "serpPage" (organic rows are marked "recordType": "organic"):

FieldDescription
searchQuery, countryCode, languageCode, pageThe search and page the row describes
urlThe Google results page address
resultsTotalTotal results count Google reports for the search, or null when not shown
hasAiOverviewTrue when an AI Overview block was present. Only the flag is stored, not its text
paidResultsAds on the page, each with title, displayedUrl, description and url
peopleAlsoAskPeople Also Ask questions found on the page
relatedQueriesRelated searches listed by Google

How to use Google Search SERP Scraper

  1. Open the Actor on Apify and go to the Input tab.
  2. Add your search phrases in Search queries. You can also paste full google.com/search links; their q, gl, hl and start parameters are used.
  3. Set how many result pages you want per query. Google returns up to 10 organic results per page, often fewer when ads, maps or other blocks are shown.
  4. Pick a country and a language.
  5. Leave Resolve result URLs on if you want the real target addresses.
  6. Optionally set Max organic results (default 100) to cap the total number of rows, and switch on Include SERP features if you also want ads, questions and related searches.
  7. Click Start. When the run finishes, open the Output tab and download the dataset as JSON, CSV, Excel or HTML, or read it through the API.

The default proxy setting uses Apify Proxy. Result pages are requested through the GOOGLE_SERP proxy group, and when a page has to be opened in a browser instead, the proxy you choose in the input is used. Residential proxies are recommended for that case.

Google sometimes shows a block page or a CAPTCHA. The Actor does not solve CAPTCHAs. It retries with a fresh proxy session several times, and if a page still returns no results it logs a warning and moves on. If you see this often, lower Max concurrency or use residential proxies.

Input

FieldTypeDescription
queriesarray, requiredSearch terms, or full google.com/search URLs. Example: ["web scraping api"]
maxItemsintegerStop after this many organic results in total across all queries, 1-10000. Default 100
maxPagesPerQueryintegerResult pages per query, 1 to 10, default 1. Google caps depth at roughly 100 results
countryCodestringTwo-letter country code (gl), default us
languageCodestringInterface language code (hl), default en
resolveUrlsbooleanResolve Google redirect links to the real target URL, default true
includeSerpFeaturesbooleanAlso save one row per results page (recordType serpPage), costs extra per page row, default false
maxConcurrencyintegerResult pages processed in parallel, 1 to 10, default 3
proxyConfigurationobjectApify Proxy settings; residential proxies are recommended

Example input:

{
"queries": ["web scraping api"],
"maxPagesPerQuery": 1,
"countryCode": "us",
"languageCode": "en",
"resolveUrls": true
}

If the input is invalid, for example an empty queries list, a link that is not a google.com/search address, a link without a q parameter, or a maxItems that is not a positive whole number, the run stops right away with a clear error message.

Output

A real row from a run with the input above:

{
"recordType": "organic",
"id": "7466883dec730892c9b8",
"searchQuery": "web scraping api",
"countryCode": "us",
"languageCode": "en",
"page": 1,
"position": 1,
"title": "How to Use WebScrapingAPI To Scrape Any Website",
"url": "https://www.webscrapingapi.com/webscrapingapi-guide",
"displayedUrl": "https://www.webscrapingapi.com › Blog › Guides",
"siteName": "WebScrapingAPI",
"description": "If you are interested in web scrapers and want a solution that can extract various data from the Internet, you've come to the right place!",
"date": "Apr 28, 2026",
"sourceUrl": "https://www.google.com/search?q=web+scraping+api&gl=us&hl=en",
"scrapedAt": "2026-09-30T18:09:43.881Z"
}

Results change over time and by location, so the titles, snippets and positions you get will differ from this example.

How much does it cost?

The Actor is charged per result: you pay for each organic result row saved to the dataset. If you switch on Include SERP features, each extra results-page row is also charged. See the Pricing tab of the Actor for the current rates.

To keep a run inexpensive, set Max organic results and a small number of result pages, and switch off Resolve result URLs when the redirect links are enough.

Use with the API

You can start the Actor and read its results through the Apify API.

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("axiomworks/google-search-results-scraper").call(
run_input={"queries": ["web scraping api"], "maxPagesPerQuery": 1}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["position"], item["title"], item["url"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('axiomworks/google-search-results-scraper').call({
queries: ['web scraping api'],
maxPagesPerQuery: 1,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

cURL:

curl -X POST "https://api.apify.com/v2/acts/axiomworks~google-search-results-scraper/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"queries": ["web scraping api"], "maxPagesPerQuery": 1}'

You can also connect runs to schedules, webhooks and the usual Apify integrations to send results to spreadsheets, databases or other tools.

Use with AI agents (MCP)

You can call this Actor from any MCP client through the Apify MCP server. Add this to your client configuration:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com/?tools=axiomworks/google-search-results-scraper"
}
}
}

Example prompts:

  • "Search Google for 'web scraping api' in the US and list the top 10 titles with their URLs."
  • "Search 'headless browser' with language de and includeSerpFeatures on, and return the serpPage rows with peopleAlsoAsk and relatedQueries."
  • "Compare the top results for 'best crm software' in the US and the UK."

The argument descriptions in the input schema tell the agent which fields to fill in.

FAQ

How many results can I get for one query? Google returns up to 10 organic results per page, often fewer, and limits depth to roughly 100 results, so the most you can expect for one phrase is up to about 100 rows.

Why is url sometimes a Google link? Either Resolve result URLs is off, or the redirect could not be followed. In both cases url holds Google's redirect link instead of the target address.

Why is date empty for some rows? The field is only filled when Google shows a date at the start of the snippet.

Does it return the AI Overview text? No. Only a true or false flag, hasAiOverview, is saved in the serpPage rows.

Can I paste a Google search link instead of a phrase? Yes. Links must be google.com/search addresses with a q parameter. Their q, gl, hl and start values are used.

Does it solve CAPTCHAs? No. If Google shows one, the Actor retries with a fresh proxy session and then moves on to the next page.

Are the results the same as what I see in my browser? Not always. Google personalizes and changes results by location and time, so positions can differ from what you see when you search yourself.

Does it use AI? No. This Actor does not use any third-party AI processor.

The Actor reads publicly visible search result pages and does not log in to any account. Whether your use of the collected data is lawful depends on what you collect, where you are, and what you do with it. Search results can contain personal data, and Google's terms of service place limits on automated access. You are responsible for making sure that your use of search results complies with Google's terms and with the laws that apply to you, including data protection rules. If in doubt, ask a legal adviser.

Feedback

If a field is missing, a search returns fewer rows than you expect, or Google changes its page layout and something stops working, open an issue from the Actor page on Apify with the run link and the input you used. Reports like these are the fastest way to get a fix.