Fast Google Maps Scraper
Pricing
Pay per event
Fast Google Maps Scraper
HTTP-first Google Maps scraper for search listings, place details, reviews, lead scoring, and optional website enrichment.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Solutions Smart
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
A lightweight Google Maps lead scraper built for low-cost prospecting. It uses a fast HTTP-first pipeline, optional deep details, and built-in opportunity scoring so you do not spend browser compute on every lead.
It is based on the public Python scraper structure from jinef-john/google-maps-scraper and keeps the original concept: direct Google Maps HTTP endpoints, configurable language and country parameters, optional proxies, request delays, max places, max reviews, and SQLite-style deduplication/checkpointing as an internal option.
What it does
listmode searches Google Maps and saves lightweight listing rows only. This is the cheapest mode.placemode scrapes one known Google MapsplaceId.searchmode searches, fetches full place details, and optionally fetches reviews.outputModecontrols whether the Dataset contains all records, only places and reviews, or places only.- Supports concurrent place detail and review scraping in
searchmode. - Pushes every result immediately to the Apify Dataset.
- Saves a run summary to Key-Value Store record
OUTPUT. - Supports Apify Proxy and a manual proxy URL fallback.
- Adds lead scoring for every full place record.
- Optionally enriches business websites with title, description, emails, and social links.
- Supports pay-per-event monetization with charged Dataset writes for
place-listed,place-detail, andreview.
Input
The Actor uses .actor/input_schema.json, so configuration is available as a typed Apify Console form.
Important fields:
mode:list,place, orsearch.outputMode:allRecords,placesAndReviews, orplacesOnly.query: business/category query required forlistandsearch, for examplecoffee shops.searchLocation: free-form location, for exampleBerlin, Germany.geolocationParameters: grouped country, state/region, county, city, and postal code fields used whensearchLocationis empty.customGeolocation: grouped geometry type, coordinates, radius, latitude, longitude, and coordinates JSON fields for anchoring the map area.leadFilters: optional minimum rating, minimum review count, website, phone, and category filters.websiteEnrichmentDepth:homepageOnlyorcontactPages.websiteTimeoutSeconds: separate short timeout for website enrichment requests.skipSocialWebsites: skips enrichment of social profile URLs by default to reduce slow tails and 429 responses.placeId: required forplace.maxPlaces: maximum places to list or scrape.maxReviews: reviews per place. Use0to skip reviews.maxTotalReviews: global review cap across the run. Use0for no global cap.maxConcurrency: number of places to scrape in parallel insearchmode.language: Googlehlparameter.gl: Google country parameter.proxyConfiguration: Apify Proxy settings.delaySeconds: randomized delay between requests.enableSqliteCheckpoint: optional internal SQLite copy for deduplication/checkpointing.enrichWebsites: optional website enrichment.enableBillingEvents: legacy testing flag. Production monetization is detected from Apify pay-per-event pricing.
Output
Dataset records are streamed as they are found:
recordType: "listing"for search results.recordType: "place"for full place detail records with lead scoring.recordType: "review"for individual reviews.
Output modes:
allRecords: saves listings, places, and reviews.placesAndReviews: saves full places and reviews, but skips listing rows.placesOnly: saves only full place records and skips review fetching.
The OUTPUT key-value store record contains:
- mode and query
- start and finish timestamps
- places listed
- places scraped
- reviews scraped
- duplicates skipped
- failed places
- website enrichments
- skipped website enrichments
Lead scoring
Each full place record includes:
{"leadScore": {"score": 80,"tier": "hot","reasons": ["Has phone", "Has website", "High rating"]}}
Signals include phone, website presence or absence, rating, review volume, opening hours, photos, booking links, and commercial local categories.
Example input
{"mode": "search","outputMode": "placesAndReviews","query": "dentists","searchLocation": "Austin, United States","customGeolocation": {"latitude": 30.2672,"longitude": -97.7431},"maxPlaces": 25,"maxReviews": 20,"maxTotalReviews": 200,"maxConcurrency": 3,"language": "en","gl": "us","delaySeconds": 1.5,"enrichWebsites": true,"websiteEnrichmentDepth": "contactPages","websiteTimeoutSeconds": 8,"skipSocialWebsites": true,"leadFilters": {"minRating": 4.0,"mustHaveWebsite": true},"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"],"apifyProxyCountry": "US"}}
Cost notes
Use list mode when you only need names, ratings, categories, addresses, coordinates, and place IDs. It avoids detail and review endpoints.
Use search mode when you need complete lead records. Set maxReviews to 0 if reviews are not needed.
Use placesOnly when you want a lead list without review rows. It skips review fetching even if maxReviews is greater than 0.
maxReviews is a per-place limit. For example, maxPlaces: 20 and maxReviews: 50 can produce up to 1,000 reviews. Use maxTotalReviews when you want a global cap.
Increase maxConcurrency to process multiple places in parallel. Start with 2 or 3 when using proxies. Higher values can reduce runtime, but they also increase request pressure and blocking risk.
Website enrichment adds extra HTTP requests and should be enabled only when you need emails, social links, or website metadata.
websiteEnrichmentDepth: "homepageOnly" fetches only the listed website homepage. contactPages also follows likely contact, about, Kontakt, and Impressum links found on the homepage. This can find more emails, but it costs extra requests and some sites may rate-limit.
websiteTimeoutSeconds is independent from the main Google Maps request timeout. Keep it low, such as 6 to 8, when you want predictable cost. skipSocialWebsites is enabled by default because social profile URLs rarely expose emails and often return 429 or slow responses through proxies.
Lead filters are applied after full place details are fetched:
{"leadFilters": {"minRating": 4.2,"minReviewCount": 25,"mustHaveWebsite": true,"mustHavePhone": false,"categoryIncludes": "cafe"}}
Filtered places are counted in the OUTPUT.filteredPlaces summary and skipped from Dataset output and review fetching.
Location targeting
You can target by city and country:
{"query": "coffee shops","searchLocation": "Berlin, Germany","gl": "de"}
Or use structured geolocation fields:
{"query": "coffee shops","geoCountry": "Germany","geolocationParameters": {"country": "Germany","city": "Berlin","postalCode": "10117"},"gl": "de"}
You can also add custom latitude and longitude to anchor the map area:
{"query": "coffee shops","searchLocation": "Berlin, Germany","customGeolocation": {"latitude": 52.520008,"longitude": 13.404954},"zoom": 13,"gl": "de"}
For coordinate-heavy workflows, use customCoordinates as simple text:
{"query": "coffee shops","searchLocation": "Berlin, Germany","customGeolocation": {"coordinates": "52.520008, 13.404954","radiusKm": 5}}
Or use coordinatesJson with a GeoJSON point:
{"query": "coffee shops","searchLocation": "Berlin, Germany","customGeolocation": {"coordinatesJson": "{\"type\":\"Point\",\"coordinates\":[13.404954,52.520008]}"}}