Google Maps Scraper Plus: Leads, Emails and Monitoring
Google Maps Scraper Plus is an Apify actor (API) by CheapAPI Labs. Places from any search and city with phones, websites, emails, socials and reviews. Splits big areas so you get past the usual result cap. It costs $2.00 per 1,000 places on the Apify Free plan and $0.75 on Gold, billed through your Apify account with no API key. On the Apify Free plan, place data has no monthly limit; only the review history and extended profile add ons share the $0.25 monthly allowance.
Compared with the most used Google Maps actor on Apify Store (about 625,000 users): 1,000 places with website contacts and 5 reviews each costs $3.50 on Free and $1.12 on Gold here and $8.50 and $3.85 there (Apify Store listing prices, checked September 2026). Apify platform usage is billed on top here. For a bare listing without contacts or reviews, some smaller actors charge less on the Free plan.
Our prices updated 30 October 2026; competitor prices as checked in the comparison. 4 Apify users have run this actor (Apify Store count, 30 October 2026).
What does Google Maps Scraper Plus return?
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.
One example row from a real run, shortened:
{
"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",
…
}Which fields do you get?
The most used fields (a value Google does not show for a place is null or missing):
| Field | Type | Example |
|---|---|---|
title |
string | "LOULOU" |
categoryName |
string | "French restaurant" |
placeId |
string | "ChIJLT_ZhspZwokR5p4Rn-hVEeQ" |
address |
string | "176 8th Ave, New York, NY 10011" |
city / postalCode / countryCode |
string | "New York" / "10011" / "US" |
location |
object | { "lat": 40.7426678, "lng": -74.0001698 } |
phone / phoneUnformatted |
string | "(212) 337-9577" / "+12123379577" |
website |
string | "https://www.loulounyc.com/" |
totalScore |
number | 4.7 |
reviewsCount |
integer | 4506 |
reviewsDistribution |
object | { "oneStar": 135, …, "fiveStar": 3738 } |
businessStatus |
string | "OPERATIONAL" |
openingHours |
array | [{ "day": "Monday", "hours": "11 AM–12 AM" }] |
claimThisBusiness |
boolean | false |
reviews |
array | top 5 reviews with text, stars, date, owner reply |
imageUrls |
array | full size photo URLs (usually 3 to 5) |
email |
string | "info@loulounyc.com" (leads enrichment) |
instagram / facebook / linkedin |
string | "https://www.instagram.com/loulou.nyc" |
contacts.websiteStatus |
string | "ok", "parked", "social_only" … |
contacts.emails |
array | ["info@loulounyc.com"], all business mailboxes found on the website |
contacts.emailsDetailed |
array | [{ "email": "info@loulounyc.com", "type": "generic", "domainMatchesWebsite": true, "mxValid": true }] |
contacts.phonesFromWebsite |
array | extra phone numbers from the website, E.164, deduplicated |
contacts.socialProfiles |
object | { "instagram": ["https://www.instagram.com/loulou.nyc"] } (13 networks) |
contacts.websiteSignals |
object | { "https": true, "mobileFriendly": true, "bookingSystems": ["Resy"] } |
leadScore |
integer | 95 |
leadScoreBreakdown |
array | [{ "points": 15, "reason": "Has phone number" }, …], every point explained |
leadScoreCoverage |
number | 1, share of the 10 score criteria that could be evaluated |
leadSignals |
array | ["no_website", "unclaimed_listing"] |
changeStatus |
string | "NEW", "UPDATED", "UNCHANGED" (monitoring) |
searchQuery / searchLocation |
string | "restaurant" / "Chelsea, Manhattan, New York" |
scrapedAt |
string | ISO timestamp of the run |
dataQuality |
object | { "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 to 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,tiktokcolumns plus the fullcontactsobject:contacts.emails,contacts.emailsDetailed(typegeneric/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 much does Google Maps Scraper Plus cost?
You pay per event, through your Apify account. Main price: $2.00 per 1,000 places on the Apify Free plan and $0.75 on Gold. Every event and plan:
| Event | Free | Bronze | Silver | Gold |
|---|---|---|---|---|
| Place scrapedOne place in the dataset with full details, 5 top reviews, photos, lead score and monitoring. | $0.002 | $0.002 | $0.0014 | $0.00075 |
| Review scrapedOne review beyond the first 5 per place (full review history). Each place's review history costs at least its minimum (see review minimum). | $0.00025 | $0.00025 | $0.00025 | $0.0001 |
| Review history minimum (top up)$0.0001 top up units, charged only when the reviews delivered for a place are worth less than the minimum charge of the review pages loaded for it (few reviews, a review date filter that removed most of them, or no reviews returned). | $0.0001 | $0.0001 | $0.0001 | $0.0001 |
| Place extrasExtended profile of a place: popular times, price level, people also search, review topics, attributes. | $0.0022 | $0.0022 | $0.0022 | $0.0022 |
| Place extras checked (none available)Extended profile looked up for a place, but Google has no extended profile for it. Charged instead of Place extras, only when Place extras is on. | $0.0022 | $0.0022 | $0.0022 | $0.0022 |
| Contacts enrichedWebsite visit that added new emails, phones or social profiles. | $0.0015 | $0.0015 | $0.0015 | $0.00037 |
How do I call Google Maps Scraper Plus API from code?
Every run is one HTTP request to the Apify API with your Apify token; the input below is the actor's own example. The synchronous endpoint returns the rows in the response for runs up to 300 seconds; for longer runs start a run and fetch its dataset.
curl -X POST "https://api.apify.com/v2/acts/cheapapi~google-maps-scraper-plus/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" -H "Content-Type: application/json" \
-d '{"searchQueries":["restaurant"],"locations":["Chelsea, Manhattan, New York"],"maxPlacesPerQuery":50}'With the JavaScript client:
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('cheapapi/google-maps-scraper-plus').call({
"searchQueries": [
"restaurant"
],
"locations": [
"Chelsea, Manhattan, New York"
],
"maxPlacesPerQuery": 50
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();How does Google Maps Scraper Plus compare with alternatives?
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 plan | Most used Actor (~625k users), event prices | Google Maps Scraper Plus, event prices | Difference (event prices) |
|---|---|---|---|
| Free | $4.00 + $2.00 + $2.50 = $8.50 | $2.00 + $1.50 = $3.50 | 59 % less |
| Bronze | $3.00 + $2.00 + $2.50 = $7.50 | $2.00 + $1.50 = $3.50 | 53 % less |
| Silver | $2.00 + $1.50 + $1.85 = $5.35 | $1.40 + $1.50 = $2.90 | 46 % less |
| Gold | $1.50 + $1.05 + $1.30 = $3.85 | $0.75 + $0.37 = $1.12 | 71 % less |
| Platinum | $1.26 + $0.63 + $0.79 = $2.68 | $0.75 + $0.37 = $1.12 | 58 % less |
| Diamond | $0.76 + $0.38 + $0.47 = $1.61 | $0.75 + $0.37 = $1.12 | 30 % 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 to $0.15 (about 5 to 20 minutes at 1 GB, i.e. 0.1 to 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 to 6 places) used $0.001 to $0.01. Added to our price, the Diamond difference narrows to roughly 21 to 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 to 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.
| Typical Google Maps scrapers | Google Maps Scraper Plus | |
|---|---|---|
| Results per search | Capped at ~120 per map view, or grid search as a paid add on | Adaptive 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 run | Often one | Any number of locations × any number of search terms, deduplicated across all of them |
| Place details, reviews, images | Separate add on fees | Included in the base price (5 top reviews per place) |
| Full review history | Often broken since Google hid reviews from logged out visitors in 2026 | Up to 5,000 most recent reviews per place, sortable, with owner replies |
| Popular times | Not available logged out | Popular times, price level, "people also search" as an optional extended profile |
| Emails & socials | Add on, often charged even when nothing is found | Charged 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 qualification | Rare, opaque | 0 to 100 lead score with a point by point breakdown + sales signals (no_website, unclaimed_listing, website_outdated…) |
| Recurring runs | Re pay for the same places every time | Monitoring mode: NEW / UPDATED / UNCHANGED with a field level diff; output only changes and pay only for them |
| Market analysis | Paid AI add on, or nothing | Free market & competitor report (opportunity lists, category benchmarks, your business vs. nearest competitors) computed from the data, no AI, no hallucinations |
| Honesty | Silent nulls, "unlimited reviews" claims | Run summary with fill rate per field, per record dataQuality, unresolved inputs listed, wrong geocodes refused instead of scraping the wrong area |
| Inputs | Often only search terms, sometimes rejects IDs | Search terms, cities/regions/postcodes/countries, GeoJSON polygons/circles, any Maps URL, share links, Place IDs, CIDs, feature ids |
| Privacy | Reviewer names and personal emails on by default | Reviewer 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 is it used for?
- 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.
What are the limits?
- 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 request agains 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, freemail (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 enableincludePersonalEmails. On franchise pages listing many branches, the address matching this branch's name or city is put first andmultiLocationPageis 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.suspectSharedContactslists any address found on 3+ different websites (usually a web agency footer). - Photos: Google exposes about 3 to 5 photos per place to logged out visitors;
imagesCountshows 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).
Questions about Google Maps Scraper Plus
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):
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 to $0.01 and a 1,000-place lead run roughly $0.03 to $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).
Run Google Maps Scraper Plus on Apify
The form opens with a working example. Free Apify accounts get a small monthly allowance.