Google Maps Leads Scraper - US Phones, Emails & Reviews
Pricing
from $0.85 / 1,000 result scrapeds
Google Maps Leads Scraper - US Phones, Emails & Reviews
Build US and worldwide business prospect lists from Google Maps. Use Fast mode for discovery or Detailed for phones, websites, public email evidence, social links and review samples. Export ranked, deduplicated leads with transparent contact-readiness scores.
Pricing
from $0.85 / 1,000 result scrapeds
Rating
0.0
(0)
Developer
Md Jakaria Mirza
Maintained by CommunityActor stats
0
Bookmarked
6
Total users
0
Monthly active users
3 days ago
Last modified
Categories
Share
Build US local-business prospect lists for agencies, sales operations, and market research from public Google Maps data. Start with contractors in Chicago, dentists in Austin, or commercial cleaning companies in Phoenix. Search by keyword and location, preserve filters from an existing Maps search URL, or scrape direct place URLs. Every result is ranked, deduplicated, and ready to export. Worldwide locations remain supported; this is not a US-only scraper.
Use Fast mode at $1 per 1,000 results for affordable business discovery. Choose Detailed mode at $5 per 1,000 leads to add phone numbers, websites, structured opening hours, price and closure status, photos, optional review samples, and optional public emails and social links from the listed business website.
Looking for phones or emails? The prefilled input uses Fast mode and deliberately does not collect those fields. Select Detailed mode, enable enrichContacts for public website emails, and inspect emailEvidence and contactStatus before using the output. Emails are source-published contacts, not verified mailboxes. Setup fees below also apply.
Start here: US contractor contacts
Open the US Contractor Business Contacts starter. It requests up to 5 general contractors in Chicago using Detailed mode, US country bias, and public website contact enrichment. It inspects at most 5 feed places, checks only the listed website page per business, and skips review samples and images. The existing London example and Actor input defaults remain unchanged.
At current undiscounted pricing and 1024 MB, a run delivering 5 Detailed leads has $0.03205 in listed event fees, including setup and Actor start. The starter is a saved configuration, not a pre-collected dataset or an automatic schedule. This US configuration has not received a new live verification run; contact availability and result count vary.
Choose Fast for business discovery and Detailed + contact enrichment for contact evaluation. A saved business is billable even when its website publishes no email. Neither mode guarantees a contact for every listing or complete city coverage.
Practical US workflows
- Agency prospecting: choose one service category and one city, review business-published contact evidence, then export a small qualified list.
- Local market research: use Fast mode for categories, ratings, locations and source URLs; it does not fetch phone numbers or website emails.
- Sales operations: use Detailed mode for phone, website and optional public contact fields. Keep source URLs and contact status alongside each CRM import.
- Repeat research: save an Apify task to reuse the same input, then compare your exported datasets externally. This Actor does not provide persistent watchlist history, change alerts or automatic outreach.
Why use this Actor?
- Three input methods: keyword + location, Google Maps search URLs, and direct place URLs.
- Ranked results: every row includes its feed position and source search URL.
- Transparent lead score: every row includes a 0-100 contact-readiness score and the exact reasons behind it, calculated without extra requests.
- Two extraction modes: keep broad discovery fast or collect richer business records.
- Optional reviews: collect up to 20 visible public review samples per business.
- Optional contact enrichment: fetch the listed website and optionally one discovered contact page, with a streaming 1.5 MB HTML cap per page, without sending website traffic through the Google Maps proxy. Repeated identical website URLs reuse a per-run result instead of fetching again.
- Contact provenance: each email includes its page URL and whether it came from a public mail link or visible text. Same-business-domain and role-address flags explain the chosen primary email; status distinguishes an unchecked website, a checked page with no email, and an enrichment failure.
- Run-wide deduplication: the same Maps place is saved and charged only once, even when multiple searches overlap.
- Worldwide targeting: free-form cities, postal codes, addresses, coordinates, country bias, and two global city presets.
- Export ready: use Apify datasets in JSON, CSV, Excel, XML, or RSS.
What it extracts
Every saved business can include:
- Name, search rank, primary category, and categories
- Lead score (0-100) and human-readable scoring reasons
- Address, phone, unformatted phone, website, and Plus Code
- Rating, total review count, and optional review samples
- Legacy text hours plus structured day/hour objects
- Price indicator and temporary/permanent closure flags
- Hero image, visible image URLs, and image count when shown
- Latitude, longitude, Google Maps ID, and direct Maps URL
- Optional public emails, preferred primary email, source evidence, same-domain/role-address flags, social profiles and contact-page URL
- Contact status (
not_requested,no_website,success,partial,failed) and fetched-page coverage - Original keyword, location, query, source search URL, mode, and timestamp
Fields that Google Maps or the business website does not expose are returned as null or empty arrays. Optional enrichment never removes an otherwise valid core result.
Fast vs. Detailed
| Capability | Fast | Detailed |
|---|---|---|
| Name, rank, category, rating, review count | Yes | Yes |
| Transparent lead score and reasons | Yes | Yes |
| Feed address, coordinates, Maps ID and URL | Yes | Yes |
| Phone, website, fuller address, Plus Code | No | Yes |
| Structured opening hours, price and status | Limited | Yes |
| Image URLs | No | Yes |
Review samples (maxReviews) | No | Optional |
Website emails/social links (enrichContacts) | No | Optional |
Direct place URLs always use Detailed extraction because there is no search feed to parse.
Contact quality and CRM handoff
The 0-100 leadScore is a transparent contact-readiness heuristic, not predicted conversion, verified identity, or inbox deliverability. Inspect leadScoreReasons instead of treating the number as a qualification guarantee.
- In the dataset's Google Maps Business Leads overview, check
phone,website,primaryEmailandcontactStatus.successmeans website enrichment completed, not that a mailbox was verified; a completed page check can return zero emails. - Export JSON to retain nested
emailEvidence(page URL, source type and selection flags) and social links. Review the source page before outreach. Missing data staysnullor an empty array; it is not guessed. - For a CRM CSV, map
titleto company name,phoneto business phone,websiteto company website,primaryEmailto the public email, andurlto the Google Maps source. RetaincontactStatus,queryandscrapedAt; skip empty contacts instead of inventing them. No CRM connection or email sending is included.
not_requested means enrichment was off; no_website means Maps exposed no usable website. partial or failed indicates incomplete or unsuccessful enrichment. contactPagesFetched reports fetched-page coverage, not a whole-site crawl. A role-address or same-domain flag is evidence for review, not permission to send marketing messages.
Input
Use either keywords with locations/locationPreset, startUrls, or both.
| Field | Default | Description |
|---|---|---|
keywords | none | Business types or search phrases. Each is combined with each location. |
locations | none | Cities, regions, postal codes, addresses, or lat,lon pairs. |
startUrls | [] | Google Maps search URLs, direct place URLs, or short maps.app.goo.gl place links. |
locationPreset | none | high_demand_markets (169 cities), world_major_cities (171 cities), or none. |
maxResults | 5 | Maximum saved rows per search request, 1-1,000. |
maxCrawledPlacesPerQuery | 5 | Hard cap on inspected feed places per search. |
extractionMode | fast | fast or detailed. |
maxReviews | 0 | Up to 20 visible review samples per business in Detailed mode. |
maxImages | 1 | Up to 20 visible image URLs per business in Detailed mode. |
enrichContacts | false | In Detailed mode, fetch the listed public website directly for visible emails, social profiles and a discovered contact-page URL. |
contactPageLimit | 1 | HTML pages per business website: 1 for the listed page only; 2 optionally follows one discovered same-business contact page. No path guessing. |
skipClosedBusinesses | true | Skip permanently closed listings. Temporary closures remain flagged. |
scrapeDetails | false | Detailed-mode retry when phone or address is missing. |
language | en | Google Maps result language. |
countryCode | none | Optional two-letter search and proxy-country bias. |
proxyConfig | Apify Proxy | Datacenter first, then one Residential fallback after a blocked zero-result attempt. |
Keyword/location requests, pasted search URLs, and direct place URLs share a run limit of 1,000 planned core place inspections. Split larger jobs into multiple runs.
Example inputs
Fast US discovery (no phones or emails)
{"keywords": ["dentist"],"locations": ["Austin, TX, USA"],"maxResults": 5,"maxCrawledPlacesPerQuery": 5,"extractionMode": "fast","countryCode": "us","locationPreset": "none"}
Small US contractor-contact starter
{"keywords": ["general contractor"],"locations": ["Chicago, IL, USA"],"locationPreset": "none","maxResults": 5,"maxCrawledPlacesPerQuery": 5,"extractionMode": "detailed","maxReviews": 0,"maxImages": 0,"enrichContacts": true,"contactPageLimit": 1,"skipClosedBusinesses": true,"scrapeDetails": false,"language": "en","countryCode": "us","proxyConfig": { "useApifyProxy": true }}
Detailed US leads with review samples and a contact-page lookup
{"keywords": ["commercial cleaning company"],"locations": ["Phoenix, AZ, USA"],"maxResults": 10,"maxCrawledPlacesPerQuery": 15,"extractionMode": "detailed","maxReviews": 3,"maxImages": 3,"enrichContacts": true,"contactPageLimit": 2,"countryCode": "us","locationPreset": "none"}
Preserve filters from an existing Maps search
{"startUrls": [{ "url": "https://www.google.com/maps/search/coworking+space+in+Berlin/" }],"maxResults": 20,"extractionMode": "detailed","maxReviews": 0}
Direct place URL
{"startUrls": [{ "url": "https://www.google.com/maps/place/Example+Business/" }],"maxReviews": 5,"maxImages": 5,"enrichContacts": true}
Pricing and cost control
The Actor uses Apify Pay Per Event pricing:
| Event | Price |
|---|---|
Saved Fast result (result-scraped) | $0.001, with Store-tier discounts down to $0.00085 |
Saved Detailed lead (detailed-result-scraped) | $0.005, with Store-tier discounts down to $0.00425 |
Google Maps run setup (maps-run-started, one-time) | $0.004 |
Detailed-mode setup (detailed-run-started, one-time) | $0.003 |
Actor start (apify-actor-start, one-time) | $0.00005 per allocated GB event |
Platform compute, storage, transfer, and proxy usage are included in these active event prices. Every valid Maps run has the $0.004 Maps setup event; Detailed work also has the $0.003 Detailed setup event. The synthetic Actor-start event is charged at least once, including runs below 1 GB. These fees are spread across larger batches. Optional website enrichment and its source evidence have no extra Actor event fee; repeated runs still charge for delivered places. Website HTML requests do not reuse the Maps proxy.
At undiscounted prices and 1 GB or less, 25 saved Fast results cost $0.02905 in listed events; 5 saved Detailed leads cost $0.03205. A request may return fewer rows. Setup charges can still apply when valid work later fails or produces no results; result charges apply only to delivered unique places.
| Small single-search batch | Listed event total at 1024 MB, no discount |
|---|---|
| 5 saved Fast results (discovery only) | $0.00905 |
| 25 saved Fast results | $0.02905 |
| 5 saved Detailed leads (public contacts optional) | $0.03205 |
| 25 saved Detailed leads | $0.13205 |
These examples are event-price calculations, not measured margins or guarantees of contact coverage. Subscription-tier discounts reduce result-event prices, not the fixed setup events. maxResults applies per query, not to the entire run: 2 keywords x 3 locations x 5 results can save up to 30 businesses before run-wide deduplication. Keep maxCrawledPlacesPerQuery close to the requested result count and leave global city presets off for a small trial.
For a first test, use one search and a small matching result/inspection limit. Use Fast for discovery or Detailed plus enrichContacts: true to evaluate contacts. Failed requests, retries, and duplicate places do not create result events. The Actor validates input and proxy configuration before custom setup charges.
API example
curl -X POST "https://api.apify.com/v2/acts/fascinating_lentil~google-maps-scraper/runs?token=YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{"keywords": ["coffee shop"],"locations": ["Chicago, IL, USA"],"maxResults": 5,"maxCrawledPlacesPerQuery": 5,"extractionMode": "fast","countryCode": "us","locationPreset": "none"}'
Reliability and limits
- Google Maps changes its interface regularly, and some fields vary by country, language, category, and listing.
- Fast mode deliberately avoids place-page navigation, so phone, website, full hours, images, and reviews are not available there.
- Review extraction saves visible samples, not an unlimited review archive. Order follows the Maps interface.
- Contact enrichment defaults to the listed page only.
contactPageLimit: 2can follow one discovered contact page on the same business host; it is not a whole-domain crawl. Each page is streamed with a 1.5 MB cap and a 15-second timeout. Redirects are validated and private network destinations rejected. Oversized, unreachable or blocked pages can leave core Maps data intact with a failed/partial enrichment status. - Same-domain and role-address flags are heuristics, not identity, ownership or deliverability checks. No SMTP probing, inbox verification or personal-contact guessing is performed. Review/photo limits remain 20 per place; these are visible samples.
- Results come from bounded Maps search feeds, not an adaptive geographical grid or exhaustive city census. Worldwide presets select searches; they do not prove all-area coverage.
- The Actor blocks heavy media and tracking requests, detects common challenge pages, retires blocked sessions, and retries transient failures.
- The browser processes one Maps page at a time. Fast mode disables visual WebGL rendering and blocks recognized visual-map tile requests, but keeps search/place requests, scripts and functional stylesheets. Detailed mode keeps its normal rendering path. Actual cloud memory/cost savings must be measured; these controls do not guarantee savings on every source response.
- Fast feed capture stops after enough valid, unique, not-yet-delivered candidates satisfy the row target, or at the explicit inspection cap. Closed/invalid/duplicate candidates do not falsely fill that quota. The copied feed data can then be processed after releasing the live document to a blank page; the browser context stays open for session cookies.
OUTPUT.searchFeedCoverage[].fastPageReleasedistinguishes a successful release, an unsuccessful cleanup and Detailed'snot_requestedpath. A cleanup failure does not discard core rows or trigger a proxy retry. - Fast initial navigation uses DOM readiness, then explicitly waits for the feed and classifies consent, blocking and empty-result states. It does not wait for unrelated frames to finish the full-page load event. Detailed keeps its previous initial-navigation readiness. This removes a demonstrated avoidable wait in offline fixtures; it is not proof of lower live Google Maps memory or cost.
- Detailed mode finishes copying the place's fields, selected photos, hours and reviews before releasing that document for Node-only website lookup and saving. The next place or optional missing-field retry opens the captured Maps URL; the retry document is also released before saving.
OUTPUT.detailedPageReleaseChecksanddetailedPageReleaseFailuresreport cleanup attempts/failures. A website timeout or oversized response still keeps core place fields and reports the real enrichment status. These lifetime controls require cloud verification; they do not prove savings on every target. - Search cards are retained across scrolling, including virtualized feeds that replace the visible cards.
OUTPUT.searchFeedCoveragereports captured places, saved rows and why scrolling stopped (target_reached,source_end,stalled,attempt_limitortime_limit).partialFeedCoveragewarns when a bounded/stalled feed saves fewer than the requested rows. A source-end marker is not a claim of exhaustive city coverage.
Responsible use
Use this Actor only for lawful collection of public business information. You are responsible for complying with Google Maps terms, website terms, privacy and data-protection laws, and outreach regulations such as GDPR, the India DPDP Act, CAN-SPAM, and local equivalents.
This Actor is independent and is not affiliated with or endorsed by Google.