How to scrape Google search results

Build the browser stack, or make one API call. Code for both.

Free to try, no card p50 ~1.2s web responses Pay only when results return
TWO ROUTES

DIY headless browser, or one API call

Google stopped serving results to plain HTTP clients: the page needs JavaScript, bot checks guard it, and suspicious visitors get a block page. Which route is right depends on how much plumbing you want to own.

Build it yourselfCall an API
SetupHeadless Chrome, stealth patches, a proxy account, parser code. Days before the first clean resultOne HTTPS GET. Minutes
IPs and blocksYour problem. Datacenter IPs hit the block page fast, so you buy and rotate residential or ISP proxiesOur problem. You never see a block page
ParsingYou write selectors against scrambled class names that change without noticeStable JSON, same field names every time
Cost shapeProxy and server bills arrive whether your queries worked or notone charge per query that returns results. Failures and empties cost nothing
MaintenanceOngoing. When Google changes markup, your pipeline goes dark until you patch itOurs
Best forScraping is your core product and you want control of every layerYou want the data, without owning the plumbing
THE TRADE-OFFS

What building it yourself takes

If you go DIY, here are the four layers you end up building, in the order you hit them.

  1. A real browser. Google requires JavaScript to render results, so plain requests get a blank shell or a bot check. You run headless Chrome through Playwright or Puppeteer, with stealth patches so it does not announce itself.
  2. Clean IPs. Datacenter addresses get blocked fast. You buy residential or ISP proxies, then write rotation logic for the day an IP gets throttled anyway.
  3. A parser. Result markup uses scrambled class names that change without notice. Your selectors work today and return empty arrays some Tuesday next month.
  4. Babysitting. Each layer above breaks on its own schedule. The maintenance is the real product.

For a handful of queries a day from your own machine, a small script genuinely works. The short version looks like this:

# DIY starter: Playwright, Python. Fine at tiny scale. from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch(headless=True) page = browser.new_page() page.goto("https://www.google.com/search?q=best+crm+software") titles = page.eval_on_selector_all("a h3", "els => els.map(e => e.textContent)") print(titles) browser.close()

Run that a few hundred times in an hour and you will meet the block page. At that point you start buying proxies and writing rotation logic, and the project stops being a script and starts being infrastructure.

THREE STEPS

How do you get started?

From zero to your first JSON in about two minutes:

  1. 1

    Create a free account. Try it free, no card needed.

  2. 2

    Copy your key. It is on the dashboard the moment you are in.

  3. 3

    Run the curl below. Or type the search in the playground and export CSV, no code at all.

THE API ROUTE

One call in curl, Python, or Node

The other route is one HTTPS GET. Auth is your key in the x-api-key header. Blocks, retries, and parsing are our problem, and you are only charged when a query returns results.

# curl curl "https://crustapi.com/v1/search?type=web&q=best%20crm%20software" \ -H "x-api-key: YOUR_KEY"
# Python 3 import requests r = requests.get( "https://crustapi.com/v1/search", params={"type": "web", "q": "best crm software"}, headers={"x-api-key": "YOUR_KEY"}, ) for row in r.json()["organic"]: print(row["position"], row["title"], row["link"])
// Node 18+ const params = new URLSearchParams({ type: "web", q: "best crm software" }); const res = await fetch("https://crustapi.com/v1/search?" + params, { headers: { "x-api-key": "YOUR_KEY" }, }); const data = await res.json(); for (const row of data.organic) console.log(row.position, row.title, row.link);

Useful parameters: gl for country, hl for language, page for deeper pages, location for city-level results. The full list is in the docs, and you can run queries in the playground without writing code.

WHAT COMES BACK

What data do you get?

A stable, serper-compatible shape: ranked organic results with positions, plus knowledge graph, people-also-ask, and related searches when Google shows them. Here are the top rows as CSV, then the same response as JSON, trimmed for space:

CSV view
positiontitlelinksnippet
1Tesla: Electric Cars, Solar & Clean Energyhttps://www.tesla.com/Tesla is building a world of amazing abundance with AI, electric cars, solar…
2Model Y - Electric Midsize SUVhttps://www.tesla.com/modelyLearn about Model Y, a midsize electric SUV with award-winning safety, convenient technology features and seating for up to five.
JSON view
{ "searchParameters": { "q": "tesla", "gl": "us", "hl": "en", "page": 1, "type": "web" }, "organic": [ { "title": "Tesla: Electric Cars, Solar & Clean Energy", "link": "https://www.tesla.com/", "snippet": "Tesla is building a world of amazing abundance with AI, electric cars, solar…", "sitelinks": [ { "title": "Shop", "link": "https://shop.tesla.com/" }, ], "position": 1 }, { "title": "Model Y - Electric Midsize SUV", "link": "https://www.tesla.com/modely", "snippet": "Learn about Model Y, a midsize electric SUV with award-winning safety, convenient technology features and seating for up to five.", "position": 2 } ], "peopleAlsoAsk": [ { "question": "Why are people not buying Tesla anymore?" }, ], "relatedSearches": [ { "query": "Tesla Model X" }, { "query": "Tesla Model Y" }, ] }

Published median for web search is about 1.2 seconds. The shape stays put, so the parser you write today keeps working.

PULLED LIVE FROM THE API, AUGUST 4, 2026

12 search types, one endpoint

Swap type=web for any other Google surface on the same endpoint, same key, same billing. Here is a real autocomplete call we ran while writing this page:

curl "https://crustapi.com/v1/search?type=autocomplete&q=how%20to%20scrape%20google" -H "x-api-key: YOUR_KEY" { "suggestions": [ { "value": "how to scrape google maps" }, { "value": "how to scrape google maps for free" }, { "value": "how to scrape google reviews" }, { "value": "how to scrape google maps data" }, { "value": "how to scrape google maps reviews" }, ] }
Ranked organicweb Full business recordsmaps Lean local resultsplaces Source + datenews Prices + ratingsshopping ~97 per requestimages Duration + channelvideos Papers + citationsscholar Filings + PDFspatents Suggestionsautocomplete Page text as JSONwebpage ~0.3s responsesreviews

One note on emails: Google results and Maps records do not include email addresses. Maps gives you name, address, phone, website, rating, reviews, categories, and hours. Verified emails come from our LinkedIn people search (beta) endpoints, which are separate.

Deeper dives: Google Maps scraper API · Google Reviews API · the official Google Search API, compared

PRICING

How much does scraping Google cost?

You pay the applicable price per successful search. A search that fails or comes back empty costs nothing. Here is the ladder:

DepositGoogle Search / 1,000 requestsMaps / 1,000 businessesLinkedIn reads / 1,000 requestsPeople, Jobs, Refresh / 1,000 units
$10+$1.00$1.96$6.00$1.96
$149+$0.76$1.49$4.50$1.49
$549+$0.56$1.10$3.30$1.10
$1,999+$0.41$0.80$2.45$0.80
$6,500+$0.33$0.65$1.95$0.65
$27,500+$0.28$0.55$1.65$0.55
$50,000+$0.26$0.50$1.50$0.50
$100,000+$0.20$0.40$1.50$0.40

Every eligible account gets $6 of free usage monthly. Each deposit keeps its prices until spent; paid funds never expire. People and Jobs bill per successful search, Refresh per accessible profile. Full profiles in People use the read rate per full profile. See all billing details.

Larger deposits unlock lower endpoint prices. Each deposit keeps its prices until spent. See the full deposit table on the pricing page. Prices in USD, ex-tax.

Paid funds never expire. People search with type=maps bills the Maps rate per business returned instead of per search.

WHO IT'S FOR

Who scrapes Google results?

Run your first queries free
Free to try. No card, no contract.
Try for free
FAIR PLAY

When DIY is the better pick: scraping is your core product, you only need a handful of queries a day, or you want to learn the plumbing. Those are real cases. If you are shopping hosted APIs, Serper and SerpApi are both solid; see CrustAPI vs Serper and CrustAPI vs SerpApi.

BEFORE YOU ASK

Common questions

Stated neutrally: logged-out, public-only collection has repeatedly defeated computer-fraud and contract claims, while Google's Terms of Service prohibit automated access, which is a contract matter for whoever does the collecting. The results are mostly facts: links, titles, rankings. Laws like GDPR and CCPA still apply to any personal data you store, however it was collected. None of this is legal advice.

No. You make one HTTPS GET with your key in the x-api-key header. The blocks, the retries, and the parsing are all handled on our side. That is the whole point of the API route.

You pay nothing. Billing is one charge per query that returns results, so failures and empty result sets are free. You are never charged for a block page you did not see.

Published numbers: web search runs about 1.2 seconds at the median, Maps about 1 second, and reviews about 0.3 seconds.

Yes. Twelve Google search types run through the same endpoint: web, maps, places, news, shopping, images, videos, scholar, patents, autocomplete, webpage, and reviews. Change the type parameter and nothing else.

Google Search starts at $1.00 per 1,000 successful requests, Maps at $1.96 per 1,000 businesses, LinkedIn reads at $6.00 per 1,000 successful requests, and People, Jobs and Refresh at $1.96 per 1,000 billing units. Full profiles in People use the LinkedIn read rate per full profile. Each deposit saves its own prices until spent. Every eligible account gets $6 of free usage monthly; paid funds never expire.

WORKS WITH YOUR STACK

Run one query and read the JSON

The free plan covers a real project. Skip the proxy shopping and see what comes back.

Try for free
No credit card required