# Google Maps Scraper - Cheap (`fabri-lab/google-maps-scraper`) Actor

Extract Google Maps business leads globally with phones, websites, ratings, categories, opening hours, images, popular times, company contacts, and optional reviews. Launch pricing available for early users.

- **URL**: https://apify.com/fabri-lab/google-maps-scraper.md
- **Developed by:** [Yusuf Barış](https://apify.com/fabri-lab) (community)
- **Categories:** Automation, Jobs
- **Stats:** 12 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## 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 Business Leads Scraper with Reviews

Extract Google Maps business leads globally with phones, websites, ratings, categories, opening hours, photos, popular times, optional reviews, and optional website-based contact enrichment.

This Actor is built for lead generation, local SEO research, market mapping, competitor discovery, and sales prospecting workflows.

### 💰 Pricing

| Data type | Price |
| --- | ---: |
| Base place data | `$1.50 / 1,000 places` |
| Reviews add-on | `$0.30 / 1,000 reviews` |

Configure these as pay-per-event items in Apify Console before publishing.

### 🚀 What You Can Extract

#### 🏢 Base business data

- Business name
- Main category and extra categories
- Full address
- Latitude and longitude
- Plus Code
- Phone number
- Website URL
- Google Maps URL
- Google Place ID and CID
- Search query, location, rank, and scrape timestamp

#### ⭐ Reputation data

- Rating
- Review count
- Rating distribution when visible
- Optional review extraction
- Optional reviewer public profile info
- Optional review photos
- Owner responses when visible

#### 🕒 Additional place details

- Opening hours
- Current open / closed status
- Business status
- Claimed / verified status, best-effort
- Menu links
- Booking links
- Order links
- Service options
- Amenities
- Accessibility details
- Payment options
- Dining and service attributes
- Popular times and live busyness labels when visible
- Related / nearby businesses

#### 🖼️ Images add-on

- Public Google Maps image URLs
- Image alt text when visible
- Source links when available

#### 🏢 Company contacts enrichment

- Public emails found on the business website
- Social profile links
- Contact / about / team page URLs

#### 👥 Business leads enrichment

- Public person/title snippets from the business website
- Owner, founder, manager, director, partner, and similar lead candidates
- Source URL and surrounding context for each candidate

### 🔍 Input Options

#### Main search

- `searchQueries`: Search terms such as `restaurant`, `dentist`, `hotel`, or `car repair`.
- `locations`: City, state, region, or country.
- `maxPlaces`: Number of places to extract per search term or URL.
- `language`: Google Maps UI language.
- `countryCode`: Optional Google country targeting code such as `US`, `GB`, or `TR`.

#### Add-on: search filters and categories

- `categories`: Category terms to combine with search terms.
- `searchFilterKeywords`: Extra intent keywords such as `open now`, `24 hours`, or `wheelchair accessible`.
- `sortBy`: Best-effort result preference. Relevance uses native Google order; rating and review count are applied after visible data is extracted.
- `minRating`: Skip places below the selected rating.
- `minReviews`: Skip places below the selected review count.
- `openNowOnly`: Keep only places that appear open.
- `requireWebsite`: Keep only places with a visible website.
- `requirePhone`: Keep only places with a visible phone number.
- `onlyClaimed`: Keep only claimed / verified places when visible.
- `priceLevels`: Keep only places with matching visible price level when available.

#### Add-on: additional place details

- `includeAdditionalDetails`
- `includePopularTimes`
- `includePeopleAlsoSearch`

#### Add-on: reviews

- `includeReviews`
- `maxReviewsPerPlace`
- `reviewSort`
- `includeReviewerInfo`

#### Add-on: images

- `includePhotos`
- `maxPhotosPerPlace`

#### Add-on: enrichment

- `includeCompanyContacts`
- `includeBusinessLeads`

#### Alternative start modes

- `startUrls`: Google Maps search URLs or place URLs.
- `placeIds`: Google Maps place IDs.
- `geolocation`: Center latitude, longitude, zoom, and optional radius.
- `polygons`: Polygon areas. The Actor creates a small grid inside each polygon.
- `browseWithoutSearchTerms`: Broad `business` search around the supplied area.

### 📤 Output Schema

Each dataset item represents one Google Maps business.

#### Core fields

```json
{
  "name": "Business name",
  "category": "Restaurant",
  "categories": ["Restaurant", "Italian restaurant"],
  "address": "123 Main St, New York, NY",
  "latitude": 40.7128,
  "longitude": -74.006,
  "plusCode": "P27Q+MC New York",
  "phone": "+1 555 000 0000",
  "website": "https://example.com/",
  "googleMapsUrl": "https://www.google.com/maps/place/...",
  "placeId": "ChIJ...",
  "cid": "1234567890",
  "rating": 4.6,
  "reviewCount": 532,
  "searchQuery": "restaurant",
  "location": "New York, USA",
  "rank": 1,
  "scrapedAt": "2026-05-11T09:00:00.000Z"
}
```

#### Add-on fields

```json
{
  "ratingDistribution": { "5Star": 410, "4Star": 80 },
  "openingHours": ["Monday: 9 AM-5 PM"],
  "currentOpenStatus": "Open now",
  "businessStatus": "Open",
  "claimedStatus": "Claimed",
  "menuUrl": "https://example.com/menu",
  "bookingLinks": ["https://example.com/book"],
  "orderLinks": ["https://example.com/order"],
  "attributes": {
    "serviceOptions": ["Dine-in", "Takeout"],
    "amenities": ["Wi-Fi"],
    "accessibility": ["Wheelchair accessible entrance"],
    "payments": ["Credit cards"],
    "other": []
  },
  "popularTimes": [{ "label": "Usually busy at 7 PM", "value": null }],
  "peopleAlsoSearch": [{ "name": "Nearby Place", "url": "https://www.google.com/maps/place/..." }],
  "photos": [{ "url": "https://lh3.googleusercontent.com/...", "alt": "Food photo" }],
  "emails": ["hello@example.com"],
  "socialLinks": ["https://www.instagram.com/example"],
  "contactPageUrls": ["https://example.com/contact"],
  "leadCandidates": [{ "name": "Jane Smith", "title": "Owner", "sourceUrl": "https://example.com/about" }]
}
```

#### Reviews field

```json
{
  "reviews": [
    {
      "reviewId": "abc123",
      "rating": 5,
      "text": "Great service.",
      "relativeDate": "2 weeks ago",
      "ownerResponse": "Thank you!",
      "reviewUrl": "https://www.google.com/maps/...",
      "photos": [],
      "reviewerName": "Public Reviewer",
      "reviewerProfileUrl": "https://www.google.com/maps/contrib/...",
      "reviewerAvatarUrl": "https://lh3.googleusercontent.com/..."
    }
  ]
}
```

#### Diagnostics

- `partial`: `true` when the place was saved with incomplete extraction.
- `warning`: Non-fatal extraction or charging notes.
- `error`: Fatal per-place error message if a failed place item was saved.
- `visibleFields`: Raw visible UI hints captured for debugging parser gaps.

### 🧪 Example Input

The prefilled Console input is a fast platform health check. Replace it with search terms, Google Maps URLs, or place IDs to run a live scrape. If you intentionally want to scrape the exact prefilled/default values, set `forceLiveScrape` to `true`.

```json
{
  "searchQueries": ["restaurant"],
  "locations": ["New York, USA"],
  "maxPlaces": 1,
  "language": "en",
  "countryCode": "US",
  "categories": ["pizza"],
  "minRating": 4,
  "requireWebsite": true,
  "includeAdditionalDetails": false,
  "includePopularTimes": false,
  "includePeopleAlsoSearch": false,
  "includeCompanyContacts": true,
  "includeBusinessLeads": false,
  "includeReviews": true,
  "maxReviewsPerPlace": 20,
  "reviewSort": "newest",
  "includeReviewerInfo": false,
  "includePhotos": true,
  "maxPhotosPerPlace": 20
}
```

### 🌍 Global Coverage

The Actor supports global Google Maps searches. For best extraction consistency, use English UI (`language: "en"`) unless you specifically need local-language labels.

Tested target categories for MVP validation:

- Restaurants
- Dentists
- Hotels
- Hair salons
- Car repair services

Recommended country test set:

- United States
- United Kingdom
- Turkey
- Japan
- United Arab Emirates

### ⚙️ Local Development

```bash
npm install
npm run build
npm test
npm start
```

For larger production runs, increase the Actor timeout in Apify Console and set `requestHandlerTimeoutSecs` up to `3600`.

For local pay-per-event testing:

```bash
ACTOR_TEST_PAY_PER_EVENT=true ACTOR_USE_CHARGING_LOG_DATASET=true npm start
```

### 🧾 Store Positioning

Store title:

> Google Maps Business Leads Scraper with Optional Reviews

Short description:

> Extract Google Maps business leads globally with phones, websites, ratings, categories, opening hours, images, popular times, company contacts, and optional reviews.

### ❓ FAQ

#### Does it extract reviews?

Yes. Reviews are optional and disabled by default. Enable `includeReviews` and set `maxReviewsPerPlace`.

#### Does it extract images?

Yes. Enable `includePhotos` and set `maxPhotosPerPlace`.

#### Can I scrape by Google Maps URL?

Yes. Use `startUrls` with Google Maps search URLs or place URLs.

#### Can I scrape by place ID?

Yes. Use `placeIds`.

#### Can I scrape by coordinates or polygon?

Yes. Use `geolocation` for a center point or `polygons` for polygon grid searches.

#### Can I enrich company contacts?

Yes. Enable `includeCompanyContacts` to fetch public website emails, social links, and contact pages.

#### Why are some fields empty?

Google Maps fields vary by country, category, language, and page layout. The Actor saves partial records instead of failing the whole run.

#### Is this official Google API data?

No. This is a browser-based best-effort scraper for publicly visible Google Maps pages.

# Actor input Schema

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

Business keywords to search for, e.g. restaurant, dentist, hotel.

## `locations` (type: `array`):

City, region, or country to combine with search terms. Multiple values are supported through API/bulk mode.

## `maxPlaces` (type: `integer`):

Maximum number of unique businesses to extract per generated search request.

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

Google Maps UI language. English improves parser consistency.

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

Optional two-letter Google gl country code, e.g. US, GB, TR.

## `categories` (type: `array`):

Optional category terms to combine with each search term. If search terms are empty, categories become the search terms.

## `searchFilterKeywords` (type: `array`):

Additional keywords appended to the Google Maps query, e.g. open now, 24 hours, wheelchair accessible.

## `sortBy` (type: `string`):

Best-effort sort preference. Relevance is native Google order; rating/reviews are used as filter metadata for future sorting workflows.

## `minRating` (type: `number`):

Skip places below this rating after extraction.

## `minReviews` (type: `integer`):

Skip places with fewer visible reviews after extraction.

## `openNowOnly` (type: `boolean`):

Append open-now intent to the search and skip closed places when open status is visible.

## `requireWebsite` (type: `boolean`):

Skip places without a visible website.

## `requirePhone` (type: `boolean`):

Skip places without a visible phone number.

## `onlyClaimed` (type: `boolean`):

Best-effort filter using visible claimed/verified labels.

## `priceLevels` (type: `array`):

Keep only places with matching visible price level when Google Maps shows it.

## `includeAdditionalDetails` (type: `boolean`):

Enable rich visible place details beyond base lead fields.

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

Collect visible popular-times labels when present.

## `includePeopleAlsoSearch` (type: `boolean`):

Collect visible related Google Maps business links.

## `includeCompanyContacts` (type: `boolean`):

Extract public emails, social profiles, and contact page URLs from the business website.

## `includeBusinessLeads` (type: `boolean`):

Extract simple public lead candidates from business website pages.

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

Extract visible Google Maps reviews.

## `maxReviewsPerPlace` (type: `integer`):

Maximum visible reviews to extract per business when reviews are enabled.

## `reviewSort` (type: `string`):

Requested Google Maps review sort mode.

## `includeReviewerInfo` (type: `boolean`):

Include reviewer names/profile links/avatar URLs when publicly visible.

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

Extract public photo URLs visible on the place page.

## `maxPhotosPerPlace` (type: `integer`):

Maximum public photo URLs to collect per business.

## `geolocation` (type: `object`):

Optional map center used to build viewport searches.

## `polygons` (type: `array`):

Polygon objects with a name and coordinates array.

## `polygonGridPoints` (type: `integer`):

Maximum search grid points generated per polygon.

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

Google Maps search or place URLs.

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

Google Maps place IDs to scrape directly.

## `browseWithoutSearchTerms` (type: `boolean`):

Enable only when a location, geolocation, or polygon is provided.

## `maxConcurrency` (type: `integer`):

Browser page concurrency. Keep modest for fewer blocks.

## `navigationTimeoutSecs` (type: `integer`):

Navigation timeout in seconds.

## `requestHandlerTimeoutSecs` (type: `integer`):

Timeout for a single search or place page in seconds.

## `forceLiveScrape` (type: `boolean`):

Bypass the fast platform health-check behavior for prefilled/default input values.

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

Optional Apify Proxy configuration.

## Actor input object example

```json
{
  "searchQueries": [],
  "locations": [],
  "maxPlaces": 1,
  "language": "en",
  "countryCode": "",
  "categories": [],
  "searchFilterKeywords": [],
  "sortBy": "relevance",
  "openNowOnly": false,
  "requireWebsite": false,
  "requirePhone": false,
  "onlyClaimed": false,
  "priceLevels": [],
  "includeAdditionalDetails": false,
  "includePopularTimes": false,
  "includePeopleAlsoSearch": false,
  "includeCompanyContacts": false,
  "includeBusinessLeads": false,
  "includeReviews": false,
  "maxReviewsPerPlace": 20,
  "reviewSort": "relevance",
  "includeReviewerInfo": false,
  "includePhotos": false,
  "maxPhotosPerPlace": 20,
  "polygons": [],
  "polygonGridPoints": 5,
  "startUrls": [
    {
      "url": "https://www.google.com/maps/place/Empire+State+Building/@40.7484405,-73.9856644,17z"
    }
  ],
  "placeIds": [],
  "browseWithoutSearchTerms": false,
  "maxConcurrency": 3,
  "navigationTimeoutSecs": 60,
  "requestHandlerTimeoutSecs": 120,
  "forceLiveScrape": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `businesses` (type: `string`):

Full dataset of scraped Google Maps businesses with base fields and optional add-on fields.

## `leads` (type: `string`):

Compact sales-ready dataset view with the most useful lead generation fields.

## `datasetApi` (type: `string`):

Raw default dataset API URL for JSON, CSV, XML, RSS, HTML, and XLSX exports.

# 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 = {
    "searchQueries": [],
    "locations": [],
    "categories": [],
    "searchFilterKeywords": [],
    "priceLevels": [],
    "polygons": [],
    "startUrls": [
        {
            "url": "https://www.google.com/maps/place/Empire+State+Building/@40.7484405,-73.9856644,17z"
        }
    ],
    "placeIds": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("fabri-lab/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 = {
    "searchQueries": [],
    "locations": [],
    "categories": [],
    "searchFilterKeywords": [],
    "priceLevels": [],
    "polygons": [],
    "startUrls": [{ "url": "https://www.google.com/maps/place/Empire+State+Building/@40.7484405,-73.9856644,17z" }],
    "placeIds": [],
}

# Run the Actor and wait for it to finish
run = client.actor("fabri-lab/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 '{
  "searchQueries": [],
  "locations": [],
  "categories": [],
  "searchFilterKeywords": [],
  "priceLevels": [],
  "polygons": [],
  "startUrls": [
    {
      "url": "https://www.google.com/maps/place/Empire+State+Building/@40.7484405,-73.9856644,17z"
    }
  ],
  "placeIds": []
}' |
apify call fabri-lab/google-maps-scraper --silent --output-dataset

```

## MCP server setup

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