MapSweep - Google Maps Grid Scraper & Lead Monitor avatar

MapSweep - Google Maps Grid Scraper & Lead Monitor

Pricing

from $9.00 / 1,000 place scrapeds

Go to Apify Store
MapSweep - Google Maps Grid Scraper & Lead Monitor

MapSweep - Google Maps Grid Scraper & Lead Monitor

Full-coverage Google Maps scraper: grid search past the 12000-result cap, change tracking, contact enrichment, lead scoring and review analytics.

Pricing

from $9.00 / 1,000 place scrapeds

Rating

0.0

(0)

Developer

Safwan Daud

Safwan Daud

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 days ago

Last modified

Categories

Share

MapSweep extracts every business in an area, not just the first 120 search results. It splits the area into a grid, searches each cell, and splits any cell that comes back full until coverage is complete.

What makes it different

  • Full coverage. Adaptive grid search past Google's result cap. Give a city name or a GeoJSON polygon.
  • Change tracking. Re-run on a schedule and get only new, changed or closed places. Each place gets a changeStatus (new, changed, unchanged, closed) and a changes object.
  • Contact enrichment. Crawls each website for emails, phone numbers and social links, with optional email verification (mail server check and a confidence value).
  • Lead scoring. A 0-100 score using missing website, review volume, rating, contact availability, unclaimed listing and review activity.
  • Review analytics. Review velocity (last 30 days), owner reply rate, topic sentiment (price, service, wait, quality, location) and a one-line summary.
  • Filters. Rating, review count, category, with/without website, skip closed places.
  • Spend cap. Stops the run when charges reach your limit.

Input (main fields)

FieldPurpose
searchStringsBusiness types to search, e.g. dentist
location or polygonCity/region name, or a GeoJSON Polygon/MultiPolygon
enableGridSplit, startCellKm, minCellKm, saturationThresholdCoverage control
minRating, minReviews, websiteFilter, categories, skipClosedFilters
outputMode, trackingStoreNamenewOrChangedOnly needs a tracking name; reuse the same name on every scheduled run
enrichContacts, verifyEmails, maxPagesPerWebsiteWebsite contact enrichment
scrapeReviews, maxReviewsPerPlace, reviewsSort, analyzeReviewsReviews and analytics
leadScoring, maxSpendUsd, proxyConfigurationScoring, cap, proxy

Example:

{
"searchStrings": ["dentist"],
"location": "Johor Bahru, Malaysia",
"websiteFilter": "withoutWebsite",
"minReviews": 20,
"leadScoring": true,
"outputMode": "newOrChangedOnly",
"trackingStoreName": "jb-dentists"
}

Output

One dataset row per place: placeId, title, categories, address, location, phone, website, rating, reviewsCount, openingHours, claimed, plus (when enabled) emails, socials, leadScore, changeStatus, changes, reviews, reviewVelocity30d, ownerReplyRate, topicSentiment, reviewSummary. A RUN_SUMMARY record in the key-value store lists run counts and estimated spend.

Pay-per-event pricing (set in Console > Monetization)

Event nameSuggested price
place-scraped$0.009
contact-enrichment$0.006
review-scraped$0.001
review-analysis$0.003

The spend cap uses these same prices, so keep them in sync with PRICES in src/pipeline.js.

Maintenance note

All Google Maps page selectors are in SELECTORS at the top of src/extract.js (plus the review field selectors inside scrapeReviews). If Google changes its layout and fields come back empty, update them there; nothing else needs to change.