# Google Maps Scraper (`silentflow/google-maps-scraper`) Actor

Scrape Google Maps places by search term and location: name, category, address, phone, website, rating, review count, opening hours and exact GPS coordinates. Optionally pull emails and social profiles from each place's website. No login or API key, export to JSON, CSV or Excel for lead generation.

- **URL**: https://apify.com/silentflow/google-maps-scraper.md
- **Developed by:** [SilentFlow](https://apify.com/silentflow) (community)
- **Categories:** Lead generation, Travel
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 1,000 place scrapeds

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

Learn more: https://docs.apify.com/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 Scraper

**Turn any Google Maps search into a clean spreadsheet of local businesses.** Pull names, addresses, phone numbers, websites, ratings, categories, coordinates, and opening hours for every place in a city, neighborhood, or custom area. Add website emails and social profiles in the same run to build ready-to-use lead lists.

Type a search term and a location, press start, and get structured JSON or Excel back in seconds. No Google API key, no login, no manual copy-paste.

### How it works

![How it works](https://api.apify.com/v2/key-value-stores/KeyvhUq2Q0DEqPNOt/records/how-it-works-v1.png)

### ✨ Why teams choose this over other Google Maps scrapers

Spending hours copying business details out of Google Maps tabs? Running scrapers that return 20 results and quit? Paying for contact enrichment as a separate tool?

- 🗺️ **Real coverage, not just the first screen.** Google caps each map view at around 120 places. This scraper splits dense areas into smaller cells automatically, so a search for `restaurant` in a big city keeps pulling results instead of stopping early.
- 📞 **Every field you need in one row.** Name, category, full address broken into street, city, state, postal code and country, phone in clean international format, website, rating, coordinates, Google Place ID, and a direct Maps link. The details other scrapers make you pay extra for are included by default.
- 📧 **Lead lists, not just place lists.** Turn on contact enrichment and each business website is visited for emails and Facebook, Instagram, LinkedIn, X, YouTube, TikTok, Pinterest, and WhatsApp links. Emails are matched to the business domain so you get real inboxes, not vendor noise.
- 🎯 **Stay inside your area.** Strict area matching drops results whose coordinates fall outside your city, ZIP code, or custom polygon, so a search for one neighborhood does not leak in places from the next town.
- 🌍 **Any country, any language.** Search in 16 languages and bias results by country code. Works the same in Tokyo, São Paulo, Berlin, or Chicago.
- 🔗 **Targeted or broad.** Sweep a whole city, or paste exact Google Maps URLs and Place IDs to refresh a known list of locations.
- ⚡ **Fast and predictable.** A 45-place neighborhood search finishes in a few seconds. Clean structured output means no post-processing before you import it into your CRM or spreadsheet.

### 🎯 What you can do with Google Maps data

| Team | What they build |
|------|-----------------|
| Sales and lead generation | Local B2B prospect lists with phone, website, email, and social links for cold outreach |
| Local SEO agencies | Competitor maps across a city: who ranks, their ratings, categories, and review counts |
| Market research | Density maps of a business category by neighborhood, region, or ZIP code |
| Franchise and expansion | Site-selection datasets comparing existing businesses and gaps across areas |
| Data and CRM teams | Enrichment of existing account lists with fresh addresses, phones, and websites |
| Delivery and logistics | Directories of restaurants, stores, or service providers by service area |
| Real estate | Neighborhood profiles counting amenities, cafes, gyms, and schools near a listing |
| Agencies and freelancers | Client-ready lead spreadsheets delivered in minutes instead of days |

### 📥 Input parameters

Core fields:

| Field | Type | Description |
|-------|------|-------------|
| `searchStrings` | array | What to search for, one term per line (for example `restaurant`, `dentist`). |
| `locationQuery` | string | The area to search, for example `Brooklyn, New York, United States`. |
| `maxItems` | integer | Maximum number of places to return. Default 50. |
| `language` | select | Result language, 16 options. Default English. |
| `countryCode` | string | Two-letter country code to bias results, for example `us`, `fr`, `de`. |

Enrichment and filters:

| Field | Type | Description |
|-------|------|-------------|
| `extractContactsFromWebsite` | boolean | Visit each website for emails and social profile links. |
| `skipClosedPlaces` | boolean | Skip temporarily or permanently closed places. |
| `placeMinimumStars` | string | Keep only places rated at or above this value, for example `4.0`. |
| `categoryFilter` | array | Keep only places whose category contains one of these words. |
| `geoStrictMatch` | boolean | Drop places whose coordinates fall outside the search area. |
| `maxReviews` | integer | Reviews to attach per place. Experimental. Default 0. |

Advanced targeting (use instead of Location):

| Field | Type | Description |
|-------|------|-------------|
| `customGeolocation` | object | GeoJSON Polygon, MultiPolygon, or Point with `radiusKm`. |
| `startUrls` | array | Full Google Maps place or search URLs. |
| `placeIds` | array | Raw Google Place IDs, one per line. |

### 📊 Output data

Each place is one record. A typical result:

```json
{
  "name": "Moka & Co",
  "category": "Coffee shop",
  "categories": ["Coffee shop"],
  "description": "Family-owned cafe known for meticulously prepared coffee and pastries",
  "placeId": "ChIJU8L4BgBZwokRiqudELknuTI",
  "fid": "0x89c2590006f8c253:0x32b927b9109dab8a",
  "cid": "3654996248389069706",
  "googleMapsUrl": "https://www.google.com/maps/place/?q=place_id:ChIJU8L4BgBZwokRiqudELknuTI",
  "address": "Moka & Co, 142 W 34th St., New York, NY 10001",
  "street": "142 W 34th St.",
  "city": "New York",
  "state": "New York",
  "postalCode": "10001",
  "countryCode": "US",
  "latitude": 40.7503639,
  "longitude": -73.9898075,
  "phone": "+16463703500",
  "website": "https://mokanco.com/manhattan-midtown-34th-st/",
  "domain": "mokanco.com",
  "rating": 4.7,
  "searchQuery": "coffee shop",
  "searchLocation": "New York, United States",
  "scrapedAt": "2026-07-05T09:11:12Z"
}
````

With contact enrichment turned on, business records also include:

```json
{
  "name": "Qahwah House Coffee",
  "website": "http://qahwahhouse.com/",
  "emails": ["coffee@qahwahhouse.com"],
  "socials": {
    "facebook": "https://www.facebook.com/qahwahhouse",
    "instagram": "https://www.instagram.com/qahwah_house"
  }
}
```

### 🗂️ Data fields

| Category | Fields |
|----------|--------|
| Identity | name, category, categories, description, placeId, fid, cid, entityId, googleMapsUrl |
| Address | address, street, city, state, postalCode, countryCode, neighborhood, plusCode, latitude, longitude |
| Contact | phone, website, domain |
| Ratings | rating, reviewsCount, priceLevel |
| Status | permanentlyClosed, temporarilyClosed, openingHours |
| Enrichment | emails, socials (facebook, instagram, linkedin, x, youtube, tiktok, pinterest, whatsapp) |
| Reviews (experimental) | reviews (text, authorName, rating, relativeDate) |
| Provenance | searchQuery, searchLocation, scrapedAt |

### 🚀 Examples

**Build a local lead list**
Search `plumber` in `Phoenix, Arizona, United States`, turn on contact enrichment, and get names, phones, websites, and emails ready for outreach.

**Map the competition**
Search `coffee shop` in `Williamsburg, Brooklyn` and compare ratings, categories, and websites across every cafe in the neighborhood.

**Cover a whole city**
Search `restaurant` in `Chicago, Illinois, United States` with a high place count. Dense downtown areas are split automatically so you get deep coverage, not just the first screen.

**Target a custom service area**
Provide a GeoJSON polygon of your delivery zone and get only the businesses inside it.

**Refresh a known list**
Paste Google Maps URLs or Place IDs for locations you already track and pull their latest details.

### 🤖 Copy to your AI assistant

```
Use the Google Maps Scraper on Apify to build a lead list.
Search term: "dentist"
Location: "Denver, Colorado, United States"
Number of places: 200
Turn on website contact enrichment.
Return name, phone, website, email, and rating for each result as a table.
```

### 💻 Integrations

Run the actor and pull results from the dataset with any language, or connect it to Make, Zapier, Google Sheets, and other tools through Apify.

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("google-maps-scraper").call(run_input={
    "searchStrings": ["dentist"],
    "locationQuery": "Denver, Colorado, United States",
    "maxItems": 200,
    "extractContactsFromWebsite": True,
})
for place in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(place["name"], place.get("phone"), place.get("emails"))
```

**JavaScript**

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

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('google-maps-scraper').call({
    searchStrings: ['coffee shop'],
    locationQuery: 'Brooklyn, New York, United States',
    maxItems: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((p) => `${p.name} - ${p.rating}`));
```

**Google Sheets**
Export a run to Excel or CSV and import it directly, or use the Apify Google Sheets integration to push results into a live sheet after every run.

### 📈 Performance

| Search | Places | Time |
|--------|--------|------|
| Coffee shops, one neighborhood | 15 | About 1 second |
| Restaurants, a dense district | 45 | About 3 seconds |
| Lead list with website enrichment | 4 | About 7 seconds (enrichment visits each site) |

Times measured on a standard run. Larger areas and contact enrichment add time proportional to the number of websites visited.

### 💾 Data export

Download results as JSON, CSV, Excel, HTML, or RSS from the Apify console, or pull them through the API. Every field above is available in every format.

### 💡 Tips for best results

- Add a clear location. `dentist` alone can match the wrong city. `dentist` plus `Miami, Florida, United States` keeps results local.
- Use one location per line. Each area is resolved separately, and the place count applies per search term per location.
- Turn on strict area matching when you need only one neighborhood or ZIP code.
- Use specific search terms for cleaner lists. `vegan restaurant` returns tighter results than `food`.
- For very large cities, raise the place count and let the automatic area splitting do the work.

### ❓ FAQ

**Do I need a Google Maps API key?**
No. The scraper works without any API key or Google account.

**How many places can I get?**
Set any number with the place count field. Dense areas are split automatically to reach deep coverage.

**Can I get emails and phone numbers?**
Phone numbers come from Google Maps directly. Turn on website contact enrichment to also collect emails and social profile links from each business website.

**Which countries and languages are supported?**
Any country. Results can be returned in 16 languages, and you can bias by country code.

**Can I scrape a single business?**
Yes. Paste its Google Maps URL or Place ID.

**Can I limit results to an exact area?**
Yes. Provide a GeoJSON polygon or a point with a radius, or turn on strict area matching with a location.

**What if a business has no website?**
It is still saved with all its Google Maps fields. Only the website-based emails and social links are skipped.

**How fresh is the data?**
Every run pulls live data from Google Maps at the moment you run it.

**Can I schedule regular runs?**
Yes. Use Apify schedules to refresh your dataset daily, weekly, or on any cadence.

### ⚖️ Legal

This scraper collects publicly available business information from Google Maps. Business contact details such as company phone numbers and addresses are public data. When you collect data that can identify individuals, you are responsible for having a lawful basis and for complying with applicable privacy laws, including the GDPR in Europe, the CCPA in California, and the PIPL in China. Use the data for legitimate business purposes such as market research and B2B outreach, and honor opt-out and deletion requests.

### 🔗 Related scrapers

Looking for other local and business data sources? Explore our other scrapers on Apify for reviews, directories, and company data.

### 📬 Support

Have a use case in mind or need a field that is not here yet? Start a run, see the data, and reach out through the actor's Apify page. We ship improvements based on real requests.

# Actor input Schema

## `searchStrings` (type: `array`):

What you would type into Google Maps, e.g. <b>restaurant</b>, <b>dentist</b>, <b>coffee shop</b>. One term per line.

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

The area to search, e.g. <b>Brooklyn, New York, United States</b> or <b>Paris, France</b>. Leave empty to let Google infer the area from the search term.

## `maxItems` (type: `integer`):

Maximum number of places to extract. Higher values take longer.

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

Google Maps language for names, categories, and labels.

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

Two-letter country code used to bias results, e.g. <code>us</code>, <code>fr</code>, <code>de</code>.

## `extractContactsFromWebsite` (type: `boolean`):

Visit each business website and extract emails plus Facebook, Instagram, LinkedIn, X, YouTube, TikTok, Pinterest, and WhatsApp links. Places without a website are still saved.

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

Skip places marked as temporarily or permanently closed.

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

Only keep places rated at or above this value, e.g. <code>4.0</code>. Leave empty for no filter.

## `categoryFilter` (type: `array`):

Only keep places whose category contains one of these words, e.g. <code>restaurant</code>. Leave empty to keep all.

## `geoStrictMatch` (type: `boolean`):

Drop results whose coordinates fall outside the resolved location or custom area.

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

How many reviews to attach to each place. Set to <b>0</b> for the fastest run. Review extraction is experimental.

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

Ordering for extracted reviews.

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

Define an exact area with GeoJSON: Polygon, MultiPolygon, or Point with <code>radiusKm</code>. Overrides Location.

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

Full Google Maps place or search URLs to scrape directly.

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

Raw Google Place IDs, one per line, e.g. <code>ChIJU8L4BgBZwokRiqudELknuTI</code>.

## `debugMode` (type: `boolean`):

Log verbose diagnostics.

## Actor input object example

```json
{
  "searchStrings": [
    "coffee shop"
  ],
  "locationQuery": "New York, United States",
  "maxItems": 50,
  "language": "en",
  "countryCode": "us",
  "extractContactsFromWebsite": false,
  "skipClosedPlaces": false,
  "geoStrictMatch": false,
  "maxReviews": 0,
  "reviewsSort": "newest",
  "debugMode": false
}
```

# Actor output Schema

## `places` (type: `string`):

All scraped places including name, category, address, phone, website, rating, coordinates, opening hours, emails, and social links.

# 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 = {
    "searchStrings": [
        "coffee shop"
    ],
    "locationQuery": "New York, United States",
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("silentflow/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 = {
    "searchStrings": ["coffee shop"],
    "locationQuery": "New York, United States",
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("silentflow/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 '{
  "searchStrings": [
    "coffee shop"
  ],
  "locationQuery": "New York, United States",
  "maxItems": 50
}' |
apify call silentflow/google-maps-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=silentflow/google-maps-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Maps Scraper",
        "description": "Scrape Google Maps places by search term and location: name, category, address, phone, website, rating, review count, opening hours and exact GPS coordinates. Optionally pull emails and social profiles from each place's website. No login or API key, export to JSON, CSV or Excel for lead generation.",
        "version": "1.0",
        "x-build-id": "gauxgNp5hyUYgKwza"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/silentflow~google-maps-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-silentflow-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/silentflow~google-maps-scraper/runs": {
            "post": {
                "operationId": "runs-sync-silentflow-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/silentflow~google-maps-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-silentflow-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": {
                    "searchStrings": {
                        "title": "🔍 Search terms",
                        "type": "array",
                        "description": "What you would type into Google Maps, e.g. <b>restaurant</b>, <b>dentist</b>, <b>coffee shop</b>. One term per line.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "locationQuery": {
                        "title": "📍 Location",
                        "type": "string",
                        "description": "The area to search, e.g. <b>Brooklyn, New York, United States</b> or <b>Paris, France</b>. Leave empty to let Google infer the area from the search term."
                    },
                    "maxItems": {
                        "title": "💯 Number of places",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of places to extract. Higher values take longer.",
                        "default": 50
                    },
                    "language": {
                        "title": "🌍 Language",
                        "enum": [
                            "en",
                            "es",
                            "fr",
                            "de",
                            "it",
                            "pt",
                            "nl",
                            "pl",
                            "tr",
                            "ru",
                            "uk",
                            "ja",
                            "ko",
                            "zh-CN",
                            "ar",
                            "hi"
                        ],
                        "type": "string",
                        "description": "Google Maps language for names, categories, and labels.",
                        "default": "en"
                    },
                    "countryCode": {
                        "title": "🗺 Country",
                        "type": "string",
                        "description": "Two-letter country code used to bias results, e.g. <code>us</code>, <code>fr</code>, <code>de</code>.",
                        "default": "us"
                    },
                    "extractContactsFromWebsite": {
                        "title": "📧 Add website contacts (emails + social links)",
                        "type": "boolean",
                        "description": "Visit each business website and extract emails plus Facebook, Instagram, LinkedIn, X, YouTube, TikTok, Pinterest, and WhatsApp links. Places without a website are still saved.",
                        "default": false
                    },
                    "skipClosedPlaces": {
                        "title": "⏩ Skip closed places",
                        "type": "boolean",
                        "description": "Skip places marked as temporarily or permanently closed.",
                        "default": false
                    },
                    "placeMinimumStars": {
                        "title": "⭐ Minimum rating",
                        "type": "string",
                        "description": "Only keep places rated at or above this value, e.g. <code>4.0</code>. Leave empty for no filter."
                    },
                    "categoryFilter": {
                        "title": "🏷 Category filter",
                        "type": "array",
                        "description": "Only keep places whose category contains one of these words, e.g. <code>restaurant</code>. Leave empty to keep all.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "geoStrictMatch": {
                        "title": "📍 Keep only places inside the search area",
                        "type": "boolean",
                        "description": "Drop results whose coordinates fall outside the resolved location or custom area.",
                        "default": false
                    },
                    "maxReviews": {
                        "title": "💬 Number of reviews per place (experimental)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "How many reviews to attach to each place. Set to <b>0</b> for the fastest run. Review extraction is experimental.",
                        "default": 0
                    },
                    "reviewsSort": {
                        "title": "Sort reviews by",
                        "enum": [
                            "newest",
                            "most_relevant",
                            "highest",
                            "lowest"
                        ],
                        "type": "string",
                        "description": "Ordering for extracted reviews.",
                        "default": "newest"
                    },
                    "customGeolocation": {
                        "title": "🛰 Custom search area (GeoJSON)",
                        "type": "object",
                        "description": "Define an exact area with GeoJSON: Polygon, MultiPolygon, or Point with <code>radiusKm</code>. Overrides Location."
                    },
                    "startUrls": {
                        "title": "🔗 Google Maps URLs",
                        "type": "array",
                        "description": "Full Google Maps place or search URLs to scrape directly.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "placeIds": {
                        "title": "🗃 Place IDs",
                        "type": "array",
                        "description": "Raw Google Place IDs, one per line, e.g. <code>ChIJU8L4BgBZwokRiqudELknuTI</code>.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "debugMode": {
                        "title": "🐞 Debug mode",
                        "type": "boolean",
                        "description": "Log verbose diagnostics.",
                        "default": false
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
