Google Maps Leads Scraper – Emails & AI Scoring
Pricing
from $3.40 / 1,000 business listings
Google Maps Leads Scraper – Emails & AI Scoring
Turn Google Maps into qualified leads. Businesses with phone, website, hours and rating for $3.40 per 1,000. Add emails and socials from each business's own website (mail-server checked, billed only when found), full listing details and AI lead scoring. Export to CSV or CRM.
Pricing
from $3.40 / 1,000 business listings
Rating
0.0
(0)
Developer
ComputerDoIt
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 hours ago
Last modified
Categories
Share
📍 What is Google Maps Leads Scraper?
Google Maps Leads Scraper – Emails & AI Scoring turns a Google Maps search into a lead list you can call, email and import into your CRM. Type a business type and a place, and get every listed business with its phone, website, address, hours and rating. Add the emails and social profiles from each business's own website, the full listing details, or an AI fit score against your ideal customer, with one click.
- Build prospect lists: every dentist, plumber or café in a city, with contacts ready for your outreach tool
- Call the best leads first: describe your ideal customer once and every business gets a 0–100 fit score with the reasons
- Find the people: owners and managers named on each business's own website, with their roles
- Enrich the list you already have: send names and websites from your CRM, with no Maps search and no per-row fee
- Map a market: count and compare businesses by area, category and rating
Built for agencies, sales teams and local-service marketers who need contactable leads, not just map pins.
What data can you get?
| 🏷️ Business name, category and description | 📍 Address, city, postal code and country |
| 🌍 Coordinates and plus code | ☎️ Phone number |
| 🌐 Website | ⭐ Rating and review count |
| 🕒 Opening hours and open / closed status | 🆔 Place ID, FID, CID and Maps link |
| 📧 Emails from the business's own website, with a mail-server check | 📱 Website phones, with the line type |
| 🔗 Facebook, Instagram, LinkedIn, X, YouTube, TikTok and Pinterest links | 🛎️ Amenities, accessibility, payments and other listing details |
| 🍽️ Menu and booking links, owner posts | 📸 Photo links and the cover photo |
| 🤖 AI profile, services and a 0–100 fit score with reasons | 👥 Owners and team named on the website, with roles |
⚠️ Google shows Apify sessions a limited view of Maps. It leaves out individual reviews, popular times, the rating breakdown and the price range, so those are never in the output. Nothing is guessed: a missing value stays empty.
💰 Pricing
You pay per result, with no start fee. Set a spending limit on each run and the Actor stays within it.
| What you get | Price |
|---|---|
| 🏢 Business row (always) | $3.40 per 1,000 ($0.0034 each) |
| 📧 Website emails & socials | $0.002 per business website with contacts found |
| 🛎️ Full listing details | $0.001 per business with details found |
| 📸 Photo links | Free |
| 🤖 AI lead scoring | $0.008 per business scored |
| 👥 Owners & team (with AI lead scoring) | $0.004 per website where people are named |
Websites without contacts, listings without details and businesses the AI could not score cost nothing for that pack. Only valid, unique businesses delivered to your dataset are charged: duplicates, filtered-out businesses and candidates that never made it into the dataset are free. A partial run is charged for the businesses it delivered.
Examples: 1,000 businesses cost $3.40. A business with everything (contacts, details, AI score and people) costs $0.0034 + $0.002 + $0.001 + $0.008 + $0.004 = $0.0184.
🚀 Quick start
- Enter a Search query (for example
dentist) and a Location (for exampleLeeds, United Kingdom). - Set Maximum business rows.
- Optionally pick packs under Add data.
- Click Start, then open the Leads view or export the dataset.
The Console form starts with this small test, which reads at most five cafés in under a minute:
{"search_query": "cafe","location": "Lower Manhattan, New York, USA","language": "en","search_mode": "single","detailProfile": "core","detailTransport": "feed","captureDetailEvidence": false,"max_results": 5,"geographicOptions": { "resultLimit": 10 },"maxSearchCells": 1,"maxSearchAttempts": 1,"maxNavigationAttempts": 12,"maxCandidateUrls": 10,"maxRunTimeSecs": 60,"maxConcurrentSearches": 1,"maxConcurrentExtractions": 1,"baseDelayMs": 500,"enableCache": false,"proxyConfiguration": { "useApifyProxy": false }}
In one hosted run this test delivered all five businesses in 35 seconds without opening a business page. Results vary with the search and Google's view, so it is an example, not a guarantee. Through the API, settings you leave out use the defaults instead: 50 businesses and up to 600 seconds of scraping.
⬇️ Input
🔍 Search query and location
search_query is what you would type into Google Maps, and location is where. The location steers the search but is not a strict boundary, so a few results can come from nearby. English (en) is the tested language.
⚡ Fast by default
Businesses are read from Google's search results feed without opening each listing. In a 30-business test this took 61 seconds instead of 298 and used about a tenth of the compute. A business the feed cannot supply opens its listing as usual. The category is the one Google shows for your search; the other categories are in subcategories.
Set detailProfile to full to also read the email, social, booking, menu and service fields shown on the listing itself. This opens every listing in a browser and takes about ten times longer.
📋 Several searches or direct listings
Use targetJobs instead of search_query and location to run several searches in one go (clear those two fields first). One max_results caps the whole run, and each search can have its own cap:
{"targetJobs": [{ "kind": "search", "search_query": "dentist", "location": "Leeds, United Kingdom", "max_results": 20 },{ "kind": "search", "search_query": "orthodontist", "location": "Leeds, United Kingdom", "max_results": 20 }],"max_results": 40}
A job can also be a Google Maps listing URL ("kind": "url"), a Place ID ("kind": "placeId") or a CID ("kind": "cid"), read with "detailTransport": "browser". Short links (maps.app.goo.gl) and search URLs are rejected.
🗺️ Strict area
For results strictly inside an area, give search_bounds (south, west, north, east) or search_center (latitude, longitude) with radius_km. Only businesses whose pin is inside the area are kept. Set search_mode to geographic to split a large area into smaller cells and reach more businesses.
🎚️ Filters
min_ratingandmin_reviewskeep businesses at or above a rating or review count.has_websiteandhas_phonekeep businesses that list one.has_emailkeeps businesses whose Google listing shows an email. Google rarely shows an email on a listing, sohas_email: truereturns few businesses. For emails, add the Website emails & socials pack, which reads each business's own website.
categories and exclude_chains are kept for compatibility and are not applied. The experimental mapsSelection and mapsExclusions fields add finer filters and skip lists; their help text in the input form explains them.
⏱️ Limits
max_results caps delivered businesses. maxRunTimeSecs caps scraping time (default 600). The other limits cap searches, page visits and candidates; reaching any of them returns what was found so far. The scraper time is separate from the Apify run timeout, so leave the platform timeout a few minutes longer. The default 2048 MB of memory suits feed runs; give full browser runs 4096 MB.
⬆️ Output
Open the Leads view for a CRM-ready table with one row per business: name, category, phone, website, best email, AI score, rating and address. Overview and Details show the remaining fields. Export as CSV, Excel or JSON, or read the dataset through the API.
Fields
| Group | Fields |
|---|---|
| Business | name, description, category, subcategories |
| Identity | place_id, fid, cid, source_url |
| Address | address, street_address, city, state, country, postal_code, neighborhood |
| Location | latitude, longitude, plus_code |
| Contact | phone, phone_international, website |
| Reviews | rating, review_count |
| Hours and status | opening_hours, is_open, is_temporarily_closed, is_permanently_closed |
With full, when shown | email, social_links, booking_url, menu_url, service_options |
| Website emails & socials | website_email, website_email_mail_server, website_phone, website_socials |
| AI lead scoring | ai_fit_score, ai_summary, ai_fit_reasons, ai_services, decision_makers |
| Metadata | scraped_at, data_quality_score |
Packs also write linked datasets (contacts, mapsSections, media, aiProfiles, people), listed in the run's output tab. A field Google does not show is left out. data_quality_score is a rough completeness score, not an accuracy rating.
Here is an illustrative, synthetic partial shape of a row (not a real business):
{"name": "Synthetic example cafe","category": "Cafe","address": "Unknown","city": "Lower Manhattan, New York, USA","opening_hours": {"Monday": [{ "open": "08:00", "close": "16:00" }]},"is_open": false}
📊 Run summary
The SUMMARY record in the run's key-value store explains each run: how many businesses were found and delivered, what each pack did, and why collection stopped. Its outcome is completed, capped (a limit was reached), truncated (the time limit was reached) or empty. Runs marked limited_view are partial by nature.
📧 Website emails & socials
Add the Website emails & socials pack (websiteContacts). The Actor visits each business's website, up to five pages (home, contact, about, team and locations), and collects:
- 📧 Emails, each with a mail-server (MX) check:
present,absentorunknown. This catches dead domains, but no mailbox is contacted, so it is not a guarantee of delivery. - ☎️ Phones, each with a line type (
mobile,fixed_line,toll_freeand so on) and region. - 🔗 Social profiles and Google listing links.
The best email, a website phone that differs from the Maps phone and one link per social platform land on the business row. Every contact is in the linked contacts dataset with the page it came from. A website shared by several branches is read once, and its contacts are marked as company-wide.
Price: $0.002 per business website with contacts found. Websites without contacts are free.
🛎️ Full listing details
Add the Full listing details pack (extendedMaps) for the listing's about attributes (amenities, accessibility, payments), business links and owner posts in the mapsSections dataset, plus its photo links in media. Each section can be absent; nothing is guessed. Price: $0.001 per business with details found.
📸 Photo links
Add Photo links (media) for each listing's photo URLs, categories and cover photo in the media dataset, with no image downloads. Free. Full listing details already include them.
🤖 AI lead scoring
Add AI lead scoring (aiProfiles) together with Website emails & socials, since the AI reads the pages that pack fetches. Describe who you sell to in Ideal customer, for example "Independent dental clinics with 2+ dentists that accept new patients".
For each business, an AI model reads its Maps facts and its own website, then writes:
- 🧾 a short profile, its services and the customers it serves
- 🎯 a 0–100 fit score against your ideal customer, with up to three reasons
Results are on the business row (ai_fit_score, ai_summary, ai_fit_reasons, ai_services) and in the aiProfiles dataset. Without an ideal customer you get profiles without scores. Price: $0.008 per business scored. A business the AI could not profile is delivered without AI fields and is not charged for AI.
👥 Owners & team
With Find owners & team (on by default), the AI also lists the owners, managers and staff named on the business's own website. A person is kept only when their name and role both appear on that business's pages, so contacts are never invented. Each person row in the people dataset links to the page that names them. Price: $0.004 per website where people are named.
🏅 Only deliver good matches
Set Only deliver leads scoring at least (minFitScore, 0–100) to keep only businesses that reach your bar. Businesses below it go to the screened dataset with their score and reasons, and are charged only the AI scoring fee ($0.008), not the business fee. The run does not search further when too few qualify, so set max_results above the number of leads you want.
📂 Enrich your own list
Already have businesses in a CRM or spreadsheet? Send them as records instead of a search (clear the search query and location first): up to 1,000 objects with name and website, plus optional id, phone, address and category.
{"records": [{ "id": "crm-17", "name": "Rose Bakery", "website": "https://rosebakery.example.com/" },{ "name": "Oak Dental", "website": "oakdental.example.com", "phone": "+44 20 7946 0001" }],"max_results": 2,"featurePacks": ["websiteContacts", "aiProfiles"],"idealCustomer": "Independent shops and clinics that take bookings"}
Select Website emails & socials, and add AI lead scoring for fit scores and people. There is no business fee: you pay only for the contacts, scores and people found. Results go to the Enriched records dataset, and each record keeps your id. Set max_results to at least the size of your list.
🔌 Integrations
Export to CSV, Excel or JSON, or send results to Google Sheets, Make, Zapier or n8n with Apify integrations and webhooks. Call the Actor from your own code through the Apify API, or let an AI agent run it through Apify's MCP server. Schedule a task to refresh a lead list every week.
❓ FAQ
How many results can I get?
As many as Google Maps lists for your search, within max_results and the run limits. For more businesses in a big area, use a strict area with search_mode: "geographic", or list several searches in targetJobs.
Why are reviews and popular times missing? Google shows Apify sessions a limited view of Maps without individual reviews, popular times, the rating breakdown or the price range. A proxy does not change this.
Are the emails verified? Each email's domain gets a mail-server (MX) check, which catches dead domains. No mailbox is contacted, so a passing check is not a guarantee of delivery.
How accurate is AI lead scoring? The AI uses only the listing and the business's own website, and gives its reasons. Treat the score as a way to rank leads, not as a fact.
Why did I get fewer businesses than I asked for?
Filters, Google's view and the run limits can all stop a run early. The SUMMARY record says why. Try a broader search, fewer filters or a longer maxRunTimeSecs.
Can I use a proxy? No. Proxies are turned off in this build, and a run with a proxy is rejected.
Is it legal to scrape Google Maps? The Actor collects publicly visible business information. You are responsible for using it lawfully, including data-protection and anti-spam rules where you operate.
💬 Support
Open an issue in Actor Issues on this page with the run ID, your input and what you expected. Remove passwords, cookies and personal data first.
Built by ComputerDoIt. Need these leads flowing into your CRM, outreach tool or an AI receptionist automatically? We build the automation around them.
⚖️ Responsible use
Google Maps Leads Scraper is not affiliated with Google, sponsored by Google or endorsed by Google. Google Maps is a Google service and trademark.
Use the Actor only for a lawful purpose. Respect privacy and data-protection rules: publicly visible contact details are not consent to unsolicited messages. The website pack reads public pages and does not consult robots.txt. Do not use the Actor to get around sign-in requirements, challenges or other access controls.