# Google Maps Extractor (`compass/google-maps-extractor`) Actor

Extract data from hundreds of places fast. Scrape Google Maps by keyword, category, location, URLs & other filters. Get addresses, contact info, opening hours, popular times, prices, menus & more. Export scraped data, run the scraper via API, schedule and monitor runs, or integrate with other tools.

- **URL**: https://apify.com/compass/google-maps-extractor.md
- **Developed by:** [Compass](https://apify.com/compass) (Apify)
- **Categories:** Lead generation, Travel
- **Stats:** 100,904 total users, 4,981 monthly users, 99.4% runs succeeded, 1,504 bookmarks
- **User rating**: 4.85 out of 5 stars

## Pricing

from $2.10 / 1,000 scraped places

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### What is Google Maps Extractor?

**Google Maps Extractor** is a web scraping tool that enables you to extract Google Maps place details. It’s a stripped-down version of the original [Google Maps Scraper](https://apify.com/compass/crawler-google-places). Just **enter a keyword/category/URL and location** and scrape various data like price, geolocation, place name, contact info, and more at great speed and predictable price.

We recommend trying out [Google Maps Scraper](https://apify.com/compass/crawler-google-places), as well, since it extracts even more than Google Maps Extractor can and at the same speed, but at a lower price.

### What can this Google Maps Extractor do?

- **Find and scrape places** in Google Maps by search query
- Extract places in Google Maps **by category**, for example “parking lot” or “bar”
- Scrape Google Maps **by location** (country, city, county, or zip code)
- Narrow down search areas by using **coordinates or by search URL**
- Get past [**Google Maps' limitations**](https://blog.apify.com/google-maps-how-to-overcome-google-api-limit-120-places/#what-are-google-maps-limitations-%E2%9B%94), such as showing no more than 120 places per map
- Export Google Maps data in **Excel, CSV, JSON, HTML, and other formats**
- Use the API in Python and Node.js, API endpoints, webhooks, and **integrations with other apps**

### What data can this Google Maps Extractor extract?

<table>
<tbody>
<tr>
<td>🥡 Place name and URL</td>
<td>💲 Price</td>
<td>🏷️ Category</td>
</tr>
<tr>
<td>🌍 Country code and phone number</td>
<td>🏠 Address, neighborhood, street, city, postal code, state</td>
<td>🌐 Website</td>
</tr>
<tr>
<td>✅ Claim this business</td>
<td>🧭 Location coordinates</td>
<td>🚫 Permanently or temporarily closed</td>
</tr>
<tr>
<td>⭐ Total score</td>
<td>🆔 Place ID</td>
<td>🗓️ Scraped at</td>
</tr>
<tr>
<td>📊 Reviews count</td>
<td>🏷️ Review tags</td>
<td>🖼️ Image categories</td>
</tr>
<tr>
<td>📸 Photos count</td>
<td>🔖 Place tags</td>
<td>🍔 Google food URL</td>
</tr>
<tr>
<td>⌚ Opening hours</td>
<td>👀 People also search</td>
<td>⛽️ Gas prices</td>
</tr>
<tr>
<td>🚫 Promoted status</td>
<td>♿ Accessibility info</td>
<td></td>
</tr>
<tr>
<td>🏢 Company contacts enrichment (emails, phone numbers, and social media links from business website)</td>
<td>👥 Business leads enrichment (full name, work email, phone number, job title, and LinkedIn profile)</td>
<td>📱 Social media profile enrichment (follower counts, descriptions, and verification status for Facebook, Instagram, YouTube, TikTok, X)</td>
</tr>
</tbody>
</table>

#### Data Google Maps Extractor can’t extract

This web scraper does not extract the following data from Google Maps:

- Images
- Reviews

To scrape images or reviews, we recommend you try [Google Maps Scraper](https://apify.com/compass/crawler-google-places), instead, which is a more comprehensive solution than Google Maps Extractor.

### How much does it cost to extract Google Maps data?

Google Maps Extractor uses a **pay-per-event pricing model**, where you're charged based on specific actions taken during scraping. This provides transparent, predictable pricing based on actual usage.

#### Base pricing

The foundation of costs includes:

- **Place scraped** (`place-scraped`): Cost varies by plan tier (see table below). This event is triggered for every place whose basic details are scraped from Google Maps.

#### Optional add-ons

Additional chargeable events include:

- **Filter applied** (`filter-applied`): Cost varies by plan tier (see table below). This is charged when you use category filters to narrow down your search results. Note that multiple categories count as one filter application per place.

- **Additional place details** (`place-details-scraped` with `scrapePlaceDetailPage` enabled): **$0.002 per place**. This add-on extracts additional details beyond the basics, such as reviews distribution, image categories, popular times, opening hours, and more. **Enabling the `scrapePlaceDetailPage` input option is required to scrape the reviews count.**

#### Pricing by plan tier

| Plan Tier | Place Scraped (per 1,000) | Filter Applied (per 1,000) |
| --------- | ------------------------- | -------------------------- |
| Free      | $5.00                     | $1.00                      |
| Starter   | $4.00                     | $1.00                      |
| Scale     | $3.00                     | $0.75                      |
| Business  | $2.10                     | $0.55                      |

On the [free plan](https://apify.com/pricing) you get $5 in credit, meaning you can scrape **1,000 places on Google Maps** without it costing you a penny (or fewer if you use add-ons).

Subscribing to one of Apify’s [paid plans](https://apify.com/pricing) adds more credit to your account and reduces per-event costs.

#### Why pay-per-event pricing?

The pay-per-event model offers several benefits:

- **Transparent pricing**: You only pay for what you use, with no hidden costs
- **Predictable costs**: Know exactly what each action costs before you start
- **No idle charges**: Unlike compute-time pricing, you're not charged for waiting or processing time

[Google Maps Scraper](https://apify.com/compass/crawler-google-places) offers more flexible pricing with additional add-on options, allowing you to customize exactly which data points you want to extract and pay for.

### How do I use Google Maps Extractor to scrape map data?

This Google Maps Extractor was designed for an easy start, even if you've never extracted map data from the web before. Learn more about using Google Maps Extractor by watching this video tutorial:

https://www.youtube.com/watch?v=UOkJm9pTgMw

### ⬇️ Input

The input for Google Maps Extractor should be **either a Google Maps URL or a location in combination with a search term.** You can provide keywords, URLs, and categories either one by one or in bulk. You can provide the location as a simple city name, a full postal address, or as a polygon consisting of multiple coordinates.

You can just set the whole country as the location: Google Maps Extractor intelligently splits it into subregions internally, so there's no need to search city by city or neighborhood by neighborhood yourself.

Here's a simple input example, scraping 1,000 parking lots in New York City:

```json
{
    "categoryFilterWords": ["parking lot"],
    "language": "en",
    "locationQuery": "New York, USA",
    "maxCrawledPlacesPerSearch": 1000,
    "skipClosedPlaces": false,
    "searchMatching": "all",
    "placeMinimumStars": ""
}
```

Click on the [input tab](https://apify.com/compass/google-maps-extractor/input-schema) for a full explanation of input in JSON.

#### Search terms

Using multiple similar search terms can increase the number of scraped places, but it also increases the time a run takes. We recommend using a combination of search terms that are distinct or overlap only slightly in meaning. Using a long list of duplicate search terms will just increase the time of a run without providing more results.

Example of a good list of search terms: \[`restaurant`, `bar`, `pub`, `cafe`, `buffet`, `ice cream`, `tea house`]

Example of a bad list of search terms: \[`restaurant`, `restaurants`, `chinese restaurant`, `cafe`, `coffee`, `coffee shop`, `takeout`]

Google search results often include categories adjacent to your search, e.g. `restaurant` might also capture some `cafe` or `bar` places, but you will get better results if you use them as separate search terms, as well.

#### Categories

**Using categories can be dangerous!**

Search terms can introduce false positives, extracting some irrelevant places. Categories can be used to narrow down the results to just the ones you select.

Categories can also be dangerous because they can cause false negatives, excluding places you might want in the results. Google has thousands of categories, and many are synonymous. You must list all the categories you want to match, including all synonyms; for example, `Divorce lawyer`, `Divorce service`, and `Divorce attorney` are three distinct categories. Some places might be classified as only one of them, meaning you should input all of them. For this reason, we recommend going through the categories list carefully. For some use cases, you might want to select as many as 100 categories to ensure you don't miss any relevant places.

To help with this, Google Maps Extractor tries to increase the chance of a match by doing the following:

- If any category of a place (each can have several categories) matches any category from your input, it will be included.
- If all words from your input are contained in a category name, it will be included. E.g. `restaurant` will match `Chinese restaurant` and `Pan Asian restaurant`.

> ⚠️ If categories are used without search terms, they will be used both as search terms and as category filters. However, for the above reasons, using categories without search terms is not recommended. We generally recommend using fewer search terms and more categories.

#### Search without geolocation

Rather than using the standard search term and location inputs, you may also opt to use only the search term (e.g. "restaurants in Berlin") or a direct Google Maps search URL (e.g. <https://www.google.com/maps/search/restaurants/@52.5190603,13.388574,13z/>) without the location input field. However, **this approach will limit the number of results to a maximum of 120** because it only opens a single map screen on Google with a finite scroll. We only recommend skipping location input if you don't need more than 120 results, you need the lowest possible latency, or you want to get the results in the same order as Google would provide.

### ⬆️ Output example

The results will be wrapped into a dataset found in the **Output** or **Storage** tab. Note that the output is organized in tables and tabs for your convenience. You can view results as a table, JSON, or as a map.

Once the run is finished, you can also download the dataset in various data formats (JSON, CSV, Excel, XML, HTML). Before exporting, you can pick or omit specific output fields; alternatively, you can also choose to download the whole view, which includes thematically connected data.

#### Table view

The table view can be manipulated in different ways. There is a general overview, but you can also sort the table by contact info, location rating, reviews, or other fields.

<a href="https://console.apify.com/actors/2Mdma1N6Fd0y3QEjR/">
<img src="https://github.com/apify-projects/actor-readme-images/blob/master/Google-maps-extractor-output.png?raw=true" alt="Google Maps Extractor output" style="width:70%;">
</a>

#### JSON file

Here's the amount of data you'd get for a single scraped place:

```json
[
    {
        "searchString": "parking lot",
        "rank": 1,
        "searchPageUrl": "https://www.google.com/maps/search/parking%20lot/@40.723076278078985,-74.01368194408177,15z?hl=en",
        "searchPageLoadedUrl": "https://www.google.com/maps/search/parking%20lot/@40.723076278078985,-74.01368194408177,15z?hl=en",
        "isAdvertisement": false,
        "title": "Washington Square Parking",
        "price": null,
        "categoryName": "Parking garage",
        "address": "2 5th Ave, New York, NY 10012",
        "neighborhood": "Manhattan",
        "street": "2 5th Ave",
        "city": "New York",
        "postalCode": "10012",
        "state": "New York",
        "countryCode": "US",
        "website": "https://www.gmcparking.com/locations-rates/downtown/washington-square/",
        "phone": "(212) 533-8312",
        "phoneUnformatted": "+12125338312",
        "claimThisBusiness": false,
        "location": {
            "lat": 40.7322523,
            "lng": -73.9966579
        },
        "totalScore": 4.3,
        "permanentlyClosed": false,
        "temporarilyClosed": false,
        "placeId": "ChIJEQLrzZBZwokR5IODtBM-TTU",
        "categories": ["Parking garage", "Parking lot", "Public parking space"],
        "cid": "3840794311570719716",
        "fid": "0x8752803adcbfe1eb:0x22db97b7282d97c3",
        "reviewsCount": 43,
        "imagesCount": 80,
        "imageCategories": [],
        "scrapedAt": "2024-02-15T15:05:01.934Z",
        "googleFoodUrl": null,
        "hotelAds": [],
        "openingHours": [
            {
                "day": "Thursday",
                "hours": "Open 24 hours"
            },
            {
                "day": "Friday",
                "hours": "Open 24 hours"
            },
            {
                "day": "Saturday",
                "hours": "Open 24 hours"
            },
            {
                "day": "Sunday",
                "hours": "Open 24 hours"
            },
            {
                "day": "Monday",
                "hours": "Open 24 hours"
            },
            {
                "day": "Tuesday",
                "hours": "Open 24 hours"
            },
            {
                "day": "Wednesday",
                "hours": "Open 24 hours"
            }
        ],
        "wasOpenAtScrapeTime": true,
        "peopleAlsoSearch": [],
        "placesTags": [],
        "reviewsTags": [],
        "additionalInfo": {
            "Accessibility": [
                {
                    "Wheelchair accessible entrance": true
                },
                {
                    "Wheelchair accessible parking lot": true
                }
            ]
        },
        "gasPrices": [],
        "url": "https://www.google.com/maps/search/?api=1&query=Washington%20Square%20Parking&query_place_id=ChIJEQLrzZBZwokR5IODtBM-TTU"
    },
    {
        "searchString": "parking lot",
        "rank": 4,
        "searchPageUrl": "https://www.google.com/maps/search/parking%20lot/@40.723076278078985,-74.01368194408177,15z?hl=en",
        "searchPageLoadedUrl": "https://www.google.com/maps/search/parking%20lot/@40.723076278078985,-74.01368194408177,15z?hl=en",
        "isAdvertisement": false,
        "title": "Mott Park",
        "price": null,
        "categoryName": "Parking lot",
        "address": "284 Mott St, New York, NY 10012",
        "neighborhood": "Manhattan",
        "street": "284 Mott St",
        "city": "New York",
        "postalCode": "10012",
        "state": "New York",
        "countryCode": "US",
        "website": "http://www.enterpriseparking.com/",
        "phone": "(212) 625-9221",
        "phoneUnformatted": "+12126259221",
        "claimThisBusiness": true,
        "location": {
            "lat": 40.724376,
            "lng": -73.9941788
        },
        "totalScore": 3.3,
        "permanentlyClosed": false,
        "temporarilyClosed": false,
        "placeId": "ChIJqaECg4VZwokRgFQE8-MgxCQ",
        "categories": ["Parking lot", "Parking garage"],
        "cid": "2649278644207506560",
        "fid": "0x8752803adcbfe1eb:0x22db97b7282d97c3",
        "reviewsCount": 16,
        "imagesCount": 14,
        "imageCategories": [],
        "scrapedAt": "2024-02-15T15:05:01.935Z",
        "reserveTableUrl": "https://www.parkwhiz.com/locations/7889?pwa=pa-1242&utm_medium=Google&utm_source=GBP&hl=en-US&gei=HCjOZdrJPKbOwbkPypiLWA&rwg_token=AAh05qbwbyp9mDxN7yUCMJpflONuHt8b7Yb9AD9dYTf_PIHixx-jnO72hpNTlYuxc5kvRjin1vwgpEoZSmFvb3RKuVAshDORqg%3D%3D",
        "googleFoodUrl": null,
        "hotelAds": [],
        "openingHours": [
            {
                "day": "Thursday",
                "hours": "5 AM to 1 AM"
            },
            {
                "day": "Friday",
                "hours": "5 AM to 1 AM"
            },
            {
                "day": "Saturday",
                "hours": "5 AM to 1 AM"
            },
            {
                "day": "Sunday",
                "hours": "5 AM to 1 AM"
            },
            {
                "day": "Monday",
                "hours": "5 AM to 1 AM"
            },
            {
                "day": "Tuesday",
                "hours": "5 AM to 1 AM"
            },
            {
                "day": "Wednesday",
                "hours": "5 AM to 1 AM"
            }
        ],
        "wasOpenAtScrapeTime": true,
        "peopleAlsoSearch": [],
        "placesTags": [],
        "reviewsTags": [],
        "additionalInfo": {
            "Accessibility": [
                {
                    "Wheelchair accessible entrance": true
                },
                {
                    "Wheelchair accessible parking lot": true
                }
            ]
        },
        "gasPrices": [],
        "url": "https://www.google.com/maps/search/?api=1&query=Mott%20Park&query_place_id=ChIJqaECg4VZwokRgFQE8-MgxCQ"
    },
    {
        "searchString": "parking lot",
        "rank": 8,
        "searchPageUrl": "https://www.google.com/maps/search/parking%20lot/@40.723076278078985,-74.01368194408177,15z?hl=en",
        "searchPageLoadedUrl": "https://www.google.com/maps/search/parking%20lot/@40.723076278078985,-74.01368194408177,15z?hl=en",
        "isAdvertisement": false,
        "title": "Icon Parking",
        "price": null,
        "categoryName": "Parking garage",
        "address": "301 Elizabeth St, New York, NY 10012",
        "neighborhood": "Manhattan",
        "street": "301 Elizabeth St",
        "city": "New York",
        "postalCode": "10012",
        "state": "New York",
        "countryCode": "US",
        "website": "https://iconparkingsystems.com/facility/comfort",
        "phone": "(212) 219-9562",
        "phoneUnformatted": "+12122199562",
        "claimThisBusiness": false,
        "location": {
            "lat": 40.7247031,
            "lng": -73.9935025
        },
        "totalScore": 1.9,
        "permanentlyClosed": false,
        "temporarilyClosed": false,
        "placeId": "ChIJOa-kEoVZwokRpZ34us608bI",
        "categories": ["Parking garage", "Parking lot"],
        "cid": "12894286008131558821",
        "fid": "0x8752803adcbfe1eb:0x22db97b7282d97c3",
        "reviewsCount": 44,
        "imagesCount": 17,
        "imageCategories": [],
        "scrapedAt": "2024-02-15T15:05:01.936Z",
        "googleFoodUrl": null,
        "hotelAds": [],
        "openingHours": [
            {
                "day": "Thursday",
                "hours": "6 AM to 10 PM"
            },
            {
                "day": "Friday",
                "hours": "6 AM to 10 PM"
            },
            {
                "day": "Saturday",
                "hours": "7 AM to 11 PM"
            },
            {
                "day": "Sunday",
                "hours": "7 AM to 11 PM"
            },
            {
                "day": "Monday",
                "hours": "6 AM to 10 PM"
            },
            {
                "day": "Tuesday",
                "hours": "6 AM to 10 PM"
            },
            {
                "day": "Wednesday",
                "hours": "6 AM to 10 PM"
            }
        ],
        "wasOpenAtScrapeTime": true,
        "peopleAlsoSearch": [],
        "placesTags": [],
        "reviewsTags": [],
        "additionalInfo": {
            "Accessibility": [
                {
                    "Wheelchair accessible entrance": true
                },
                {
                    "Wheelchair accessible parking lot": true
                }
            ]
        },
        "gasPrices": [],
        "url": "https://www.google.com/maps/search/?api=1&query=Icon%20Parking&query_place_id=ChIJOa-kEoVZwokRpZ34us608bI"
    }
]
```

**🏢 Company contacts enrichment**

When the Company contacts enrichment add-on is enabled, each place result will include social media links and contact details found on the business website:

```json
{
    "title": "Daniel's Jewelers",
    "instagrams": ["https://www.instagram.com/danielsjewelers/"],
    "facebooks": ["https://www.facebook.com/DanielsJewelers"],
    "linkedIns": [],
    "youtubes": ["https://www.youtube.com/channel/UCUgzkwhbbodMnOwDIPJj0_g"],
    "tiktoks": ["https://www.tiktok.com/@DanielsJewelers"],
    "twitters": ["https://twitter.com/danielsjewelers"],
    "pinterests": ["https://www.pinterest.com/daniel_jewelers/"]
}
```

**👥 Business leads enrichment**

When Business leads enrichment is enabled, each place result will include an array of employee leads with contact and company details:

```json
{
    "city": "Seattle",
    "state": "Washington",
    "personId": "2746893668571939229",
    "firstName": "Benjamin",
    "lastName": "White",
    "fullName": "Benjamin White",
    "linkedinProfile": "https://www.linkedin.com/in/benjamin-white-2562a3212",
    "email": null,
    "mobileNumber": null,
    "headline": "Influencer & Content Creator (IG, TT)",
    "jobTitle": "Sales Manager",
    "department": ["Marketing"],
    "industry": "Food&Beverage",
    "seniority": ["entry"],
    "country": "United States",
    "photoUrl": "https://media.licdn.com/dms/image/v2/...",
    "companyId": "23734538243567720",
    "companyName": "Happy Eating",
    "companyWebsite": "happyeating.com",
    "companySize": "51 - 200",
    "companyLinkedin": "https://www.linkedin.com/company/62543",
    "twitter": null,
    "companyCity": null,
    "companyState": null,
    "companyCountry": null,
    "companyPhoneNumber": null
}
```

> ⚠️ The number of leads you request is **per place found**. Setting this to a high number can significantly increase your costs. For example, requesting 10 leads for a search that finds 1,000 places will result in an attempt to find 10,000 leads. You will only be charged for leads that are successfully found.

**✅ Add-on: Email verification**

When `verifyLeadsEnrichmentEmails` is enabled, each lead's email address is verified and an `emailVerification` object is added to the lead output. Requires Business leads enrichment to be active.

**Charged (decisive results):**

- `ok` - Valid, deliverable email address
- `invalid` - Invalid or non-existent email address
- `disposable` - Disposable or temporary email address

**Not charged:**

- `catch_all` - The domain accepts all addresses; individual deliverability cannot be confirmed
- `unknown` - Verification result could not be determined
- `error` - Verification encountered a technical error

```json
{
    "email": "james.hill@apify.com",
    "quality": "good",
    "result": "ok",
    "subResult": "accepted_email",
    "free": false,
    "role": false,
    "error": ""
}
```

**📱 Social media profile enrichment**

When Social media profile enrichment is enabled, Google Maps Extractor enriches discovered social media URLs with detailed profile information (follower counts, descriptions, and verification status). The enriched profiles are included directly in the place output.

**Important notes:**

- Social media profile enrichment requires the **Company contacts enrichment feature to be enabled** (this is automatically enabled when you enable Social media profile enrichment)
- Each enriched social media profile is a separate billable event
- You can enable enrichment for specific platforms only (e.g., only Facebook and Instagram)
- All enrichment options are disabled by default

#### Map view

Google Maps Extractor provides a zoomable map that shows all the places scraped. The map is shown in the `Live View` tab on the Actor run page and also stored in the Key-Value Store as `results-map.html` record.

<a href="https://console.apify.com/actors/2Mdma1N6Fd0y3QEjR/">
<img src="https://github.com/apify-projects/actor-readme-images/blob/master/Google-maps-extractor-map.png?raw=true" alt="Google Maps Extractor map" style="width:70%;">
</a>

### What are other tools for scraping Google Maps?

For more comprehensive Google Maps data, we recommend using [Google Maps Scraper](https://apify.com/compass/crawler-google-places). It uses the same input options, but has a lot more options and is able to extract many more different types of data.

For more specific use cases, we recommend the following:

- [Google Maps Reviews Scraper](https://apify.com/compass/google-maps-reviews-scraper), which focuses on Google Maps reviews
- [AI Text Analyzer for Google Reviews](https://apify.com/geneea-analytics/reviews-text-nlp-analyzer), which can help you figure out keywords from review batches
- [Google Maps Scraper Orchestrator](https://apify.com/lukaskrivka/google-maps-scraper-orchestrator), which lets you run multiple Google Maps Scraper instances concurrently
- [Competitive Intelligence AI Agent](https://apify.com/apify/competitive-intelligence-agent), which can figure out competitors’ strengths and weaknesses
- [Market Expansion AI Agent](https://apify.com/apify/market-expansion-agent), which can help you determine where best to expand to

### Frequently asked questions

#### How can I extract Google Maps data by coordinates?

If you want to customize your location for a specific area, you'll be happy to use the **🛰 Custom search area** section of this tool. You’ll have to provide coordinate pairs for an area and the scraper will create start URLs out of them. There are several types of search area geometry that you can use in Google Maps Extractor: [Polygon, MultiPolygon, and Point (Circle)](https://blog.apify.com/google-maps-how-to-overcome-google-api-limit-120-places/#%F0%9F%93%A1-level-4-custom-geolocation-in-google-maps-boss-level). We’ve found the polygons and circle to be the most useful ones when it comes to extracting data from Google Maps.

Feel free to consult with [this guide](https://blog.apify.com/google-maps-how-to-overcome-google-api-limit-120-places/#%F0%9F%93%A1-level-4-custom-geolocation-in-google-maps-boss-level) or its equivalent in [video form](https://www.youtube.com/watch?v=op9MabaZNZo).

#### What are the disadvantages of the Google Maps API?

With the Google Maps API, you get $200 worth of credit usage every month free of charge. That means 28,500 map loads per month. However, the Google Maps API caps your search results to 60, regardless of the radius you specify. So, if you want to scrape data for bars in New York, for example, you'll get results for only 60 of the thousands of bars in the area. **Google Maps Extractor imposes no rate limits or quotas** and provides more cost-effective, comprehensive results.

#### Can I integrate Google Maps Extractor with other apps?

Yes. The Google Maps Extractor can be connected with almost any cloud service or web app thanks to [**integrations**](https://apify.com/integrations) on the Apify platform. You can **integrate your Google Maps data with Zapier, Slack, Make, Airbyte, GitHub, Google Sheets, Asana, LangChain,** and more.

You can also use [**webhooks**](https://docs.apify.com/integrations/webhooks) to carry out an action whenever an event occurs, for example, get a notification whenever Google Maps Extractor successfully finishes a run.

#### Can I use Google Maps Extractor as its own API?

Yes, you can use the Apify API to access Google Maps Extractor programmatically. The API allows you to manage, schedule, and run Apify Actors, access datasets, monitor performance, get results, create and update Actor versions, and more.

To access the API using Node.js, you can use the `apify-client` [NPM package](https://apify.com/compass/crawler-google-places/api/client/nodejs). To access the API using Python, you can use the `apify-client` [PyPI package](https://apify.com/compass/crawler-google-places/api/client/python).

For detailed information and code examples, see the [**API tab**](https://apify.com/compass/crawler-google-places/api) or refer to the [**Apify API documentation**](https://docs.apify.com/api/v2).

#### Can I use this Google Maps API in Python?

Yes, by using the Apify API. To access the [Google Places API with Python](https://apify.com/compass/google-maps-extractor/api/client/python), use the `apify-client` PyPI package. You can find more details about the client in the [Python Client documentation](https://docs.apify.com/api/client/python/).

#### Is it legal to scrape Google Maps data?

Web scraping is legal if you are extracting publicly available data, which is most data on Google Maps. However, you should **respect boundaries such as personal data** and intellectual property regulations. You should only scrape personal data if you have a legitimate reason to do so, and you should also factor in Google's [Terms of Use](https://policies.google.com/terms?hl=en).

#### Your feedback

We’re always working on improving the performance of Apify’s Actors. So if you’ve got any technical feedback for Google Maps Extractor or simply found a bug, please create an issue on the Actor’s [Issues tab](https://apify.com/compass/crawler-google-places/issues/open).

# Actor input Schema

## `searchStringsArray` (type: `array`):

Type what you'd normally search for in the Google Maps search bar, like <b>English breakfast</b> or <b>pet shelter</b>. Aim for unique terms for faster processing. Using similar terms (e.g., <b>bar</b> vs. <b>restaurant</b> vs. <b>cafe</b>) may slightly increase your capture rate but is less efficient.<br><br>⚠️ <b>Searching for a specific place?</b> If you're looking for a particular business or location (e.g., <b>M\&M Indian Thai Halal Restaurant</b>), make sure to also specify the city or country in the <b>📍 Location</b> field below to get more accurate and reliable results. Without location context, Google Maps may return results from unexpected areas.<br><br>⚠️ Heads up: Adding a location directly to the search, e.g., <b>restaurant Pittsburgh</b>, can limit you to a maximum of 120 results per search term due to <a href='https://blog.apify.com/google-places-api-limits/#%E2%9B%94-what-are-google-maps-limitations-for-scraping'>Google Maps' scrolling limit</a>.<br><br>You can also use direct place IDs here in the format <code>place\_id:ChIJ8\_JBApXMDUcRDzXcYUPTGUY</code>. See the [detailed description](https://apify.com/compass/crawler-google-places#search-terms).

## `locationQuery` (type: `string`):

Define location using free text. Simpler formats work best; e.g., use City + Country rather than City + Country + State. <br><br>🌍 You can just set the whole country or state as the location: Google Maps Data Scraper intelligently splits it into subregions internally, so there's no need to search city by city or neighborhood by neighborhood yourself. <br><br>Verify with the <a href='https://nominatim.openstreetmap.org/ui/search.html'>OpenStreetMap webapp</a> for visual validation of the exact area you want to cover. <br><br>💡 <b>Pro tip:</b> Always specify a location when searching for specific place names in the <b>🔍 Search terms</b> field above. This helps narrow down results to the geographic area you're interested in and prevents getting results from unrelated locations.<br><br>⚠️ Automatically defined City polygons may be smaller than expected (e.g., they don't include agglomeration areas). If you need to define the whole city area, head over to the 📡 <b>Geolocation parameters\*</b> section instead to select Country, State, County, City, or Postal code.<br>For an even more precise location definition (especially when using City name as a starting point), head over to <b>🛰 Custom search area</b> section to create polygon shapes of the areas you want to scrape. Note that 📍 <b>Location</b> settings always take priority over <b>📡 Geolocation\*</b> (so use either section but not both at the same time). <br><br>For guidance and tricks on location definition, check the <a href='https://blog.apify.com/google-places-api-limits/#2-choose-the-location-using-regular-toponomy%F0%9F%93%8D'>Apify tutorial</a>.

## `maxCrawledPlacesPerSearch` (type: `integer`):

Number of results you expect to get per each Search term, Category or URL. The higher the number, the longer it will take. <br><br>If you want to scrape all the places available, <b>leave this field empty</b>.

## `language` (type: `string`):

Results will be scraped in this language.

## `categoryFilterWords` (type: `array`):

You can limit the places that are scraped based on the Category filter; you can choose as many categories for one flat fee for the whole field. ⚠️ Using categories can sometimes lead to false negatives, as many places do not properly categorize themselves, and there are over <a href='https://api.apify.com/v2/key-value-stores/epxZwNRgmnzzBpNJd/records/categories'> 4,000</a> available categories which Google Maps has. Using categories might filter out places that you’d like to scrape. To avoid this problem, you must list all categories that you want to scrape, including synonyms, e.g., divorce lawyer, divorce attorney, divorce service, etc. See the [detailed description](https://apify.com/compass/crawler-google-places#categories).

## `searchMatching` (type: `string`):

Restrict what places are scraped based on matching their name with provided 🔍 <b>Search term</b>. E.g., all places that have <b>chicken</b> in their name vs. places called <b>Kentucky Fried Chicken</b>.

## `placeMinimumStars` (type: `string`):

Scrape only places with a rating equal to or above the selected stars. Places without reviews will also be skipped. Keep in mind, filtering by reviews reduces the number of places found per credit spent, as many will be excluded.

## `website` (type: `string`):

Use this to exclude places without a website, or vice versa. This option is turned off by default.

## `skipClosedPlaces` (type: `boolean`):

Skip places that are marked as temporary or permanently closed. Ideal for focusing on currently open places.

## `scrapePlaceDetailPage` (type: `boolean`):

Scrape detail pages of each place the Actor finds. This will slow down the Actor since it needs to open another page for each place individually.<br><br> The fields available only when scrapePlaceDetailPage is enabled include: `reviewsDistribution`, `reviewsRemovedNotice`, `imageCategories`, popularTimes fields, `openingHours`, `BusinessConfirmationText`, `peopleAlsoSearch`, `reviewsTags`, `updatesFromCustomers`, `questionsAndAnswers`, `tableReservationLinks`, `ownerUpdates` and hotel fields. <br><br> Enabling this also ensures that `reviewsCount` will be scraped. <br><br>This option needs to be enabled if you wish to use any of the options below.

## `scrapeTableReservationProvider` (type: `boolean`):

Scrape table reservation provider data like name, address, email or phone. This data is present only in restaurants that have a blue "RESERVE A TABLE" button.

## `scrapeOrderOnline` (type: `boolean`):

Scrape the 'Order online' section of restaurants to get pickup and delivery providers (Uber Eats, DoorDash, etc.), along with fees and estimated times.

## `includeWebResults` (type: `boolean`):

Extract the "Web results" section located at the bottom of every place listing.

## `scrapeDirectories` (type: `boolean`):

Some places (e.g. malls) can have multiple businesses located inside them. This option will scrape inside the "Directory" or "At this place" as per different categories (example <a href='https://www.google.com/maps/place/Forum+Karl%C3%ADn/@50.0914263,14.4522411,532m/data=!3m1!1e3!4m7!3m6!1s0x470b94a14fd738ff:0x6a75e391416ab4fa!8m2!3d50.0914263!4d14.454816!10e3!16s%2Fg%2F1ptxlz77_?entry=ttu&g_ep=EgoyMDI1MDQwMi4xIKXMDSoASAFQAw%3D%3D'>here</a>). Turn this toggle on to include those places in your results.<br><br> ⚠️ Note that full place details need to be scraped in order to scrape directories.

## `maxQuestions` (type: `integer`):

Set the number of questions per place you expect to scrape. If you fill in <b>0</b> or leave the field empty, only the first question and answer will be scraped. To extract all questions, type <b>999</b> into the field.<br><br>⚠️ Note that some of the fields contain <b>personal data</b>.

## `scrapeContacts` (type: `boolean`):

Enrich Google Maps places with contact details extracted from the business website, including business emails and social media profiles (Meta, LinkedIn, X, etc.).<br><br>We exclude contacts of big chains: mcdonalds, starbucks, dominos, pizzahut, burgerking, kfc, subway, wendys, dunkindonuts, tacobell.

## `scrapeSocialMediaProfiles` (type: `object`):

Enable enrichment for any social media profiles found. This add-on retrieves detailed public data for each profile, including <b>profile names, follower/following counts, descriptions, post/video counts, and verification status</b>.<br><br>You are charged a flat rate for the <b>total number of profiles enriched</b>, regardless of how many platforms (Facebook, YouTube, etc.) you select.<hr><b>Feature dependency:</b><br>To use this feature, the <b>Company contacts enrichment (from website)</b> add-on is enabled automatically. This ensures the enriched social media data is combined with the main contact record for each domain.<br><br><b>Output:</b> Enriched profiles are available in the <b>Social profiles</b> output view tab.

## `maximumLeadsEnrichmentRecords` (type: `integer`):

Enrich your results with detailed contact and company information, including employee names, job titles, emails, phone numbers, LinkedIn profiles, and key company data like industry and number of employees. <br><br> This setting allows you to set the maximum number of leads records you want to scrape per each place found on the map (that has a website). By default, it's set to 0 which means that no leads information will be scraped. <br><br>⚠️ Note that some of the fields contain <b>personal data</b>. GDPR protects personal data in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your use case is legitimate, please consult an attorney. <br><br>We exclude leads of big chains as these are not related to the local places: mcdonalds, starbucks, dominos, pizzahut, burgerking, kfc, subway, wendys, dunkindonuts, tacobell.

## `leadsEnrichmentDepartments` (type: `array`):

You can use this filter to include only specific departments (like Sales, Marketing, or C-Suite). Note: This will only work if the ⏩ Add-on: Extract business leads information - Maximum leads per place (maximumLeadsEnrichmentRecords) option is enabled. Please note that some job titles are sometimes miscategorized in the wrong departments.

## `verifyLeadsEnrichmentEmails` (type: `boolean`):

When enabled, verifies the email address of each lead extracted during business leads enrichment. Each lead receives an <b>emailVerification</b> object with the verification result and quality assessment.<br><br><b>Charged (decisive results):</b> valid (<code>ok</code>), invalid, and disposable email addresses.<br><b>Not charged:</b> catch-all, unknown, and error results.<br><br>⚠️ This add-on requires business leads enrichment to be enabled.

## `countryCode` (type: `string`):

Set the country, e.g., <b>United States</b>.

## `city` (type: `string`):

Enter the city, e.g., <b>Pittsburgh</b>.<br><br>⚠️ <b>Do not include State or Country names here.</b><br><br>⚠️ Automatic City polygons may be smaller than expected (e.g., they don't include agglomeration areas).

## `state` (type: `string`):

Set a state, e.g., <b>Massachusetts</b> (mainly for the US addresses).

## `county` (type: `string`):

Set the county, e.g., <b>New York County</b>.<br><br>⚠️ Note that <b>county</b> may represent different administrative areas in different countries: a county (e.g., US), regional district (e.g., Canada) or département (e.g., France).

## `postalCode` (type: `string`):

Set the postal code, e.g., <b>10001</b>. <br><br>⚠️ <b>Combine Postal code only with 🗺 Country, never with 🌇 City. You can only input one postal code at a time.</b>

## `customGeolocation` (type: `object`):

Use this field to define the exact search area if other search area parameters don't work for you. See <a href='https://apify.com/compass/crawler-google-places#custom-search-area' target='_blank' rel='noopener'>readme</a> or <a href='https://blog.apify.com/google-places-api-limits/#1-create-a-custom-area-by-using-pairs-of-coordinates-%F0%9F%93%A1' target='_blank' rel='noopener'>the Apify guide</a> for details.

## `startUrls` (type: `array`):

Max 300 results per search URL. Valid format for URLs contains <code>https://google.com/maps/</code>. This feature also supports uncommon URL formats such as: <code>https://google.com/maps?cid=***</code>, <code>https://goo.gl/maps/***</code>, and custom place list URL.

## Actor input object example

```json
{
  "searchStringsArray": [
    "restaurant"
  ],
  "locationQuery": "New York, USA",
  "maxCrawledPlacesPerSearch": 50,
  "language": "en",
  "categoryFilterWords": [
    "pizza",
    "italian"
  ],
  "searchMatching": "all",
  "placeMinimumStars": "",
  "website": "allPlaces",
  "skipClosedPlaces": false,
  "scrapePlaceDetailPage": false,
  "scrapeTableReservationProvider": false,
  "scrapeOrderOnline": false,
  "includeWebResults": false,
  "scrapeDirectories": false,
  "maxQuestions": 0,
  "scrapeContacts": false,
  "scrapeSocialMediaProfiles": {
    "facebooks": false,
    "instagrams": false,
    "youtubes": false,
    "tiktoks": false,
    "twitters": false
  },
  "maximumLeadsEnrichmentRecords": 0,
  "leadsEnrichmentDepartments": [
    "sales",
    "marketing"
  ],
  "verifyLeadsEnrichmentEmails": false,
  "countryCode": "US",
  "city": "New York",
  "state": "New York",
  "county": "New York County",
  "postalCode": "10001",
  "customGeolocation": {
    "type": "Point",
    "coordinates": [
      -73.9857,
      40.7484
    ]
  },
  "startUrls": [
    {
      "url": "https://www.google.com/maps/place/Yellowstone+National+Park/@44.5857951,-110.5140571,9z/data=!3m1!4b1!4m5!3m4!1s0x5351e55555555555:0xaca8f930348fe1bb!8m2!3d44.427963!4d-110.588455?hl=en-GB"
    }
  ]
}
```

# Actor output Schema

## `dataset` (type: `string`):

Dataset containing all scraped places

## `resultsMap` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchStringsArray": [
        "restaurant"
    ],
    "locationQuery": "New York, USA",
    "maxCrawledPlacesPerSearch": 50,
    "language": "en",
    "scrapeSocialMediaProfiles": {
        "facebooks": false,
        "instagrams": false,
        "youtubes": false,
        "tiktoks": false,
        "twitters": false
    },
    "maximumLeadsEnrichmentRecords": 0
};

// Run the Actor and wait for it to finish
const run = await client.actor("compass/google-maps-extractor").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchStringsArray": ["restaurant"],
    "locationQuery": "New York, USA",
    "maxCrawledPlacesPerSearch": 50,
    "language": "en",
    "scrapeSocialMediaProfiles": {
        "facebooks": False,
        "instagrams": False,
        "youtubes": False,
        "tiktoks": False,
        "twitters": False,
    },
    "maximumLeadsEnrichmentRecords": 0,
}

# Run the Actor and wait for it to finish
run = client.actor("compass/google-maps-extractor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchStringsArray": [
    "restaurant"
  ],
  "locationQuery": "New York, USA",
  "maxCrawledPlacesPerSearch": 50,
  "language": "en",
  "scrapeSocialMediaProfiles": {
    "facebooks": false,
    "instagrams": false,
    "youtubes": false,
    "tiktoks": false,
    "twitters": false
  },
  "maximumLeadsEnrichmentRecords": 0
}' |
apify call compass/google-maps-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,compass/google-maps-extractor"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/2Mdma1N6Fd0y3QEjR/builds/SV1UDxGPzPT4lM4hl/openapi.json
