Google SERP Scraper - Search Results, Rankings & SERP Features
Pricing
$5.00 / 1,000 search queries
Google SERP Scraper - Search Results, Rankings & SERP Features
Scrape Google search results: organic listings with real URLs and positions, local pack, featured snippets and People Also Ask questions. Perfect for SEO research, rank tracking, and competitive analysis. Track Rankings Analyze SERP Features Research Competition Study User Intent Monitor Local SEO
Pricing
$5.00 / 1,000 search queries
Rating
0.0
(0)
Developer
The Howlers
Maintained by CommunityActor stats
2
Bookmarked
94
Total users
4
Monthly active users
3 days ago
Last modified
Categories
Security
Limited permissionsShare
Scrape Google search results: organic listings with their real URLs and positions, the local pack (map listings with ratings and review counts), featured snippets, People Also Ask questions, related searches and emphasized keywords. Multi-page pagination and CAPTCHA retries. Pages are fetched over plain HTTP through Apify's Google SERP proxy, with no browser.
On local searches (for example "plumber Austin TX") Google hides the link of every organic result behind an encrypted redirect. The actor unlocks each one by following Google's redirect, so you still get the real URL in its real position. Most links unlock with one short request; some take a few hops through Google's loading page or a retry on another proxy exit.
Not extracted: paid text ads, shopping ads, the Knowledge Panel, sitelinks and People Also Ask answers. Those output fields are always empty.
Quick Start
Run with real data
{"queries": ["best pizza near me"],"location": "United States","language": "en","device": "desktop","maxResults": 10,"maxPagesPerQuery": 1,"includePAA": true,"includeLocalPack": true,"includeFeaturedSnippet": true,"includeRelatedSearches": true,"includeEmphasizedKeywords": true,"maxRetries": 3,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["GOOGLE_SERP"]}}
Input Parameters
| Parameter | Type | Default | Required | Description |
|---|---|---|---|---|
queries | array | ["best pizza near me"] | No | List of search queries to scrape (one per line or comma-separated) |
location | string | "United States" | No | Geographic location for localized results (e.g., 'New York, NY, USA') |
language | string | "en" | No | Search language code |
device | string | "desktop" | No | Label saved with each result. The same result page is fetched for both values |
maxResults | integer | 10 | No | Number of organic results to extract per page (Google typically shows 10) |
maxPagesPerQuery | integer | 1 | No | Number of Google result pages to scrape per query (1-10). Page 2 = results 11-20, etc. |
includeAds | boolean | false | No | Not extracted: ads is always an empty list |
includeShoppingAds | boolean | false | No | Not extracted: shoppingResults is always an empty list |
includePAA | boolean | true | No | Extract People Also Ask questions (questions only) |
expandPAAAnswers | boolean | true | No | Not extracted: answers need a browser, so only the questions are returned |
includeLocalPack | boolean | true | No | Extract local business results (map pack) with ratings, reviews, categories |
includeFeaturedSnippet | boolean | true | No | Extract featured snippet content (paragraph, list, or table type) |
includeKnowledgePanel | boolean | true | No | Not extracted: knowledgePanel is never returned |
includeRelatedSearches | boolean | true | No | Extract related search suggestions at bottom of SERP |
includeSitelinks | boolean | true | No | Not extracted: sitelinks is always an empty list |
includeEmphasizedKeywords | boolean | true | No | Extract bolded/emphasized words from result descriptions, showing the exact keyword matches Google uses |
maxRetries | integer | 3 | No | Maximum retry attempts per request when CAPTCHA or errors occur (1-5) |
proxyConfiguration | object | {"useApifyProxy":true,"apifyProxyGroups":["GOOGLE_SERP"]} | No | Proxy settings. GOOGLE_SERP group recommended for best results |
webhookUrl | string | - | No | Optional webhook URL to receive results in real-time as each query completes |
Output
Each dataset item is one result page for one query: its organic results, and the local pack (the map listings) when Google shows one.
Local pack fields
| Field | Example | Notes |
|---|---|---|
name | Reliant Plumbing | Business name |
rating | 4.7 | Star rating. Read the same way whether Google prints 4.7 or 4,7. null when Google shows no rating |
reviewCount | 2935 | Review count as a number. See below |
reviewCountText | 2.9K | The count exactly as Google printed it in the pack |
reviewCountExact | true | false when reviewCount is an expanded abbreviation (2.9K read as 2900) |
category | Plumber | Business category |
address | Austin, TX | The location line Google shows: a street address, or the city for service-area businesses |
phone | (512) 222-6029 | When Google shows it |
sponsored | false | true for a paid listing in the pack |
How review counts are read. In the pack Google shortens large counts, and the short form depends on the search language: 2.9K in English, 2,9 k in French, 2,9 mil in Portuguese, 2,9 tys. in Polish, 2.7万 in Japanese and Chinese, 2,9 B in Turkish (B means thousand there). The actor reads all of them in the language you searched in. The same result page also carries each listed business's exact count; when that count agrees with the short form, reviewCount is the exact number (2935) and reviewCountExact is true. When it does not (paid listings usually have no exact count), reviewCount is the short form expanded (2900) and reviewCountExact is false. A business Google shows with "No reviews" gets reviewCount 0.
Organic result fields
| Field | Example | Notes |
|---|---|---|
position | 3 | The result's real position on the page (page 2 starts after page 1's results) |
title | THE BEST 10 PLUMBING IN AUSTIN, TX | |
url | https://www.yelp.com/search?cflt=plumbing&find_loc=Austin%2C+TX | The real URL. null only when linkStatus is locked |
linkStatus | unlocked | direct: a plain link on the page. unlocked: Google hid the link behind an encrypted redirect and the actor followed it. locked: the redirect could not be followed, so url is null and the result carries a _notice |
displayedUrl | https://www.yelp.com › Home Services › Plumbing | The site line Google prints under the title |
description | The snippet | |
emphasizedKeywords | ["plumbers"] | Bold words in the snippet |
sitelinks | [] | Not extracted, always empty |
When Google shows review stars under a result (for example a Yelp or directory page), the result also has rating, reviewCount, reviewCountText and reviewCountExact, read the same way as in the local pack.
Hidden links on local searches. For searches with local intent, Google now replaces each organic result's link with an encrypted google.com/goto redirect. The actor follows each one through Apify's residential proxy and puts the real URL in url. Usually that is one short request that returns only the address the redirect points to. Sometimes Google first serves a loading page that points to a fresh redirect, so a link can take a few hops, and a request that fails is retried on another proxy exit. Nothing is downloaded from the result's own site. A result whose redirect still cannot be followed stays in its real position with url: null and linkStatus: "locked"; it is never dropped or renumbered. Each page item has hiddenLinks (hidden, unlocked, locked) so you can see how many were unlocked. When several links from one result page are followed, Google makes each further request wait a few seconds, so a local result page takes about 10 to 25 seconds longer than before. Up to three result pages are processed at the same time, so those waits overlap on runs with several queries. Unlocking is included in the Search Query price.
Page fields
query, page, location, language, device, totalResults (Google's text) and totalResultsCount (the same as a number, or null when Google shows no result count, which is common on current result pages), peopleAlsoAsk (questions only), relatedSearches, featuredSnippet, hiddenLinks, scrapedAt. ads and shoppingResults are always empty lists and knowledgePanel is never returned.
Pricing
This actor uses pay-per-event billing:
| Event | When it is charged | Price |
|---|---|---|
| Search Query | Per Google result page scraped: one per query at the default of 1 page per query (Pages Per Query 3 makes 3). Unlocking hidden result links is included. Failed pages and demo runs are not charged | $0.005 |
Troubleshooting
"API error 429" or "Rate limit"
Too many requests. Wait a minute and try again, or reduce the number of items per run.
No results or empty dataset
Check the run log for error messages. Common causes:
- Invalid input format (check the examples above)
- The target data doesn't exist or is too small to track
How do I test without an API key?
Run the actor with the default sample input, or set demoMode to true, and it returns labeled sample search result data showing the exact live output format. Every sample item carries demo: true and a _notice field, and sample runs charge no task events. Add your own search queries to run a real scrape.
Built by John Rippy | Actor Arsenal