How to scrape Google Maps with Python
This guide shows how to scrape Google Maps with Python: call one endpoint, get every business as clean JSON, then save it to a CSV file. No browser automation, no parsing HTML.
3,000 free results / month, no card
Name, phone, website, rating
Clean JSON, or CSV
PULLED LIVE FROM THE API, JULY 20, 2026
One request, real response
The hard part of scraping Google Maps yourself is driving a browser, dodging blocks, and parsing a page that keeps changing. Instead you send one HTTP request to a search endpoint and get clean JSON back, or the same rows as CSV. First a quick test with curl:
# one credit 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 the first two businesses that came back, shown as CSV so they drop straight into Sheets or a CRM:
name,address,phone,website,rating,reviews
"Jo's Coffee - South Congress","1300 S Congress Ave, Austin, TX 78704","(512) 852-23••","https://www.joscoffee.com/south-congress-jos",4.4,1976
"Epoch Coffee","221 W N Loop Blvd, Austin, TX 78751","(512) 454-37••","http://www.epochcoffee.com/",4.5,2500
Change q to any search you would type into the Maps box, like plumbers in Miami or dentists near 90210.
WHAT EVERY BUSINESS INCLUDES
The full record, ready to use
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:
name,category,rating,reviews,phone,website,street,city,state,postalCode,lat,lng
"Jo's Coffee - South Congress","Coffee shop",4.4,1976,"(512) 852-23••","https://www.joscoffee.com/south-congress-jos","1300 S Congress Ave","Austin","Texas","78704",30.2510458,-97.7493717
Or the same record as JSON, exactly as the API returns it:
// one place in full
{
"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": 1976,
"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"
},
"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 with a headless browser and a parser, and plenty of tutorials show how. The trade is maintenance. Here is the difference in practice.
| Writing it yourself | CrustAPI |
| Setup | Install a headless browser, handle blocks and page changes | One GET request, no browser |
| Output | Parse the HTML yourself; fields break when the layout changes | Clean JSON with every field named, or the same rows as CSV |
| Maintenance | Fix the scraper each time the page changes | We keep it working |
| Free tier | Free, but you pay in time and blocked requests | 3,000 results / month, no card |
| Cost model | Server, proxy, and developer time | One credit per business returned; empty searches free |
| Storing the data | Yours to manage | No storage limits. Export to CSV or a database |
PRICING
One credit per result
Prepaid packs, and credits never expire: 25k for $49 · 100k for $149 · 500k for $549 · 2.5M for $1,999 · up to 250M, all self-serve, ex-tax. A search that returns 20 businesses costs 20 credits; a search that returns none costs nothing.
Run your first Maps search free
3,000 credits a month. No card, no contract.
Get started →
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 from the search 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
WORKS WITH YOUR STACK
LangChain
n8n
MCP
Clay
Try it on a city you know
3,000 free credits covers a real search. Run one query and look at the JSON that comes back.
Get 3,000 free credits
No credit card required