Google Maps Scraper avatar

Google Maps Scraper

Pricing

from $3.20 / 1,000 place scrapeds

Go to Apify Store
Google Maps Scraper

Google Maps Scraper

Scrapes Google Maps places — business data, reviews, images, contacts. Pay-per-event pricing.

Pricing

from $3.20 / 1,000 place scrapeds

Rating

0.0

(0)

Developer

Ian Emmanuel

Ian Emmanuel

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Extract business data, reviews, contacts, and images from Google Maps — with pay-per-event pricing and support for 20 languages.


What This Actor Does

The Google Maps Scraper searches Google Maps for businesses, landmarks, and services in any location worldwide. It returns structured place records and supports optional add-ons for reviews, images, contact details, and enriched business data. Results are returned in your chosen language — independent of the scraping location or proxy IP.


Output Fields

Each place record includes the following fields:

FieldDescription
titleBusiness name
addressFull formatted address
phonePhone number (E.164 formatted)
websiteWebsite URL (tracking params stripped)
categoryGoogle Maps category label
totalScoreStar rating (1.0 – 5.0)
reviewsCountTotal number of reviews
lat / lngGPS coordinates (7 decimal places)
openingHoursOpening hours by day
priceBracketPrice level ($ to $$$$)
placeIdUnique Google Maps Place ID
isExternalServicePlacetrue for booking-provider injected results
reviews[]Array of review objects (when enabled)
images[]Array of image objects (when enabled)
emails[]Extracted email addresses (when enabled)
socialUrls[]Social media profile URLs (when enabled)
scrapedAtISO 8601 timestamp of extraction

Pricing

This actor uses a pay-per-event model. You are charged only for events that actually fire during your run — no subscriptions, no idle fees, no minimum commitments.

EventRateBilling UnitWhen It Fires
Actor start$0.0056Per runEvery run — infrastructure flat fee
Place scraped$0.0032Per placeEvery successfully returned place
Filter applied$0.0008Per filter × placeWhen any filter is active (category, rating, website, keyword)
Additional place details$0.0016Per placeWhen enriched details are enabled
Contact details scraped$0.0016Per place w/ websiteOnly places with a website
Review scraped$0.0004Per reviewEach individual review extracted
Image scraped$0.0004Per imageEach image including metadata

Worked Examples

Job TypeConfigurationFormulaCost
Plain directory3,500 places, no add-ons3,500 × $0.0032 + $0.0056$11.21
Filtered search1,200 places, 3 filters1,200 × $0.0032 + 1,200 × 3 × $0.0008 + $0.0056$6.73
Contact leads2,000 places, 1,400 with websites2,000 × $0.0032 + 1,400 × $0.0016 + $0.0056$8.65
Review extraction500 places, 60 reviews/place cap500 × $0.0032 + 30,000 × $0.0004 + $0.0056$13.61
Full enrichment400 places, 2 filters, 350 websites, 25 reviews, 8 images400×$0.0032 + 800×$0.0008 + 400×$0.0016 + 350×$0.0016 + 10,000×$0.0004 + 3,200×$0.0004 + $0.0056$8.41
Direct ID lookup5,000 Place IDs5,000 × $0.0032 + 5,000 × $0.0016 + $0.0056$24.01

💡 Multiple categories under the category filter = 1 filter event — no extra charge for category breadth.
💡 Direct Place ID/URL input always triggers Additional place details ($0.0016/place) — minimum base rate is $0.0048/place.
⚠️ Set reviewsPerPlaceLimit and imagesPerPlaceLimit before every run — these are the highest-scaling line items.


Input Fields

FieldTypeDefault / RequiredDescription
searchTermsarrayRequired (or directPlaceIds)Keywords to search Google Maps (e.g. "restaurant", "pharmacy"). Each term triggers a full map-scroll pass.
directPlaceIdsarrayOptionalList of Place IDs or Google Maps URLs. Skips the search step and extracts specific places directly.

Location

FieldTypeDefault / RequiredDescription
locationstringRecommendedCity, region, or country name. Resolved via OpenStreetMap.
countrystringOptionalISO 3166-1 alpha-2 country code (e.g. "KE", "NG", "ZA").
statestringOptionalState or province name.
citystringOptionalCity name.
postalCodestringOptionalPostal or ZIP code.
customGeolocationobjectOptionalGeoJSON Polygon, MultiPolygon, or Point with radiusKm. Subdivides the area into tiles and bypasses the 120-place limit.

Run Control

FieldTypeDefaultDescription
maxCrawledPlacesinteger100Hard cap on total places returned. Set before every run to control cost.
languagestringEnglishResult language — 20 supported including Mandarin Chinese, Arabic, Hindi, and Swahili.

Filters

FieldTypeDefaultDescription
categoriesarrayOptionalOnly keep places matching these category labels.
minimumStarRatingnumberOptionalExclude places below this rating (1.0 – 5.0).
requiresWebsitebooleanfalseOnly return places with a website URL. Recommended when contact scraping is enabled.
titleKeywordstringOptionalOnly return places whose name contains this string (case-insensitive).

Add-ons

FieldTypeDefaultDescription
scrapeAdditionalDetailsbooleanfalseExtract enriched fields: reservations, web results, Q&A, menu URLs, booking links.
scrapeContactsbooleanfalseVisit each business website to extract emails and social media URLs. Charged $0.0016/place with a website.
enrichSocialMediabooleanfalseCategorise discovered social URLs by platform. Requires scrapeContacts.
scrapeBusinessLeadsbooleanfalsePull LinkedIn profiles for key personnel. Part of Additional place details — $0.0016/place.

Reviews

FieldTypeDefaultDescription
scrapeReviewsbooleanfalseExtract individual reviews per place.
reviewsPerPlaceLimitinteger50Cap on reviews per place. Set conservatively — 200 reviews × 5,000 places = $400 in review charges alone.
scrapeReviewerDatabooleanfalseInclude reviewer name, ID, photo, isLocalGuide flag. Separate toggle — enabling reviews does not automatically enable this.

Images

FieldTypeDefaultDescription
scrapeImagesbooleanfalseExtract gallery images and metadata per place.
imagesPerPlaceLimitinteger10Cap on images per place. 50 images × 10,000 places = $200 in image charges alone.

Other

FieldTypeDefaultDescription
estimatedPlacesintegerOptionalEnter your expected place count to log a pre-run cost estimate before scraping begins.
proxyConfigurationobjectOptionalApify proxy settings. Residential proxy recommended for production runs.
debugModebooleanfalseEnable verbose logging — XHR hits, selector misses, filter rejection reasons.

Important Notes

⚠️ 120-place limit without geolocation

Without a location, country, city, or customGeolocation, Google Maps renders a single screen and returns at most ~120 results. Provide any geolocation field to get full coverage. The customGeolocation field (GeoJSON polygon) subdivides the area into tiles and bypasses this limit entirely.

⚠️ GeoJSON coordinate order

GeoJSON (RFC 7946) uses [longitude, latitude] order — the opposite of Google Maps display order. Pasting coordinates from Google Maps directly will scrape the wrong area with no error. Use geojson.io to build and visually verify your polygon before running.

⚠️ Direct Place ID billing

Inputting Place IDs or Google Maps URLs directly skips the search step and goes straight to detail extraction. This automatically triggers the Additional place details add-on ($0.0016/place) on every place — the minimum base rate for direct-ID runs is $0.0048/place.

⚠️ Social enrichment dependency

enrichSocialMedia requires scrapeContacts to also be enabled. Without contact scraping, there are no discovered social URLs to enrich and the feature produces no output.

⚠️ Overlapping search terms

Each search term triggers a full independent map-scroll pass. Near-duplicate terms like "restaurant" and "restaurants" re-scrape the same places, inflating run time and cost. Use distinct, non-overlapping terms only, and use category filters to narrow results instead.

ℹ️ External service places

Hotel and accommodation searches may include places sourced from booking providers. These are flagged with isExternalServicePlace: true and may have incomplete fields (phone, address, and hours may be null). Filter them post-run using this field.

ℹ️ Review data and privacy

Reviewer personal data (name, ID, photo, isLocalGuide) is disabled by default for privacy compliance. Only enable scrapeReviewerData when you have a documented lawful basis.

ℹ️ 5,000-review dataset limit

Places with more than 5,000 reviews are split into multiple dataset items sharing the same place fields. Use the Reviews export view (append &view=reviews to the dataset API URL) to get one flat row per review.


Getting Started Example

The following example runs a full-enrichment scrape of cafes in Nairobi with all major add-ons enabled. It is designed to test every billing event type with a minimal place count to keep cost predictable.

{
"searchTerms": ["cafe"],
"location": "Nairobi, Kenya",
"country": "KE",
"city": "Nairobi",
"maxCrawledPlaces": 5,
"language": "English",
"categories": ["Cafe", "Coffee shop", "Espresso bar", "Bakery"],
"minimumStarRating": 1.0,
"requiresWebsite": false,
"scrapeAdditionalDetails": true,
"scrapeContacts": true,
"enrichSocialMedia": true,
"scrapeReviews": true,
"reviewsPerPlaceLimit": 3,
"scrapeReviewerData": true,
"scrapeImages": true,
"imagesPerPlaceLimit": 3,
"estimatedPlaces": 5,
"debugMode": false
}

Expected cost: ~$0.08 – $0.12 depending on how many places have websites.

Each place record will include:

Field GroupFields
Coretitle, address, phone, website, category, totalScore, reviewsCount, lat, lng, openingHours, priceBracket, placeId, scrapedAt
Additional detailsreservationUrl, orderUrl, menuUrl, qaItems[], webResults[]
Contactsemails[], socialUrls[], socialProfiles{}, phonesFromSite[]
ReviewsreviewId, text, stars, publishedDate, ownerResponse, reviewerName, reviewerUrl, isLocalGuide*
Imagesurl, authorName, uploadDate

*Only included when scrapeReviewerData is enabled.


Built with Node.js 18+ · Crawlee · Playwright · Apify SDK