Google Maps Places Scraper avatar

Google Maps Places Scraper

Pricing

from $0.90 / 1,000 place scrapeds

Go to Apify Store
Google Maps Places Scraper

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

Milad Amirzadeh

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

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: hasPhoneOnly defaults to true, and imageMode defaults to all. For general place or POI datasets, set hasPhoneOnly to false. For smaller contact-only runs, set imageMode to none or cover.

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"
]
}
}
  1. Open the Actor's Input tab.
  2. Add one or more keyword-and-location searches or Google Maps URLs.
  3. Choose the maximum number of accepted records per query.
  4. Adjust filters, images, reviews, and language.
  5. Keep Apify Proxy enabled; residential proxies are recommended.
  6. Click Start and open the default dataset when the run finishes.
Google Maps Places Scraper input with multiple Berlin search queries

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, and featureId
  • 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. maxPlacesPerQuery limits 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. placeId and featureId are 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.

FieldTypeDefaultDescription
searchQueriesarray of stringsNatural searches such as Dentists in New York, NY or Museums in Paris, France. Each query has its own accepted-result ceiling.
startUrlsarray[]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.
maxPlacesPerQueryinteger, 1–50003Maximum accepted records per text query or search URL. It is a ceiling, not a guarantee.
languagestringenResult language used for localized fields. The input supports 79 interface languages.
hasPhoneOnlybooleantrueKeep only places with a usable public phone number. Disable it for general POI collection.
hasWebsiteOnlybooleanfalseKeep only places with an external website rather than a Google-owned, social, or unusable URL.
minStarRatinginteger, 0–50Minimum Google rating. 0 disables the filter. Unrated places are rejected when a positive minimum is set.
hasLocationOnlybooleanfalseKeep only places with latitude and longitude.
skipClosedbooleanfalseExclude places Google clearly identifies as closed. Unknown status is not treated as closed.
imageModenone, cover, or allallReturn no images, one cover image, or up to six preview image URLs.
extractReviewsbooleanfalseReturn up to ten highlighted reviews from the place detail response. This is not a full review-history crawl.
proxyConfigurationobjectApify Proxy enabledProxy 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
Essential Results dataset view with Berlin businesses and museums, including contact details, ratings, addresses, locations, and opening hours

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

FieldTypeDescription
titlestringBusiness, attraction, institution, or place name.
categorystring or nullPrimary localized Google Maps category.
descriptionstring or nullPlace-specific editorial description when Google provides one.
phonestring or nullPublic phone number.
websitestring or nullExternal website when available.
ratingnumber or nullGoogle star rating from 1.0 to 5.0.
reviewCountinteger or nullTotal Google review count when present.
addressstring or nullDisplay address.
locationobject or nullGeographic coordinates as { "lat": number, "lng": number }.
isClosedboolean or nullClosed flag when detectable; null when unknown.
businessStatusstring or nullLocalized current status or next opening/closing time.
openingHoursarray or nullWeekly hours as { "day", "hours" } entries when Google publishes them.
imagesarrayZero, one, or up to six preview image URLs, depending on imageMode.
aboutInfoobjectStructured place attributes such as amenities, accessibility, offerings, payments, or parking.
reviewsarrayUp to ten highlighted reviews when extractReviews is enabled.
urlstringCanonical Google Maps place URL.
featureIdstring or nullGoogle's CID-style feature identifier.
placeIdstring or nullGoogle Place ID, commonly beginning with ChIJ.
searchQuerystringQuery or search URL that produced the record.
searchRankinteger or nullOrganic 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 os
from apify_client import ApifyClient
client = 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().items
print(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 eventFreeStarterScaleBusiness
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
Apify benchmark showing 50 results, 0.022 dollars platform usage, and 43 seconds runtime

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 language to the language required for categories, hours, status, About attributes, and relative review times.
  • Disable hasPhoneOnly for 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 extractReviews disabled when sample reviews are not needed.
  • Start with a small run before requesting hundreds or thousands of places.
  • Treat maxPlacesPerQuery as 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.