Google Maps Scraper — Emails, Phones & B2B Leads
Pricing
from $3.00 / 1,000 place scrapeds
Google Maps Scraper — Emails, Phones & B2B Leads
Extract Google Maps business leads with emails, phones, ratings, reviews, social links, opening hours and a lead score. Email enrichment is optional and charged per email found.
Pricing
from $3.00 / 1,000 place scrapeds
Rating
0.0
(0)
Developer
Khadin Akbar
Maintained by CommunityActor stats
1
Bookmarked
200
Total users
19
Monthly active users
13 hours ago
Last modified
Categories
Features
Share
This Apify Actor is a Google Maps scraper for B2B leads. Give it a business category and a place (or many of each) and it returns one lead record per business: name, category, address, phone, website, rating, review count, lead score, contactability and, when the website shows one, a public email with a free mail-server check. You pay for an email only when one is found. Use it for agency prospecting, territory planning, local market research and CRM list building, from the Apify Console, API or an AI agent through Apify MCP.
| You get | Detail |
|---|---|
| Business facts | name, category, full address, phone, website, rating, review total, hours, map pin, place ID |
| Lead data | public email, email_status (mail server check), email_is_role_address, social profile links, lead score, priority, contactability, opportunity signals |
| Scale | up to about 200 businesses per search; many categories and places per run (categories x places, up to 300 searches); up to 5,000 leads per run |
| Speed | roughly 100 leads in about a minute, no browser for normal searches |
| Output for agents | agentSummary sentence in OUTPUT, honest COMPLETE / PARTIAL / VALID_EMPTY outcomes |
What's new (November 2026)
- Faster and lighter: normal searches no longer open a browser page per business.
- Several categories and several places in one run (
searchQueries,locations). - Refresh saved leads by place ID (
placeIds). - Free email check:
email_statusandemail_is_role_address. agentSummaryin the run output for AI agents.- Default memory lowered to 1024 MB (same speed, lower platform usage).
Best fit and connected workflows
This Actor fits bounded local prospecting work where the starting point is a Google Maps search such as a service category in a city, region, or country. It is well matched to territory planning, local market research, agency lead-list creation, and reviewable outreach prep.
A common workflow is:
- start with a category plus location, such as "roofing contractors" in "Austin, TX"
- extract public Google Maps business listings
- enrich the business website for public email and social links when enabled
- review contactability, lead priority, and opportunity signals
- export qualified leads to a CRM or follow-up queue
Use For company lists that are already known and need website contact extraction, Bulk Website Contact Extractor is a natural downstream step. For lead discovery beyond Google Maps coverage, Universal Lead Finder connects to a broader web-search workflow.
Practical scenario
Maya, a local SEO consultant, starts with "dentists" and "Manchester, UK" because she wants a territory-specific prospect list. She enables email enrichment, keeps the minimum lead score at 70, and asks for five records first.
The returned rows include fields such as business_name, phone, website, email, rating, review_count, lead_score, lead_priority, contactability, and opportunity_signals. Maya uses those fields to decide which businesses have enough public contact detail for outreach, then sends the qualified rows to her CRM and keeps the rest for later research.
Input
| Field | Type | Purpose |
|---|---|---|
searchQuery | string | Business category or keyword to search on Google Maps, such as dentists or roofing contractors |
location | string | City, region, or country that narrows the search, such as Austin, TX |
locations | array | More cities, neighbourhoods or ZIP codes; every category is searched in every place |
searchQueries | array | More business categories; combined with searchQuery |
placeIds | array | Place IDs (0x...:0x..., as returned in place_id) to refresh known leads |
startUrls | array | Public Google Maps search or place URLs to process directly |
maxResults | integer | Maximum number of qualified leads to return, from 1 to 5000 |
enrichEmails | boolean | Visits business websites and contact pages to find public email and social links |
requireEmail | boolean | Keeps only leads with a public email found during enrichment |
requireWebsite | boolean | Keeps only leads with a website listed on Google Maps |
minLeadScore | integer | Minimum contactability score from 0 to 100 |
maxReviews | integer | Recent Google reviews to include for each business, from 0 to 100 |
language | string | Google Maps interface language, such as en, es, de, or fr |
minRating | number | Minimum Google Maps rating from 0 to 5 |
Focused JSON example
{"searchQuery": "roofing contractors","location": "Austin, TX","maxResults": 25,"enrichEmails": true,"requireEmail": true,"requireWebsite": true,"minLeadScore": 70,"maxReviews": 5,"language": "en","minRating": 4.2}
Output
Each dataset item represents one Google Maps business record.
| Field | Type | Purpose |
|---|---|---|
business_name | string | public business name from Google Maps |
category | string | Primary Google Maps category |
full_address | string | Complete street address |
phone | string or null | Public business phone number |
website | string or null | Website listed on Google Maps |
email | string or null | Public email found on the business website |
rating | number or null | Google rating on the listing |
review_count | integer | Total number of Google reviews |
reviews | array | Recent review objects when requested with maxReviews |
lead_score | integer | Contactability score from 0 to 100 |
lead_priority | string | high, medium, or low based on the score |
contactability | string | suitable public contact route found |
opportunity_signals | array | Transparent public-signal notes for follow-up workflows |
enrichment_status | string | Website enrichment outcome |
data_source | string | Public discovery source, google_maps |
latitude | number | Business latitude |
longitude | number | Business longitude |
google_maps_url | string | Direct Google Maps link for the business |
place_id | string | Google Place ID |
opening_hours | object or null | Business opening hours by day |
email_status | string or null | mx_valid, no_mail_server or not_checked: free check that the email domain accepts mail |
email_is_role_address | boolean or null | True for shared mailboxes such as info@ or sales@ |
facebook | string or null | Facebook URL found on the business website |
instagram | string or null | Instagram URL found on the business website |
linkedin | string or null | LinkedIn URL found on the business website |
twitter | string or null | Twitter/X URL found on the business website |
scraped_at | string | ISO 8601 extraction timestamp |
source_url | string | Google Maps URL used to produce the record |
Illustrative output record
{"business_name": "Example Roofing Co.","category": "Roofing contractor","full_address": "123 Main Street, Austin, TX 78701, USA","phone": "+1 512 555 0100","website": "https://example-roofing.com","email": "info@example-roofing.com","email_status": "mx_valid","email_is_role_address": true,"rating": 4.6,"review_count": 84,"reviews": [{"author": "A. Smith","rating": 5,"text": "Quick estimate and clear communication.","date": "2 weeks ago","response_from_owner": null}],"lead_score": 90,"lead_priority": "high","contactability": "email","opportunity_signals": ["no_social_profile_detected"],"enrichment_status": "completed","data_source": "google_maps","latitude": 30.2672,"longitude": -97.7431,"google_maps_url": "https://www.google.com/maps/place/Example+Roofing+Co./data=!1sChIJN1t_tDeuEmsRUsoyG83frY4","place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4","opening_hours": {"Monday": "9:00 AM - 5:00 PM","Tuesday": "9:00 AM - 5:00 PM","Saturday": "Closed"},"facebook": null,"instagram": null,"linkedin": null,"twitter": null,"scraped_at": "2026-03-31T10:00:00.000Z","source_url": "https://www.google.com/maps/search/roofing+contractors+in+Austin"}
How it works
The Actor uses Google Maps as the public discovery source and can also process supplied Google Maps search or place URLs directly. It extracts business listing data, then optionally visits the listed website and likely contact pages to look for public email addresses and social profile links.
Qualification happens after the lead record is assembled. The dataset includes transparent fields for contactability, lead priority, opportunity signals, enrichment status, and source metadata. The actor writes validated dataset rows and publishes run outcome records in the default key-value store.
Pricing
Pay per event, with Apify platform usage added on top. A normal 100-lead run uses roughly $0.03 of platform usage (measured). The events are:
| Event | What is billed |
|---|---|
Place Scraped (place-scraped) | each business lead returned |
Email Enriched (email-enriched) | each public email found; nothing when none is found |
| Actor Start | a small fixed start fee |
Volume discounts apply on higher Apify plans. The Pricing tab always shows the live prices.
Use with AI agents (MCP)
This Actor is available through Apify MCP as a hosted Actor tool for local-business lead discovery and qualification. The exact Actor identity is khadinakbar/google-maps-leads-scraper.
It is useful when an agent needs to turn a category and location into structured business leads, then interpret public contact routes and qualification fields from the dataset.
Find 25 roofing contractors in Austin, TX. Use public Google Maps records, include email enrichment when available, and return business name, phone, website, email, lead score, lead priority, contactability, opportunity signals, source URL, and scrape time.
Output interpretation:
business_name,full_address, andgoogle_maps_urlidentify the recordphone,website, andemailshow the public contact route foundlead_scoreandlead_prioritysummarize contactabilityopportunity_signalsprovide visible public-signal context for human reviewscraped_atandsource_urlshow when and from where the record was collected
Provenance and scope:
- the public source is Google Maps, recorded as
data_source: google_maps - website enrichment is based on the business website and likely contact pages
- the actor returns one dataset record per business lead
startUrls, when provided, are processed as Google Maps search or place URLs alongside category discovery
Pagination and cost guidance:
maxResultssets the maximum number of returned lead records- each returned business lead is billed as a
Place Scrapedevent Email Enrichedis billed only when a public email is found- for a smaller test run, start with a low
maxResultsvalue before expanding a territory campaign
API example
const { ApifyClient } = require('apify-client');const client = new ApifyClient({token: process.env.APIFY_TOKEN,});async function main() {const run = await client.actor('khadinakbar/google-maps-leads-scraper').call({searchQuery: 'dentists',location: 'Austin, TX',maxResults: 5,enrichEmails: true,minLeadScore: 70});const dataset = await client.dataset(run.defaultDatasetId).listItems();console.log(dataset.items);}main().catch((err) => {console.error(err);process.exit(1);});
Best results and outcome guidance
Use a specific business category together with a precise place name so the Maps search stays focused. Increase maxResults only after the input pattern matches your workflow and the returned fields look right for your CRM or outreach process.
When enrichEmails is enabled, public email and social links come from the business website and its contact pages. requireEmail, requireWebsite, minLeadScore, and minRating work as post-extraction filters, so they help you shape the final lead list after the full record is assembled.
Continue the workflow
- Then use Google Maps Reviews Scraper — $0.30 per 1K Reviews to add Google Maps engagement evidence to records selected with Local Business Lead Generator — Google Maps.
- Then use Houzz Pros Scraper to extend Local Business Lead Generator — Google Maps with a neighboring local-business research source when the brief calls for Houzz data.
FAQ
Can I start from a keyword and a location?
Yes. The Actor accepts a plain-language search category in searchQuery together with a location such as a city, region, or country.
Can I use a Google Maps URL instead of a category search?
Yes. startUrls accepts public Google Maps search or place URLs, and the Actor can process those directly.
How is a lead scored?
lead_score is computed from public signals such as email, website, phone, rating of at least 4, a review count above 10, and social media presence. lead_priority maps that score to high, medium, or low.
Which workflow should use this Actor?
Use this Actor for Google Maps-based local business discovery and qualification. For a list you already have, a website contact extraction workflow is a better follow-up. For broader lead discovery beyond local Maps coverage, route to a wider web-search lead finder.
What appears in the dataset when email enrichment is off?
You still get the Google Maps record, including business identity, contact details listed on Maps, rating, review count, contactability fields, and source metadata. The email field remains null unless a public email is found during enrichment.
How do I get more than about 200 businesses for one city?
Google Maps shows about 200 businesses per search. Put neighbourhoods or ZIP codes in locations and the Actor searches each one, then removes duplicates.
Which Actor should I use for which job?
This Actor starts from Google Maps. B2B Lead Finder with Enrichment adds deeper company enrichment, Universal Lead Finder finds leads from web search beyond Maps, and Bulk Website Contact Extractor pulls contacts from a list of websites you already have.
Is the email check a guarantee the mailbox exists?
No. email_status only tells you whether the domain can receive mail. Deliverability of a single mailbox is not tested.
Responsible use
Use public business information in a way that respects applicable privacy, outreach, and anti-spam rules. Public contact signals describe what the business chose to publish, and they are suitable for review, qualification, and workflow routing. Apply your own compliance review before any outreach or data transfer.
Runtime limits and recovery
The Console prefill asks for five roofing contractors in Austin, TX with email enrichment on, so the first run shows leads with emails; API calls that omit a result limit also default to five. maxItems and limit remain supported aliases; when several limits are supplied, the smallest valid limit applies. searchQueries accepts multiple categories and lang supplies the interface language when language is absent.
Use at least 1024 MB for browser runs. The default is 1024 MB, which is enough for normal searches. Runs that ask for reviews or supply place or search URLs open a browser page and finish faster with 2048 MB; you can choose that in the run options. Smaller selections stop with CONFIG_ERROR and an explanation before starting the browser; the Actor never silently increases your memory allocation. This minimum is a resource requirement, not a guarantee that every upstream page will load.
Each Maps navigation has at most one retry. Browser images, fonts and media are skipped. Work stops before the caller's time limit, with at most 210 seconds for crawling and a separate allowance for shutdown and confirmed diagnostics. Large campaigns can return PARTIAL before reaching the requested cap. Website enrichment reads at most three pages, 1 MiB per page and 2 MiB per business, within 15 seconds and the remaining run budget. Private network destinations are rejected. website_unavailable means the website could not be checked; no_public_email means a reachable page was checked without finding a public email within those bounds. An email address is extracted from public HTML and is not an inbox-deliverability verification.
OUTPUT and RUN_SUMMARY contain the same confirmed terminal record. Useful incomplete results are PARTIAL; functioning no-match or qualification exclusions are VALID_EMPTY; invalid targets are INVALID_INPUT. Exhausted required routes with no useful data are UPSTREAM_FAILED and fail the run. An uncertain delivery or fee acknowledgment also fails rather than reporting a confirmed zero. Unknown counts are null. A restarted run inspects its existing delivery checkpoint and stops without replaying paid work. If initialization, storage, or shutdown itself fails, the platform run fails; a new paired report cannot be promised when storage cannot be confirmed. Preserve any saved results and inspect the run before starting a replacement.