# Google Maps Scraper ✅ $1.5/1k places (`x_guru/google-maps-scraper`) Actor

Scrape Google Maps places from $1.5/1k results. Get business names, addresses, phones, websites, ratings, reviews, images, opening hours, GPS coordinates, categories, Place IDs, and optional public website emails from keywords, URLs, Place IDs, or map areas.

- **URL**: https://apify.com/x\_guru/google-maps-scraper.md
- **Developed by:** [Hundevmode Labs](https://apify.com/x_guru) (community)
- **Categories:** Lead generation, Automation, Travel
- **Stats:** 49 total users, 13 monthly users, 100.0% runs succeeded, 5 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.50 / 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

## Google Maps Scraper: Extract Places, Reviews, Images & Business Contacts

Use this Google Maps Scraper to collect local business data from Google Maps by search term and location, direct Google Maps URLs, Google Place IDs, or a selected map area. It can extract Google Maps places, ratings, reviews, images, websites, phone numbers, addresses, coordinates, categories, and public business contacts when they are available.

The actor is built for high-throughput Google Places scraping: base discovery is payload-first, large searches can be split automatically, and slower add-ons run after places are collected. This makes it useful for Google Maps lead generation, local SEO research, market mapping, review monitoring, and business directory datasets.

![Google Maps search results for bike repair shops in Portland](https://api.apify.com/v2/key-value-stores/RgWfy9bTkPpSqNzrV/records/google-maps-bike-repair-portland.png?signature=1y7yXgMqYJwtRw8fVOV7s)

### AI agent skill

Use the dedicated [Google Maps Scraper Apify agent skill](https://github.com/hundevmode/apify-google-maps-scraper-agent-skill) when you want AI agents to build correct inputs, run this actor through Apify, control spend with `maxTotalChargeUsd`, and return structured Google Maps place data for CRM, Sheets, n8n, BI, or enrichment workflows.

Install with skills.sh-compatible agents:

```bash
npx skills add hundevmode/apify-google-maps-scraper-agent-skill \
  --skill google-maps-scraper-apify
```

ClawHub skill slug: `google-maps-scraper-apify`.

### At a glance

| Need | Use this actor for |
| --- | --- |
| Local leads | Business names, categories, websites, phones, emails, and social links |
| Google Maps reviews | Review text, ratings, counts, distribution, and review-fetch diagnostics |
| Place directories | Addresses, coordinates, Place IDs, CIDs, Google Maps URLs, and categories |
| Market research | Competitor lists by area, rating, review volume, category, and opening status |
| CRM enrichment | Direct Google Maps URLs, Place IDs, and website contact enrichment |

### Quick start

1. Add one or more values to `searchStringsArray`, such as `bike repair shop`, `dentist`, or `hotel`.
2. Add a specific `locationQuery`, for example `Portland, Oregon, USA`.
3. Set `maxCrawledPlacesPerSearch` to the number of places you want per search term.
4. Enable only the add-ons you need: place details, website contacts, reviews, or images.
5. Run the actor and export the dataset as JSON, CSV, Excel, or through the Apify API.

### Pricing

The actor uses Apify pay-per-event pricing. The base event is one saved Google Maps place. Optional add-ons are charged only when the corresponding work produces saved output. Apify calls paid-plan Store discounts Bronze, Silver, and Gold internally; all paid plans use the same paid rate for this actor.

| Event | Free | Paid plans |
| --- | --- | --- |
| Scraped place | $3.00 / 1,000 saved places | $1.50 / 1,000 saved places |
| Add-on: filter applied | $0.80 / 1,000 saved places | $0.35 / 1,000 saved places |
| Add-on: additional place details scraped | $1.50 / 1,000 enriched places | $0.75 / 1,000 enriched places |
| Add-on: company contacts enrichment | $1.50 / 1,000 enriched places | $0.45 / 1,000 enriched places |
| Add-on: review scraped | $0.40 / 1,000 reviews | $0.20 / 1,000 reviews |
| Add-on: image scraped | $0.40 / 1,000 images | $0.20 / 1,000 images |
| Actor start | $0.00005 per start event | $0.00001 per start event |

Set a maximum run cost before starting a run; the actor respects the Apify spending limit and exits gracefully when no paid results can be saved.

### What can this Google Maps scraper do?

- Search Google Maps by one or more search terms and a location, for example `restaurants in New York` or `bike repair shop in Portland`.
- Scrape direct Google Maps search URLs, place URLs, and Google Place IDs.
- Collect all visible places from a selected area when you do not want to use a business search term.
- Filter results by Google Maps category, name matching, rating, website availability, and closed-place status.
- Extract extra place details, Google reviews, Google Maps image URLs, and public website contacts with optional add-ons.
- Keep output compatible with Apify Dataset exports such as JSON, CSV, Excel, and API access.

### Data you can extract

| Data group | Example fields |
| --- | --- |
| Basic place data | `title`, `subTitle`, `description`, `categoryName`, `categories`, `price`, `rank`, `isAdvertisement` |
| Address and location | `address`, `street`, `neighborhood`, `city`, `state`, `postalCode`, `countryCode`, `location`, `plusCode`, `locatedIn`, `floor` |
| Contact data | `website`, `phone`, `phoneUnformatted`, `emails`, `additionalPhones` |
| Social links | `facebooks`, `instagrams`, `linkedIns`, `twitters`, `youtubes`, `tiktoks` |
| Status and ownership | `permanentlyClosed`, `temporarilyClosed`, `claimThisBusiness` |
| Ratings and reviews | `totalScore`, `reviewsCount`, `reviewsDistribution`, `reviews`, `reviewsScraped`, `reviewsFetchStatus`, `reviewsFetchMethod`, `reviewsDateFilterStatus` |
| Images | `imageUrl`, `images`, `imagesCount`, `imageFetchStatus`, `imageFetchMethod`, `imageAuthorsStatus`, `imageCategories` |
| Place details | `openingHours`, `additionalOpeningHours`, `popularTimesLiveText`, `popularTimesLivePercent`, `popularTimesHistogram`, `menu`, `servicesLink`, `reserveTableUrl`, `googleFoodUrl`, `peopleAlsoSearch`, `placesTags` |
| Hotels and fuel | `hotelStars`, `hotelDescription`, `checkInDate`, `checkOutDate`, `hotelAds`, `gasPrices` |
| Google identifiers | `placeId`, `cid`, `fid`, `kgmid`, `url`, `searchPageUrl`, `searchPageLoadedUrl`, `searchString`, `language` |
| Add-on data | `additionalInfo`, including nested data such as `companyContacts`, `webResults`, `insidePlaces`, image lists, and review metadata when enabled |

Not every Google Maps result exposes every field. Detail fields, images, review data, web results, inside places, and website contacts are best-effort and are returned when Google Maps or the business website provides enough public data.

### Popular use cases

- Build local business lead lists from Google Maps with websites, phone numbers, emails, and social links.
- Find restaurants, dentists, hotels, shops, agencies, clinics, contractors, repair services, and other local businesses in a city or region.
- Monitor Google Maps reviews, ratings, categories, and business details for market research.
- Create location datasets with addresses, coordinates, Google Place IDs, CIDs, and Google Maps URLs.
- Enrich CRM records when you already have Google Maps URLs or Place IDs.
- Collect business websites before running separate email, SEO, or sales workflows.
- Compare local competitors by category, neighborhood, rating, review count, and opening status.

### Input options

#### Search terms and location

Use `searchStringsArray` with `locationQuery` for standard Google Maps scraping. Put the business category or query in `searchStringsArray`, and put the place context in `locationQuery`.

```json
{
  "searchStringsArray": ["bike repair shop"],
  "locationQuery": "Portland, Oregon, USA",
  "maxCrawledPlacesPerSearch": 250,
  "language": "en"
}
```

Core input fields:

| Field | What it does |
| --- | --- |
| `searchStringsArray` | One or more Google Maps search terms, such as `bike repair shop`, `dentist`, `hotel`, or `restaurants`. |
| `locationQuery` | Free-text location for the run, such as `Portland, Oregon, USA` or `Berlin, Germany`. This has priority over structured search area fields. |
| `maxCrawledPlacesPerSearch` | Target number of places per search term or Google Maps URL. If fewer places exist or Google returns fewer useful places, the actor returns what it can find. |
| `language` | Google Maps language code used for localized result text when Google provides it. |

#### Search area

You can define a structured search area with:

- `countryCode`: country or territory selector with 248 options.
- `city`, `state`, `county`, `postalCode`: optional location parts.
- `customGeolocation`: polygon or area geometry.
- `strictLocationBounds`: keeps results inside the resolved or custom search area when coordinates are available.

The free-text `locationQuery` has priority when it is provided. Use the structured search area fields when you need more control or when the free-text location is not specific enough.

#### Google Maps URLs and Place IDs

Use `startUrls` when you already have Google Maps URLs. Use `placeIds` when you have Google Place IDs.

```json
{
  "startUrls": [
    { "url": "https://www.google.com/maps/search/restaurants+near+New+York,+NY" }
  ],
  "placeIds": ["ChIJ..."],
  "maxCrawledPlacesPerSearch": 100,
  "language": "en"
}
```

Direct place URLs and Place IDs are useful when you need specific locations. Search URLs are useful when you want Google Maps results from a prepared query.

URL and ID behavior:

| Field | What it accepts | Notes |
| --- | --- | --- |
| `startUrls` | Google Maps search URLs and direct Google Maps place URLs. | URL sources run before normal search terms. Direct place URLs usually return one place; search URLs can return multiple places depending on what Google exposes for that URL. |
| `placeIds` | Google Place IDs, values prefixed with `place_id:`, and Google Maps URLs containing `query_place_id`. | Useful for exact place enrichment or when another system already stores Google Place IDs. |

#### All visible places

Use `allPlacesNoSearchAction` only when you want all visible places in a selected area instead of a category search.

```json
{
  "locationQuery": "SoHo, New York, USA",
  "allPlacesNoSearchAction": "all_visible",
  "allPlacesZoom": 16
}
```

This mode needs a concrete area. Large or vague areas should be narrowed with city, postal code, custom geolocation, or a smaller `locationQuery`.

All visible places fields:

| Field | What it does |
| --- | --- |
| `allPlacesNoSearchAction` | Enables area-based scraping without search terms, URLs, or Place IDs. |
| `allPlacesZoom` | Optional zoom override. Leave `0` for automatic zoom. Typical useful values are 14-17; higher zoom can expose more pins but may take longer. |

### Add-ons

#### Result filters and categories

Use filters to narrow Google Maps places after base collection:

- `placeCategories`: select from 3,968 Google Business Profile category presets.
- `customPlaceCategories`: add free-text categories not present in the predefined list.
- `searchMatching`: keep all places, only names that include the search term, or exact name matches.
- `minStars`: require a minimum Google rating.
- `website`: keep all places, only places with a website, or only places without a website.
- `skipClosedPlaces`: remove temporarily or permanently closed places when Google exposes the status.

Category filters can improve relevance, but they can also remove valid places if a business is categorized differently on Google Maps.

Result filter fields:

| Field | Values |
| --- | --- |
| `placeCategories` | Predefined Google Business Profile category presets. |
| `customPlaceCategories` | Custom text matched against `categoryName` and `categories`. |
| `searchMatching` | `all`, `only_includes`, `only_exact`. |
| `minStars` | `0`, `1`, `2`, `2.5`, `3`, `3.5`, `4`, `4.5`, `5`. |
| `website` | `allPlaces`, `withWebsite`, `withoutWebsite`. |
| `skipClosedPlaces` | `true` or `false`. |

#### Place details

Enable `scrapePlaceDetailPage` to enrich places with extra Google Maps detail fields such as opening hours, popular times, additional categories, descriptions, menus, service links, plus codes, and related place data when available.

Additional place-detail toggles include:

- `scrapeTableReservationProviderData`: extract reservation links when Google exposes them.
- `scrapeOrderOnlineWidgetData`: extract order-online links when available.
- `includeWebResults`: include related web links when available.
- `scrapeInsidePlaces`: extract inside places for malls, venues, and similar parent places when Google exposes them.

The actor uses fast Google Maps detail payloads first and avoids opening a browser detail page unless a fallback is needed.

Place detail output can include `openingHours`, `additionalOpeningHours`, `plusCode`, `locatedIn`, `floor`, `menu`, `servicesLink`, `reserveTableUrl`, `googleFoodUrl`, `popularTimesLiveText`, `popularTimesLivePercent`, `popularTimesHistogram`, `peopleAlsoSearch`, `placesTags`, hotel fields, gas prices, and nested `additionalInfo` data when Google exposes them.

#### Website contacts

Enable `scrapeCompanyContacts` to crawl public business websites and extract contacts into `emails`, `additionalPhones`, social-link fields, and `additionalInfo.companyContacts`.

The contact crawler uses a shallow same-domain crawl. It checks the homepage and common internal pages such as contact, about, team, impressum, and footer links. For best cost and speed, combine this add-on with the `website` filter set to places with a website.

Website contact output can include `emails`, `additionalPhones`, `facebooks`, `instagrams`, `linkedIns`, `twitters`, `youtubes`, `tiktoks`, and raw crawl details in `additionalInfo.companyContacts`. The actor extracts public contact data; it does not verify emails or collect follower counts, engagement stats, or other profile analytics.

#### Reviews

Set `maxReviews` above `0` to extract Google Maps reviews.

Useful review options:

- `reviewsSort`: newest, most relevant, highest rating, or lowest rating.
- `reviewsStartDate`: best-effort review date filter.
- `reviewsFilterString`: keep reviews matching keywords.
- `reviewsOrigin`: all reviews or Google reviews.
- `scrapeReviewsPersonalData`: include reviewer data when available.

Review extraction uses the Google Maps reviews RPC first. UI fallback is only used when the fast path is unavailable. Review date filtering is best-effort because Google may return localized or relative dates.

Review output includes `reviews`, `reviewsScraped`, `reviewsCount`, `reviewsDistribution`, `reviewsTags`, `reviewsFetchStatus`, `reviewsFetchMethod`, and `reviewsDateFilterStatus`.

#### Images

The main image URL is included as `imageUrl` when Google Maps exposes it in the base result. Set `maxImages` above `0` to extract additional Google Maps image URLs into `images`.

Use `scrapeImageAuthors` if you want best-effort image author metadata. Image extraction is payload-first and returns only what Google Maps exposes for a place.

Image output includes `imageUrl` for the main image, plus `images`, `imagesCount`, `imageFetchStatus`, `imageFetchMethod`, `imageAuthorsStatus`, and `imageCategories` when available.

### How it works

1. The actor builds search sources from search terms, locations, URLs, Place IDs, or the selected area.
2. Base discovery uses Google Maps payload responses instead of opening every place page.
3. Large searches can be split automatically across smaller map areas and deduplicated by Google identifiers.
4. Optional relevance and result filters remove unwanted places before saving.
5. Detail, reviews, images, and website contacts run in a second enrichment stage so add-ons do not block base discovery.
6. The actor writes places to the dataset and includes run diagnostics for troubleshooting and performance review.

### Example input with add-ons

```json
{
  "searchStringsArray": ["restaurants"],
  "locationQuery": "New York, New York, USA",
  "maxCrawledPlacesPerSearch": 1000,
  "language": "en",
  "countryCode": "US",
  "placeCategories": ["Restaurant"],
  "website": "withWebsite",
  "skipClosedPlaces": true,
  "scrapePlaceDetailPage": true,
  "scrapeCompanyContacts": true,
  "maxReviews": 5,
  "reviewsSort": "newest",
  "maxImages": 3
}
```

### Example output

```json
{
  "title": "Example Restaurant",
  "categoryName": "Restaurant",
  "categories": ["Restaurant"],
  "address": "123 Example St, New York, NY 10001, USA",
  "city": "New York",
  "state": "NY",
  "countryCode": "US",
  "website": "https://example-restaurant.com/",
  "phone": "+1 212-555-0100",
  "emails": ["hello@example-restaurant.com"],
  "facebooks": ["https://www.facebook.com/example"],
  "totalScore": 4.6,
  "reviewsCount": 248,
  "reviewsScraped": 5,
  "reviewsFetchStatus": "ok",
  "reviewsFetchMethod": "rpc",
  "imagesCount": 12,
  "images": ["https://lh3.googleusercontent.com/..."],
  "imageFetchStatus": "ok",
  "imageFetchMethod": "payload",
  "location": {
    "lat": 40.7128,
    "lng": -74.006
  },
  "placeId": "ChIJ...",
  "cid": "1234567890",
  "url": "https://www.google.com/maps/place/?q=place_id:ChIJ...",
  "searchString": "restaurants",
  "rank": 1,
  "scrapedAt": "2026-05-31T00:00:00.000Z"
}
```

The example uses placeholder business data. Real output depends on the selected inputs, Google Maps availability, and enabled add-ons.

### Export, dataset views, and API access

Results are saved to an Apify Dataset and can be exported in formats such as JSON, CSV, Excel, XML, RSS, or accessed through the Apify API.

The output schema includes focused dataset views for common workflows:

- `Overview`: core lead export fields.
- `Contact info`: address, phone, website, and coordinates.
- `Place details`: extra Google Maps detail fields.
- `Website contacts`: public emails, phones, and social links from business websites.
- `Social media`: social profile URLs discovered from websites.
- `Rating`: ratings, review counts, and rating distribution.
- `Reviews`: extracted Google Maps reviews and review-fetch diagnostics.
- `Images`: main image, additional image URLs, and image-fetch diagnostics.
- `Lead Enrichment`: lead-style export fields grouped from the scraped place and contact data.
- `All fields`: complete place records.

Use the Apify API when you want to run the Google Maps Scraper from code, schedule repeated runs, connect results to another system, or download dataset items programmatically.

### Output field reference

The dataset schema is stable for common exports. Fields may be `null`, empty arrays, or absent inside nested objects when Google Maps or the business website does not provide that data.

#### Core place fields

| Field | Meaning |
| --- | --- |
| `title` | Place name. |
| `subTitle` | Secondary title shown by Google Maps. |
| `description` | Short place description when available. |
| `price` | Price level or price range. |
| `categoryName` | Primary Google Maps category. |
| `categories` | All visible Google Maps categories. |
| `rank` | Result rank within the search source. |
| `isAdvertisement` | Whether Google marked the result as an ad. |
| `scrapedAt` | ISO timestamp when the place was scraped. |

#### Address and geolocation fields

| Field | Meaning |
| --- | --- |
| `address` | Full formatted address. |
| `neighborhood` | Neighborhood or locality label. |
| `street` | Street address. |
| `city` | City. |
| `postalCode` | Postal code. |
| `state` | State, province, or region. |
| `countryCode` | ISO country code. |
| `location` | Latitude and longitude object. |
| `plusCode` | Google Maps plus code. |
| `locatedIn` | Parent place, mall, building, or venue. |
| `floor` | Floor inside a venue when available. |

#### Contact and lead fields

| Field | Meaning |
| --- | --- |
| `website` | Business website URL. |
| `phone` | Formatted phone number. |
| `phoneUnformatted` | Normalized phone number when available. |
| `emails` | Public email addresses found on the business website when website contacts enrichment is enabled. |
| `additionalPhones` | Additional phone numbers found on the business website. |
| `facebooks` | Facebook profile or page URLs found on the business website. |
| `instagrams` | Instagram profile URLs found on the business website. |
| `linkedIns` | LinkedIn profile or company URLs found on the business website. |
| `twitters` | X/Twitter profile URLs found on the business website. |
| `youtubes` | YouTube channel or profile URLs found on the business website. |
| `tiktoks` | TikTok profile URLs found on the business website. |

#### Rating, status, and review fields

| Field | Meaning |
| --- | --- |
| `totalScore` | Average Google rating. |
| `reviewsCount` | Number of Google reviews. |
| `reviewsDistribution` | Rating distribution by star value. |
| `reviewsTags` | Review summary tags when available. |
| `reviews` | Extracted Google Maps reviews when the reviews add-on is enabled. |
| `reviewsScraped` | Number of reviews extracted for this place. |
| `reviewsFetchStatus` | Review extraction status. |
| `reviewsFetchMethod` | Method used to fetch reviews, such as `rpc`, `ui`, or `none`. |
| `reviewsDateFilterStatus` | Best-effort status for review date filtering. |
| `permanentlyClosed` | Whether the place is permanently closed. |
| `temporarilyClosed` | Whether the place is temporarily closed. |
| `claimThisBusiness` | Whether Google shows the business as claimable. |

#### Image fields

| Field | Meaning |
| --- | --- |
| `imageUrl` | Main image URL from the base Google Maps result when available. |
| `images` | Additional Google Maps image URLs when the images add-on is enabled. |
| `imagesCount` | Number of visible Google Maps images when available. |
| `imageFetchStatus` | Image extraction status. |
| `imageFetchMethod` | Method used to fetch additional images, such as `payload`, `ui`, or `none`. |
| `imageAuthorsStatus` | Best-effort status for image author extraction. |
| `imageCategories` | Image categories when available. |

#### Extra detail fields

| Field | Meaning |
| --- | --- |
| `openingHours` | Regular opening hours. |
| `additionalOpeningHours` | Additional opening-hour groups. |
| `popularTimesLiveText` | Live popular-times text. |
| `popularTimesLivePercent` | Live popular-times percentage. |
| `popularTimesHistogram` | Popular-times histogram. |
| `menu` | Menu URL. |
| `servicesLink` | Services URL. |
| `reserveTableUrl` | Reservation URL. |
| `googleFoodUrl` | Food ordering URL. |
| `peopleAlsoSearch` | Related places shown by Google Maps. |
| `placesTags` | Place tags shown by Google Maps. |
| `gasPrices` | Gas prices when available. |
| `hotelStars` | Hotel star rating when available. |
| `hotelDescription` | Hotel description when available. |
| `checkInDate` | Hotel check-in date when available. |
| `checkOutDate` | Hotel check-out date when available. |
| `hotelAds` | Hotel ads when available. |
| `additionalInfo` | Nested add-on data, including `companyContacts`, `webResults`, `insidePlaces`, review metadata, and image lists when enabled. |

#### Google identifier and source fields

| Field | Meaning |
| --- | --- |
| `placeId` | Google Place ID. |
| `cid` | Google Maps customer ID. |
| `fid` | Google Maps feature ID. |
| `kgmid` | Google Knowledge Graph ID when available. |
| `url` | Google Maps URL for this place. |
| `searchPageUrl` | Google Maps search URL that produced this result. |
| `searchPageLoadedUrl` | Loaded Google Maps search URL. |
| `searchString` | Search term or source query. |
| `language` | Google Maps language code used for the run. |

### Performance and cost tips

- Use a specific search term and location. `dentist in Berlin` is usually better than `businesses in Germany`.
- Set `maxCrawledPlacesPerSearch` to control the run size for each search term or URL.
- Keep add-ons disabled unless you need their fields. Base Google Maps place scraping is faster than enrichment.
- Use `website: "withWebsite"` before enabling website contacts to avoid crawling places without websites.
- Use `strictLocationBounds` when you need places to stay inside a custom or resolved area.
- For all-visible-place scraping, choose a realistic area and zoom. Higher zoom can reveal more pins but may take longer.

### Limitations

- Google Maps can return similar, sponsored, nearby, or broad-tail results. The relevance filter helps, but raw Google output may still vary by location, language, and session.
- Some Google Maps fields are missing for some places. Missing fields are returned as `null`, empty arrays, or omitted nested values depending on the field.
- Reviews, images, web results, inside places, popular times, reservation links, and order links are best-effort.
- Review date filtering is best-effort and may be affected by localized or relative review dates.
- Website contacts depend on each business website, public pages, crawl limits, redirects, and blocking.
- All visible places mode is intended for concrete selected areas, not whole countries or vague global searches.
- This actor scrapes public Google Maps and website data. Make sure your use case follows applicable laws, platform terms, and privacy rules.

### FAQ

#### Can I scrape Google Maps reviews?

Yes. Set `maxReviews` to the number of reviews per place you want to extract. The actor returns review data in `reviews`, with diagnostics such as `reviewsScraped`, `reviewsFetchStatus`, `reviewsFetchMethod`, and `reviewsDateFilterStatus`.

#### Can I extract emails from Google Maps businesses?

Google Maps usually does not expose emails directly. Enable `scrapeCompanyContacts` to crawl each business website and extract public emails, extra phone numbers, and social links when they are available.

#### Can I scrape Google Maps by Place ID?

Yes. Add Google Place IDs to `placeIds`. You can also provide Google Maps URLs in `startUrls`.

#### Can I filter by category, rating, website, or closed status?

Yes. Use `placeCategories`, `customPlaceCategories`, `minStars`, `website`, and `skipClosedPlaces`. The actor includes 3,968 predefined category presets plus custom category matching.

#### Can I scrape all visible places in an area?

Yes. Use `allPlacesNoSearchAction` with a concrete location or custom search area. This mode is for area-based discovery when you do not want a business category search.

#### Is this provided by Google?

No. This is an Apify actor for scraping publicly available Google Maps data. It is not provided by Google.

#### How do I reduce irrelevant similar results?

Use a specific search term, add category filters when appropriate, and narrow the location. The actor also applies a relevance filter by default to reduce broad Google Maps tail results.

#### What should I enable for lead generation?

Start with search terms, a specific location, `website: "withWebsite"`, and `scrapeCompanyContacts`. Add reviews, images, or place details only when your workflow needs those fields.

#### Can I use this as a Google Maps scraper API?

Yes. Run the actor through the Apify API and read results from the dataset API. This is useful for scheduled lead generation, CRM enrichment, reporting pipelines, and internal data tools.

#### Can I scrape multiple business categories?

Yes. Add multiple values to `searchStringsArray`, select multiple `placeCategories`, or use custom category filters. Each search term has its own target, and results are deduplicated by Google identifiers when possible.

#### Can I scrape business contacts and social media links?

Yes, when the business has a website and public contact pages are reachable. Enable `scrapeCompanyContacts` to extract public emails, additional phone numbers, and links to Facebook, Instagram, LinkedIn, X/Twitter, YouTube, and TikTok profiles.

# Actor input Schema

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

Type what you would normally search for in Google Maps, for example bike repair shop, dentist, pet shelter, or English breakfast. Use one clear term per row for better speed and coverage.

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

Location context for all search terms, for example New York, USA or Berlin, Germany. For a specific business, keep the business name in Search term(s) and the city/country here.

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

Target number of places for each search term or Google Maps URL. Example: 10 search terms and 250 here means up to 2,500 places total. If fewer places exist in the area, the actor returns all places it can find.

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

Results details will show in this language when Google Maps provides localized text.

## `placeCategories` (type: `array`):

Optional paid category filter applied after Google Maps returns places. Choose one or more known Google Business Profile categories. For rare or new categories not listed here, use Custom place categories below.

## `customPlaceCategories` (type: `array`):

Optional free-text category filter for categories missing from the predefined list. Values are matched against categoryName and categories.

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

Paid name matching filter. Leave the default to scrape all places returned by Google Maps.

## `minStars` (type: `string`):

Paid rating filter. Only save places with this rating or higher.

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

Paid website availability filter.

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

Paid status filter. Skip places that appear temporarily or permanently closed.

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

Adds detail fields that Google Maps exposes for a place, such as opening hours, plus code, located-in, menu/services links, refined phone/address/category data, and review count. This runs after base collection and uses a fast details payload first.

## `scrapeTableReservationProviderData` (type: `boolean`):

Save reservation provider URLs, such as OpenTable, Resy, SevenRooms, Tock, or Google Reserve, when Google exposes them for the place.

## `scrapeOrderOnlineWidgetData` (type: `boolean`):

Save food ordering URLs or Google food/order links when Google exposes them for restaurants and similar businesses.

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

Save external links found in the Google Maps detail payload, such as menu, booking, event, post, and other business-related result links. Google-owned utility links are filtered out.

## `scrapeInsidePlaces` (type: `boolean`):

Save places located inside a larger venue, mall, airport, station, or building when Google exposes this relationship.

## `scrapeCompanyContacts` (type: `boolean`):

Visit each business website after places are collected and extract public emails, phone numbers, and social profile links from the homepage plus a small set of contact/about/team/impressum pages.

## `maxReviews` (type: `integer`):

Extract up to this many Google Maps reviews per place. Reviews are collected after base places are saved, using the fast Google reviews endpoint first.

## `reviewsStartDate` (type: `string`):

Optional YYYY-MM-DD date. The filter is applied when Google returns a parseable review timestamp; reviews with only relative dates are kept as best-effort instead of being dropped blindly.

## `reviewsSort` (type: `string`):

Ask Google's reviews endpoint for this order before extraction.

## `reviewsFilterString` (type: `string`):

Only save extracted reviews whose text contains this keyword string. Leave empty to keep all fetched reviews.

## `reviewsOrigin` (type: `string`):

Compatibility option for review source selection. Google Maps currently exposes Google-rendered reviews through this fast extraction path, so both options use the same source.

## `scrapeReviewsPersonalData` (type: `boolean`):

Include reviewer name, profile URL, photo URL, and extra profile info when Google exposes them. Turn this off when you only need review text, rating, and date.

## `maxImages` (type: `integer`):

Extract up to this many additional Google Maps image URLs per place. The main image is already saved in imageUrl during base collection when Google provides it.

## `scrapeImageAuthors` (type: `boolean`):

Include image author or alt text when Google exposes it. Fast payload images usually contain URLs only, so author data is best-effort and may require the optional gallery fallback.

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

Optional country used for structured search area and Google Maps region bias. Free-text Location has priority when it is filled.

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

Optional city used to build the search area when the main Location field is empty.

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

Optional state, province, or region used to build the search area when the main Location field is empty.

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

Optional county or district used to build the search area when the main Location field is empty.

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

Optional postal or ZIP code used to build the search area when the main Location field is empty.

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

Optional GeoJSON-like custom area. Use longitude, latitude coordinate order. Supports polygon-like coordinate lists and circle-style point/radius inputs when provided by the Apify form.

## `strictLocationBounds` (type: `boolean`):

Filter out places whose coordinates are outside the geocoded or custom search area. Keep this on for bounded area runs.

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

Paste Google Maps search URLs or place URLs copied from google.com/maps or the Google Maps app share dialog. URL sources run before normal search terms. Search URLs can return multiple places; direct place URLs return one place when Google exposes the place payload. In API JSON, pass items as objects, for example \[{"url":"https://www.google.com/maps/..."}].

## `placeIds` (type: `array`):

Paste Google Place IDs, one per row, for example ChIJN1t\_tDeuEmsRUsoyG83frY4. The actor also accepts values prefixed with place\_id: and can extract query\_place\_id from Google Maps URLs pasted here.

## `allPlacesNoSearchAction` (type: `string`):

Use only when you do not provide Search terms, Google Maps URLs, or Place IDs. Requires a concrete Search area above: Location, city/state/postal fields, or a custom area. Country-only is too broad for this mode.

## `allPlacesZoom` (type: `integer`):

Optional zoom override for All visible places mode. Leave 0 for automatic zoom based on area size. Higher zoom can expose more local pins but can take longer. Typical useful values are 14 to 17.

## Actor input object example

```json
{
  "searchStringsArray": [
    "bike repair shop"
  ],
  "locationQuery": "Portland, Oregon, USA",
  "maxCrawledPlacesPerSearch": 25,
  "language": "en",
  "searchMatching": "all",
  "minStars": "0",
  "website": "allPlaces",
  "skipClosedPlaces": false,
  "scrapePlaceDetailPage": false,
  "scrapeTableReservationProviderData": false,
  "scrapeOrderOnlineWidgetData": false,
  "includeWebResults": false,
  "scrapeInsidePlaces": false,
  "scrapeCompanyContacts": false,
  "maxReviews": 0,
  "reviewsSort": "newest",
  "reviewsOrigin": "all",
  "scrapeReviewsPersonalData": false,
  "maxImages": 0,
  "scrapeImageAuthors": false,
  "countryCode": "US",
  "strictLocationBounds": true,
  "allPlacesNoSearchAction": "",
  "allPlacesZoom": 0
}
```

# Actor output Schema

## `results` (type: `string`):

Google Maps place records saved to the default dataset.

## `summary` (type: `string`):

Run-level diagnostics, including saved count, exhaustion reason, selected add-ons, and PPE budget details.

# 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": [
        "bike repair shop"
    ],
    "locationQuery": "Portland, Oregon, USA",
    "maxCrawledPlacesPerSearch": 25,
    "language": "en",
    "countryCode": "US"
};

// Run the Actor and wait for it to finish
const run = await client.actor("x_guru/google-maps-scraper").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": ["bike repair shop"],
    "locationQuery": "Portland, Oregon, USA",
    "maxCrawledPlacesPerSearch": 25,
    "language": "en",
    "countryCode": "US",
}

# Run the Actor and wait for it to finish
run = client.actor("x_guru/google-maps-scraper").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": [
    "bike repair shop"
  ],
  "locationQuery": "Portland, Oregon, USA",
  "maxCrawledPlacesPerSearch": 25,
  "language": "en",
  "countryCode": "US"
}' |
apify call x_guru/google-maps-scraper --silent --output-dataset

```

## MCP server setup

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

```

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/kLdarP5qiTvc9CwtP/builds/UmN4chKIphEgd3ZIf/openapi.json
