Google Maps Scraper - Every Place, Not Just the Top 250 avatar

Google Maps Scraper - Every Place, Not Just the Top 250

Pricing

from $4.29 / 1,000 places

Go to Apify Store
Google Maps Scraper - Every Place, Not Just the Top 250

Google Maps Scraper - Every Place, Not Just the Top 250

Extract every place from Google Maps with 40+ fields: ratings, phone, website, opening hours, popular times, amenities, photos, reviews. Full coverage past Google's 250-per-view cap, hundreds of places per minute. $4.99 per 1,000 places.

Pricing

from $4.29 / 1,000 places

Rating

5.0

(1)

Developer

Zen Studio

Zen Studio

Maintained by Community

Actor stats

0

Bookmarked

27

Total users

3

Monthly active users

20 hours ago

Last modified

Share

Google Maps Scraper | Contacts, Reviews, Photos & Popular Times (2026)

Google Maps Scraper

40+ fields on every place — not just the top 250 Google shows you — full address, phone, opening hours, hour-by-hour popular times, amenities, reservation links, photos, and reviews, at hundreds of places per minute. The richest Google Maps output on Apify.
Place and review tools
Google Maps  Google Maps
➤ You are here
Place Aggregator  Place Aggregator
5 platforms, one export
Google Reviews  Google Reviews
Reviews from Google only
Directions  Directions
Routes, ETA and steps

Use a Google Maps place link from your results in Place Review Aggregator to compare reviews for that location across Google Maps, Yelp and Tripadvisor, with optional Facebook recommendations and Swarm tips.

Key Features

  • 40+ fields per place — every result is auto-enriched with the full detail page. No toggles, no opt-ins.
  • Goes past the 250-per-view ceiling — get every restaurant in Manhattan, not just the top 200 you'd see in the Maps UI.
  • Fast at scale — hundreds of places per minute; a dense 1,500-place city finishes in minutes.
  • Hour-by-hour popular times — 7 days × 24 hours of busyness data per place. Few scrapers capture this.
  • Free tier — 10 lifetime runs with up to 10 dataset records per run. No credit card required.

Copy to your AI assistant

zen-studio/google-maps-scraper on Apify. Google Maps search with 40+ fields per place including hour-by-hour popular times, amenities, and reservation links. Call ApifyClient("TOKEN").actor("zen-studio/google-maps-scraper").call(run_input={...}), then client.dataset(run["defaultDatasetId"]).list_items().items. Provide searchStringsArray+locationQuery, OR startUrls, OR placeIds. Full spec: GET https://api.apify.com/v2/acts/zen-studio~google-maps-scraper/builds/default (Bearer TOKEN) → inputSchema, actorDefinition.storages.dataset, readme. Token: https://console.apify.com/account/integrations

How to Scrape Google Maps Data

Basic — search a city

{
"searchStringsArray": ["restaurants"],
"locationQuery": "Astoria, NY",
"maxCrawledPlacesPerSearch": 50
}

Every place in a dense city — go past the 250-per-view ceiling

{
"searchStringsArray": ["restaurants"],
"locationQuery": "Manhattan, NY",
"maxCrawledPlacesPerSearch": 1500
}

Scrape specific places by URL or ID — no search needed

{
"placeIds": ["ChIJlxDiXJxZwokRp4HHbeYqXXU"],
"startUrls": [
{"url": "https://www.google.com/maps/place/Veselka/..."}
],
"maxReviews": 20,
"maxImages": 10
}

Stream a large review history

{
"placeIds": ["ChIJlxDiXJxZwokRp4HHbeYqXXU"],
"outputMode": "reviews",
"maxReviews": 5000,
"reviewsSort": "newest",
"reviewsOrigin": "google"
}

outputMode: "reviews" emits one dataset row per review and includes placeId, placeName, googleMapsUrl, address, coordinates, place rating, and review count on every row. Rows are delivered progressively in bounded batches, so large histories do not build one huge nested object in memory. The actor stops at the requested positive limit or when the source is exhausted. maxReviews: 0 still means no reviews.

The default outputMode: "places" preserves the existing one-row-per-place contract. It supports up to 1,000 nested reviews per place; use review-row output above for anything larger.

Bulk lead-gen — trim heavy fields to keep your export small

{
"searchStringsArray": ["dentist"],
"locationQuery": "Chicago, IL",
"maxCrawledPlacesPerSearch": 500,
"websiteFilter": "with_website",
"excludeFields": [
"popularTimes",
"amenities",
"relatedPlaces",
"reviewTeasers"
]
}

What Data Can You Extract from Google Maps?

Every place includes:

  • Identity — name, place ID, hex ID, feature ID, Google Maps URL, verified owner
  • Address — full address, street, locality, country, Plus Code (compound + global)
  • Geo — latitude, longitude, neighborhood, city label, country code, timezone, region hierarchy (continent → district)
  • Contact — phone, website, menu URL
  • Categories — human-readable list, primary category, machine-readable GCID slugs, entity type
  • Ratings & price — rating, reviews count, price range, price label
  • Hours & status — full opening hours (Mon–Sun), the live status line ("Open ⋅ Closes 10 PM"), extra schedules per department (delivery, happy hour, emergency room), hour-by-hour popular times (busyness 0–100, wait labels), permanently-closed flag
  • Menu & services — the menu as sections of priced items, popular dishes with review-mention and photo counts, the services list of trades and stations
  • Rich content — description, meta description, typical visit length, amenities (14 sections)
  • Photos — hero photo with native size + total photo count, photo tab catalog (All / Latest / Menu / Vibe / dish tabs), Street View thumbnail
  • Reviews — featured snippets, review keyword pills with sentiment counts, optional full reviews (review ID, rating, date, text, language, source, photos, author)
  • Discovery — "people also search for" related places, immersive 360° media, walking-time travel markers (15 / 30 min landmarks)
  • Reservations — booking links, partner provider blocks (Resy, OpenTable, etc.)
  • Photos / videos (optional add-on) — photo URL, photo ID, width, height, upload date, source, tab tags; video MP4 + HLS + DASH streams
  • Vertical-specific — hotel editorial + amenities + check-in policies + one priced offer per booking partner; fuel prices for gas stations; directory of sub-tenants for malls / plazas

Output Example

One row per place, taken from a live run. Fields that only apply to certain place types are null elsewhere: menu and popularDishes on food places, services on trades and stations, departments where a place keeps more than one schedule, hotelOffers, hotelAmenities, hotelDescription, hotelEditorial and hotelInfo on hotels, fuelPrices on gas stations, directoryPlaces and anchorPlaces on malls and landmarks. Long arrays are shortened here with a ... +N more marker; the run carries every item.

{
"name": "Veselka",
"placeId": "ChIJlxDiXJxZwokRp4HHbeYqXXU",
"hexId": "0x89c2599c5ce21097:0x755d2ae66dc781a7",
"latitude": 40.729015499999996,
"longitude": -73.9871139,
"localName": null,
"address": "Veselka, 144 2nd Ave, New York, NY 10003",
"addressFormatted": "144 2nd Ave, New York, NY 10003",
"addressComponents": {
"street": "144 2nd Ave",
"locality": "New York, NY 10003",
"country": null
},
"ftid": "/m/080lxnb",
"rating": 4.6,
"reviewsCount": 7922,
"priceRange": "$20–30",
"priceLabel": "$20 to $30",
"plusCode": {
"compound": "P2H7+J5 New York",
"global": "87G8P2H7+J5"
},
"phone": "(212) 228-9682",
"website": "https://www.veselka.com/",
"menuUrl": "https://veselka.com/blogs/menu-list/main-location-specials",
"categories": [
"Ukrainian restaurant",
"Breakfast restaurant",
"Diner",
"... +6 more"
],
"primaryCategory": {
"id": 8,
"slug": "restaurants"
},
"categoryGcids": [
{
"gcid": "ukrainian_restaurant",
"label": "Ukrainian"
},
{
"gcid": "breakfast_restaurant",
"label": "Breakfast"
},
{
"gcid": "diner",
"label": null
},
"... +6 more"
],
"entityType": "restaurant",
"shortDescription": "Neighborhood diner serving Ukrainian food",
"neighborhood": "Manhattan",
"cityLabel": "New York, NY",
"countryCode": "US",
"timezone": "America/New_York",
"description": "Borscht and pierogi are menu highlights at this lively Ukrainian eatery with a rustic vibe and murals on the walls. ...",
"metaDescription": "EST. 1954\nFor seventy years, customers have crowded into Veselka, a cozy Ukrainian coffee shop in New York City's Eas...",
"popularSpendTime": "People typically spend 45 min to 2 hr here",
"amenities": {
"Service options": [
"Outdoor seating",
"Delivery",
"Onsite services",
"Takeout",
"Dine-in"
],
"Highlights": [
"Fast service",
"Great coffee",
"Great dessert",
"Serves local specialty"
],
"Popular for": [
"Breakfast",
"Lunch",
"Dinner",
"Solo dining"
],
"Accessibility": [
"Wheelchair accessible entrance",
"Wheelchair accessible restroom",
"Wheelchair accessible seating",
"Wheelchair accessible parking lot"
],
"Offerings": [
"Alcohol",
"Beer",
"Cocktails",
"Coffee",
"Comfort food",
"Healthy options",
"Late-night food",
"Quick bite",
"Small plates",
"Vegetarian options",
"Wine"
],
"Dining options": [
"Breakfast",
"Brunch",
"Lunch",
"Dinner",
"Catering",
"Counter service",
"Dessert",
"Seating",
"Table service"
],
"Amenities": [
"Bar onsite",
"Restroom",
"Wi-Fi",
"Wi-Fi"
],
"Atmosphere": [
"Casual",
"Cozy",
"Historic",
"Trendy"
],
"Crowd": [
"College students",
"Groups",
"Tourists"
],
"Planning": [
"Accepts reservations",
"Usually a wait"
],
"Payments": [
"Credit cards",
"Debit cards",
"NFC mobile payments",
"Credit cards"
],
"Children": [
"Good for kids",
"Has changing table(s)",
"High chairs",
"Kids' menu"
],
"Parking": [
"Paid parking garage",
"Paid street parking",
"Parking"
],
"Pets": [
"Dogs allowed"
]
},
"openingHours": {
"Wednesday": "9 AM–12 AM",
"Thursday": "9 AM–12 AM",
"Friday": "9 AM–12 AM",
"Saturday": "Open 24 hours",
"Sunday": "12 AM–11 PM",
"Monday": "9 AM–12 AM",
"Tuesday": "9 AM–12 AM"
},
"openStatus": "Closed · Opens 9 AM",
"departments": [
{
"name": "Brunch",
"openingHours": {
"Wednesday": "Closed",
"Thursday": "Closed",
"Friday": "Closed",
"Saturday": "8 AM–4 PM",
"Sunday": "8 AM–4 PM",
"Monday": "Closed",
"Tuesday": "Closed"
}
}
],
"menu": [
{
"name": "Seasonal Beverages",
"items": [
{
"name": "Raspberry Lemonade",
"price": "$5.00"
},
{
"name": "Honey Mint Ginger Iced Tea",
"price": "$5.00"
},
{
"name": "Rose Wine",
"price": "$9.00"
},
"... +1 more"
]
},
{
"name": "Seasonal Desserts",
"items": [
{
"name": "Ben & Jerry's Ice Cream",
"price": "$4.00"
},
{
"name": "Blueberry Pierogi Dessert Bowl",
"price": "$10.00"
}
]
},
{
"name": "Featured Specials of the Week",
"items": [
{
"name": "Classic Ukrainian Veselka Pierogi Bowl: 65th Anniversary",
"price": "$14.00"
},
{
"name": "Classic Ukrainian Veselka Pierogi Bowl: Vegetarian",
"price": "$12.00"
},
{
"name": "Homemade Salmon Burger",
"price": "$18.00"
},
"... +4 more"
]
}
],
"services": null,
"popularDishes": [
{
"name": "Coffee",
"id": "/g/11fk6z20gz",
"reviewMentions": 76,
"photoCount": 31,
"photos": [
"https://lh3.googleusercontent.com/gps-cs-s/AHRPTWnJLp3cukO902c6y6pMQsS5mltPo3kPR1aG6HyG0yA2BIrqTxgsUBSmvmFqoOIYKkmuiL..."
]
},
{
"name": "Beef Stroganoff",
"id": "/g/11z8hs_rff",
"reviewMentions": 71,
"photoCount": 15,
"photos": [
"https://lh3.googleusercontent.com/gps-cs-s/AHRPTWlIwqJiHfnyq1XYgHjxyE5DbR_z-3Rkbz_JEG0HpnPkPa15-9-OQbXy_VhXzCd639jGat..."
]
},
{
"name": "Ola's Famous Veal Goulash",
"id": "/g/11z1s2pqy3",
"reviewMentions": 0,
"photoCount": 78,
"photos": [
"https://lh3.googleusercontent.com/gps-cs-s/AHRPTWnda7PLBvUXWb3S1fzGbrzbScO46qW5_bJpdWVTV8KUVsWeEqlXQZBEOmGCUDP1z9c1Ze..."
]
},
"... +10 more"
],
"hotelOffers": null,
"popularTimes": [
{
"day": "Monday",
"hours": [
{
"hour": 6,
"busyness": 0,
"label": "",
"waitLabel": null,
"hourLabel": "6 AM"
},
{
"hour": 7,
"busyness": 0,
"label": "",
"waitLabel": null,
"hourLabel": "7 AM"
},
{
"hour": 8,
"busyness": 0,
"label": "",
"waitLabel": null,
"hourLabel": "8 AM"
},
"... +15 hours"
]
},
{
"day": "Tuesday",
"hours": [
{
"hour": 6,
"busyness": 0,
"label": "",
"waitLabel": null,
"hourLabel": "6 AM"
},
{
"hour": 7,
"busyness": 0,
"label": "",
"waitLabel": null,
"hourLabel": "7 AM"
},
{
"hour": 8,
"busyness": 0,
"label": "",
"waitLabel": null,
"hourLabel": "8 AM"
},
"... +15 hours"
]
},
{
"day": "Wednesday",
"hours": [
{
"hour": 6,
"busyness": 0,
"label": "",
"waitLabel": null,
"hourLabel": "6 AM"
},
{
"hour": 7,
"busyness": 0,
"label": "",
"waitLabel": null,
"hourLabel": "7 AM"
},
{
"hour": 8,
"busyness": 0,
"label": "",
"waitLabel": null,
"hourLabel": "8 AM"
},
"... +15 hours"
]
},
"... +4 days"
],
"ratingHistogram": null,
"reviewPills": [
{
"label": "pierogis",
"topicId": "AA1Y4fAHawc",
"count": 1117,
"secondaryCount": 422,
"positiveCount": 759,
"neutralCount": 49,
"negativeCount": 14,
"fusedTopicId": "ZnVzZWRfdG9waWNfaWQ6QUExWTRmQUhhd2M="
},
{
"label": "blintzes",
"topicId": "QXuIQGwzVyM",
"count": 107,
"secondaryCount": 239,
"positiveCount": 77,
"neutralCount": 3,
"negativeCount": 2,
"fusedTopicId": "ZnVzZWRfdG9waWNfaWQ6UVh1SVFHd3pWeU0="
},
{
"label": "outdoor seating",
"topicId": "AEmHqxr-_tg",
"count": 52,
"secondaryCount": 43,
"positiveCount": 38,
"neutralCount": 6,
"negativeCount": 8,
"fusedTopicId": "ZnVzZWRfdG9waWNfaWQ6QUVtSHF4ci1fdGc="
},
"... +7 more"
],
"verifiedOwner": {
"name": "Veselka (Owner)",
"ownerId": "101183567786896189438"
},
"regionHierarchy": [
{
"name": "Americas",
"weight": 0.75
},
{
"name": "Lower Manhattan",
"weight": 1
},
{
"name": "Manhattan",
"weight": 0.99
},
"... +11 more"
],
"heroPhoto": {
"url": "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWmvCVX1bUt4da3pNv-jpw_D9_x_q_R4SDvXY7c3fD5ppPRqJNy6_Onvo7Ic4VquQEEJD7...",
"photoId": "CIHM0ogKEICAgICEhd6u3AE",
"nativeWidth": 5472,
"nativeHeight": 2736,
"caption": null,
"photoCount": 7283
},
"photoTabs": [
{
"name": "All",
"previewPhotoCount": 1,
"previewPhotos": [
"https://lh3.googleusercontent.com/gps-cs-s/AHRPTWlfwsvaHHhUlWRndTsNjNZZ6yZwv2xm9vEpf1OoR6SU5woOb_OsHuF8O5WOTNcr_K_Bs8..."
]
},
{
"name": "Latest",
"previewPhotoCount": 1,
"previewPhotos": [
"https://lh3.googleusercontent.com/gps-cs-s/AHRPTWmxwK-g6S_hi5xl9zIKwP-I0GzmbEElDvPHPdJF1LMzHbVvnnhIp7nOi3qYYh0uxbYxm0..."
]
},
{
"name": "Videos",
"previewPhotoCount": 1,
"previewPhotos": [
"https://lh3.googleusercontent.com/gps-cs-s/AHRPTWkjdfFNtULt54GQc-euPBI1c4LH96Xt8TogGnLkQ6S6kdtbTPqewGG7n3vQAu3LtFpafC..."
]
},
"... +13 more"
],
"travelTimeMarkers": [
{
"durationSeconds": 900,
"label": "15 min",
"latitude": 40.729131599999995,
"longitude": -73.98729519999999
},
{
"durationSeconds": 1800,
"label": "30 min",
"latitude": 40.729131599999995,
"longitude": -73.98729519999999
},
{
"durationSeconds": 900,
"label": "15 min",
"latitude": 40.729131599999995,
"longitude": -73.98729519999999
},
"... +6 more"
],
"reviewTeasers": [
{
"text": "Beers, wines, specialty drinks, and soft drinks, coffee, tea, etc. served.",
"authorProfile": "https://www.google.com/maps/contrib/105081235751380118019?hl=en-US",
"authorPhoto": "https://lh3.googleusercontent.com/a/ACg8ocKLqB-KcWYIpvD34HdpFELRShkAQbN2fBgwAXe5KxVh3_sADw4=s40-k-cc-rp-mo",
"rating": 2,
"reviewId": null
},
{
"text": "Great place for early morning breakfast and people watching.",
"authorProfile": "https://www.google.com/maps/contrib/112218215948416192664?hl=en-US",
"authorPhoto": "https://lh3.googleusercontent.com/a-/ALV-UjWd8PZZ19WFZk8rJHzQ4VwpqwjTBe2Ib8N09h963d4wUPxs88Nihg=s40-k-cc-rp-mo",
"rating": 2,
"reviewId": null
}
],
"bookingLinks": [
"https://resy.com/cities/new-york-ny/venues/veselka-east-village?rwg_token=AE37R_jNS4ADM4jzRLpXhUgI3_JjoIIC4J4jIJSj-cp..."
],
"bookingPartners": [
{
"type": "Reserve a table",
"provider": "Resy",
"providerDomain": "resy.com",
"providerLogo": "https://lh3.googleusercontent.com/yxi7m1BMVsqDfDtvz4YCZTFs4roT3nGw6JswN8bD5gNOYxEgEt9f68nq2GbrihK0",
"url": "https://resy.com/cities/new-york-ny/venues/veselka-east-village?rwg_token=AE37R_jNS4ADM4jzRLpXhUgI3_JjoIIC4J4jIJSj-cp..."
},
{
"type": "Order online",
"provider": null,
"providerDomain": null,
"providerLogo": null,
"url": "https://www.google.com/searchviewer/42?cvd=CLw_EiQKIuICHzIdEhYiFNLX29IPDgoKL20vMDgwbHhuYhgAOgMI8A0%3D&g2lbs=AEzIGDuWg..."
}
],
"immersiveView": [
{
"url": "https://lh3.googleusercontent.com/iv/AL0AxSVrNXhChUMm3bsktfK9862wvM0cY7ruWDvTG0RjrwF0Ha8xqbtUPZmLGArI4eCYcJghGV36ZTGH...",
"type": "immersive_view"
}
],
"fuelPrices": null,
"editorial": null,
"anchorPlaces": null,
"directoryPlaces": null,
"hotelAmenities": null,
"hotelDescription": null,
"hotelEditorial": null,
"hotelInfo": null,
"nearbyCategories": null,
"relatedPlaces": [
{
"name": "Ukrainian East Village Restaurant",
"hexId": "0x0:0x368f0888d6eac978",
"rating": 4.3,
"reviewsCount": 889,
"latitude": 40.728891499999996,
"longitude": -73.9870955,
"categories": [
"Ukrainian",
"Family-friendly"
]
},
{
"name": "Streecha",
"hexId": "0x0:0x2c81041ca4925043",
"rating": 4.7,
"reviewsCount": 699,
"latitude": 40.728475599999996,
"longitude": -73.9889486,
"categories": [
"Ukrainian",
"Restaurant"
]
},
{
"name": "Little Poland",
"hexId": "0x0:0x629c88aa869a5aa",
"rating": 4.4,
"reviewsCount": 1221,
"latitude": 40.731151200000006,
"longitude": -73.9854506,
"categories": [
"Polish",
"Eastern European",
"European"
]
},
"... +2 more"
],
"streetViewThumb": "https://lh3.googleusercontent.com/-560plyIzZdo/AAAAAAAAAAI/AAAAAAAAAAA/cv5jxU4uOxA/s44-p-k-no-ns-nd/photo.jpg",
"googleMapsUrl": "https://www.google.com/maps/place/?q=place_id:ChIJlxDiXJxZwokRp4HHbeYqXXU",
"businessStatus": null,
"permanentlyClosed": false,
"reviews": [
{
"reviewId": "Ci9DQUlRQUNvZENodHljRjlvT2tOWVFYZG9NamcyTldwUE4yRnlkbVk1TFhWTFZrRRAB",
"rating": 5,
"ratingScale": 5,
"date": "a day ago",
"publishedAtMicros": 1788823286187228,
"editedAtMicros": null,
"isEdited": false,
"text": null,
"textTranslated": null,
"language": null,
"translatedLanguage": null,
"likes": 0,
"source": "Google",
"sourceIcon": "https://www.gstatic.com/images/branding/product/1x/googleg_48dp.png",
"ownerResponse": null,
"attributes": [
{
"key": "GUIDED_DINING_MEAL_TYPE",
"label": "Meal type",
"question": "What did you get?",
"rating": null,
"values": [
"Dinner"
]
},
{
"key": "GUIDED_DINING_PRICE_RANGE",
"label": "Price per person",
"question": "How much did you spend per person?",
"rating": null,
"values": [
"$20–30"
]
},
{
"key": "GUIDED_DINING_FOOD_ASPECT",
"label": "Food",
"question": "Food",
"rating": 5,
"values": null
},
"... +3 more"
],
"media": null,
"photos": null,
"author": "Oyku Akcin",
"authorPhoto": "https://lh3.googleusercontent.com/a-/ALV-UjXMg365gjU3Ft-lyxcXuDTEG5c2gr8pvBXOmePW5jPSmR5bx-72=s120-c-rp-mo-ba12-br100",
"authorProfile": "https://www.google.com/maps/contrib/106806605107580398553/reviews?hl=en",
"authorId": "106806605107580398553",
"authorReviewCount": 13,
"authorPhotoCount": 15,
"isLocalGuide": true,
"localGuideLevel": 4,
"reviewUrl": "https://www.google.com/maps/reviews/data=!4m8!14m7!1m6!2m5!1sCi9DQUlRQUNvZENodHljRjlvT2tOWVFYZG9NamcyTldwUE4yRnlkbVk1..."
},
{
"reviewId": "Ci9DQUlRQUNvZENodHljRjlvT2xWeE1tOUVURE5XU0ZoSlVUVlZZemwxYVcxclQzYxAB",
"rating": 5,
"ratingScale": 5,
"date": "a day ago",
"publishedAtMicros": 1788818486311395,
"editedAtMicros": null,
"isEdited": false,
"text": "When I was a kid I could not stand halopkas so at the age of 68 I thought I'd give it another try. This is a good pla...",
"textTranslated": null,
"language": "en",
"translatedLanguage": null,
"likes": 0,
"source": "Google",
"sourceIcon": "https://www.gstatic.com/images/branding/product/1x/googleg_48dp.png",
"ownerResponse": null,
"attributes": [
{
"key": "GUIDED_DINING_MEAL_TYPE",
"label": "Meal type",
"question": "What did you get?",
"rating": null,
"values": [
"Dinner"
]
},
{
"key": "GUIDED_DINING_PRICE_RANGE",
"label": "Price per person",
"question": "How much did you spend per person?",
"rating": null,
"values": [
"$20–30"
]
},
{
"key": "GUIDED_DINING_FOOD_ASPECT",
"label": "Food",
"question": "Food",
"rating": 5,
"values": null
},
"... +4 more"
],
"media": null,
"photos": null,
"author": "jon winston",
"authorPhoto": "https://lh3.googleusercontent.com/a-/ALV-UjU5x0JSIIo8XsoeFKDjdT_yMoaovPQMW_wE7mR9kNGb_HLSI8bmZQ=s120-c-rp-mo-ba12-br100",
"authorProfile": "https://www.google.com/maps/contrib/114831321821228718510/reviews?hl=en",
"authorId": "114831321821228718510",
"authorReviewCount": 171,
"authorPhotoCount": 192,
"isLocalGuide": true,
"localGuideLevel": 7,
"reviewUrl": "https://www.google.com/maps/reviews/data=!4m8!14m7!1m6!2m5!1sCi9DQUlRQUNvZENodHljRjlvT2xWeE1tOUVURE5XU0ZoSlVUVlZZemwx..."
}
],
"images": [
{
"url": "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWmvCVX1bUt4da3pNv-jpw_D9_x_q_R4SDvXY7c3fD5ppPRqJNy6_Onvo7Ic4VquQEEJD7...",
"mediaType": "image",
"source": "embedded",
"tags": []
},
{
"url": "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWm5jfBskKHI9LIsoW7SY1BIWzFohLjiTAMN0O2ZJqEhKNM6dfAlYx8M_Fyg_P3LyfpPzt...",
"mediaType": "image",
"source": "embedded",
"tags": []
}
],
"videos": [
{
"url": "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWkql_Mh3QqkZQZ7nUUsai9RV1sLKxUfLS2Nk5S0oGeAQE3MUv9h96hbCKvroPiNKM9dtT...",
"photoId": "CIABIhBWhABsxJsW1AIA44shF2DV",
"mediaType": "video",
"width": 1080,
"height": 2400,
"uploadedAt": "2025-07-09",
"source": "gmm_android_review_post",
"tags": [
"All"
],
"videoUrls": {
"dash": "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWkql_Mh3QqkZQZ7nUUsai9RV1sLKxUfLS2Nk5S0oGeAQE3MUv9h96hbCKvroPiNKM9dtT...",
"hls": "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWkql_Mh3QqkZQZ7nUUsai9RV1sLKxUfLS2Nk5S0oGeAQE3MUv9h96hbCKvroPiNKM9dtT...",
"mp4_864p": "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWkql_Mh3QqkZQZ7nUUsai9RV1sLKxUfLS2Nk5S0oGeAQE3MUv9h96hbCKvroPiNKM9dtT..."
}
}
]
}

Advanced Usage

Search a structured area instead of free text

{
"searchStringsArray": ["bakeries"],
"city": "Brooklyn",
"state": "NY",
"postalCode": "",
"countryCode": "us"
}

Combine city + state for US/AU/IN/BR/MX/DE. Use postalCode + countryCode alone (never with city — they conflict in the geocoder).

Custom polygon — only this neighborhood

{
"searchStringsArray": ["pizza"],
"customGeolocation": {
"type": "Polygon",
"coordinates": [[
[-73.99, 40.72],
[-73.96, 40.72],
[-73.96, 40.74],
[-73.99, 40.74],
[-73.99, 40.72]
]]
}
}

Coordinate order is [longitude, latitude]. customGeolocation overrides every other location field.

Filtered hospitality dataset with reviews and photos

{
"searchStringsArray": ["hotel"],
"locationQuery": "Miami Beach, FL",
"maxCrawledPlacesPerSearch": 200,
"placeMinimumStars": "4.0",
"openNow": false,
"maxReviews": 30,
"reviewsSort": "newest",
"reviewsFilterString": "breakfast",
"maxImages": 20
}

reviewsFilterString scans until it has the requested number of matching reviews or the source is exhausted, then filters by substring (case-insensitive).

Narrow by category and price

{
"searchStringsArray": ["restaurants"],
"locationQuery": "New York, NY",
"categoryFilterWord": "chinese_restaurant",
"priceMin": 20,
"priceMax": 60
}

categoryFilterWord takes a Google category slug. Common ones: chinese_restaurant, coffee_shop, hotel, plumber, dentist. Full list of 4,400+ slugs: category reference. priceMin/priceMax set a per-person dining band in the country's local currency (restaurants only).

Multilingual run

{
"searchStringsArray": ["Café"],
"locationQuery": "Paris, France",
"language": "fr",
"countryCode": "fr",
"maxCrawledPlacesPerSearch": 100
}

language affects category labels and review text preferences. countryCode biases search results geographically.

Pricing — Pay Per Event (PPE)

$5.99 per 1,000 places (every place is auto-enriched with the full detail page — no separate enrichment fee). Subscription plans get a lower per-place rate.

EventPer callPer 1,000
Place scraped (40+ fields)$0.00599$5.99
Review scraped$0.00050$0.50
Photo / video scraped$0.00050$0.50

Free tier: 10 lifetime runs, up to 10 dataset records per run. No credit card required.

FAQ

How many places can I extract per run? Up to your maxCrawledPlacesPerSearch cap per search term. The actor reliably returns 1,500+ places in dense cities (validated on Manhattan restaurants); sparse areas return the natural supply ceiling.

How do you get past Google's 250-per-view ceiling? For dense queries (every restaurant in Manhattan, every dentist in LA), the actor sweeps the search area systematically and deduplicates by place ID. You always get unique places, never the same place twice.

Is the data fresh? Every run hits Google Maps directly. No cached snapshots. Opening hours, reviews, photos — all live at run time.

My search returned the wrong Starbucks. How do I target a specific one? Google has many places sharing a name. Use placeIds or a full Google Maps URL when you need a specific location. Free-text searches return whatever Google ranks first for that name + area.

Can I scrape reviews without scraping places first? Use placeIds or startUrls with outputMode: "reviews" and maxReviews > 0. The actor skips search and progressively emits one row per review. Keep the default place output only when you specifically need reviews nested inside each place row.

What languages and countries are supported? 15 display languages (English, German, French, Spanish, Italian, Portuguese, Dutch, Polish, Japanese, Chinese (Simplified/Traditional), Korean, Arabic, Turkish, Russian) and 249 ISO country codes for geo-biasing.

What's the free tier? 10 lifetime runs with up to 10 dataset records per run. No credit card required. Upgrade to a paid Apify plan to unlock full runs.

Can I run this on a schedule? Yes — Apify schedules let you run this actor hourly, daily, or on cron. Pipe results into your own database via webhooks or pull from the dataset API.

More Zen Studio & Clearpath scrapers for maps & local data

Support

  • Bugs: Issues tab
  • Features: Issues tab

Extracts publicly available data. Users must comply with Google Maps terms of service and data protection regulations (GDPR, CCPA).


The richest Google Maps scraper on Apify — every place auto-enriched with 40+ fields, hour-by-hour popular times, amenities, and reservation links, hundreds per minute. Goes past Google's 250-per-view ceiling.