# 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:** 4 total users, 2 monthly users, 92.3% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=fabri-lab/google-maps-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Maps Scraper - Cheap",
        "description": "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.",
        "version": "0.0",
        "x-build-id": "pduuDPU06dR8g3Ct3"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/fabri-lab~google-maps-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-fabri-lab-google-maps-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/fabri-lab~google-maps-scraper/runs": {
            "post": {
                "operationId": "runs-sync-fabri-lab-google-maps-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/fabri-lab~google-maps-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-fabri-lab-google-maps-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchQueries": {
                        "title": "🔍 Search term(s)",
                        "type": "array",
                        "description": "Business keywords to search for, e.g. restaurant, dentist, hotel.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "locations": {
                        "title": "📍 Location (use only one location per run)",
                        "type": "array",
                        "description": "City, region, or country to combine with search terms. Multiple values are supported through API/bulk mode.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxPlaces": {
                        "title": "💯 Number of places to extract (per each search term or URL)",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of unique businesses to extract per generated search request.",
                        "default": 1
                    },
                    "language": {
                        "title": "🌍 Language",
                        "enum": [
                            "en",
                            "tr",
                            "de",
                            "fr",
                            "es",
                            "it",
                            "pt",
                            "nl",
                            "ar",
                            "ja",
                            "ko",
                            "zh-CN"
                        ],
                        "type": "string",
                        "description": "Google Maps UI language. English improves parser consistency.",
                        "default": "en"
                    },
                    "countryCode": {
                        "title": "Country code",
                        "type": "string",
                        "description": "Optional two-letter Google gl country code, e.g. US, GB, TR.",
                        "default": ""
                    },
                    "categories": {
                        "title": "Business categories",
                        "type": "array",
                        "description": "Optional category terms to combine with each search term. If search terms are empty, categories become the search terms.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "searchFilterKeywords": {
                        "title": "Extra search filter keywords",
                        "type": "array",
                        "description": "Additional keywords appended to the Google Maps query, e.g. open now, 24 hours, wheelchair accessible.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "sortBy": {
                        "title": "Sort preference",
                        "enum": [
                            "relevance",
                            "rating",
                            "reviews"
                        ],
                        "type": "string",
                        "description": "Best-effort sort preference. Relevance is native Google order; rating/reviews are used as filter metadata for future sorting workflows.",
                        "default": "relevance"
                    },
                    "minRating": {
                        "title": "Minimum rating",
                        "minimum": 0,
                        "maximum": 5,
                        "type": "number",
                        "description": "Skip places below this rating after extraction."
                    },
                    "minReviews": {
                        "title": "Minimum review count",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Skip places with fewer visible reviews after extraction."
                    },
                    "openNowOnly": {
                        "title": "Open now only",
                        "type": "boolean",
                        "description": "Append open-now intent to the search and skip closed places when open status is visible.",
                        "default": false
                    },
                    "requireWebsite": {
                        "title": "Only places with website",
                        "type": "boolean",
                        "description": "Skip places without a visible website.",
                        "default": false
                    },
                    "requirePhone": {
                        "title": "Only places with phone",
                        "type": "boolean",
                        "description": "Skip places without a visible phone number.",
                        "default": false
                    },
                    "onlyClaimed": {
                        "title": "Only claimed / verified places",
                        "type": "boolean",
                        "description": "Best-effort filter using visible claimed/verified labels.",
                        "default": false
                    },
                    "priceLevels": {
                        "title": "Price levels",
                        "type": "array",
                        "description": "Keep only places with matching visible price level when Google Maps shows it.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "includeAdditionalDetails": {
                        "title": "Extract additional place details",
                        "type": "boolean",
                        "description": "Enable rich visible place details beyond base lead fields.",
                        "default": false
                    },
                    "includePopularTimes": {
                        "title": "Include popular times / live busyness",
                        "type": "boolean",
                        "description": "Collect visible popular-times labels when present.",
                        "default": false
                    },
                    "includePeopleAlsoSearch": {
                        "title": "Include related / nearby businesses",
                        "type": "boolean",
                        "description": "Collect visible related Google Maps business links.",
                        "default": false
                    },
                    "includeCompanyContacts": {
                        "title": "Extract company contacts from website",
                        "type": "boolean",
                        "description": "Extract public emails, social profiles, and contact page URLs from the business website.",
                        "default": false
                    },
                    "includeBusinessLeads": {
                        "title": "Extract business lead candidates",
                        "type": "boolean",
                        "description": "Extract simple public lead candidates from business website pages.",
                        "default": false
                    },
                    "includeReviews": {
                        "title": "Include reviews",
                        "type": "boolean",
                        "description": "Extract visible Google Maps reviews.",
                        "default": false
                    },
                    "maxReviewsPerPlace": {
                        "title": "Maximum reviews per place",
                        "minimum": 0,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum visible reviews to extract per business when reviews are enabled.",
                        "default": 20
                    },
                    "reviewSort": {
                        "title": "Review sort",
                        "enum": [
                            "relevance",
                            "newest",
                            "highest",
                            "lowest"
                        ],
                        "type": "string",
                        "description": "Requested Google Maps review sort mode.",
                        "default": "relevance"
                    },
                    "includeReviewerInfo": {
                        "title": "Include reviewer public profile info",
                        "type": "boolean",
                        "description": "Include reviewer names/profile links/avatar URLs when publicly visible.",
                        "default": false
                    },
                    "includePhotos": {
                        "title": "Include images",
                        "type": "boolean",
                        "description": "Extract public photo URLs visible on the place page.",
                        "default": false
                    },
                    "maxPhotosPerPlace": {
                        "title": "Maximum images per place",
                        "minimum": 0,
                        "maximum": 200,
                        "type": "integer",
                        "description": "Maximum public photo URLs to collect per business.",
                        "default": 20
                    },
                    "geolocation": {
                        "title": "Center geolocation",
                        "type": "object",
                        "description": "Optional map center used to build viewport searches.",
                        "properties": {
                            "latitude": {
                                "title": "Latitude",
                                "type": "number",
                                "description": "Center latitude.",
                                "minimum": -90,
                                "maximum": 90
                            },
                            "longitude": {
                                "title": "Longitude",
                                "type": "number",
                                "description": "Center longitude.",
                                "minimum": -180,
                                "maximum": 180
                            },
                            "zoom": {
                                "title": "Zoom",
                                "type": "integer",
                                "description": "Google Maps zoom level.",
                                "minimum": 3,
                                "maximum": 21
                            },
                            "radiusMeters": {
                                "title": "Radius meters",
                                "type": "integer",
                                "description": "Used to estimate zoom when zoom is not provided.",
                                "minimum": 0,
                                "maximum": 100000
                            }
                        },
                        "additionalProperties": false
                    },
                    "polygons": {
                        "title": "Polygon areas",
                        "type": "array",
                        "description": "Polygon objects with a name and coordinates array."
                    },
                    "polygonGridPoints": {
                        "title": "Polygon grid points",
                        "minimum": 1,
                        "maximum": 25,
                        "type": "integer",
                        "description": "Maximum search grid points generated per polygon.",
                        "default": 5
                    },
                    "startUrls": {
                        "title": "Google Maps URLs",
                        "type": "array",
                        "description": "Google Maps search or place URLs.",
                        "default": [
                            {
                                "url": "https://www.google.com/maps/place/Empire+State+Building/@40.7484405,-73.9856644,17z"
                            }
                        ],
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "placeIds": {
                        "title": "Google Maps place IDs",
                        "type": "array",
                        "description": "Google Maps place IDs to scrape directly.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "browseWithoutSearchTerms": {
                        "title": "Browse without search terms",
                        "type": "boolean",
                        "description": "Enable only when a location, geolocation, or polygon is provided.",
                        "default": false
                    },
                    "maxConcurrency": {
                        "title": "Maximum concurrency",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Browser page concurrency. Keep modest for fewer blocks.",
                        "default": 3
                    },
                    "navigationTimeoutSecs": {
                        "title": "Navigation timeout",
                        "minimum": 10,
                        "maximum": 600,
                        "type": "integer",
                        "description": "Navigation timeout in seconds.",
                        "default": 60
                    },
                    "requestHandlerTimeoutSecs": {
                        "title": "Request handler timeout",
                        "minimum": 30,
                        "maximum": 3600,
                        "type": "integer",
                        "description": "Timeout for a single search or place page in seconds.",
                        "default": 120
                    },
                    "forceLiveScrape": {
                        "title": "Force live scrape",
                        "type": "boolean",
                        "description": "Bypass the fast platform health-check behavior for prefilled/default input values.",
                        "default": false
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Optional Apify Proxy configuration.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
