Google SERP Scraper — AI Mode, Shopping, Local | $2/1K pages
Pricing
from $1.94 / 1,000 serp pages
Google SERP Scraper — AI Mode, Shopping, Local | $2/1K pages
Scrape Google Search results (SERP) into clean JSON — organic results, People Also Ask, knowledge panel, related searches. Anchors on stable page structure, not fragile CSS classes, so it keeps working when Google changes its HTML. Every result ships a parse_confidence score.
Pricing
from $1.94 / 1,000 serp pages
Rating
0.0
(0)
Developer
Vitalii Bondarev
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
3
Monthly active users
3 days ago
Last modified
Share
Google SERP Scraper
Scrape Google Search results (SERP) into clean, structured JSON — organic results, People Also Ask, knowledge panel, and related searches. Built to keep working when Google changes its HTML, and honest about what it returns.
Most Google scrapers parse the page by CSS class name. Google rotates those class names every few weeks — when it does, those scrapers silently return empty or wrong data until someone notices. This one anchors on the stable structure of the results page instead (the #rso results container, <h3> headings, and data-* attributes Google's own code depends on), and ships a parse_confidence score with every result so you always know whether the data is trustworthy. No browser, no flaky pixels — fast static fetches through Google-grade proxies.
⚙️ Unofficial scraper of publicly available Google Search results. Not affiliated with or endorsed by Google.
What you can extract
- 🔎 Organic results — position, title, URL, displayed URL, snippet
- ❓ People Also Ask — the related questions block
- 📇 Knowledge panel — title, subtitle, description, and structured facts (born, party, etc.)
- 🔗 Related searches — the "searches related to…" suggestions
- 📢 Ads — parsed from the ad slots when Google serves them (see note below)
- 🌍 Geo & language control — target any country (
gl) and interface language (hl) - 🖥️ Desktop or mobile SERP layout
- ✅
parse_confidence+warningson every record — drift shows up loudly, never silently
How to use it
- Click Try for free.
- Enter one or more search queries.
- (Optional) set country, language, number of pages, and which result types you want.
- Click Start and collect clean JSON from the dataset — or pull it via the Apify API, MCP, or any integration.
No code required. Runs on Apify's cloud with the purpose-built Google SERP proxy, so there's nothing to configure to get unblocked.
Pricing
$1.00 per 1,000 searches (pay-per-result: one charge per SERP page returned). You only pay for pages that actually come back.
| Scraper | Price / 1,000 searches | Reliability signal |
|---|---|---|
| Apify official | $1.80 | — |
| This actor | $1.00 | parse_confidence on every result |
| Bargain actors | ~$0.50 | break silently on Google's DOM changes |
We don't try to win the race to the bottom on price. We win on data you can trust: a parser that survives Google's layout churn, and a confidence score so you can verify it.
💡 Try it free first — Apify's free tier includes platform credits that cover ~1,000+ search results, plenty to evaluate output quality before you commit.
Input
| Field | Type | Default | Description |
|---|---|---|---|
queries | string[] | — (required) | One or more Google search queries. |
countryCode | string | us | Two-letter country for geo-targeting (gl). |
languageCode | string | en | Two-letter interface language (hl). |
resultsPerPage | integer | 10 | Results per page. Google fixed this at ~10 in late 2025. |
maxPages | integer | 1 | Pages per query (paginated via start offset). |
resultTypes | string[] | organic, ads, PAA, KP, related | Which blocks to extract (organic always included). |
device | enum | desktop | desktop or mobile layout. |
proxyConfiguration | proxy | Apify GOOGLE_SERP | Google-grade proxy, billed to the run owner. |
Output
One record per query/page:
{"query": "best running shoes 2026","page": 1,"organic": [{"position": 1,"title": "The 15 Best Running Shoes of 2026","url": "https://www.runnersworld.com/gear/best-running-shoes/","displayed_url": "https://www.runnersworld.com","snippet": "For new runners we recommend a shoe like the Brooks Ghost…"}],"people_also_ask": [{ "question": "What are the best running shoes for beginners?" }],"knowledge_panel": null,"related_searches": [{ "query": "best running shoes for 5k" }],"ai_overview": "","parse_confidence": 1.0,"warnings": [],"organic_count": 9,"ads_count": 0,"paa_count": 4,"related_count": 8,"has_knowledge_panel": false,"has_ai_overview": false}
Why this scraper doesn't break
Google ships HTML with two kinds of hooks: stable structural ones (the #rso results container, the <h3> title heading, data-sncf snippet bodies, data-attrid knowledge-panel facts) that its own JavaScript relies on, and cosmetic CSS class names (.yuRUbf, .tF2Cxc, …) that it rotates constantly for obfuscation. Scrapers that key off class names break on every rotation. This actor keys off the structural hooks — and when something does shift, the parse_confidence score drops and a warnings entry is emitted, so you find out from the data, not from a customer complaint.
FAQ
Is it legal to scrape Google Search? This actor only collects publicly available search results, logged-out, the same data any visitor sees. Courts have generally treated scraping public web data favorably (e.g. hiQ v. LinkedIn, Meta v. Bright Data). It is not legal advice — review Google's terms and your own use case. Don't scrape personal data unlawfully.
How is this different from other Google SERP scrapers?
It anchors on stable page structure instead of rotating CSS classes, and it returns a parse_confidence score on every result so you can trust the output — most scrapers give you no signal at all and break silently.
Does it return AI Overviews / AI Mode? No. AI Overviews are rendered by JavaScript and don't appear in the static HTML this actor fetches. Organic results, People Also Ask, knowledge panel, and related searches are all fully supported.
Why is ads_count sometimes 0 on commercial queries?
Google frequently serves no ads to programmatic requests (ads are JavaScript-injected and auction-gated). When ads are present in the page, they're parsed; when they're absent, that's expected, not a failure.
Can I get one result per row?
Each record is one SERP page with an organic array. To flatten to one row per organic result, use the dataset's "unwind" option or a simple post-process step.
Can I use it via API / MCP / integrations? Yes — it's a standard Apify actor, callable via the Apify API, scheduler, webhooks, MCP server, and every Apify integration.
Support
Found a SERP layout we don't parse well, or a parse_confidence that dropped? Open an issue on the actor — drift reports are exactly what keep this parser ahead.
More scrapers from our toolkit
Building a data pipeline? These actors pair well with this one — each runs on your own Apify account with the same pay-per-result pricing, no subscription:
- Similarweb Traffic Scraper
- ASO Keyword Tracker
- Google News Scraper
- App Store Scraper
- Google Play Scraper
Chain any of them together from the Integrations tab (the Run succeeded trigger) to build a multi-step workflow — one actor's output feeds the next.
Use it from your existing tools
Use with Claude Desktop / Cursor / Cline (MCP)
Load this actor as a tool in your AI assistant. Call it directly from your AI assistant via the Apify MCP server — no Store browsing needed. Paste this into your MCP client config (e.g. claude_desktop_config.json) and restart the client:
{"mcpServers": {"apify-google-serp-structural": {"command": "npx","args": ["-y","@apify/actors-mcp-server","--tools","bovi/google-serp-structural"],"env": {"APIFY_TOKEN": "YOUR_APIFY_TOKEN"}}}}
Replace YOUR_APIFY_TOKEN with your own Apify API token (free at apify.com → Settings → Integrations). Curated to a handful of tools so the agent selects reliably.
Works with Clay
Run this actor as an HTTP enrichment step inside a Clay table:
- Method:
POST - URL:
https://api.apify.com/v2/acts/bovi~google-serp-structural/run-sync-get-dataset-items?token={{apify_token}} - Body (JSON): map your Clay columns to the actor input (see the Input section above), e.g.
{"queries": "{{clay_column}}"}
The run finishes synchronously and returns the dataset rows straight into your Clay table. It runs on Apify's cloud under your own token and usage. Synchronous runs must complete within 300 seconds.

