Google Maps Places Scraper
Pricing
from $0.90 / 1,000 place scrapeds
Google Maps Places Scraper
Fast HTTP-only Google Maps scraper for local business leads. Extract names, phones, websites, addresses, ratings, reviews, opening hours, GPS coordinates, photos, and Place IDs. Export to JSON, CSV, or Excel, no Google API key required.
Pricing
from $0.90 / 1,000 place scrapeds
Rating
5.0
(1)
Developer
Milad Amirzadeh
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Extract structured Google Maps place data for lead generation, local SEO, market research, directories, and point-of-interest datasets—without a Google Maps API key.
Google Maps Places Scraper collects businesses, attractions, landmarks, public places, institutions, entertainment venues, and other Google Maps locations. Results can include names, categories, descriptions, phone numbers, websites, addresses, ratings, review counts, weekly opening hours, coordinates, images, highlighted reviews, Google Place IDs, and other place details.
Normal runs use an HTTP-based extraction pipeline instead of browser rendering. Avoiding browser startup supports faster processing and lower Compute Unit overhead, while normalized fields and two dataset views keep the output clean and ready for export, API access, schedules, and downstream systems.
Before your first run:
hasPhoneOnlydefaults totrue, andimageModedefaults toall. For general place or POI datasets, sethasPhoneOnlytofalse. For smaller contact-only runs, setimageModetononeorcover.
Quick start
This input collects ten Paris attractions, including places that do not publish a phone number:
{"searchQueries": ["Tourist attractions in Paris, France"],"maxPlacesPerQuery": 10,"language": "en","hasPhoneOnly": false,"hasWebsiteOnly": false,"minStarRating": 0,"hasLocationOnly": true,"skipClosed": false,"imageMode": "cover","extractReviews": false,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
- Open the Actor's Input tab.
- Add one or more keyword-and-location searches or Google Maps URLs.
- Choose the maximum number of accepted records per query.
- Adjust filters, images, reviews, and language.
- Keep Apify Proxy enabled; residential proxies are recommended.
- Click Start and open the default dataset when the run finishes.
What data can you extract?
Depending on what Google publishes for a place, each result can include:
- Place identity: name, category, description, Google Maps URL,
placeId, andfeatureId - Contact details: phone number and external website
- Reputation: star rating and total review count
- Location: formatted address, latitude, and longitude
- Availability: current business status, closed flag, and weekly opening hours
- Place attributes: amenities, offerings, accessibility, payments, parking, and other About data
- Images: no images, one cover image, or up to six preview images
- Reviews: up to ten highlighted reviews with author, rating, text, and relative time
- Search provenance: source query and organic search rank
Missing optional values are returned as null, {}, or []. The Actor does not fabricate unavailable data.
Why choose this Google Maps scraper?
- Efficient HTTP-based processing. Normal runs do not launch Chromium or Playwright, reducing browser overhead and helping control runtime and Compute Unit usage.
- Clean structured output. Normalized records are written to the default dataset, with Essential Results for a compact table and Places Overview for the complete field set.
- No Google Maps API key required. Run it directly on Apify without setting up Google Places API credentials or quotas.
- Accepted-result quotas.
maxPlacesPerQuerylimits valid saved records; candidates rejected by filters do not consume the accepted-record quota. - Practical filters. Require a phone number, external website, coordinates, or minimum rating, and exclude clearly closed places when needed.
- Direct URL support. Process full Google Maps place URLs and supported search URLs in addition to text queries.
- Multilingual output. Use one of 79 supported interface languages for localized categories, status text, hours, About labels, and review labels.
- Organic result handling. Sponsored candidates are excluded from organic ranking and the saved-place quota.
- Transparent identity fields.
placeIdandfeatureIdare included for matching, updates, and downstream record management.
Common use cases
Lead generation and sales prospecting
Build phone and website lists for dentists, contractors, agencies, clinics, retailers, restaurants, and other local businesses. Combine hasPhoneOnly and hasWebsiteOnly when both contact channels are required.
Local SEO and competitor research
Compare categories, ratings, review volume, locations, websites, and opening hours across a city or region. Export the results for audits, outreach, reporting, or territory planning.
POI, travel, and location datasets
Collect attractions, museums, parks, landmarks, public facilities, universities, hospitals, entertainment venues, and other points of interest. Set hasPhoneOnly to false because many non-business locations do not publish phone numbers.
Directories and data enrichment
Create or refresh structured place directories and enrich existing records with stable identity fields, coordinates, public contact details, ratings, and Google Maps links.
Input reference
At least one non-empty searchQueries or startUrls entry is required.
| Field | Type | Default | Description |
|---|---|---|---|
searchQueries | array of strings | — | Natural searches such as Dentists in New York, NY or Museums in Paris, France. Each query has its own accepted-result ceiling. |
startUrls | array | [] | Full Google Maps /maps/place/... or supported /maps/search/... URLs. A direct place URL targets one place. Viewport-only /maps/@lat,lng,zoom URLs are not supported. |
maxPlacesPerQuery | integer, 1–5000 | 3 | Maximum accepted records per text query or search URL. It is a ceiling, not a guarantee. |
language | string | en | Result language used for localized fields. The input supports 79 interface languages. |
hasPhoneOnly | boolean | true | Keep only places with a usable public phone number. Disable it for general POI collection. |
hasWebsiteOnly | boolean | false | Keep only places with an external website rather than a Google-owned, social, or unusable URL. |
minStarRating | integer, 0–5 | 0 | Minimum Google rating. 0 disables the filter. Unrated places are rejected when a positive minimum is set. |
hasLocationOnly | boolean | false | Keep only places with latitude and longitude. |
skipClosed | boolean | false | Exclude places Google clearly identifies as closed. Unknown status is not treated as closed. |
imageMode | none, cover, or all | all | Return no images, one cover image, or up to six preview image URLs. |
extractReviews | boolean | false | Return up to ten highlighted reviews from the place detail response. This is not a full review-history crawl. |
proxyConfiguration | object | Apify Proxy enabled | Proxy configuration for Google requests. Residential proxies are recommended. |
Filters are evaluated from place data already being processed. When many candidates fail strict filters, the Actor may inspect more candidates before reaching the accepted-result ceiling.
Example inputs
Find dentists with phone numbers in New York
{"searchQueries": ["Dentists in New York, NY"],"maxPlacesPerQuery": 10,"language": "en","hasPhoneOnly": true,"hasWebsiteOnly": false,"minStarRating": 0,"hasLocationOnly": false,"skipClosed": false,"imageMode": "none","extractReviews": false,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
Build a Paris attractions and POI dataset
{"searchQueries": ["Tourist attractions in Paris, France"],"maxPlacesPerQuery": 10,"language": "en","hasPhoneOnly": false,"hasWebsiteOnly": false,"minStarRating": 0,"hasLocationOnly": true,"skipClosed": false,"imageMode": "cover","extractReviews": false,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
Extract one place from a Google Maps URL
{"startUrls": [{"url": "https://www.google.com/maps/place/BK/@47.9946787,10.1791317,17z/data=!4m6!3m5!1s0x479bf25b04099115:0xd7db0d8989fc3f6f!8m2!3d47.9946787!4d10.1791317"}],"maxPlacesPerQuery": 1,"language": "en","hasPhoneOnly": false,"imageMode": "cover","extractReviews": true}
Use a full /maps/place/ URL that contains place identity information. Short redirect links and map-viewport URLs may not contain enough information for direct extraction.
Output
Every accepted place is written as one object to the default Apify Dataset. The Output tab provides two views:
- Essential Results: a compact table for contact, rating, address, location, opening-hours, and Google Maps URL fields
- Places Overview: the complete output, including descriptions, images, About data, and reviews
A shortened output record looks like this:
{"title": "Musée Rodin","category": "Sculpture museum","description": "18th-century mansion and sculpture garden displaying Rodin's influential works.","phone": "+33 1 44 18 61 10","website": "https://www.musee-rodin.fr/","rating": 4.7,"reviewCount": 20727,"address": "Musée Rodin, 77 Rue de Varenne, 75007 Paris, France","location": {"lat": 48.8553072,"lng": 2.3158354},"businessStatus": "Closed · Opens 10 AM Tue","openingHours": [{"day": "Monday","hours": "Closed"},{"day": "Tuesday","hours": "10 AM–6:30 PM"}],"images": ["https://lh3.googleusercontent.com/...=s0"],"aboutInfo": {"Accessibility": ["Wheelchair-accessible entrance"]},"reviews": [],"url": "https://www.google.com/maps/place/...","featureId": "0x...","placeId": "ChIJ...","searchQuery": "Tourist attractions in Paris, France","searchRank": 1}
Output fields
| Field | Type | Description |
|---|---|---|
title | string | Business, attraction, institution, or place name. |
category | string or null | Primary localized Google Maps category. |
description | string or null | Place-specific editorial description when Google provides one. |
phone | string or null | Public phone number. |
website | string or null | External website when available. |
rating | number or null | Google star rating from 1.0 to 5.0. |
reviewCount | integer or null | Total Google review count when present. |
address | string or null | Display address. |
location | object or null | Geographic coordinates as { "lat": number, "lng": number }. |
isClosed | boolean or null | Closed flag when detectable; null when unknown. |
businessStatus | string or null | Localized current status or next opening/closing time. |
openingHours | array or null | Weekly hours as { "day", "hours" } entries when Google publishes them. |
images | array | Zero, one, or up to six preview image URLs, depending on imageMode. |
aboutInfo | object | Structured place attributes such as amenities, accessibility, offerings, payments, or parking. |
reviews | array | Up to ten highlighted reviews when extractReviews is enabled. |
url | string | Canonical Google Maps place URL. |
featureId | string or null | Google's CID-style feature identifier. |
placeId | string or null | Google Place ID, commonly beginning with ChIJ. |
searchQuery | string | Query or search URL that produced the record. |
searchRank | integer or null | Organic rank within the source query. |
Export, automate, and integrate
You can:
- Export datasets as JSON, CSV, Excel, XML, RSS, or HTML
- Fetch results through the Apify Dataset API
- Schedule recurring runs in Apify Console
- Trigger workflows with webhooks
- Connect results to Make, Zapier, n8n, CRMs, spreadsheets, databases, and data warehouses
Run with curl
This synchronous endpoint waits for the Actor and returns default-dataset items:
curl --request POST \--url "https://api.apify.com/v2/actors/miladamirzadeh~google-maps-places-scraper/run-sync-get-dataset-items?format=json" \--header "Authorization: Bearer $APIFY_TOKEN" \--header "Content-Type: application/json" \--data '{"searchQueries": ["Museums in Paris, France"],"maxPlacesPerQuery": 10,"language": "en","hasPhoneOnly": false,"imageMode": "none","extractReviews": false}'
Run with JavaScript
Install the official client:
$npm install apify-client
import { ApifyClient } from 'apify-client';const client = new ApifyClient({token: process.env.APIFY_TOKEN,});const input = {searchQueries: ['Museums in Paris, France'],maxPlacesPerQuery: 10,language: 'en',hasPhoneOnly: false,imageMode: 'none',extractReviews: false,};const run = await client.actor('miladamirzadeh/google-maps-places-scraper').call(input);const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Run with Python
Install the official client:
$pip install apify-client
import osfrom apify_client import ApifyClientclient = ApifyClient(token=os.environ['APIFY_TOKEN'])run_input = {'searchQueries': ['Museums in Paris, France'],'maxPlacesPerQuery': 10,'language': 'en','hasPhoneOnly': False,'imageMode': 'none','extractReviews': False,}run = client.actor('miladamirzadeh/google-maps-places-scraper').call(run_input=run_input)items = client.dataset(run.default_dataset_id).list_items().itemsprint(items)
Pricing
This Actor uses pay-per-event pricing. Billing is tied to a run start and successfully saved records in the default dataset.
| Charged event | Free | Starter | Scale | Business |
|---|---|---|---|---|
| Actor start | $0.005 per run | $0.005 per run | $0.005 per run | $0.005 per run |
| Saved place record | $0.00120 | $0.00120 | $0.00105 | $0.00090 |
On the Free or Starter plan, typical charges are:
- 10 saved places: $0.017
- 100 saved places: $0.125
- 1,000 saved places: $1.205
Candidates rejected by your filters are not written as results and therefore are not charged as saved-place records. Images and highlighted reviews do not use separate paid events. The Actor does not pass through a separate platform-usage charge.
Example benchmark
A development benchmark was run with:
- Five Berlin searches: restaurants, museums, hospitals, libraries, and tourist attractions
- Ten accepted places per query
- English language
- Residential proxy
- Images disabled
- Reviews disabled
- 1 GB memory
Observed result:
- 50 saved places
- 43 seconds
- $0.022 development platform usage
This measured run illustrates the speed and resource profile of the HTTP-based pipeline under one configuration; it is not a performance guarantee. Runtime and availability vary with query breadth, location, filters, proxy conditions, and changes in Google Maps responses. Store billing follows the pay-per-event prices above; the displayed $0.022 is the underlying platform usage recorded during the development benchmark.
Tips for reliable results
- Include the city, region, or country in each query, for example
Veterinarians in Munich, Germany. - Use a residential proxy country that matches the target market when localization matters.
- Set
languageto the language required for categories, hours, status, About attributes, and relative review times. - Disable
hasPhoneOnlyfor public places, landmarks, attractions, and broad POI datasets. - Use
imageMode: "none"for contact exports,"cover"for a thumbnail, and"all"only when the complete preview set is useful. - Leave
extractReviewsdisabled when sample reviews are not needed. - Start with a small run before requesting hundreds or thousands of places.
- Treat
maxPlacesPerQueryas a ceiling. Google may return fewer useful matches than requested. - Split substantially different countries or languages into separate runs.
Limitations and responsible use
- Data coverage depends on what Google Maps exposes for a specific place, category, language, and region.
- Images are limited to up to six preview URLs; this is not a full Photos-gallery crawl.
- Reviews are limited to up to ten highlighted reviews; this is not a paginated review-history scraper.
- The Actor does not visit external business websites, so it does not collect emails or social and messaging profiles.
- Popular times, menus, price ranges, and full hotel inventory are not currently included.
- Some parks, squares, landmarks, hotels, and public places do not publish weekly opening hours or phone numbers.
- Google Maps response structures can change. Report reproducible extraction issues through the Actor's Issues tab.
- This Actor is not affiliated with, endorsed by, or sponsored by Google. Google Maps and Google Business Profile are trademarks of Google LLC.
You are responsible for using extracted data lawfully and for complying with applicable privacy, database, copyright, marketing, and data-protection rules, as well as relevant terms. Do not use the Actor for spam, harassment, unlawful profiling, or other abuse.
FAQ
Do I need a Google Maps API key?
No. The Actor does not use the official Google Places API. It runs on Apify using HTTP extraction and your configured proxy.
Can I use it without coding?
Yes. Configure the Actor in Apify Console, click Start, then preview or export the dataset. Developers can run the same workflow through curl, JavaScript, Python, schedules, webhooks, and integrations.
Can I search several cities or categories in one run?
Yes. Add multiple strings to searchQueries. maxPlacesPerQuery applies separately to each query.
Why did I get fewer records than requested?
maxPlacesPerQuery is an upper limit. A run can save fewer records when Google returns limited matches, filters reject many candidates, a query is narrow, or access ends before the ceiling is reached.
How do I keep places without phone numbers?
Set hasPhoneOnly to false. This is important for attractions, landmarks, parks, institutions, and other POIs.
Can I require both a phone number and a website?
Yes. Enable both hasPhoneOnly and hasWebsiteOnly. The filters use AND logic.
Why are hours, About data, images, or reviews empty?
These fields are optional and vary by place. Google may not publish them, and your imageMode or extractReviews settings may intentionally omit them.
Are sponsored listings included?
Sponsored candidates are excluded from organic ranking and do not count toward the accepted-place ceiling.
Can it extract emails or social media profiles?
No. The Actor deliberately does not visit external websites, so it does not collect emails, Facebook, Instagram, LinkedIn, TikTok, WhatsApp, Telegram, or similar profiles.
Support
For a failed run, missing field, incorrect place match, or parsing issue, open the Actor's Issues tab and include:
- The run ID
- The input used, with secrets removed
- One or two affected Google Maps URLs or place names
- The expected result and the actual result
Clear, reproducible examples make Google-side changes faster to diagnose. Feature requests and custom extraction requirements can be submitted through the same channel.