Google Search Scraper
Pricing
from $0.15 / 1,000 results
Google Search Scraper
Scrape Google organic search results - position, title, URL and snippet - for any list of queries, with country, language and time-range targeting. Ads and AI overviews excluded, so position is true organic rank. One request per 10 results.
Pricing
from $0.15 / 1,000 results
Rating
5.0
(1)
Developer
Mary Lou
Maintained by CommunityActor stats
2
Bookmarked
1
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Google Search Scraper — SERP results, rank tracking, no browser
Scrape Google organic search results for any list of keywords and export them as JSON, CSV or Excel. Every row gives you organic rank, title, URL and snippet, with country, language and time-range targeting.
Built for SEO monitoring and rank tracking: schedule it, diff position over
time, and watch your keywords move. No browser, no API key, nothing to
configure.
What you can do with it
- Keyword rank tracking — run daily on your target keywords and chart position over time
- SERP monitoring — see who is ranking, who moved, and who appeared
- Competitor analysis — find every page a competitor ranks for using
site:queries - Local SEO — the same keyword in
us,gb,dereturns different rankings; compare them - Content research — pull the top results and snippets for a topic cluster
- Lead sourcing — turn
site:and intent queries into domain lists, then feed them to a contact scraper - Feed a RAG pipeline or LLM with fresh, ranked search results
How to scrape Google search results
Paste your search terms into Search queries, one per line, and press Start. That is the whole setup.
Google search operators all work:
| Operator | Example |
|---|---|
| Site restriction | site:apify.com actor |
| Exact phrase | "web scraping tools" |
| Exclusion | python scraper -selenium |
| Either/or | serp api OR serp scraper |
| Title match | intitle:pricing |
| File type | filetype:pdf market report |
Input
| Field | What it does |
|---|---|
| Search queries | One per line. Operators supported |
| Results per query | How many organic results to return. 10 = one request |
| Country | 2-letter code (us, gb, de) — changes the ranking Google serves |
| Language | 2-letter interface language code |
| Time range | Past hour, 24 hours, week, month, year, or any time |
| SafeSearch | Google's SafeSearch filtering |
| Max concurrency | How many queries to run at once |
Output
One row per organic result. Export as JSON, CSV, Excel, XML or RSS.
{"query": "web scraping tools","position": 3,"title": "5 Best Web Scraping Tools (Ranked By Real Tests)","url": "https://www.scrapingdog.com/blog","url_is_exact": false,"displayed_url": "https://www.scrapingdog.com › Blog","snippet": "Jan 25, 2026 — Scrapingdog - Best overall for scalable, cost..."}
| Field | Notes |
|---|---|
query | Which search this result came from, so multi-keyword runs stay separable |
position | True organic rank. Ads, AI overviews, shopping carousels and video shelves are excluded, not filtered afterwards |
title | The result headline |
url | Absolute URL — see the section below on how it is derived |
url_is_exact | Whether the URL is verbatim or reconstructed |
displayed_url | Google's own breadcrumb form, verbatim and never guessed |
snippet | The description text beneath the result |
The same URL ranking for two different queries is two rows, because it is two rankings. Dedup is per query, not global.
About the URL field — read this one
Google now encrypts its outbound result links. Every link on a modern
results page points at /goto?url=<encrypted blob>; the blob is opaque, the
tracking attribute repeats the same blob, and requesting it directly returns an
error. The real destination is genuinely no longer in the page.
What is in the page is the URL Google displays to a human —
https://github.com › apify. So:
displayed_urlis exactly what Google showed. Never guessed.urlis that turned back into a usable link.url_is_exacttells you which kind you got:true— Google displayed a bare domain, and the URL is verbatimfalse— the path was rebuilt from breadcrumbs. The domain is always right; the path is usually right but can be off, because Google prettifies breadcrumbs and truncates long ones. When a path is truncated, only the origin is returned rather than a URL containing a literal...null— the result showed no URL at all, typically a video
Filter on url_is_exact when you need certainty. Measured across 20 results:
5 exact, 12 reconstructed, 3 with no URL. Any scraper claiming exact Google
URLs today is either following every link individually — at 10x the requests —
or guessing without telling you.
Pricing
$0.15 per 1,000 results, plus Apify platform usage.
| Plan tier | Price per 1,000 results |
|---|---|
| Free / Bronze | $0.17 |
| Silver, Gold, Platinum, Diamond | $0.15 |
Read the usage half before you scale this one up. Google serves no results at all to an ordinary HTTP client, so every request goes through Apify's SERP proxy, billed separately at $2.50 per 1,000 SERPs on Free and Starter. One request returns 10 results, so that works out at about $0.25 per 1,000 results — larger than the scraper charge itself, and the biggest line in any run. It falls to $2.00 per 1,000 SERPs on Scale and $1.70 on Business.
Compute is negligible next to that (~$0.01 per 1,000 results): there is no browser and no per-query API fee.
Requests cost money, not results. 10 results is one request, 100 results is ten. Set Results per query to exactly what you need.
FAQ
Why can't I just fetch google.com/search myself? You can, and you will get a page with no results in it. Google retired its no-JavaScript results page. A direct fetch returns a "please enable JavaScript" redirect; an older browser signature gets the cookie consent wall instead. Nine user-agent and parameter combinations were tested and every one returned HTTP 200 with zero results. This Actor routes through Apify's SERP proxy, which is what makes plain HTTP work at all.
Does it use a headless browser? No — and that is deliberate. A headless Chromium version was built and measured first: it timed out at 75 seconds per query and needed a ~1.5 GB image. Plain HTTP through the SERP proxy is 1.3–4 seconds per request and far cheaper.
Do I need to configure a proxy? No. It is fixed to the one group that works. A country set in the proxy options is honoured; the group is not changeable, because nothing else returns results.
Are ads included?
No. position is organic rank only.
Can I get more than 100 results per keyword? Yes, but Google's own result depth thins out fast and quality drops. Raise Results per query; each extra page is one more request.
Why is a snippet occasionally empty? Some result types genuinely carry no description text. Coverage was 30/30 in the last measured run.
How fast is it? Measured on the platform: 60 results across 3 queries in 13 seconds.
Can I run it on a schedule?
Yes — that is the main use. Run daily on a keyword list and diff position to
track rankings.
Related scrapers
- Website Contact Scraper — turn the domains you find here into emails, phone numbers and social profiles
- LinkedIn Jobs Scraper — job postings without a login or cookie
- TikTok Ad Library Scraper, Meta Ads Library Scraper, Google Ads Transparency Center Scraper — competitor ad intelligence