Google Maps is the largest verified database of local businesses in existence — names, addresses, phone numbers, websites and ratings for practically every company with a storefront. This guide shows how to extract it into a CSV you can actually work from, in about a minute.
Short answer: give the Google Maps Scraper a search query like marketing agencies near New York and it returns every matching place with contact details.
Why not just use the Google Places API?
You can, and for some jobs you should. But for lead generation it has three hard edges:
1. It charges per request, and the useful fields cost extra. Phone number and website live in a higher-priced tier. A few thousand lookups gets expensive quickly.
2. It caps results per query. You get 20 per page, 60 total, with mandatory delays between pages. There is no way to pull "every dentist in Chicago" in one call.
3. It needs billing setup, a project, and API key management before you can evaluate whether the data is even useful to you.
Scraping the Maps front end sidesteps all three. The trade-off is that you are responsible for handling the page structure, which is what the scraper does for you.
Step 1 — Describe what you want in plain language
{
"queries": [
"restaurants in Miami",
"marketing agencies near New York",
"dentists in Chicago"
],
"language": "en",
"country": "us",
"maxResultsPerQuery": 0,
"maxConcurrency": 3
}
maxResultsPerQuery: 0 means no limit — pull everything Maps will show for that query. Set a number when you are testing and do not want to pay for a full sweep.
Queries are just what you would type into Maps. "plumbers in Austin TX", "gyms near 90210", and "coffee shops Shoreditch London" all work.
Step 2 — Read the results
{
"id": "ChIJN1t_tDeuEmsRUsoyG83frY4",
"title": "Joe's Stone Crab",
"category": "Seafood restaurant",
"address": "11 Washington Ave, Miami Beach, FL 33139",
"phoneNumber": "(305) 673-0365",
"completePhoneNumber": "+1 305-673-0365",
"domain": "joesstonecrab.com",
"url": "https://www.joesstonecrab.com/",
"coor": "25.768,-80.135",
"stars": 4.4,
"reviews": 6128,
"source_query": "restaurants in Miami"
}
Two fields worth knowing about:
-
completePhoneNumberis E.164-formatted and is what you want for any dialler, CRM import or WhatsApp workflow.phoneNumberis the display string Maps shows. -
source_querytells you which of your queries produced the row. When you run 50 queries at once, this is how you attribute results back to a segment.
Turning results into a qualified lead list
Raw Maps output is not a lead list yet. Two filters do most of the work:
Businesses with no website. If domain is empty, that business has a Maps listing but no site — the single highest-converting segment for web design and digital marketing agencies.
no_website = [p for p in places if not p.get("domain")]
Businesses with low review counts. Under ~20 reviews usually means nobody is managing their online presence, which is the opening for reputation and SEO services.
underserved = [p for p in places if (p.get("reviews") or 0) < 20 and p.get("stars", 0) >= 3.5]
From there, feed domain into the Contact Details Scraper to pull emails and social profiles off each site, and you have a complete outbound list.
Calling it from your own code
Python
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("mina_safwat/google-maps-scraper").call(
run_input={"queries": ["marketing agencies near New York"], "country": "us"}
)
places = list(client.dataset(run["defaultDatasetId"]).iterate_items())
prospects = [p for p in places if not p.get("domain")]
print(f"{len(prospects)} of {len(places)} have no website")
cURL
curl -X POST "https://api.apify.com/v2/acts/mina_safwat~google-maps-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"queries":["dentists in Chicago"],"country":"us"}'
What it costs
Per place returned: $0.003 on the free plan, down to $0.001 on Gold and above. A thousand local businesses costs $1–$3 depending on your plan.
For comparison, buying a comparable local business list from a data broker runs $0.10–$0.50 per record, and the data is usually months stale. Maps data is as current as the business's own listing.
Common use cases
- Agency prospecting. Find businesses in your service area with no website or a neglected one.
- Franchise and site selection. Map competitor density by category before signing a lease.
- Market sizing. Count how many businesses of a type operate in a region.
- CRM enrichment. Match existing accounts against Maps to fill in missing phone numbers and current addresses.
FAQ
How many results can I get per query?
Set maxResultsPerQuery: 0 for no cap. Google itself limits how deep a single query scrolls, so for exhaustive coverage of a large city, split into neighbourhood-level queries rather than one city-wide one.
Does it return reviews?
It returns the star rating and review count. Review text is a separate job.
Is scraping Google Maps legal?
Business names, addresses and phone numbers are factual public information, and scraping publicly accessible data is generally permitted in many jurisdictions. That is not legal advice. Google's Terms of Service prohibit automated access, and if you contact the businesses you collect, you are subject to CAN-SPAM, GDPR, and local telemarketing rules. Check your obligations before you start emailing or calling.
Can I get results outside the US?
Yes. Set country to any two-letter code and language to match — {"country": "de", "language": "de"} for Germany.
Why are some phone numbers missing?
Not every listing publishes one. Filter on completePhoneNumber when a dialler workflow requires it.
Try it: Google Maps Scraper on Apify Store — pay per place, from $0.001.
Top comments (0)