Google Maps Scraper Plus — Places, Leads & Change Monitoring avatar

Google Maps Scraper Plus — Places, Leads & Change Monitoring

Pricing

Pay per event + usage

Go to Apify Store
Google Maps Scraper Plus — Places, Leads & Change Monitoring

Google Maps Scraper Plus — Places, Leads & Change Monitoring

Fast HTTP Google Maps scraper: unlimited area coverage with an adaptive grid, multi-city runs, emails & socials with MX check, transparent lead score, change monitoring, honest fill-rate report and interactive map.

Pricing

Pay per event + usage

Rating

0.0

(0)

Developer

CheapAPI

CheapAPI

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Google Maps Scraper Plus - Leads, Emails & Monitoring

Extract businesses from any area of Google Maps — far beyond Google's ~120 results per map view — with contacts, emails, social profiles, a transparent lead score, top reviews and change tracking between runs. Built on Google Maps' own internal endpoints over plain HTTP (no browser), so it is fast, cheap and does not need residential proxies.

Why this Actor

  • $2.00 per 1,000 places on the Free and Bronze plans, $1.40 on Silver and $0.75 per 1,000 on Gold and above — full place details, 5 top reviews, photos, lead score and monitoring in that one price, no start fee and no add-on maze. For a typical lead-generation run (places + contacts + 5 reviews) that is 30–71 % less in event prices (depending on your plan; Apify platform usage is billed separately) than the most-used Google Maps Actor (exact comparison). If you only need a bare listing, some smaller Actors are cheaper (from $0.50 / 1,000).
  • Beyond the ~120-result cap: an adaptive grid on the real boundary of each location found 84 % of all places in Auto mode and 93 % in Thorough mode in our test runs (one test area, n=1: a dense urban neighbourhood, September 2026 — see How coverage works for the method and its limits).
  • 70+ output fields per place, including rating distribution, opening hours, amenities, booking links, and optional emails + 13 social networks from the business website.
  • Pay only for what is new: contacts are charged only when the website adds something the listing didn't have; in monitoring mode unchanged places are neither output nor charged.
  • Honest run reports: fill rate of every field, unresolved inputs and Google's "limited view" are reported, never hidden.
  • What it does not do: it does not return employee-level contacts (no named decision-makers, job titles or personal LinkedIn profiles), does not guess personal email addresses and does not verify individual mailboxes (MX check only).

Compared with typical Google Maps scrapers

Typical Google Maps scrapersGoogle Maps Scraper Plus
Results per searchCapped at ~120 per map view, or grid search as a paid add-onAdaptive grid on the real boundary of every location — dense tiles are zoomed into automatically, empty ones are skipped (one test area, n=1: 84 % of all places in Auto, 93 % in Thorough — method)
Locations per runOften oneAny number of locations × any number of search terms, deduplicated across all of them
Place details, reviews, imagesSeparate add-on feesIncluded in the base price (5 top reviews per place)
Full review historyOften broken since Google hid reviews from logged-out visitors in 2026Up to 5,000 most recent reviews per place, sortable, with owner replies
Popular timesNot available logged-outPopular times, price level, "people also search" as an optional extended profile
Emails & socialsAdd-on, often charged even when nothing is foundCharged only when the website adds something new (an email, or a phone/social profile not already on the listing); emails checked for a working mail server (MX), junk and template addresses removed
Website health–parked / dead / DNS error / social-only / redirects elsewhere, HTTPS, mobile, CMS, analytics, pixel, online booking
Lead qualificationRare, opaque0–100 lead score with a point-by-point breakdown + sales signals (no_website, unclaimed_listing, website_outdated…)
Recurring runsRe-pay for the same places every timeMonitoring mode: NEW / UPDATED / UNCHANGED with a field-level diff; output only changes and pay only for them
Market analysisPaid AI add-on, or nothingFree market & competitor report (opportunity lists, category benchmarks, your business vs. nearest competitors) computed from the data — no AI, no hallucinations
HonestySilent nulls, "unlimited reviews" claimsRun summary with fill rate per field, per-record dataQuality, unresolved inputs listed, wrong geocodes refused instead of scraping the wrong area
InputsOften only search terms, sometimes rejects IDsSearch terms, cities/regions/postcodes/countries, GeoJSON polygons/circles, any Maps URL, share links, Place IDs, CIDs, feature ids
PrivacyReviewer names and personal emails on by defaultReviewer data off by default; emails follow a documented business-mailbox allowlist (see below), other addresses are hidden unless you opt in

"Typical" column summarises public Apify Store listings of popular Google Maps scrapers, checked September 2026; features and prices of individual Actors change, so check the listing of any alternative you consider.

What data you get

The most used fields (a value Google does not show for a place is null or missing):

FieldTypeExample
titlestring"LOULOU"
categoryNamestring"French restaurant"
placeIdstring"ChIJLT_ZhspZwokR5p4Rn-hVEeQ"
addressstring"176 8th Ave, New York, NY 10011"
city / postalCode / countryCodestring"New York" / "10011" / "US"
locationobject{ "lat": 40.7426678, "lng": -74.0001698 }
phone / phoneUnformattedstring"(212) 337-9577" / "+12123379577"
websitestring"https://www.loulounyc.com/"
totalScorenumber4.7
reviewsCountinteger4506
reviewsDistributionobject{ "oneStar": 135, …, "fiveStar": 3738 }
businessStatusstring"OPERATIONAL"
openingHoursarray[{ "day": "Monday", "hours": "11 AM–12 AM" }]
claimThisBusinessbooleanfalse
reviewsarraytop 5 reviews with text, stars, date, owner reply
imageUrlsarrayfull-size photo URLs (usually 3–5)
emailstring"info@loulounyc.com" (leads enrichment)
instagram / facebook / linkedinstring"https://www.instagram.com/loulou.nyc"
contacts.websiteStatusstring"ok", "parked", "social_only" …
contacts.emailsarray["info@loulounyc.com"] — all business mailboxes found on the website
contacts.emailsDetailedarray[{ "email": "info@loulounyc.com", "type": "generic", "domainMatchesWebsite": true, "mxValid": true }]
contacts.phonesFromWebsitearrayextra phone numbers from the website, E.164, deduplicated
contacts.socialProfilesobject{ "instagram": ["https://www.instagram.com/loulou.nyc"] } (13 networks)
contacts.websiteSignalsobject{ "https": true, "mobileFriendly": true, "bookingSystems": ["Resy"] }
leadScoreinteger95
leadScoreBreakdownarray[{ "points": 15, "reason": "Has phone number" }, …] — every point explained
leadScoreCoveragenumber1 — share of the 10 score criteria that could be evaluated
leadSignalsarray["no_website", "unclaimed_listing"]
changeStatusstring"NEW", "UPDATED", "UNCHANGED" (monitoring)
searchQuery / searchLocationstring"restaurant" / "Chelsea, Manhattan, New York"
scrapedAtstringISO timestamp of the run
dataQualityobject{ "googleView": "full", … }

All fields, by group

  • Identity: title, categoryName, categories, placeId, cid, fid, kgmid, url, cidUrl
  • Location: address, street, neighborhood, city, postalCode, state, countryCode, plusCode, location {lat,lng}, timezone
  • Contact: phone, phoneUnformatted (E.164), website, websiteDomain
  • Reputation: totalScore, reviewsCount, reviewsDistribution (1–5 stars), reviewsTags (what reviews talk about, with counts), reviews (top reviews with text, stars, ISO date, per-aspect ratings like Food/Service/Atmosphere, visit context like "Price per person", owner reply, photos)
  • Business: businessStatus (OPERATIONAL / CLOSED_TEMPORARILY / CLOSED_PERMANENTLY), openingHours (text + machine-readable periods), additionalOpeningHours (brunch, delivery, happy hour…), openingHoursStatus, claimThisBusiness, ownerName, description, ownerDescription, ownerUpdates (business posts)
  • Extras: isOpenNow, additionalInfo (amenities: accessibility, service options, payments…), highlights, actionLinks (reservation / order online / shopping providers and URLs), priceInfo (hotel nightly price, fuel price), hotel (stars, check-in/out dates, amenities), placesInside (stores inside a mall, restaurants inside a hotel…), imagesCount, imageUrls, mainImageUrl
  • Leads (optional): flat CSV-friendly email, facebook, instagram, linkedin, twitter, youtube, tiktok columns plus the full contacts object: contacts.emails, contacts.emailsDetailed (type generic / business / published, on-domain, free provider, MX valid), contacts.personalEmailsHidden, contacts.multiLocationPage, contacts.phonesFromWebsite (normalized, deduplicated), contacts.socialProfiles (Facebook, Instagram, X, LinkedIn, YouTube, TikTok, Pinterest, WhatsApp, Telegram, Discord, Threads, Yelp, Tripadvisor), contacts.websiteStatus (ok, platform_page, social_only, parked, dns_error, blocked, redirects_elsewhere, under_construction, skipped_closed…), contacts.websiteSignals
  • Scoring: leadScore, leadScoreCoverage (share of criteria that could be evaluated), leadScoreBreakdown, leadSignals
  • Monitoring: changeStatus, changes[] {field, from, to}, metricsDelta (rating / review-count movement), firstSeenAt
  • Meta: searchQuery, searchLocation, rank (position in the Google result list of the map view it was found in), scrapedAt, dataQuality

ownerName is the display name of the Google Business Profile owner account (usually the business name itself), not a named decision-maker.

How to use

In Apify Console (no code)

  1. Open Google Maps Scraper Plus in Apify Console and click Try for free / Start.
  2. In What & where to search, type your search terms (e.g. dentist) and one or more locations (e.g. Austin, Texas, USA). The form is prefilled, so you can also just press Start for a first test.
  3. Optional: set Max places per search term & location (the form starts at 50 for a cheap first try; 0 = everything in the area).
  4. Optional: turn on Find emails, phones & social profiles on the website for leads, add filters (minimum rating, only places without a website, unclaimed listings…) or Track changes between runs.
  5. Optional: set Maximum cost per run in the run options to cap your spend.
  6. Click Start. Watch results appear in the Output tab, then export them as CSV, Excel, JSON or HTML, or open the results map, run summary and market report from the Output tab.

Ready-to-paste input JSON

{
"searchQueries": ["dentist"],
"locations": ["Austin, Texas, USA"],
"maxPlacesPerQuery": 100,
"scrapeContacts": true,
"minRating": 4
}

Run it via the API

curl (runs the Actor and returns the dataset items when it finishes):

curl -X POST "https://api.apify.com/v2/acts/cheapapi~google-maps-scraper-plus/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"searchQueries":["dentist"],"locations":["Austin, Texas, USA"],"maxPlacesPerQuery":100,"scrapeContacts":true}'

JavaScript (npm install apify-client):

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_TOKEN>' });
const run = await client.actor('cheapapi/google-maps-scraper-plus').call({
searchQueries: ['dentist'],
locations: ['Austin, Texas, USA'],
maxPlacesPerQuery: 100,
scrapeContacts: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, items[0]?.title, items[0]?.email);

Python (pip install apify-client):

from apify_client import ApifyClient
client = ApifyClient("<YOUR_TOKEN>")
run = client.actor("cheapapi/google-maps-scraper-plus").call(run_input={
"searchQueries": ["dentist"],
"locations": ["Austin, Texas, USA"],
"maxPlacesPerQuery": 100,
"scrapeContacts": True,
})
for place in client.dataset(run["defaultDatasetId"]).iterate_items():
print(place["title"], place.get("phone"), place.get("email"))

More input recipes

Leads in several cities

{
"searchQueries": ["plumber", "electrician"],
"locations": ["Austin, Texas, USA", "Dallas, Texas, USA"],
"maxPlacesPerQuery": 0,
"scrapeContacts": true,
"minRating": 4
}

Web-design prospects: businesses without a website

{ "searchQueries": ["hair salon"], "locations": ["Manchester, UK"], "websiteFilter": "withoutWebsite", "maxPlacesPerQuery": 0 }

Local-SEO prospects: unclaimed listings

{ "searchQueries": ["dentist"], "locations": ["Phoenix, Arizona"], "claimFilter": "unclaimed" }

Your own polygon / radius (paste from geojson.io)

{ "searchQueries": ["cafe"], "customGeolocation": { "type": "Point", "coordinates": [13.405, 52.52], "radiusKm": 2 } }

Look up known places (any mix of formats)

{
"placeIds": ["ChIJLT_ZhspZwokR5p4Rn-hVEeQ", "16434010972841156326", "0x8644eb01e1b6f12b:0xfd2a1ae49e89ca16"],
"startUrls": [{ "url": "https://maps.app.goo.gl/…" }, { "url": "https://www.google.com/maps/search/pizza/@40.72,-74.0,15z" }]
}

Weekly market monitoring — schedule the Actor with:

{ "searchQueries": ["coffee shop"], "locations": ["Lisbon"], "maxPlacesPerQuery": 0, "monitoringMode": true, "monitoringName": "lisbon-coffee", "outputOnlyChanges": true }

The first run stores a baseline (BASELINE). Later runs output only NEW and UPDATED places plus verified REMOVED places. Unchanged places are neither output nor charged.

  • What counts as a change is configurable (monitorFields; default: name, category, address, phone, website, business status, opening hours, ownership). Rating and review-count movement is always reported in metricsDelta without flagging the place as changed, so busy places don't make every run expensive.
  • Places that are temporarily incomplete (Google's limited view) never produce fake changes. A watched place that is now removed by your filters (for example it closed while "Skip closed places" is on) is not output, but the change still appears in the CHANGES record.
  • REMOVED is never guessed from absence alone. A place missing from 3 consecutive complete runs is re-checked on Google by its id, and is reported only with a confirmed reason: closed_permanently, merged (Google replaced it with newFid), moved_out_of_area or not_found (Google no longer knows the id — confirmed twice, on different IPs, while a control place loads fine). If the re-check shows the place still exists, it was just a coverage miss and nothing is reported.
  • A run whose search terms hit a limit, were truncated or had failed search pages does not count misses at all. With monitoring on and no per-search limit set, each area is searched without a limit (in our one-area test, n=1, the grid found ~84 % of places per run in Auto, ~93 % in Thorough — the verification above keeps that from ever turning into false removals).
  • NEW means the watch sees the place for the first time. That includes businesses an earlier run's grid did not reach (in our one-area test, n=1, Auto covered ~84 % of the area per run, Thorough ~93 %), so NEW records carry likelyNewBusiness: true when the place has 3 reviews or fewer — the typical signature of a genuinely new business. Use coverage: thorough for the most stable watches.
  • Each run also writes a compact CHANGES record to its key-value store — point a webhook or Slack/Zapier integration at it for alerts.

Use cases

  • Lead generation: phone, website, email and social profiles of every plumber, dentist or restaurant in several cities, ranked by leadScore.
  • Agency prospecting: businesses without a website (web design), unclaimed listings (local SEO), no online booking or outdated websites (leadSignals).
  • Market research: how many competitors, their ratings, review volume and categories in an area — plus the free market report.
  • Competitor tracking: compare your business with its 10 nearest competitors (myBusiness) and watch them with scheduled monitoring runs.
  • Reputation analysis: up to 5,000 recent reviews per place with star ratings, per-aspect ratings and owner replies.
  • Data enrichment: look up known places by Place ID, CID or Google Maps URL to refresh phone numbers, hours and status in your CRM.

Advanced options

Everything below is optional; the defaults are what you get if you leave the field empty.

InputDefaultWhat it does
searchQueries– (form prefill: restaurant)Search terms; every term is searched in every location
locations– (form prefill: Chelsea, Manhattan, New York)Cities, districts, regions, postcodes or countries
customGeolocation–Your own GeoJSON area: Polygon, MultiPolygon, Point with radiusKm, Feature/FeatureCollection
countryCode–Two-letter ISO code; disambiguates locations, sets Google's region, or searches the whole country
startUrls–Google Maps URLs (place, search, ?cid=, share links)
placeIds–Place IDs, CIDs or feature ids
maxPlacesPerQuery200 (no limit in monitoring mode; form prefill 50)Places per search term × location, 0 = no limit
maxPlacesTotal0 (no cap)Hard cap for the whole run
coverageautoauto adaptive grid, thorough dense grid, fast single map view
includeNearbyKm0Also keep places up to this many km outside the boundary
pointRadiusKm3Search radius when a location resolves to a point
minRating–Minimum star rating
minReviews / maxReviewsCount–Minimum / maximum number of reviews
categoryFilter / excludeCategories–Keep / drop places whose category contains these words
websiteFilterallwithWebsite / withoutWebsite
phoneFilterallwithPhone / withoutPhone
claimFilterallclaimed / unclaimed
skipClosedPlacesfalseDrop permanently and temporarily closed places
nameMatchanycontainsQuery or exact for brand searches
scrapePlaceDetailstrueFull details (rating distribution, top reviews, places inside…)
maxReviews5Reviews per place, up to 5,000 (first 5 included in the place price; above 5, each place's review history costs at least the review minimum)
reviewsSortnewestnewest, mostRelevant, highestRating, lowestRating
reviewsStartDate–Only reviews published on or after this date
reviewsPersonalDatafalseInclude reviewer names and profile links
maxImages5Photo URLs per place (0–10)
placeExtrasfalseExtended profile: popular times, price level, people also search, review topics, attributes ($0.0022 per place looked up, also when Google has none)
scrapeContactsfalseEmails, phones and social profiles from the business website + website health
maxContactPagesPerSite4Pages visited per website, including the homepage (1–10)
verifyEmailDomainstrueDrop emails whose domain cannot receive mail (MX check)
includePersonalEmailsfalseAlso return addresses that may belong to a person
leadScoringtrueleadScore, leadScoreBreakdown, leadSignals
monitoringModefalseTrack changes between runs (NEW / UPDATED / UNCHANGED / REMOVED)
monitoringNamefingerprint of terms + locationsRuns with the same name share memory
monitorFieldsname, category, address, phone, website, status, hours, ownershipFields that count as a change
outputOnlyChangesfalseOutput and charge only new and changed places (switches monitoring on)
marketReporttrueFree market & competitor report
myBusiness–Your Place ID / URL / CID for the competitor comparison. It is looked up and output (charged as one place) even when the filters would exclude it
languageenLanguage of names, categories and reviews
outputMaptrueSave results-map.html
proxyConfigurationApify datacenter proxyProxy for Google Maps requests
useProxyForWebsitesfalseAlso use the proxy when visiting business websites
maxConcurrency10Parallel requests (1–50)
limitedViewRetries4Re-requests for places Google served in its "limited view" (0–10)

Example output (shortened)

One place from a restaurant search in Chelsea, Manhattan, New York with website contacts on (the same place as in the field table above):

{
"title": "LOULOU",
"categoryName": "French restaurant",
"address": "176 8th Ave, New York, NY 10011",
"city": "New York",
"postalCode": "10011",
"location": { "lat": 40.7426678, "lng": -74.0001698 },
"phone": "(212) 337-9577",
"phoneUnformatted": "+12123379577",
"website": "https://www.loulounyc.com/",
"totalScore": 4.7,
"reviewsCount": 4506,
"reviewsDistribution": { "oneStar": 135, "twoStar": 101, "threeStar": 105, "fourStar": 427, "fiveStar": 3738 },
"businessStatus": "OPERATIONAL",
"openingHours": [{ "day": "Monday", "hours": "11 AM–12 AM", "periods": [{ "open": "11:00", "close": "24:00" }] }],
"actionLinks": [{ "type": "reservation", "label": "Reserve a table", "provider": "Resy", "url": "https://resy.com/…" }],
"reviewsTags": [{ "title": "speakeasy", "count": 49 }, { "title": "outdoor seating", "count": 64 }],
"placesInside": [{ "title": "Live at Loulou", "category": "Cocktail bar", "totalScore": 4.3, "reviewsCount": 84 }],
"reviews": [{
"stars": 5,
"text": "Dinner, Drinks & a Show — Good Vibes! 9/10 …",
"publishedAtDate": "2026-08-26T22:19:32.347Z",
"reviewDetailedRating": { "Food": 5, "Service": 5, "Atmosphere": 5 },
"reviewContext": { "Meal type": "Dinner", "Price per person": "$90–100" },
"responseFromOwnerText": "Thank you so much for such a wonderful and thoughtful review…"
}],
"contacts": {
"websiteStatus": "ok",
"emails": ["info@loulounyc.com"],
"emailsDetailed": [{ "email": "info@loulounyc.com", "type": "generic", "domainMatchesWebsite": true, "freeProvider": false, "mxValid": true }],
"socialProfiles": { "instagram": ["https://www.instagram.com/loulou.nyc"] },
"websiteSignals": { "https": true, "mobileFriendly": true, "bookingSystems": ["Resy"], "googleAnalytics": ["G-TMTMDEEXE5"], "technologies": [] }
},
"leadScore": 95,
"leadScoreCoverage": 1,
"leadSignals": [],
"searchQuery": "restaurant",
"searchLocation": "Chelsea, Manhattan, New York",
"dataQuality": { "source": "details", "googleView": "full", "detailAttempts": 1, "openingHoursPartial": false, "note": null }
}

How coverage works

  1. Every location is geocoded (OpenStreetMap) to its real boundary, not a bounding box. Ambiguous names that only match unrelated places are refused with a warning instead of scraping the wrong area.
  2. The area is covered with tiles. Each tile is searched page by page while Google's results stay inside the tile.
  3. If Google cuts the list while it is still local (it never returns more than ~120–200 places per map view), the tile is split into four and zoomed in — repeatedly, only where businesses are dense.
  4. Places are deduplicated across tiles, search terms and locations, and filtered to the boundary (includeNearbyKm widens it).

Coverage modes, measured in one test area (n=1): Auto found 84 % of all places with 14 % of the requests; Thorough 93 % with 34 %; Fast is a single map view per location.

How these numbers were measured (September 2026, while tuning the grid): one dense urban neighbourhood was searched with each mode, and the places found were compared against a reference exhaustive crawl of the same area (631 search requests, taken as 100 % of the places Google returns there). "Requests" are search requests relative to those 631. This is a single-area internal test, not an independent benchmark: real coverage depends on density, search term and area size, so treat the figures as indicative. Every run reports its own numbers (places per search term × location, search requests, tiles split) in RUN_SUMMARY.

Lead score (0–100)

Points below add up to at most 95 and are scaled to 0–100. When the review count is unknown (Google's limited view), a neutral 6 points is given. Scores are comparable between records of the same run configuration; leadScoreCoverage shows how many of the 10 criteria were known.

PointsCondition
+10Operational (permanently closed = score 0)
+15Has a phone number
+10Has a website
+20 / +12Email on the business's own domain with a valid mail server / any email
+10 / +53+ social profiles / at least one
+10 / +7Rating ≥ 4.5 / ≥ 4.0
+10 / +6100+ / 20+ reviews
+5Claimed listing
+5Opening hours published

leadSignals lists opportunities and red flags: no_website, website_is_social_profile, website_parked, website_dns_error, website_no_https, website_not_mobile_friendly, website_outdated, no_analytics, no_online_booking (no booking widget on the site, no Google reservation/appointment link and the website is not a booking platform), no_email_found, no_social_profiles, unclaimed_listing, low_rating, few_reviews, few_photos, no_opening_hours, temporarily_closed. Every point is returned in leadScoreBreakdown, so you can re-weight it yourself.

Free market & competitor report

Every run also saves market-report.html (and MARKET_REPORT as JSON) — computed only from the places of this run, with no extra requests and no AI, so every number is traceable to the dataset:

  • Overview & categories: median rating and reviews, share rated 4.5★+, without a website, unclaimed, with online booking — per category.
  • Opportunities: established businesses without a website, unclaimed listings, rising stars (≥4.6★ with 5–60 reviews), busy but poorly rated (<3.8★, 50+ reviews), appointment businesses without online booking.
  • Leaders: most reviewed and best rated (only places with a typical number of reviews or more — no 5.0★ with 3 reviews).
  • What reviews talk about: Google's review topics shared by 3+ businesses of the area.
  • Your business (optional myBusiness): your place against its 10 nearest competitors of the same category — rating, reviews, photos, business posts, website, online booking — with strengths and weaknesses.

The report states its own limits: small samples (<30 places) and runs that stopped at a limit are flagged, and counts are lower bounds (in our one-area test, n=1, the grid found ~84 % / ~93 % of the area per run). For a real market view, run with maxPlacesPerQuery: 0.

Run summary & map

Every run stores in its key-value store:

  • RUN_SUMMARY — places per search term × location, search requests, failed search pages, tiles split, filtered places by reason, Google rate limits hit, places where Google only served its "limited view", fill rate of every field, unresolved inputs and monitoring counts.
  • CHANGES (monitoring mode) — the NEW / UPDATED / REMOVED places of this run.
  • results-map.html — an interactive, clustered map of all places.

Pricing

Typical cost: 1,000 places with website contacts cost $3.50 on the Free plan and $1.12 on Gold (worst case, contacts charged on every place); Apify platform usage is billed separately.

Apify Free plan: Apify does not pay developers for usage on its Free plan, so on the Free plan the two add-ons that cost us data fees — the full review history (more than 5 reviews per place) and extended profiles — share an allowance of $0.25 per calendar month. Place data, contacts and the first 5 reviews are not limited. When the allowance is used up, those add-ons are skipped with a clear log message (not an error). Any paid Apify plan removes the limit; prices are the same.

Pay per result, no start fee and no add-on maze. Prices drop automatically on higher Apify plans:

EventFree planBronzeSilverGold and aboveWhen
Place scraped$2.00 / 1,000$2.00$1.40$0.75Each place in your dataset — full details, 5 top reviews, photos, lead score and monitoring included
Review scraped$0.25 / 1,000$0.25$0.25$0.10Only reviews beyond the first 5 per place, when you ask for more (up to 5,000 per place)
Review history minimum$0.0001 per unit$0.0001$0.0001$0.0001Top-up units, only when a place's delivered reviews are worth less than the minimum of the review pages loaded for it (see below)
Place extras$2.20 / 1,000$2.20$2.20$2.20Only with "Extended profile" on, for places that return it (popular times, price level, people also search, review topics, attributes)
Place extras checked$2.20 / 1,000$2.20$2.20$2.20Only with "Extended profile" on, for places that were looked up but have no extended profile on Google
Contacts enriched$1.50 / 1,000$1.50$1.50$0.37Only when the website visit added new information (an email, or a phone / social profile not already on the listing)

Review history minimum. The full review history is loaded in pages of 10 reviews, and every page costs us money whether or not its reviews end up in your dataset. So each place's review history is charged at least a small minimum: pages × $0.001875 + $0.00025 on Free, Bronze and Silver, or pages × $0.0009375 + $0.00025 on Gold and above (economy mode, also used for any run asking for more than 20,000 reviews).

When the reviews you receive beyond the first 5 are worth less than that minimum, the difference is charged as review-minimum units of $0.0001. This happens with small review counts, when Only reviews since removes most reviews, or when Google returns fewer reviews than the place lists. Example amounts per place are in the FAQ ("Why was I charged review-minimum or place-extras-checked?").

The run never starts a review request that your Maximum cost per run could not pay, including this minimum.

Apify platform usage (compute, storage, proxy) is billed separately by Apify, on top of these prices. At the default 1024 MB a small run typically uses about $0.002–$0.01 and a 1,000-place lead run roughly $0.03–$0.15 (estimate); large area searches run longer and use proportionally more (1 compute unit = 1 GB of memory for 1 hour, at your plan's rate).

Free: places removed by your filters, unchanged places in monitoring mode, duplicates, the market report, the results map and the run summary. Identical website URLs (e.g. several locations linking the same homepage) are crawled once (contacts.sharedWebsite: true on the others), and contacts are charged at most once per business domain per run.

Worked examples

  • 1,000 dentists with contact enrichment, 700 websites yield new contacts — Free plan: $2.00 + $1.05 = $3.05; Silver: $1.40 + $1.05 = $2.45; Gold: $0.75 + $0.26 = $1.01.
  • 10,000 places, no enrichment — Free plan: $20.00; Silver: $14.00; Gold: $7.50.
  • 100 restaurants with 100 reviews each (95 charged reviews per place) — Free plan: $0.20 + 9,500 × $0.00025 = $2.58; Silver: $0.14 + $2.38 = $2.52; Gold: $0.075 + $0.95 + 200 × $0.0001 review minimum = $1.05.
  • 20 places with 10 reviews each and the extended profile (Free plan) — 20 × $0.002 places + 20 × $0.00215 reviews (5 reviews × $0.00025 = $0.00125 per place, plus 9 review-minimum units) + 20 × $0.0022 extras = $0.127. Plus Apify platform usage.

Price comparison for a typical lead-generation run

1,000 places + website contacts + 5 reviews per place, compared with the most-used Google Maps Actor on the Apify Store (~625,000 users). That Actor sells details, contacts, reviews and filters as separate add-ons; we price its base place + contacts add-on (per place) + 5 reviews (per review). We count our contacts event on all 1,000 places (worst case — in practice it is charged only when the website adds something new).

Apify planMost-used Actor (~625k users), event pricesGoogle Maps Scraper Plus, event pricesDifference (event prices)
Free$4.00 + $2.00 + $2.50 = $8.50$2.00 + $1.50 = $3.5059 % less
Bronze$3.00 + $2.00 + $2.50 = $7.50$2.00 + $1.50 = $3.5053 % less
Silver$2.00 + $1.50 + $1.85 = $5.35$1.40 + $1.50 = $2.9046 % less
Gold$1.50 + $1.05 + $1.30 = $3.85$0.75 + $0.37 = $1.1271 % less
Platinum$1.26 + $0.63 + $0.79 = $2.68$0.75 + $0.37 = $1.1258 % less
Diamond$0.76 + $0.38 + $0.47 = $1.61$0.75 + $0.37 = $1.1230 % less

These totals exclude Apify platform usage. Our runs bill platform usage (compute, storage, proxy) separately. At the default 1024 MB, a 1,000-place run with website contacts typically adds roughly $0.03–$0.15 (about 5–20 minutes at 1 GB, i.e. 0.1–0.35 compute units at typical compute-unit rates — an estimate, not a benchmark; every run shows its exact usage in Console). Our measured small test runs (1–6 places) used $0.001–$0.01. Added to our price, the Diamond difference narrows to roughly 21–29 %, while the other plans stay more than 40 % below. The most-used Actor's public pricing data does not mark platform usage as billed to the user, so compare our price plus usage with its price alone. It also charges a start fee of $0.00005 per GB of memory.

Its optional "additional place details" add-on (reservation data, web results, questions) costs another $2.00 / 1,000 on Free and $1.05 on Gold, and each filter adds $1.00 / 1,000 on Free ($0.525 on Gold); filters are free here.

Bare listing only (no contacts, no reviews): the most-used Actor charges $4.00 / $3.00 / $2.00 / $1.50 / $1.26 / $0.76 per 1,000 places (Free → Diamond) against our $2.00 / $2.00 / $1.40 / $0.75 / $0.75 / $0.75 — on Diamond the two are practically the same, and ours costs slightly more once platform usage is added. Several smaller Actors (~3,000–4,000 users) charge $0.50 / 1,000 on Free and $0.40 on Gold for a bare listing, which is cheaper than us if the listing is all you need.

Prices from public Apify Store listings, checked September 2026. Store prices change — check the listing of any alternative you consider.

Set Maximum cost per run in the run options and the Actor stops gracefully when it is reached; prices for your plan are read at run time, so the budget is always respected.

Integrations

  • Make, Zapier, n8n: use the Apify apps/nodes to start a run and pull the dataset into your CRM, email tool or spreadsheet.
  • Google Sheets: connect the dataset with Apify's Google Sheets integration, or export CSV/Excel from the Output tab.
  • Webhooks: trigger your own endpoint when a run succeeds; in monitoring mode point it at the CHANGES record for alerts (Slack, email…).
  • Schedules: run daily/weekly in Apify Schedules — combine with monitoringMode + outputOnlyChanges to pay only for new and changed places.
  • API & AI agents: every feature is available through the Apify API (see examples above), the official JavaScript/Python clients and the Apify MCP server.

FAQ

Is there a limit on the Apify Free plan? Only for two add-ons: the full review history (beyond the first 5 reviews) and extended profiles share $0.25 per calendar month on the Free plan. Apify pays developers nothing for Free-plan usage while those add-ons cost us data fees. Place data, contacts and the first 5 reviews are unlimited; the allowance resets on the 1st of the month. Any paid Apify plan has no limit.

Is scraping Google Maps legal? Scraping publicly available business data is generally allowed, but personal data (e.g. reviewer names) is protected by laws such as GDPR. Reviewer personal data is off by default; only enable it with a legitimate reason. Consult your lawyer if unsure.

How fresh is the data? Every run collects the data from Google Maps at the moment it runs — nothing is served from an old cache. Each record carries scrapedAt.

Why did I get fewer results than expected? Common reasons: the per-search limit (maxPlacesPerQuery, 200 when empty, 50 in the Console form), filters (minimum rating, website/phone/ownership filters, name match), places outside the location boundary (widen with includeNearbyKm), Fast coverage mode, or your Maximum cost per run. RUN_SUMMARY lists filtered places by reason, search terms that hit a limit and unresolved inputs. A location is skipped when OpenStreetMap only found unrelated places for that name — use the official name (e.g. "The Heights, Jersey City") or draw the area as customGeolocation; skipped inputs are listed in RUN_SUMMARY.unresolvedInputs.

Why was I charged review-minimum or place-extras-checked? review-minimum: reviews are loaded in pages of 10, and each page has a real cost even when its reviews are not delivered. If the reviews you received for a place (beyond the free first 5) are worth less than the minimum of the pages loaded for it — for example Reviews per place = 10 (only 5 charged reviews), Only reviews since removed most of them, or Google returned fewer reviews than the place lists — the difference is charged in $0.0001 units. Minimum per place (rounded up to $0.0001):

Reviews per placeFree / Bronze / SilverGold and above
6–10$0.0022$0.0012
11–20$0.0040$0.0022
21–30$0.0059$0.0031
100$0.0190 (95 reviews = $0.02375, no top-up)$0.0097 (95 reviews = $0.0095, 2 units top-up)

With 100 reviews per place on Free–Silver the reviews themselves cover the minimum and no top-up is charged.

place-extras-checked: with Extended profile on, every place is looked up; some places (often small businesses) have no extended profile on Google. The lookup still costs money, so it is charged at the same price as Place extras. Turn the option off if you do not need popular times or price levels.

Is Apify platform usage included? No. The prices on this page are for results only; Apify bills platform usage (compute, storage, proxy) separately. At the default 1024 MB a small run typically uses about $0.002–$0.01 and a 1,000-place lead run roughly $0.03–$0.15 (estimate).

How do I control my spend? Set Maximum cost per run in the run options — the Actor stops gracefully when it is reached. maxPlacesPerQuery and maxPlacesTotal cap the number of places, and filtered places are never charged.

Can I monitor an area on a schedule? Yes. Schedule the Actor with monitoringMode (and optionally outputOnlyChanges) and the same monitoringName. Each run labels places NEW / UPDATED / UNCHANGED, reports verified REMOVED places and writes a CHANGES record for alerts.

Which export formats are supported? JSON, CSV, Excel, XML, HTML and RSS from the dataset. Emails and social profiles are also in flat columns (email, facebook, instagram…) so CSV/Excel exports stay readable.

Do I need residential proxies? No. The default Apify datacenter proxy works for these endpoints and is the cheapest option.

Can I get the names of owners, managers or employees? No. The Actor returns business-level contacts only (business phone, business mailboxes, social profiles). ownerName is the display name of the Google Business Profile owner account — usually the business name itself — not a person.

Where do I get help? Open an issue in the Actor's Issues tab in Apify Console with your run ID (and the input, if you can share it).

Honest limitations

  • Reviews: every place includes its top 5 reviews. Set "Reviews per place" higher to get the most recent review history — up to 5,000 per place (Google itself stops listing older reviews after roughly 4,500). About half of Google reviews are star-only without text; that is how they were posted.
  • Popular times exist only for place types where Google shows them (restaurants, bars, shops…, not e.g. dentists). Q&A no longer exists on Google Maps. Extended profiles and long review histories add a few minutes to a run (longer for very large runs), because they are completed in one batch after the map search.
  • Limited view: Google randomly serves a reduced place page (about half of all requests) without review data, without the ownership marker and with only today's opening hours. The Actor re-requests such places (limitedViewRetries), fills the week's hours from the search results when possible, and labels any record that stayed reduced (dataQuality.googleView: limited, dataQuality.openingHoursPartial). In monitoring, partial data never counts as a change.
  • Emails come from the business's own website; MX checking confirms the domain accepts mail, not that a specific mailbox exists. Privacy rule: by default an address is returned only when it is clearly a business mailbox — one of its name parts is or starts with a role word (info@, bookings2@, front.desk@, events@…), it contains a word from the business name or website domain, or the business published it in its structured data (schema.org). On ordering/booking/site-builder pages only the business's own, free-mail (gmail…) or self-published addresses are kept, and vendor addresses found on privacy/terms pages are ignored. Everything else might be a person's mailbox and is hidden (counted in personalEmailsHidden) unless you enable includePersonalEmails. On franchise pages listing many branches, the address matching this branch's name or city is put first and multiLocationPage is set.
  • Ordering, booking and site-builder pages (Toast, DoorDash, Booksy, Vagaro, GlossGenius, Wix sites…) are labelled websiteStatus: platform_page; the platform's own emails and social profiles are removed so they are never attributed to the business. RUN_SUMMARY.suspectSharedContacts lists any address found on 3+ different websites (usually a web agency footer).
  • Photos: Google exposes about 3–5 photos per place to logged-out visitors; imagesCount shows the total on Google.
  • Very large areas (whole countries in Thorough mode) are capped at 2,500 starting tiles closest to the centre; split them into regions for full coverage.
  • Not included: employee or decision-maker names, job titles and personal LinkedIn profiles; mailbox-level email verification (MX only, no SMTP probing); anything that requires a Google login (e.g. full photo galleries).

Privacy & personal data

The Actor collects business information that is publicly visible on Google Maps and on the businesses' own websites. Reviewer names and profile links are off by default, and email addresses that may belong to a person are hidden unless you enable includePersonalEmails. If you enable personal data, you are responsible for having a legitimate reason to process it under GDPR, CCPA and similar laws.