# Google Maps Scraper - Business Data, Reviews & Leads (`buff_pineapple/google-maps-scraper`) Actor

Scrape Google Maps business listings without an API key — name, address, phone, website, rating, reviews, photos, hours, amenities & GPS. Precision targeting (batch, map URLs, custom area) + optional add-ons: emails, socials, contacts & ad intelligence. Export to CSV, Excel & JSON.

- **URL**: https://apify.com/buff\_pineapple/google-maps-scraper.md
- **Developed by:** [yossef Nagy](https://apify.com/buff_pineapple) (community)
- **Categories:** Lead generation, Business, Developer tools
- **Stats:** 311 total users, 57 monthly users, 96.3% runs succeeded, 4 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 — Places, Leads, Reviews & Contact Data

Extract business data from Google Maps at scale — **names, addresses, phone numbers, websites, ratings, reviews, photos, opening hours, amenities, coordinates and more** — for any type of business in any location. No browser required: the Actor talks to Google Maps' internal endpoints directly over HTTP, so it's fast and cheap.

It also ships powerful, optional layers: **precise targeting** (batch queries, map URLs, or a drawn area), **deep reviews**, **complete place data**, plus experimental **lead enrichment** (emails, socials, people/contacts) and **ad intelligence** (is the business advertising on Meta / Google right now?).

***

### What does it do?

1. **Searches Google Maps** for your query and covers the whole area with a **grid search**, finding businesses that a single search page misses.
2. **Extracts a clean record** for every business — the full place profile.
3. **Optionally enriches** each business with deeper place data, full reviews, website contact data, the people who work there, and live ad-spend signals.

***

### Features

- 🗺️ **Comprehensive place data** — name, address, phone, website, rating, review count, category list, coordinates, opening hours, price level, **photos, amenities, Plus Code, permanently-closed status**.
- 🎯 **Precise targeting** — search by a plain query, a **batch of queries**, **Google Maps URLs**, or a **custom area** (lat/lng + radius, or a GeoJSON polygon).
- ⭐ **Deep reviews** — review text, rating, date, author, **owner responses, reviewer stats, language, review photos**, plus **rating / keyword filters**.
- 📩 **Lead enrichment (experimental)** — emails (MX-validated) and social profiles harvested from each business's own website.
- 👤 **People / contacts (experimental)** — the actual people at a business with their own name, title, email, phone and LinkedIn.
- 📣 **Ad intelligence (experimental)** — detect which businesses are **actively running ads** on Meta (Facebook/Instagram) and Google (Search/YouTube/Display), with sample creatives.
- ⚡ **No browser** — pure HTTP, residential proxy by default, automatic IP rotation and retry; built to keep running against Google's defenses.

***

### Quick start

Just enter what you'd type in the Google Maps search box — **include the location**:

```
restaurants in New York
```

```
dentists in Miami, FL
```

```
coffee shops 90210
```

That's it. Everything else has a sensible default. Turn on the optional layers below only when you need them.

***

### Targeting (how to choose what to scrape)

You can target in four ways — use whichever fits:

| Input | Use it for |
|-------|-----------|
| `query` | A single search, e.g. `plumbers in Chicago`. The location is auto-detected. |
| `searchQueries` | A **batch** of searches in one run, e.g. `["dentists in Miami", "dentists in Orlando"]`. Results are de-duplicated across queries. |
| `startUrls` | Direct **Google Maps URLs** (place or search URLs). |
| `customGeolocation` | A **custom area** — either a point + radius `{ "lat": 25.77, "lng": -80.19, "radiusMeters": 1500 }` or a GeoJSON `Polygon` / `MultiPolygon` (coordinates in `[lng, lat]` order). |

If you provide an advanced targeting input you can leave `query` empty.

***

### Output

Each business is one dataset item. Base fields (always present when `Include Place Details` is on):

```json
{
  "name": "Joe's Pizza",
  "address": "7 Carmine St, New York, NY 10014",
  "phone": "+1 212-366-1182",
  "website": "https://www.joespizzanyc.com/",
  "rating": 4.5,
  "reviews_count": 12847,
  "category": "Pizza restaurant",
  "categories": ["Pizza restaurant", "Italian restaurant"],
  "latitude": 40.7304,
  "longitude": -74.0022,
  "place_id": "ChIJr3k0v6VZwokRPCxBJnIcdTA",
  "google_maps_url": "https://www.google.com/maps/place/?q=place_id:ChIJr3k0v6VZwokRPCxBJnIcdTA",
  "hours": { "monday": "10 AM-2 AM", "tuesday": "10 AM-2 AM" },
  "price_level": "$10-20",
  "photos": ["https://lh3.googleusercontent.com/..."],
  "amenities": ["Outdoor seating", "Takeout", "Wheelchair accessible entrance"],
  "plus_code": "76QXQR66+RC"
}
```

Additional fields appear when the matching option is enabled: `reviews`, `permanently_closed`, `popular_times`, `found_via` (which target produced the row), the lead-enrichment columns (`email`, `emails`, `facebook` … `whatsapp`, `website_reachable`), the people columns (`business_lead`, `contacts`), and the ad-intelligence columns (`meta_ads_*`, `google_ads_*`). Anything not found is `null` — the base scrape is never affected.

***

### Input reference

#### Results & detail

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `maxResults` | integer | 100 | Max businesses to extract (0 = unlimited). |
| `language` | string | `en` | Two-letter result language (Google `hl`). |
| `zoom` | integer | 13 | Search granularity (1–21). Lower = wider area, higher = more detail. |
| `includeDetails` | boolean | true | Fetch full place details (hours, phone, website, price level, photos…). |

#### Complete place data

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `includePhotos` | boolean | true | Include up to 10 photo URLs per place. |
| `includePlaceExtras` | boolean | true | Include amenities, Plus Code and permanently-closed status. |
| `includePopularTimes` | boolean | false | Include the weekly popular-times histogram when available (experimental). |

#### Reviews

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `includeReviews` | boolean | false | Extract reviews for each business. |
| `reviewsLimit` | integer | 5 | Max reviews per business (up to 1000). |
| `minReviewRating` | integer | 0 | Keep only reviews rated ≥ this (1–5; 0 = off). |
| `reviewKeyword` | string | — | Keep only reviews whose text contains this keyword. |
| `reviewsSort` | select | newest | `newest` or `relevant`. |

Each review includes `author`, `rating`, `date`, `text`, `review_id`, `author_photo`, plus (when present) `owner_response_text`, `owner_response_date`, `reviewer_review_count`, `reviewer_is_local_guide`, `review_language` and `review_images`.

#### Lead enrichment (experimental add-on)

Visits each business's **own website** (plus contact/about/imprint pages) to extract contact data. Off by default; never changes the base scrape.

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `includeEmails` | boolean | false | Find email addresses (deduplicated and MX-validated). |
| `includeSocials` | boolean | false | Find social profiles (Facebook, Instagram, LinkedIn, X/Twitter, YouTube, TikTok, WhatsApp). |
| `emailOnly` | boolean | false | Keep only businesses with an email (implies `includeEmails`). |
| `socialOnly` | boolean | false | Keep only businesses with a social profile (implies `includeSocials`). |
| `onlyWithWebsite` | boolean | false | Keep only businesses that have a real website. |
| `onlyWithoutWebsite` | boolean | false | Keep only businesses **without** a website (prospects for web/design agencies). |
| `maxPagesPerSite` | integer | 4 | Advanced: max pages crawled per website (1–10). |

#### People / contacts (experimental add-on)

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `includePersonnel` | boolean | false | Extract the people at each business (name, title, their own email/phone/LinkedIn). |
| `maxContactsPerBusiness` | integer | 10 | Max contacts per business (highest-confidence first). |
| `personnelMinConfidence` | select | low | Drop contacts below this tier (`low`/`medium`/`high`). |
| `onlyWithPersonnel` | boolean | false | Keep only businesses with at least one contact. |

Each business gains `business_lead` (org-level email/phone/socials) and `contacts[]` (people with `name`, `title`, `email`, `phone`, `linkedin`, `confidence`, `tier`, `source_urls`).

#### Ad intelligence (experimental add-on)

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `includeMetaAds` | boolean | false | Check the Meta Ad Library — is the business running Facebook/Instagram ads? With sample creatives. |
| `includeGoogleAds` | boolean | false | Check the Google Ads Transparency Center — is it running Search/YouTube/Display ads? |
| `onlyRunningAds` | boolean | false | Keep only businesses currently running ads. |
| `adCountry` | string | US | Two-letter country code for where the ads are shown (applies to both sources). |

#### Proxy

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `proxyConfiguration` | object | Apify Residential | Recommended — Google blocks datacenter IPs on Maps. Leave as-is. |
| `proxyUrl` | string | — | Advanced: a single custom HTTP proxy used instead of Apify Proxy. |

***

### Recipes

**Web-design leads (businesses with no website):**

```json
{ "query": "restaurants in Austin, TX", "onlyWithoutWebsite": true, "includePersonnel": true }
```

**Warm leads — businesses advertising right now, with their contacts:**

```json
{ "query": "dentists in Miami, FL", "includeMetaAds": true, "includeGoogleAds": true,
  "onlyRunningAds": true, "includeEmails": true, "includePersonnel": true }
```

**Reputation / review mining (5★ reviews mentioning a topic):**

```json
{ "query": "hotels in Paris", "includeReviews": true, "reviewsLimit": 50,
  "minReviewRating": 5, "reviewKeyword": "breakfast" }
```

**Whole-area sweep with a custom radius:**

```json
{ "query": "gyms", "customGeolocation": { "lat": 34.0522, "lng": -118.2437, "radiusMeters": 5000 } }
```

***

### Tips

- **Include a location** in your query (`plumbers in Chicago`); plain phrases like `plumbers Chicago` or `coffee 90210` also work.
- **Keep the residential proxy** — Google blocks datacenter IPs on Maps search.
- **Start with a small `maxResults`** to test, then scale up.
- The optional enrichment / ad-intelligence layers add run time and are **off by default** — they never change the base scrape.

### Limitations

- Results depend on what Google Maps returns for your query and location; some businesses have incomplete data.
- `popular_times` is experimental and not available for every place.
- The Google Ads Transparency Center does not expose the text of search ads (only creative previews/metadata).
- For ad lookups outside the US, set `adCountry` to the business's country (e.g. `GB`, `DE`) for accurate results.

### Frequently asked questions

#### Do I need a Google Maps API key?

No. This is a scraper, not the Google Places API — there is no API key, no OAuth and no Google Cloud project. It talks to Google Maps' public endpoints over HTTP, so you just enter a search query and run it.

#### Can it scrape emails and contact details from Google Maps?

Yes, with the optional experimental add-ons. Turn on `includeEmails`, `includeSocials` or `includePersonnel` and the Actor visits each business's own website to find emails (MX-validated), social profiles and the people who work there. Off by default and billed separately.

#### Does it extract Google Maps reviews?

Yes. Enable `includeReviews` to pull review text, author, rating, date and owner responses, with `reviewsLimit`, `minReviewRating` and `reviewKeyword` filters. Reviews are an optional layer — the base place scrape runs without them.

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

The Actor reads only Google's public, unauthenticated listings — the same data any visitor sees. Scraping public data is broadly treated as lawful (e.g. hiQ v. LinkedIn), and Google's Terms are civil, not criminal. Use the output within applicable privacy laws.

#### How many businesses can I get from one search?

The Actor runs a grid search over the whole area, so it finds far more places than a single Google Maps page (which caps out quickly). Set `maxResults` to your target (0 = unlimited), and split very dense areas with a custom area or batch queries.

#### How is this different from the Google Places API?

No API key, no OAuth and no per-call quota. Pricing is simple pay-per-result, and the grid search returns more places than the API's per-search cap. You also get optional reviews, emails, contacts and ad intelligence the API does not provide.

#### Can I scrape a custom area, radius or Google Maps URL?

Yes. Target with a single `query`, a batch of `searchQueries`, direct Google Maps `startUrls`, or a `customGeolocation` (point + radius, or a GeoJSON polygon). Use whichever fits — leave `query` empty when using advanced targeting.

#### Can I find businesses without a website, or ones running ads?

Yes — both are built for agencies. Use `onlyWithoutWebsite` to find web-design prospects, and the ad-intelligence add-ons (`includeMetaAds`, `includeGoogleAds`, `onlyRunningAds`) to keep only businesses currently advertising on Meta or Google.

#### What formats can I export to?

Every run saves to an Apify dataset you can download as CSV, Excel (XLSX), JSON, JSONL or HTML, or pull via the Apify API and the official Python / JavaScript clients — ready for spreadsheets, CRMs and data pipelines.

### Other Actors by buff\_pineapple

- **[Google Reviews Scraper](https://apify.com/buff_pineapple/google-reviews-scraper)** — every Google Maps review for a place, with reviewer details and owner replies.
- **[Meta Ad Library Scraper](https://apify.com/buff_pineapple/meta-ad-library-scraper)** — spy on Facebook & Instagram ads (creatives, spend, landing pages), no login.
- **[Yelp Scraper](https://apify.com/buff_pineapple/yelp-scraper)** — Yelp business profiles and reviews.
- **[Trustpilot Reviews Scraper](https://apify.com/buff_pineapple/trustpilot-reviews-scraper)** — every Trustpilot review plus the company TrustScore.
- **[Shopify Store Leads Scraper](https://apify.com/buff_pineapple/shopify-store-leads-scraper)** — detect Shopify stores and pull product + contact leads.
- **[Zillow Listings Scraper](https://apify.com/buff_pineapple/zillow-listings-scraper)** — homes for sale, rent and sold with full details.
- **[TikTok Top Ads Scraper](https://apify.com/buff_pineapple/tiktok-top-ads-scraper)** — TikTok Creative Center top-ads intelligence.

### Privacy & anonymous usage information

This Actor records a small amount of **anonymous, aggregate usage information** so the maintainer can understand which features are used and keep the Actor reliable. At the end of a run it may record, in the run's own storage on the Apify platform: the run ID, build number, run status/outcome, how the run was started, the number of results collected / pushed / filtered / skipped, and which optional features (reviews, emails, socials, personnel, ad-intelligence, etc.) were enabled, plus non-personal numeric settings (such as the result limit, reviews limit, language, and ad country).

**What is never recorded:** your search query, your geolocation or targeting inputs, any scraped business data or contact details, your account identity, or your IP address / user-agent. The account ID, if present, is reduced to a one-way, salted, non-reversible hash so distinct runs can be counted without identifying anyone. This information consists solely of run metadata and counters and is **stored on the Apify platform — it is not transmitted to any external service.** The same per-feature usage is also reflected in the Actor's standard pay-per-event billing line items. The recording is best-effort and fail-open: if it cannot be written, your run proceeds normally and is never slowed or affected.

# Actor input Schema

## `query` (type: `string`):

What to search for on Google Maps — exactly what you'd type in the search box. Works best as "<category> in <location>", e.g. "restaurants in New York" or "dentists in Miami". Plain phrases like "coffee shops Seattle" or "plumbers 90210" also work — the location is detected automatically. You can also leave this empty and use the Advanced targeting options below (batch queries, Google Maps URLs, or a custom area).

## `searchQueries` (type: `array`):

Run several searches in one go — one query per line. Each is run through the full pipeline and results are merged and de-duplicated by place. Example: \["dentists in Miami", "orthodontists in Miami", "dental clinics Fort Lauderdale"]. Leave empty to use the single Search Query above.

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

Scrape from Google Maps URLs (best-effort). A PLACE url (with a place feature id) fetches that single business. A SEARCH url (e.g. .../maps/search/...) re-runs that query. URLs that can't be parsed are skipped with a warning. Accepts plain URLs or {"url": "..."} objects.

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

Search an EXACT area without geocoding a place name. Provide either a point + radius: {"lat": 40.7128, "lng": -74.006, "radiusMeters": 3000}, or a GeoJSON geometry: {"type": "Polygon", "coordinates": \[\[\[lng,lat],...]]} (Polygon, MultiPolygon or Point supported). The search category comes from the Search Query field above. The area's bounding box is gridded directly.

## `maxResults` (type: `integer`):

Maximum number of businesses to extract. Set to 0 for unlimited (collect everything found).

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

Two-letter language code for result text, e.g. en, es, fr, de, it, pt, ja.

## `zoom` (type: `integer`):

Google Maps zoom level (1-21). Lower values cover a larger area with less detail; higher values cover a smaller area with more detail. 13 is a good default for city-level searches.

## `includeDetails` (type: `boolean`):

Fetch detailed info for each business (hours, phone, website, amenities). Slower but more complete.

## `includePhotos` (type: `boolean`):

Add a 'photos' array of up to 10 business photo URLs (from the place-details response). Requires 'Include Place Details' to be on.

## `includePlaceExtras` (type: `boolean`):

Add 'amenities' (attribute strings), 'plus\_code' (Google Plus Code) and 'permanently\_closed' (boolean). Best-effort — fields are null when not present in Google's response. Requires 'Include Place Details'.

## `includePopularTimes` (type: `boolean`):

EXPERIMENTAL / rarely available. Attempts to extract the weekly 'popular\_times' busy histogram. Google's HTTP place endpoint almost never includes this data (it is normally loaded by a separate browser-only request), so in practice 'popular\_times' is null for virtually all places. Kept for forward-compatibility; do not rely on it. Off by default. Requires 'Include Place Details'.

## `includeReviews` (type: `boolean`):

Fetch reviews for each business. Increases run time and cost.

## `reviewsLimit` (type: `integer`):

Maximum number of reviews to fetch per business (only used when Include Reviews is enabled).

## `minReviewRating` (type: `integer`):

Keep only reviews rated at or above this many stars (1-5). Applied after fetching. 0 = keep all ratings (off). Reviews with no rating are always kept.

## `reviewKeyword` (type: `string`):

Keep only reviews whose text contains this phrase (case-insensitive substring). Applied after fetching. Leave empty to keep all reviews. Example: 'refund', 'rude', 'clean'.

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

Review ordering. Reviews are returned in Google's default order, which is 'Most relevant' first. Note: Google's HTTP review endpoint does not reliably expose a separate strict-newest ordering, so both options currently return the most-relevant order.

## `includeEmails` (type: `boolean`):

EXPERIMENTAL / BETA. Optional lead-enrichment add-on. Visits each business website (plus its contact / about / imprint pages) and extracts email addresses. Adds run time and is billed separately, per enriched lead. Off by default — the base scraper is unaffected.

## `includeSocials` (type: `boolean`):

EXPERIMENTAL / BETA. Optional lead-enrichment add-on. Extracts social profile links (Facebook, Instagram, LinkedIn, X/Twitter, YouTube, TikTok, WhatsApp) from each business website. Adds run time and is billed separately, per enriched lead. Off by default.

## `emailOnly` (type: `boolean`):

Filter: only output businesses for which at least one email address was found. Automatically enables email finding.

## `socialOnly` (type: `boolean`):

Filter: only output businesses for which at least one social profile was found. Automatically enables social profile finding.

## `onlyWithWebsite` (type: `boolean`):

Filter: only output businesses that have a real website (excludes those with only a social page, a directory listing, or no site at all).

## `onlyWithoutWebsite` (type: `boolean`):

Filter: only output businesses that do NOT have a real website — prime prospects for web-design and digital agencies.

## `maxPagesPerSite` (type: `integer`):

Advanced: max pages to crawl on each business website during lead/people enrichment (home + contact/about/team pages). Higher finds more contacts but is slower. Defaults to 4 (auto-raised to 6 when 'Find People / Contacts' is on).

## `includePersonnel` (type: `boolean`):

EXPERIMENTAL / BETA. Optional lead-enrichment add-on. Visits each business website and extracts the PEOPLE who work there — name, title, and their own email / phone / LinkedIn where published — as a 'contacts' list, plus a structured 'business\_lead'. Only the business's own site is used. Off by default.

## `maxContactsPerBusiness` (type: `integer`):

Maximum personnel contacts to output per business (highest-confidence first). Only used when 'Find People / Contacts' is enabled.

## `personnelMinConfidence` (type: `string`):

Drop personnel contacts below this confidence tier. 'low' keeps everything (recall-first); raise to 'medium' or 'high' for precision. Only used when 'Find People / Contacts' is enabled.

## `onlyWithPersonnel` (type: `boolean`):

Filter: only output businesses for which at least one personnel contact was found. Automatically enables 'Find People / Contacts'.

## `includeMetaAds` (type: `boolean`):

EXPERIMENTAL / BETA. Ad-intelligence add-on. Checks the public Meta Ad Library (https://www.facebook.com/ads/library) for each business and reports whether they are actively running ads on Facebook / Instagram — plus the active-ad count and a few sample creatives (call-to-action, landing page, ad copy). A strong buy signal for agencies. Matches conservatively on the business's Facebook page / website domain / name, so unrelated advertisers are not falsely attributed. Adds run time, uses residential proxy, billed separately per matched advertiser. Off by default.

## `includeGoogleAds` (type: `boolean`):

EXPERIMENTAL / BETA. Ad-intelligence add-on. Checks the public Google Ads Transparency Center (https://adstransparency.google.com) for each business website and reports whether they are actively running ads on Google — Search, YouTube and Display — plus the advertiser name, ad count, when ads were last shown, and sample creatives. Matched exactly on the business's own website domain, so attribution is precise. Adds run time, billed separately per matched advertiser. Off by default.

## `onlyRunningAds` (type: `boolean`):

Filter: only output businesses that are actively running ads. If neither 'Find Meta Ads' nor 'Find Google Ads' is selected, both are checked; otherwise only the selected source(s). Keeps any business currently advertising on an enabled platform.

## `adCountry` (type: `string`):

Two-letter ISO country code for the ad lookups (where the ads are shown), e.g. US, GB, DE. Applies to both the Meta Ad Library search and the Google Ads Transparency Center region. Defaults to US. Used when an ad-intelligence add-on is enabled.

## `proxyConfiguration` (type: `object`):

Required for reliable results. Google blocks datacenter IPs on Maps search, so this defaults to Apify Residential proxy. Leave as-is unless you know what you're doing.

## `proxyUrl` (type: `string`):

Optional. A single HTTP proxy URL (http://user:pass@host:port) to use INSTEAD of Apify Proxy above. Leave empty to use the Proxy configuration.

## Actor input object example

```json
{
  "query": "restaurants in New York",
  "searchQueries": [],
  "startUrls": [],
  "customGeolocation": {},
  "maxResults": 100,
  "language": "en",
  "zoom": 13,
  "includeDetails": true,
  "includePhotos": true,
  "includePlaceExtras": true,
  "includePopularTimes": false,
  "includeReviews": false,
  "reviewsLimit": 5,
  "minReviewRating": 0,
  "reviewKeyword": "",
  "reviewsSort": "newest",
  "includeEmails": false,
  "includeSocials": false,
  "emailOnly": false,
  "socialOnly": false,
  "onlyWithWebsite": false,
  "onlyWithoutWebsite": false,
  "includePersonnel": false,
  "maxContactsPerBusiness": 10,
  "personnelMinConfidence": "low",
  "onlyWithPersonnel": false,
  "includeMetaAds": false,
  "includeGoogleAds": false,
  "onlyRunningAds": false,
  "adCountry": "US",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

One item per Google Maps place: name, full address, latitude/longitude, phone, website, rating, review count, category, price level, place ID/CID, plus any enabled enrichment (contacts, reviews, ad intelligence).

# 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 = {
    "query": "restaurants in New York",
    "searchQueries": [],
    "startUrls": [],
    "customGeolocation": {},
    "includePhotos": true,
    "includePlaceExtras": true,
    "includePopularTimes": false,
    "reviewsSort": "newest",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("buff_pineapple/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 = {
    "query": "restaurants in New York",
    "searchQueries": [],
    "startUrls": [],
    "customGeolocation": {},
    "includePhotos": True,
    "includePlaceExtras": True,
    "includePopularTimes": False,
    "reviewsSort": "newest",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("buff_pineapple/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 '{
  "query": "restaurants in New York",
  "searchQueries": [],
  "startUrls": [],
  "customGeolocation": {},
  "includePhotos": true,
  "includePlaceExtras": true,
  "includePopularTimes": false,
  "reviewsSort": "newest",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call buff_pineapple/google-maps-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,buff_pineapple/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/LhLB6a5pOhL7UUat7/builds/AC74u5wC8xCGW7DeS/openapi.json
