Google SERP Scraper — AI Mode, Shopping, Local | $2/1K pages avatar

Google SERP Scraper — AI Mode, Shopping, Local | $2/1K pages

Pricing

from $1.94 / 1,000 serp pages

Go to Apify Store
Google SERP Scraper — AI Mode, Shopping, Local | $2/1K 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

Vitalii Bondarev

Maintained by Community

Actor 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 + warnings on every record — drift shows up loudly, never silently

How to use it

  1. Click Try for free.
  2. Enter one or more search queries.
  3. (Optional) set country, language, number of pages, and which result types you want.
  4. 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.

ScraperPrice / 1,000 searchesReliability signal
Apify official$1.80
This actor$1.00parse_confidence on every result
Bargain actors~$0.50break 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

FieldTypeDefaultDescription
queriesstring[]— (required)One or more Google search queries.
countryCodestringusTwo-letter country for geo-targeting (gl).
languageCodestringenTwo-letter interface language (hl).
resultsPerPageinteger10Results per page. Google fixed this at ~10 in late 2025.
maxPagesinteger1Pages per query (paginated via start offset).
resultTypesstring[]organic, ads, PAA, KP, relatedWhich blocks to extract (organic always included).
deviceenumdesktopdesktop or mobile layout.
proxyConfigurationproxyApify GOOGLE_SERPGoogle-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:

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.