Google Maps Scraper: Leads, Reviews & Business Data avatar

Google Maps Scraper: Leads, Reviews & Business Data

Pricing

from $1.49 / 1,000 google maps results

Go to Apify Store
Google Maps Scraper: Leads, Reviews & Business Data

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

Shadow Extractor

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

2 days ago

Last modified

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 groupAvailable fields
🏒 Business identityName, subtitle, primary category, all categories, description, owner information
πŸ“ LocationFull address, street, city, state, ZIP/postal code, country, coordinates, plus code, time zone
πŸ“ž Contact dataGoogle Maps phone, website, domain, public emails, additional phones, contact-page URLs
🌐 Social profilesFacebook, Instagram, LinkedIn, X/Twitter, YouTube, TikTok, Pinterest, Discord
⭐ ReputationRating, review count, review text, reviewer, date, likes, photos, owner response when available
πŸ•’ Business detailsOpening hours, current open state, price level, attributes, highlights, reservation links
πŸ–ΌοΈ MediaMain image, photo URL list, and flat photo1Url to photo5Url columns
🎯 Lead qualityleadScore, contactCompletenessScore, and field-availability signals
πŸ”— Google identifiersMaps 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

  1. Choose Full places + enrichment.
  2. Enter one or more search terms, for example dentist or coffee shop.
  3. Enter one or more locations, for example Austin, TX.
  4. Choose how many places to collect per search.
  5. Keep contact enrichment enabled if you need emails and social profiles.
  6. 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, TX
dentist Γ— Round Rock, TX
orthodontist Γ— Austin, TX
orthodontist Γ— Round Rock, TX

🧭 Choose the Right Mode

ModeUse it whenAccepted sourceOutput
FULLYou want search results with optional details, contacts, reviews, and photosSearch terms and locations; direct place inputs can also be includedEnriched place rows or review rows
SEARCHYou want keyword-and-location discoverySearch terms and locationsPlace rows; enrichment is controlled by the detail/contact/review switches
DETAILYou already know the businessesMaps URLs, Place IDs, feature IDs, or an input datasetDetailed place rows
REVIEWSYou want review-level data for known placesDirect place inputsOne dataset row per review
CONTACTSYou want public website contacts for known placesDirect place inputsPlace rows enriched with emails, phones, and social profiles

Workflow Map

Keyword + location ──► SEARCH / FULL ──► Google Maps places
β”‚
Maps URL / ID ───────► DETAIL ──────────────────
β”œβ”€β”€β–Ί Place details + photos
Previous dataset ────► DETAIL / CONTACTS ───────
β”œβ”€β”€β–Ί Website contacts
Known place ─────────► REVIEWS ────────────────┴──► Review rows

πŸ”Ž Search Inputs

FieldWhat it controls
searchStringsArrayKeywords or business types such as restaurant, plumber, hotel, or car dealer
locationQueriesCountries, cities, neighborhoods, addresses, ZIP codes, or postal codes
maxCrawledPlacesPerSearchMaximum saved places for each keyword and location combination
languageLanguage context for Google Maps results
countryCodeCountry 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.

FieldAccepted value
startUrlsGoogle Maps place or search URLs
placeIdsPlace IDs such as ChIJ...
featureIdsGoogle Maps data/feature IDs such as 0x...:0x...
datasetIdAn 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.

FieldExampleBehavior
categoryFilterWords["dentist", "orthodontist"]Keeps places whose category contains at least one word
placeMinimumStars4.2Drops lower-rated places when a rating is available
websitewithWebsiteKeeps all places, only places with a website, or only places without one
skipClosedPlacestrueSkips 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.

ViewBest for
OverviewBusiness name, category, address, phone, website, rating, review count, score, photo, and Maps URL
Lead generationFlat CRM-ready phones, emails, social links, scores, and location columns
ContactsFull contact arrays, website status, social profiles, and pages checked
ReviewsOne review per row when review-row output is used
PhotosMain photo and five image columns that render directly in Apify
DiagnosticsInput warnings and recoverable source issues with suggested actions
All fieldsComplete 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, or INPUT_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

  • maxCrawledPlacesPerSearch controls the number of places per keyword/location pair.
  • maxContactPages controls website enrichment depth.
  • maxReviews controls review volume per place.
  • maxImages controls stored image URLs per place.
  • maxConcurrency controls parallel work; the default is suitable for normal runs.
  • scrapePlaceDetailPage, scrapeContacts, and scrapeReviews let 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.


  1. Start with one search term, one location, and 5–10 places.
  2. Check the Overview and Lead generation views.
  3. Adjust category, rating, and website filters.
  4. Enable contacts or reviews only when needed.
  5. 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.

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