Google Maps Scraper avatar

Google Maps Scraper

Pricing

from $2.70 / 1,000 results

Go to Apify Store
Google Maps Scraper

Google Maps Scraper

Fast HTTP-only Google Maps scraper for places, reviews, photos, phones, emails, websites, social profiles, opening hours and lead data. Export clean business contacts at scale with no browser runtime.

Pricing

from $2.70 / 1,000 results

Rating

0.0

(0)

Developer

Blynx

Blynx

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Google Maps Business Intelligence Scraper

Fast Apify actor for Google Maps places, details, contacts, reviews, photos and lead intelligence. It runs on HTTP requests only: no Playwright, no Puppeteer and no browser runtime.

What It Extracts

  • Place identity: title, subTitle, categoryName, categories, placeId, dataId, featureId, cid, kgmid, googleMapsUrl, sourceUrl.
  • Location: address, addressLines, street, city, state, postalCode, neighborhood, locatedIn, countryCode, coordinates, latitude, longitude, plusCode, compoundPlusCode, timeZone, language.
  • Business data: rating, reviewsCount, website, domain, phone, phoneUnformatted, phones, primaryPhone, primaryPhoneUnformatted, priceLevel, openingHours, description, businessDescription, additionalInfo, highlights, reservationLinks, localPosts, owner fields and claim status.
  • Media: images, photoUrls, imageUrl, and flat Apify image columns photo1Url through photo5Url.
  • Website contacts: contacts.emails, contacts.phones, contacts.uncertainPhones, contacts.socialProfiles, contacts.crawledUrls, contacts.websiteStatus, contacts.error.
  • Reviews: optional HTTP reviews endpoint adapter with nested place reviews or one dataset item per review.
  • Lead intelligence: leadScore, contactCompletenessScore, and dataQuality.

Output Shape Notes

  • Emails are stored in contacts.emails.
  • contacts always keeps a stable shape, even when a business has no website or no contacts.
  • phones is a deduplicated top-level string array that combines the Google Maps phone and website phones.
  • description can be null when Google does not provide a short editorial description. Check businessDescription for the longer owner/business description.
  • imageUrl and photo1Url are configured as image columns in Apify dataset views. The photos view exposes photo1Url through photo5Url.
  • dataQuality currently contains hasWebsite, hasPhone, hasEmail, hasSocialProfiles, hasCoordinates, hasOpeningHours, and contactCompletenessScore.

Modes

  • FULL: search Google Maps and enrich results. If direct seeds are also provided, it processes those too.
  • SEARCH: search places by keyword and optional location.
  • DETAIL: scrape direct Google Maps URLs, Place IDs, CIDs or data IDs.
  • REVIEWS: scrape direct places and emit one dataset item per review.
  • CONTACTS: enrich direct places with website contacts.

Direct seeds can be passed as startUrls, placeIds, featureIds, or via datasetId. Input datasets can contain googleMapsUrl, url, sourceUrl, placeUrl, placeId, cid, dataId, or featureId.

Apify Quality-Test Prefill

Apify quality-test runs the actor with the prefilled input schema. The current prefill is intentionally small and cheap while still testing search, details, contacts, phones, emails and photos:

{
"mode": "FULL",
"searchStringsArray": ["coffee shops"],
"locationQuery": "New York, NY",
"maxCrawledPlacesPerSearch": 1,
"scrapePlaceDetailPage": true,
"scrapeContacts": true,
"maxContactPages": 1,
"scrapeReviews": false,
"maxReviews": 0,
"outputMode": "PLACE_ITEMS",
"maxImages": 5,
"language": "en",
"countryCode": "US",
"maxConcurrency": 2,
"maxRetries": 3,
"maxProxyRetries": 3,
"proxy": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"],
"apifyProxyCountry": "US"
},
"rawOutput": false
}

Scaled Search Example

{
"mode": "FULL",
"searchStringsArray": ["dentists", "orthodontists"],
"locationQuery": "Austin, TX",
"maxCrawledPlacesPerSearch": 100,
"scrapePlaceDetailPage": true,
"scrapeContacts": true,
"maxContactPages": 5,
"scrapeReviews": false,
"maxImages": 20,
"maxConcurrency": 10,
"proxy": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"],
"apifyProxyCountry": "US"
}
}

Reviews

Set scrapeReviews: true and maxReviews above 0. For review-only exports, use REVIEWS mode:

{
"mode": "REVIEWS",
"placeIds": ["ChIJvSQIgqFZwokRFYQbJdzceSs"],
"maxReviews": 100,
"reviewsSort": "newest",
"outputMode": "REVIEW_ITEMS"
}

Review items include fields such as placeTitle, placeId, dataId, reviewId, authorName, authorPhotoUrl, reviewerId, rating, publishedAt, text, likesCount, owner response fields and review images when Google returns them.

Google can return an empty review payload for some sessions/IPs while still returning place data. The actor treats this as a soft failure, emits the place when using place output, and records warnings rather than failing the run.

Filters And Controls

  • categoryFilterWords: keep only places whose categories contain one of the provided words.
  • placeMinimumStars: skip places below a minimum rating when rating is available.
  • website: allPlaces, withWebsite, or withoutWebsite.
  • skipClosedPlaces: skip permanently closed places when Google exposes that status.
  • rawOutput: include raw Google nested arrays for debugging.

Run Locally

pip install -r requirements.txt
apify run
# or
python -m src

Notes

  • Residential proxies are strongly recommended for scale.
  • Contact extraction visits the business website homepage plus a small set of contact/about/team/legal pages, capped by maxContactPages.
  • Email extraction filters obvious placeholder domains and static asset filenames such as @2x.png.
  • Phone extraction removes common ZIP/year/partial-number false positives and deduplicates by normalized digits.
  • Search pagination uses Google Maps' internal map endpoint and advances by 20-result offsets.