How to scrape Google Maps with Python

One endpoint, every business as clean JSON, saved to CSV.

Free to try, no card Name, phone, website, rating Clean JSON, or CSV
PULLED LIVE FROM THE API, AUGUST 4, 2026

How do you scrape Google Maps?

Scraping Google Maps yourself means driving a browser and parsing a page that keeps changing. Here you send one HTTP request and get clean JSON back, or the same rows as CSV.

  1. 1

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

  2. 2

    Copy your key from the dashboard. One key works for every endpoint.

  3. 3

    Run the curl below, or the Python after it. Every business lands as a clean row.

First a quick test with curl:

# the Maps rate per business returned; zero results cost nothing; phones unmasked in the API response curl "https://crustapi.com/v1/search?type=maps&q=coffee shops in Austin, TX" -H "x-api-key: YOUR_KEY"

Then the same call in Python with the requests library. Install it with pip install requests, drop in a key, and run:

# pip install requests, then run this file import requests resp = requests.get( "https://crustapi.com/v1/search", params={"type": "maps", "q": "coffee shops in Austin, TX"}, headers={"x-api-key": "YOUR_KEY"}, ) data = resp.json() for place in data["places"]: print(place["title"], place["phone"], place["website"])

Here are two of the businesses that came back, shown as CSV so they drop straight into Sheets or a CRM:

nameaddressphonewebsiteratingreviews
Jo's Coffee - South Congress1300 S Congress Ave, Austin, TX 78704(512) 852-23••https://www.joscoffee.com/south-congress-jos4.41979
Epoch Coffee221 W N Loop Blvd, Austin, TX 78751(512) 454-37••http://www.epochcoffee.com/4.52504

Change q to any search you would type into the Maps box, like plumbers in Miami or dentists near 90210.

WHAT EVERY BUSINESS INCLUDES

What data do you get?

Every place comes complete, so you build a lead list or a dataset with no second call. The same record as CSV, ready for Sheets or a database:

positionnamecategoryratingreviewspriceLevelphonewebsitestreetcitystatepostalCodelatlngthumbnailUrlbookingLinks
3Jo's Coffee - South CongressCoffee shop4.41979$1-10(512) 852-23••https://www.joscoffee.com/south-congress-jos1300 S Congress AveAustinTexas7870430.2510458-97.7493717https://lh3.googleusercontent.com/gps-cs-s/AHRPTWnFVTjg5_-zY-sP--91PRgTIxNZKpeFIMTC7EABNYvyD-hfCYEeam8fnp7ld3utRHp4KCADJBO3EFDtesEh1mGo7ER6Yt7tAYchvG_0dyHo4L_xBZll2OJjM7ud2AP0Y6xRXEPn

Or the same record as JSON, exactly as the API returns it:

// one place in full { "position": 3, "title": "Jo's Coffee - South Congress", "address": "1300 S Congress Ave, Austin, TX 78704", "phone": "(512) 852-23••", "website": "https://www.joscoffee.com/south-congress-jos", "categoryName": "Coffee shop", "categories": ["Coffee shop", "Cafe", "Takeout Restaurant", "Sandwich shop"], "totalScore": 4.4, "reviewsCount": 1979, "priceLevel": "$1-10", "location": { "lat": 30.2510458, "lng": -97.7493717 }, "openingHours": { "Monday": "7 AM-7 PM", "Tuesday": "7 AM-7 PM", "Wednesday": "7 AM-7 PM", "Thursday": "7 AM-7 PM", "Friday": "7 AM-7 PM", "Saturday": "7 AM-7 PM", "Sunday": "7 AM-7 PM" }, "thumbnailUrl": "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWnFVTjg5_-zY-sP--91PRgTIxNZKpeFIMTC7EABNYvyD-hfCYEeam8fnp7ld3utRHp4KCADJBO3EFDtesEh1mGo7ER6Yt7tAYchvG_0dyHo4L_xBZll2OJjM7ud2AP0Y6xRXEPn", "bookingLinks": null, "description": "La Colombe coffee, specialty beverages & snacks in a down-to-earth, convivial locale.", "placeId": "ChIJ1S_Bov20RIYRe7MiR8tYawY" }
HOW IT COMPARES

vs writing your own scraper

You can build a Maps scraper yourself, and plenty of tutorials show how. The trade is maintenance; here is the difference in practice.

Writing it yourselfCrustAPI
SetupInstall a headless browser, handle blocks and page changesOne GET request, no browser
OutputParse the HTML yourself; fields break when the layout changesClean JSON with every field named, or the same rows as CSV
MaintenanceFix the scraper each time the page changesWe keep it working
Free tierFree, but you pay in time and blocked requests$6 of free usage each month
Cost modelServer, proxy, and developer timeThe Maps rate per business returned; empty searches free
Storing the dataYours to manageNo storage limits. Export to CSV or a database
PRICING

How much does scraping Google Maps cost?

You pay the Maps rate for each business a search returns. Twenty businesses cost $0.0392 at standard Maps prices; a search that returns none costs nothing.

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.

Funds are prepaid and never expire, so an unused pack is still yours next year.

WHO IT'S FOR

Who scrapes Google Maps?

Run your first Maps search free
Try it free. No card, no contract.
Try for free
THE LAST STEP

Save the results to a CSV file

Because the response is plain JSON, Python's built-in csv module writes it to a file in a few lines, no extra libraries. This reads every business and writes one row each:

# save every place to a CSV file with the built-in csv module import csv, requests data = requests.get( "https://crustapi.com/v1/search", params={"type": "maps", "q": "coffee shops in Austin, TX"}, headers={"x-api-key": "YOUR_KEY"}, ).json() with open("places.csv", "w", newline="") as f: writer = csv.writer(f) writer.writerow(["name", "address", "phone", "website", "rating", "reviews"]) for p in data["places"]: writer.writerow([p["title"], p["address"], p.get("phone", ""), p.get("website", ""), p.get("totalScore", ""), p.get("reviewsCount", "")])

Open places.csv in Sheets or Excel and you have a finished lead list. Swap the query, run it again, and append to build a bigger dataset.

Related: Google Maps Scraper API · Google Search API · Google News API · API docs

FAIR PLAY

When a different tool fits better: live driving directions, real-time traffic, or a contract with a formal SLA are Google Cloud products, not scraping. This endpoint returns the public business listing anyone sees on the map, which is what most lead-gen and research work needs, but it is not the official Places API.

BEFORE YOU ASK

Common questions

No. With the CrustAPI endpoint you send one HTTP request with the requests library and get clean JSON back. There is no browser to drive and no HTML to parse, so the code above is the whole scraper.

Name, full address, phone, website, category, star rating, review count, price level, coordinates, opening hours, a photo thumbnail, booking links, and the result's rank position. Enough to build a lead list or a dataset without a second call.

Logged-out, public-only collection has repeatedly defeated computer-fraud and contract claims. What you get is the same public business listing anyone sees on the map.

A search returns the places Google shows for that query. At standard Maps prices, 20 businesses cost $0.0392. Empty results cost nothing. Larger deposits get lower rates.

The response is plain JSON, so Python's built-in csv module writes it to a file in a few lines. The Save to CSV section above has the exact code, no extra libraries.

Yes. Try it free, no credit card, and paid funds never expire. That is enough to pull several full result pages while you build.

WORKS WITH YOUR STACK

Try it on a city you know

the free plan covers a real search. Run one query and look at the JSON that comes back.

Try for free
No credit card required