How to scrape Google Places with Python

One endpoint, each place as clean JSON, saved to CSV.

Free to try, no card Name, address, category, rating Clean JSON, no HTML parsing
THREE STEPS

How do you get started?

From zero to live place data in about two minutes:

  1. 1

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

  2. 2

    Copy your API key from the dashboard.

  3. 3

    Run the curl or the script below. Clean JSON comes back, ready to save as CSV.

PULLED LIVE FROM THE API, AUGUST 2, 2026

One request, real response

The hard part of scraping Google Places 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. First a quick test with curl:

# the applicable price per successful search, however many places come back; zero results cost nothing curl "https://crustapi.com/v1/search?type=places&q=coffee shops in Seattle, WA" -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": "places", "q": "coffee shops in Seattle, WA"}, headers={"x-api-key": "YOUR_KEY"}, ) data = resp.json() for place in data["places"]: print(place["title"], place["rating"], place["ratingCount"], place["category"])

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

nameaddresscategoryratingreviewscid
Storyville Coffee Pike Place94 Pike St Top floor Suite 34, Seattle, WA 98101Coffee shop4.631298582500234709843288
Aroom Coffee Waterfront904 Alaskan Wy, Seattle, WA 98104Coffee shop4.724118157902753163700432

Change q to any search you would type into the Google box, like plumbers in Miami or dentists near 90210. Add page=2, page=3 to walk further down the list; an empty places array means you have reached the end.

WHAT EVERY PLACE INCLUDES

What data do you get?

Every place comes back with its position, name, address, coordinates, category, star rating, review count, price level, phone number, website, and a Google cid you can keep as a stable ID. The same record as CSV, ready for Sheets or a database:

nameaddresscategoryratingreviewspriceLevelphonewebsitelatlngcidposition
Storyville Coffee Pike Place94 Pike St Top floor Suite 34, Seattle, WA 98101Coffee shop4.63129$10–20(206) 780-5777https://storyville.com/pages/pike-place-market47.60895-122.340430985825002347098432881

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

// one place in full { "position": 1, "title": "Storyville Coffee Pike Place", "address": "94 Pike St Top floor Suite 34, Seattle, WA 98101", "latitude": 47.60895, "longitude": -122.3404309, "rating": 4.6, "ratingCount": 3129, "priceLevel": "$10–20", "category": "Coffee shop", "phoneNumber": "(206) 780-5777", "website": "https://storyville.com/pages/pike-place-market", "cid": "8582500234709843288" }

The priceLevel field carries Google's price band, like $1–10 or $10–20, and comes back null when Google shows none. Phone number and website can be null too when Google does not list them. Need opening hours and the richer record? Use type=maps. The places type is the lean, fast listing.

HOW IT COMPARES

vs writing your own scraper

You can build a Places 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 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 from the API, 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 requestsFree to try, no card
Cost modelServer, proxy, and developer timeOne charge per search, however many places come back; empty searches free
Storing the dataYours to manageNo storage limits. Export to CSV or a database
PRICING

How much does scraping Google Places cost?

You pay the applicable price per successful search. Places costs one charge per successful search, regardless of how many places come back. Empty searches are free. Paid funds never expire.

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.

WHO IT'S FOR

Who scrapes Google Places?

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

Page through results and save to CSV

Because the response is plain JSON, a short loop pages through the results and Python's built-in csv module writes them to a file. No extra libraries. This reads pages one through three, stops early when a page comes back empty, and writes one row each:

# page through results and save each place to a CSV file import csv, requests rows = [] for page in range(1, 4): data = requests.get( "https://crustapi.com/v1/search", params={"type": "places", "q": "coffee shops in Seattle, WA", "page": page}, headers={"x-api-key": "YOUR_KEY"}, ).json() places = data["places"] if not places: break rows += places with open("places.csv", "w", newline="") as f: writer = csv.writer(f) writer.writerow(["name", "address", "category", "rating", "reviews", "cid"]) for p in rows: writer.writerow([p["title"], p["address"], p.get("category", ""), p.get("rating", ""), p.get("ratingCount", ""), p["cid"]])

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

Related: Google Places Scraper · Places API pricing · Google Maps Scraper API · Scrape Google Maps with Python · 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 place listing anyone sees in Google search, which is what most lead-gen and research work needs, but it is not the official Google 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.

Position, name, full address, category, star rating, review count, price level, phone number, website, coordinates, and a Google cid you can keep as a stable ID. Enough to build a list or a dataset from one call.

The places type is the lean, fast listing, and it includes each place's phone number and website. For opening hours and the richer record, use type=maps. A places search bills one charge per search, however many places come back.

Logged-out, public-only collection has repeatedly defeated computer-fraud and contract claims. Google's Terms restrict automated access that violates instructions like robots.txt. What you get is the same public place listing anyone sees in Google search.

Add page=2, page=3 to walk down the list, and stop when the places array comes back empty. You pay one charge per search, however many places come back, so a page that finds 20 costs one request charge and an empty page costs nothing.

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