If you've ever needed a list of local businesses - every dentist in Manchester, every plumber in Leeds - with their contact details, you've probably hit the same wall I did:
- Google's Places API is rate-limited, costs money once you scale, and annoyingly doesn't return email addresses at all.
- Copy-pasting from Maps by hand is soul-destroying past the first ten rows.
- Most "scrapers" give you the name and a phone number, then stop right where the value starts: the email.
This guide shows a practical way to pull structured business data straight from Google Maps and auto-enrich each result with emails, extra phones, and social links - no Google API key, exportable to JSON/CSV/Excel, and callable from code.
What you actually get per business
{
"name": "Ringway Dental - Cheadle",
"address": "187 Finney Ln, Heald Green, Cheadle SK8 3PX",
"phone": "0161 437 2029",
"website": "https://www.ringwaydental.com/",
"rating": 5,
"reviewsCount": 598,
"category": "Dental clinic",
"lat": 53.37, "lng": -2.22,
"emails": ["reception@ringwaydental.com"], // β enriched from the website
"socialLinks": { "facebook": "...", "instagram": "..." },
"extraPhones": ["..."]
}
The first block (name β coordinates) comes from Maps. The emails / socialLinks / extraPhones are the bit that makes a list actually usable for outreach - they're crawled from each business's own website.
The fast way: a ready-made Actor
Rather than build and babysit the scraping yourself, I packaged this as an Apify Actor: Google Maps Scraper. You give it search terms + locations; it returns enriched rows.
Input:
{
"searchTerms": ["dentists"],
"locations": ["Manchester, UK"],
"maxPlacesPerSearch": 50,
"scrapeContacts": true,
"relatedEmailsOnly": true
}
That's it. scrapeContacts: true turns on the website crawl for emails/socials; relatedEmailsOnly keeps only emails that belong to the business's own domain (so you don't get random gmail noise).
Call it from code (Python)
Every Apify Actor exposes a REST API, so you can run it from a script and stream the results:
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("fruityp/google-maps-scraper").call(run_input={
"searchTerms": ["plumbers"],
"locations": ["Leeds, UK"],
"maxPlacesPerSearch": 50,
"scrapeContacts": True,
})
for biz in client.dataset(run["defaultDatasetId"]).iterate_items():
print(biz["name"], biz.get("phone"), biz.get("emails"))
Real output from that exact run:
Plumbers Leeds 0113 433 3119 []
Norton Plumbing 07730 560422 ['alex@nortonplumbing.co.uk']
SFR Plumbing & Heating 07833 476252 []
Pipe iterate_items() straight into a CSV, a Google Sheet, your CRM, or a cold-email tool.
Going past the ~per-area cap
A single Google Maps viewport only surfaces a few hundred results before it stops. If you ask for more than one area's worth, the Actor automatically expands the search across sub-localities (neighbourhoods, postcode districts) and dedupes by place ID - so "restaurants" in "Manchester, UK" with a high limit returns hundreds of unique places, not the same 100 on repeat.
Who this is actually for
- Agencies / freelancers building targeted outreach lists ("every dental practice in the North West, with email").
- Local SaaS / service businesses finding prospects in a region.
- Market research - pull a whole category in a city with ratings + review counts to map the competitive landscape.
- A neat niche: filter to businesses without a website and you've got a ready-made list to sell web/SEO services to.
Why not just use the official Places API?
For pure place data, the Places API is fine - but for lead generation it falls short: it's metered/paid at volume, and it won't give you emails. The whole point of a lead list is the contact you can actually reach, and that lives on the business's website, not in the API. That's the gap this fills.
A note on ethics & limits
This collects public business listing data. Respect Google's and each site's terms, don't hammer at absurd rates, and don't use scraped contacts for spam - use them for genuine, relevant outreach. Deleted/removed data isn't surfaced.
Wrap-up
If you need local-business leads with contact details, the combination of Maps data + website enrichment is the practical recipe - and you don't need Google's API to do it.
π Try it here: Google Maps Scraper on Apify (free to start; bring your own proxy or use Apify's).
If you build something with it, I'd love to hear what - drop a comment.
Top comments (0)