Google Maps is the closest thing there is to a directory of every business on earth, and pulling a clean list out of it is still a chore. I needed a few hundred local businesses with phone numbers for an outreach project and found the usual choices: click and copy, wrestle the official API's pricing, or scrape. This post covers the manual route and where it breaks, then the shortcut: the Google Maps Places API on Apify, a fast bulk places scraper priced from $0.80 per 1,000 places.
Disclosure: the Apify links in this post are affiliate links. If you run the Actor, I may earn a referral commission at no extra cost to you.
Does Google Maps have an API?
Yes, and that is exactly why this exists. The official Places API is built for live lookups inside an app: you register a project, manage a key, and pay per call with field-dependent pricing. For an app's autocomplete box, great. For "give me every med spa in Miami as a spreadsheet", the quota math and key setup are overhead you do not want. A scraper consumed like an API flips the model: search terms in, one flat-priced row per place out, no Google Cloud project involved.
What the Google Maps scraper returns
The Google Maps scraper returns one clean row per place as structured JSON: name, full address, GPS coordinates, rating and review count, phone number, website, opening hours, price level, and Google IDs.
| Field | Example | Notes |
|---|---|---|
title |
"Epoch Coffee" |
Business name |
address |
"221 W N Loop Blvd, Austin, TX 78751" |
With latitude and longitude
|
rating, ratingCount
|
4.5, 2481
|
Review stars and volume |
phoneNumber, website
|
"(512) 454-3762", https://www.epochcoffee.com/
|
The lead-list columns |
openingHours |
{"Monday": "12 AM-11:30 PM", ...} |
Per weekday |
placeId, cid, fid
|
"ChIJG-gJw2vKRIYROWi2uwOp8QE" |
Stable Google identifiers |
type, types, priceLevel, a description, and a thumbnailUrl ride along too, and every row is tagged with its searchTerm.
Who this is for
Sales teams building local lead lists, market researchers and site-selection analysts mapping a category across a city, GIS people assembling location-intelligence layers, and ML folks who need real-world place attributes.
The manual way, and where it breaks
DIY Google Maps scraping means driving the map UI in a headless browser: search, scroll the results panel, expand each card, parse. The panel virtualizes its list, so scrolling is stateful and slow. The markup uses generated class names that rot fast. Results depend on viewport and location, so runs are hard to reproduce. And Google is not shy about pushing back on automated browsers at volume. It is a lot of engineering for what is, in the end, a table of names and phone numbers.
The faster way: run the Google Maps scraper
Apify Console
- Open the Google Maps Places API and click Try for free.
- Enter one or more
searchTermslikecoffee shops in Austin, TX. - Run it and export the dataset as JSON, CSV, or Excel.
REST
curl -X POST "https://api.apify.com/v2/acts/johnvc~google-maps-places-api/runs?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "searchTerms": ["coffee shops in Austin, TX"], "maxResultsPerSearch": 40 }'
Run endpoint reference: the Apify API docs.
Get Google Maps places in Python
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("johnvc/google-maps-places-api").call(
run_input={
"searchTerms": ["med spas in Miami, FL", "roofing contractors in Tampa, FL"],
"maxResultsPerSearch": 40,
}
)
for place in client.dataset(run["defaultDatasetId"]).iterate_items():
print(place["title"], place.get("phoneNumber"), place["rating"], place["address"])
Each term is searched independently, so one run can cover a whole niche list.
Build lead lists with phone numbers
The lead-generation tasks are ready to run: Build a list of med spas in Miami with phone numbers, Find roofing contractor leads in Tampa, and the general recipe, Extract local business leads from Google Maps by API.
Extract phone numbers by ZIP code
Extract phone numbers from Google Maps by ZIP code scopes the search to a postal code, which is how territory-based sales teams carve up a metro.
Export places to CSV
Export Google Maps places to CSV lands the rows as a spreadsheet, and there are Chinese-language versions of the workflow: a bulk CSV export and a Los Angeles Chinese restaurants lead list.
Use it from Claude and other MCP clients
Connect the Apify MCP server (https://mcp.apify.com/?tools=actors,docs,johnvc/google-maps-places-api) and Claude, Claude Code, or Cursor can pull local businesses on request: "find the top-rated coffee shops near the convention center and give me their phone numbers" becomes a tool call. The task Generate local leads in Claude via Google Maps MCP shows the setup, and claude.ai is the place to start with Claude.
FAQ about scraping Google Maps
How much does the Google Maps scraper cost?
You pay per unique place returned, with duplicates removed before billing: $2.00 per 1,000 places on the free plan, scaling down to $0.80 per 1,000 on the top tier. No per-run fee and no monthly minimum, and new Apify accounts include free platform credit.
Do I need a Google Maps API key to use this scraper?
No. There is no Google Cloud project, no key, and no SKU table anywhere in the flow. An Apify account and a search term are the whole setup.
Is a Google Maps scraper legal to use?
The short, honest version: this Actor collects publicly visible business listing data, the same fields anyone sees on the map, and not private or account data. Rules differ by jurisdiction and by what you do with the data downstream, so for commercial use at scale, check with someone qualified. Nothing here is legal advice.
What does the scraper not return?
Emails, individual review text, popular-times graphs, and photo galleries are out of scope; this is the fast, cheap layer for place data. If you need contact enrichment or review text, pair it with a dedicated enrichment tool and use placeId as the join key.
Can Claude pull places through the scraper?
Yes, over MCP it registers as a callable tool, and an agent can chain it: search places, filter by rating, then draft outreach from the same conversation.
Can I schedule the scraper to keep a dataset fresh?
Yes. Save one task per niche or area, attach an Apify Schedule, and let updated phone numbers, ratings, and hours accumulate. Start from the Google Maps Places API.
More from Truffle Pig Data
Neighboring Actors on the maps shelf: the Google Local API for local pack results, the Google Maps Directions API for routes between places, and the Google Maps Contributor Reviews API for reviewer history.
Wrapping up
A city's worth of business data should cost dimes, not a week of scraper maintenance. Point the Google Maps Places API at a niche and a city, and the list is yours.
Top comments (0)