Google Maps Scraper: Leads, Reviews & Business Data
Pricing
from $1.49 / 1,000 google maps results
Google Maps Scraper: Leads, Reviews & Business Data
Scrape Google Maps places by keyword, location, URL, or Place ID. Extract business contacts, emails, phones, websites, ratings, review text, photos, opening hours, coordinates, and lead-quality signals.
Pricing
from $1.49 / 1,000 google maps results
Rating
0.0
(0)
Developer
Shadow Extractor
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
2 days ago
Last modified
Categories
Share
π Google Maps Business Leads Scraper
Turn Google Maps searches into structured business datasets with place details, public contacts, reviews, photos, ratings, opening hours, and lead-quality scores.
Search by keyword and location, scrape known businesses from Google Maps URLs or IDs, or enrich a dataset from an earlier Apify run. Results are ready for CSV, Excel, JSON, CRM imports, market research, and review analysis.
Start simple: enter a search term, add a location, and run. The default setup returns detailed place records and checks business websites for public contact information.
β¨ What You Can Collect
| Data group | Available fields |
|---|---|
| π’ Business identity | Name, subtitle, primary category, all categories, description, owner information |
| π Location | Full address, street, city, state, ZIP/postal code, country, coordinates, plus code, time zone |
| π Contact data | Google Maps phone, website, domain, public emails, additional phones, contact-page URLs |
| π Social profiles | Facebook, Instagram, LinkedIn, X/Twitter, YouTube, TikTok, Pinterest, Discord |
| β Reputation | Rating, review count, review text, reviewer, date, likes, photos, owner response when available |
| π Business details | Opening hours, current open state, price level, attributes, highlights, reservation links |
| πΌοΈ Media | Main image, photo URL list, and flat photo1Url to photo5Url columns |
| π― Lead quality | leadScore, contactCompletenessScore, and field-availability signals |
| π Google identifiers | Maps URL, Place ID, feature/data ID, CID, KG MID |
Google Maps and business websites do not expose every field for every place. Missing optional data is omitted instead of being filled with fake values.
π Quick Start
In Apify Console
- Choose Full places + enrichment.
- Enter one or more search terms, for example
dentistorcoffee shop. - Enter one or more locations, for example
Austin, TX. - Choose how many places to collect per search.
- Keep contact enrichment enabled if you need emails and social profiles.
- Click Start and open Output β Results.
An empty API input is also safe: it runs a small example search for restaurants in New York.
Minimal JSON Input
{"searchStringsArray": ["dentist"],"locationQueries": ["Austin, TX"],"maxCrawledPlacesPerSearch": 20}
Rich Lead-Generation Input
{"mode": "FULL","searchStringsArray": ["dentist", "orthodontist"],"locationQueries": ["Austin, TX", "Round Rock, TX"],"maxCrawledPlacesPerSearch": 50,"scrapePlaceDetailPage": true,"scrapeContacts": true,"maxContactPages": 3,"placeMinimumStars": 4,"website": "withWebsite","maxImages": 5,"language": "en","countryCode": "US"}
Each search term is combined with each location. The example above creates four searches:
dentist Γ Austin, TXdentist Γ Round Rock, TXorthodontist Γ Austin, TXorthodontist Γ Round Rock, TX
π§ Choose the Right Mode
| Mode | Use it when | Accepted source | Output |
|---|---|---|---|
FULL | You want search results with optional details, contacts, reviews, and photos | Search terms and locations; direct place inputs can also be included | Enriched place rows or review rows |
SEARCH | You want keyword-and-location discovery | Search terms and locations | Place rows; enrichment is controlled by the detail/contact/review switches |
DETAIL | You already know the businesses | Maps URLs, Place IDs, feature IDs, or an input dataset | Detailed place rows |
REVIEWS | You want review-level data for known places | Direct place inputs | One dataset row per review |
CONTACTS | You want public website contacts for known places | Direct place inputs | Place rows enriched with emails, phones, and social profiles |
Workflow Map
Keyword + location βββΊ SEARCH / FULL βββΊ Google Maps placesβMaps URL / ID ββββββββΊ DETAIL ββββββββββββββββββ€ββββΊ Place details + photosPrevious dataset βββββΊ DETAIL / CONTACTS βββββββ€ββββΊ Website contactsKnown place ββββββββββΊ REVIEWS βββββββββββββββββ΄βββΊ Review rows
π Search Inputs
| Field | What it controls |
|---|---|
searchStringsArray | Keywords or business types such as restaurant, plumber, hotel, or car dealer |
locationQueries | Countries, cities, neighborhoods, addresses, ZIP codes, or postal codes |
maxCrawledPlacesPerSearch | Maximum saved places for each keyword and location combination |
language | Language context for Google Maps results |
countryCode | Country context such as US, GB, DE, or FR |
Search Several Markets at Once
{"mode": "SEARCH","searchStringsArray": ["coworking space", "business center"],"locationQueries": ["Berlin, Germany", "Munich, Germany"],"maxCrawledPlacesPerSearch": 25,"scrapePlaceDetailPage": false,"scrapeContacts": false,"scrapeReviews": false,"language": "de","countryCode": "DE"}
π Direct Place Inputs
Direct modes accept several source types, and duplicate places are removed automatically.
| Field | Accepted value |
|---|---|
startUrls | Google Maps place or search URLs |
placeIds | Place IDs such as ChIJ... |
featureIds | Google Maps data/feature IDs such as 0x...:0x... |
datasetId | An Apify dataset containing place URLs or identifiers |
The input dataset may contain any of these fields: googleMapsUrl, url, sourceUrl, placeUrl, placeId, dataId, featureId, fid, or cid.
Scrape Known Places
{"mode": "DETAIL","placeIds": ["ChIJvSQIgqFZwokRFYQbJdzceSs"],"scrapePlaceDetailPage": true,"scrapeContacts": true,"maxContactPages": 2,"maxImages": 10}
Enrich a Previous Dataset
{"mode": "CONTACTS","datasetId": "YOUR_DATASET_ID","scrapeContacts": true,"maxContactPages": 3}
π Public Contact Enrichment
Enable scrapeContacts to inspect the business website and collect publicly displayed contact details.
The Actor can return:
- primary Google Maps phone;
- public email addresses;
- additional website phone numbers;
- contact, about, team, and legal page URLs;
- Facebook, Instagram, LinkedIn, X/Twitter, YouTube, TikTok, Pinterest, and Discord links;
- website response status and a readable website error when enrichment is unavailable.
Use maxContactPages to control how many website pages are checked for each business. A value of 1 is the fastest option; 3 to 5 provides broader coverage.
{"mode": "FULL","searchStringsArray": ["roofing contractor"],"locationQueries": ["Denver, CO"],"maxCrawledPlacesPerSearch": 100,"website": "withWebsite","scrapeContacts": true,"maxContactPages": 3}
Emails are usually not published directly on Google Maps. They are collected from the public business website when available.
β Reviews
There are two useful review layouts.
Reviews Attached to Each Place
Use this when one row per business is more important than spreadsheet-friendly review rows.
{"mode": "FULL","searchStringsArray": ["boutique hotel"],"locationQueries": ["Paris, France"],"maxCrawledPlacesPerSearch": 10,"scrapeReviews": true,"maxReviews": 10,"reviewsSort": "newest","outputMode": "PLACE_ITEMS"}
One Row per Review
Use this layout for sentiment analysis, customer-support workflows, and review exports. REVIEWS mode requires direct place input and automatically uses review rows. If maxReviews is left at 0 in this mode, the Actor requests up to 100 reviews per place.
{"mode": "REVIEWS","placeIds": ["ChIJvSQIgqFZwokRFYQbJdzceSs"],"maxReviews": 50,"reviewsSort": "newest"}
Available sort orders:
relevantβ most relevant;newestβ newest first;highestβ highest rating first;lowestβ lowest rating first.
Every review row keeps its place identity through placeTitle, placeId, dataId, cid, and placeUrl.
ποΈ Filters
Filters are optional and are applied before a place is saved.
| Field | Example | Behavior |
|---|---|---|
categoryFilterWords | ["dentist", "orthodontist"] | Keeps places whose category contains at least one word |
placeMinimumStars | 4.2 | Drops lower-rated places when a rating is available |
website | withWebsite | Keeps all places, only places with a website, or only places without one |
skipClosedPlaces | true | Skips permanently closed places when Google exposes that status |
Find Strong Local Leads
{"mode": "FULL","searchStringsArray": ["physiotherapy clinic"],"locationQueries": ["London, UK"],"maxCrawledPlacesPerSearch": 100,"categoryFilterWords": ["physiotherapist", "physical therapy"],"placeMinimumStars": 4.3,"website": "withWebsite","skipClosedPlaces": true,"scrapeContacts": true}
Find Businesses Without Websites
{"mode": "SEARCH","searchStringsArray": ["plumber"],"locationQueries": ["Phoenix, AZ"],"maxCrawledPlacesPerSearch": 100,"website": "withoutWebsite","scrapePlaceDetailPage": false,"scrapeContacts": false}
π€ Output
Place and review records are written to the default dataset. The Apify Output tab opens the Results table, and the dataset menu provides focused views.
| View | Best for |
|---|---|
| Overview | Business name, category, address, phone, website, rating, review count, score, photo, and Maps URL |
| Lead generation | Flat CRM-ready phones, emails, social links, scores, and location columns |
| Contacts | Full contact arrays, website status, social profiles, and pages checked |
| Reviews | One review per row when review-row output is used |
| Photos | Main photo and five image columns that render directly in Apify |
| Diagnostics | Input warnings and recoverable source issues with suggested actions |
| All fields | Complete raw dataset shape for JSON export and custom analysis |
Download any dataset view as JSON, CSV, Excel, XML, or RSS from Apify Storage.
Example Place Record
{"recordType": "place","title": "Example Coffee Roasters","categoryName": "Coffee shop","categories": ["Coffee shop", "Cafe"],"address": "123 Market St, Austin, TX 78701","city": "Austin","state": "TX","postalCode": "78701","countryCode": "US","latitude": 30.2672,"longitude": -97.7431,"phone": "+1 512-555-0184","website": "https://example.com/","domain": "example.com","email": "hello@example.com","emails": ["hello@example.com"],"instagram": "https://www.instagram.com/example/","rating": 4.7,"totalScore": 4.7,"reviewsCount": 842,"imageUrl": "https://lh3.googleusercontent.com/...","photo1Url": "https://lh3.googleusercontent.com/...","placeId": "ChIJ...","dataId": "0x...:0x...","url": "https://www.google.com/maps/place/?q=place_id:ChIJ...","leadScore": 89,"contactCompletenessScore": 100,"scrapedAt": "2026-07-16T12:00:00+00:00"}
Example Review Record
{"recordType": "review","reviewId": "review-id","placeTitle": "Example Coffee Roasters","placeId": "ChIJ...","dataId": "0x...:0x...","authorName": "Alex Morgan","authorProfileUrl": "https://www.google.com/maps/contrib/...","rating": 5,"publishedAt": "2 days ago","text": "Friendly team, excellent coffee, and quick service.","likesCount": 3,"responseFromOwnerText": "Thank you for visiting!","images": ["https://lh3.googleusercontent.com/..."],"placeUrl": "https://www.google.com/maps/place/?q=place_id:ChIJ...","scrapedAt": "2026-07-16T12:00:00+00:00"}
Only fields available for that specific place or review are returned.
π Run Summary
Every run writes a compact OUTPUT record to the default key-value store. Open Output β Run summary to see:
- final status:
SUCCEEDED,PARTIAL, orINPUT_NEEDS_ATTENTION; - saved place, review, and diagnostic row counts;
- processed searches and direct inputs;
- duplicates and filtered places;
- contact and review coverage;
- run duration and places per minute;
- applied filters and dataset URL;
- clear hints when input needs attention.
{"status": "SUCCEEDED","mode": "FULL","totalPlaces": 50,"uniquePlaceIds": 50,"reviewRows": 0,"diagnosticRows": 0,"datasetItems": 50,"durationSeconds": 42.8,"placesPerMinute": 70.1,"searchTermsProcessed": ["restaurant"],"searchLocationsProcessed": ["New York, USA"]}
π― Lead Scores Explained
leadScore helps rank commercially useful businesses. It considers signals such as website and phone availability, public contact data, social profiles, rating, review volume, opening status, and business description.
contactCompletenessScore focuses on contact coverage: website, phone, email, additional phones, social profiles, and address.
Scores are prioritization aids, not guarantees of lead quality.
βοΈ Performance and Cost Controls
maxCrawledPlacesPerSearchcontrols the number of places per keyword/location pair.maxContactPagescontrols website enrichment depth.maxReviewscontrols review volume per place.maxImagescontrols stored image URLs per place.maxConcurrencycontrols parallel work; the default is suitable for normal runs.scrapePlaceDetailPage,scrapeContacts, andscrapeReviewslet you enable only the data you need.
For a quick discovery run, disable details, contacts, and reviews. For richer lead data, enable details and contacts. Review collection adds more output and should be limited deliberately.
β Recommended Testing Pattern
- Start with one search term, one location, and 5β10 places.
- Check the Overview and Lead generation views.
- Adjust category, rating, and website filters.
- Enable contacts or reviews only when needed.
- Increase the result limit after the sample matches your use case.
β FAQ
Can I search multiple keywords and locations?
Yes. Every keyword is paired with every location, and duplicate places are removed within the run.
Can I scrape a business from a Google Maps URL?
Yes. Use startUrls, or provide a placeId or featureId.
Can I continue from a previous Apify dataset?
Yes. Select it with datasetId. The Actor recognizes common Google Maps URL and identifier fields.
Why is an email missing?
Many businesses do not publish an email address. Contact enrichment returns only public information found on the business website.
Why are some optional place fields missing?
Field availability varies by business type, country, and Google Maps record. The Actor omits unavailable values rather than inserting null, undefined, or placeholder text.
How do I collect exactly 10 reviews per place?
Set scrapeReviews to true and maxReviews to 10. Choose PLACE_ITEMS to keep them under each business or REVIEW_ITEMS for one dataset row per review.
How do reviews stay linked to the correct place?
Review rows include place identifiers and the source Maps URL, so they can be joined back to the business reliably.
Why did a successful run return a diagnostic row?
The Actor keeps recoverable input and source problems visible instead of failing silently. Open Diagnostics and Run summary for the reason and suggested next action.
Which mode should I use for the fastest search?
Use SEARCH with scrapePlaceDetailPage, scrapeContacts, and scrapeReviews disabled.
πΌ Common Use Cases
- local business lead generation;
- CRM and sales-list enrichment;
- local SEO and category research;
- competitor and market mapping;
- reputation and review analysis;
- franchise and branch discovery;
- businesses-without-websites prospecting;
- hospitality, healthcare, home-services, and retail research.
π·οΈ Keywords
google maps scraper Β· google maps leads Β· business contacts Β· email finder Β· local lead generation Β· place scraper Β· google reviews Β· business directory Β· crm enrichment Β· local SEO