# Google Maps Scraper - Places, Leads & Contacts (`scrapesage/google-maps-scraper`) Actor

Scrape Google Maps businesses & places by keyword + location: name, address, phone, website, rating, category, opening hours, coordinates, photos & attributes. Optional website email/social enrichment, lead scoring & monitor mode. No API key. Export to CSV/JSON/Excel.

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

## Pricing

from $4.00 / 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.

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 — Places, Business Leads, Emails & Contacts

Extract **complete Google Maps business & place data** at scale — **name, category, full address, phone, website, rating, opening status, coordinates, photos and attributes** — for any search term and location. Then optionally turn every place into a **ready-to-contact B2B lead** by crawling its own website for **emails, phone numbers and social profiles**, with a 0–100 lead score on every record.

No API key, no login, no browser — fast JSON extraction straight from Google Maps' own data feed, so you get the **richest dataset in the category at a fair flat price** (all fields included — no add-on fees for "details", "filters" or "contacts").

### Why this Google Maps scraper?

Most Google Maps scrapers either nickel-and-dime you with per-field add-ons or return thin records. This actor ships **every field Google Maps exposes in one record**, plus optional contact enrichment that other tools charge extra for:

| Data | Typical scrapers | This actor |
|---|---|---|
| Name, category, full address, city/state/ZIP, country | ✅ | ✅ |
| Phone (formatted + E.164), website, domain | partial | ✅ |
| Rating, open/closed status, today's hours | partial | ✅ |
| Latitude / longitude, plus code, neighborhood | partial | ✅ |
| Place ID, CID, FID, Knowledge-Graph ID | ❌ | ✅ |
| Business attributes (accessibility, service options…) | ❌ | ✅ |
| Photos / image URLs | ❌ | ✅ |
| **Total review count + full Mon–Sun opening hours** | ❌ paid add-on | ✅ opt-in |
| **Contact emails** (from the business website) | ❌ paid add-on | ✅ opt-in |
| Facebook / Instagram / LinkedIn / X / YouTube / TikTok | ❌ paid add-on | ✅ opt-in |
| Lead score (0–100) per place | ❌ | ✅ |
| Monitor mode — only new / changed places | ❌ | ✅ |
| Pricing | base + 5–8 add-ons | flat place fee + 2 clear opt-ins |

### Use cases

- **Local lead generation** — pull every plumber, dentist, law firm, gym or restaurant in a city, enrich their website for emails and socials, and score them by contactability. Perfect for agencies, SaaS and B2B sales.
- **Find businesses without a website** — set the website filter to "without a website" to build a targeted list for web-design and marketing offers.
- **Market & competitor research** — map saturation, ratings and categories across neighbourhoods or whole metros.
- **Data enrichment** — resolve names/addresses to phone, website, coordinates and place IDs for your CRM.
- **Recurring monitoring** — schedule the actor with monitor mode to capture only newly listed or changed businesses in a city or category.

### How to use

1. [Sign up for Apify](https://console.apify.com/sign-up) — the free plan is enough to try this actor.
2. Open the **Google Maps Scraper**, enter one or more **search terms** and a **location**, and click **Start**.
3. Watch results stream into the dataset table.
4. **Export** as JSON, CSV, Excel, XML, or RSS — or pull results programmatically via the [Apify API](https://docs.apify.com/api/v2).

### Input

```json
{
    "searchQueries": ["coffee shops", "dentist"],
    "locationQuery": "Austin, TX",
    "maxPlacesPerSearch": 120,
    "maxResults": 1000,
    "enrichContacts": true,
    "scrapePlaceDetails": true,
    "minRating": "4",
    "websiteFilter": "all",
    "sortBy": "leadScore"
}
````

- **searchQueries** — what to look for (categories, business types, or names). Each is combined with the location.
- **locationQuery** — city / area, e.g. `Austin, TX`, `New York, NY`, `London, UK`, `Berlin, Germany`. Geocoded automatically. Leave empty if you use coordinates or start URLs.
- **latitude / longitude / zoom** *(optional)* — explicit search center instead of a location string.
- **startUrls** *(optional)* — paste Google Maps search URLs (`…/maps/search/<term>/@lat,lng,zoomz`).
- **maxPlacesPerSearch** *(default 120)* — Google returns up to ~120 places per search area; split big metros into multiple cities/terms for more coverage.
- **maxResults** *(default 1000)* — global cap after filtering & sorting.
- **enrichContacts** *(default false)* — crawl each place's website (home + contact/about) for emails, social profiles and phones. Google Maps never exposes emails — this is the only way to get them.
- **scrapePlaceDetails** *(default false)* — add the **total review count**, the **full Monday–Sunday opening hours**, a refined rating and a popular-times flag. Google only serves these on its rendered place page, so this opens each place in a real browser — slower and billed per place — but gives you the review-volume and full-hours data the fast pass can't.
- **detailConcurrency** *(default 4)* — parallel place pages when `scrapePlaceDetails` is on (run with ≥4 GB memory).
- **minRating / categoryFilterWords / websiteFilter / skipClosedPlaces / withPhoneOnly / withEmailOnly / nameQuery** — filters.
- **language (hl) / countryCode (gl)** — localisation.
- **sortBy** — `leadScore` (default), `rating`, or `distance`.
- **monitorMode / monitorKey** — emit only new / changed places across runs.

### Output

One record per place (`type: "place"`). `reviewsCount`, `openingHours` (full week) and `hasPopularTimes` are present when **scrapePlaceDetails** is on; `emails` / `socialProfiles` / `contactPhones` when **enrichContacts** is on. Empty fields are omitted, so exports never carry blank columns:

```json
{
    "type": "place",
    "placeId": "ChIJm3f11RnLRIYRvuJG0P8_6bw",
    "cid": "13612481716647551678",
    "fid": "0x8644cb19d5f5779b:0xbce93fffd046e2be",
    "kgmid": "/g/11wqplhln0",
    "title": "BRB Coffee",
    "categoryName": "Coffee shop",
    "categories": ["Coffee shop", "Espresso bar"],
    "description": "Cozy neighbourhood coffee bar",
    "address": "3501 Guadalupe St, Austin, TX 78705",
    "street": "3501 Guadalupe St",
    "neighborhood": "North University",
    "city": "Austin",
    "state": "TX",
    "postalCode": "78705",
    "countryCode": "US",
    "latitude": 30.3012578,
    "longitude": -97.7386692,
    "plusCode": "8R29+QV Austin, Texas",
    "phone": "(614) 772-8409",
    "phoneUnformatted": "+16147728409",
    "website": "https://brbcoffee.com/",
    "domain": "brbcoffee.com",
    "totalScore": 4.8,
    "reviewsCount": 1284,
    "status": "Open · Closes 7 PM",
    "openNow": true,
    "hoursToday": "7 AM–7 PM",
    "openingHours": [
        { "day": "Monday", "hours": "7 AM–7 PM" },
        { "day": "Tuesday", "hours": "7 AM–7 PM" }
    ],
    "hasPopularTimes": true,
    "additionalInfo": { "Accessibility": ["Wheelchair accessible entrance"] },
    "imageUrl": "https://lh3.googleusercontent.com/…",
    "emails": ["hello@brbcoffee.com"],
    "socialProfiles": { "instagram": "https://instagram.com/brbcoffee" },
    "contactPhones": ["+16147728409"],
    "leadScore": 86,
    "url": "https://www.google.com/maps/place/?q=place_id:ChIJm3f11RnLRIYRvuJG0P8_6bw",
    "searchString": "coffee shops in Austin, TX",
    "scrapedAt": "2026-06-23T12:00:00.000Z"
}
```

### Automate & schedule

Run this actor on autopilot and pull results into your own stack:

- **[Apify API](https://docs.apify.com/api/v2)** — start runs, fetch datasets, and manage schedules over REST.
- **[apify-client for JavaScript](https://docs.apify.com/api/client/js/)** and **[apify-client for Python](https://docs.apify.com/api/client/python/)** — official SDKs.
- **[Schedules](https://docs.apify.com/platform/schedules)** — run it hourly/daily/weekly to watch a city or category for new businesses; perfect for lead pipelines.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks)** — trigger downstream actions (CRM import, Slack alert, email sequence) the moment a run finishes.

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

const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });

const run = await client.actor('scrapesage/google-maps-scraper').call({
    searchQueries: ['plumbers'],
    locationQuery: 'Phoenix, AZ',
    maxResults: 500,
    enrichContacts: true,
    websiteFilter: 'with_website',
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} places & leads`);
```

### Integrate with any app

Connect the dataset to 5,000+ apps — no code required:

- **[Make](https://docs.apify.com/platform/integrations/make)** — multi-step automation scenarios.
- **[Zapier](https://docs.apify.com/platform/integrations/zapier)** — push new leads straight into your CRM.
- **[Slack](https://docs.apify.com/platform/integrations/slack)** — get notified when a monitored search finds new places.
- **[Google Drive / Sheets](https://docs.apify.com/platform/integrations/drive)** — auto-export every run to a spreadsheet.
- **[Airbyte](https://docs.apify.com/platform/integrations/airbyte)** — pipe results into your data warehouse.
- **[GitHub](https://docs.apify.com/platform/integrations/github)** — trigger runs from commits or releases.

### Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. Call this actor from Claude, ChatGPT, or any agent framework through the **[Apify MCP server](https://docs.apify.com/platform/integrations/mcp)** — ask your assistant to "find the top-rated dentists in Austin with their phone and email" and let it run this scraper for you.

### More scrapers from scrapesage

Build a complete **local-business lead-gen stack**:

- **[Website Contact Scraper](https://apify.com/scrapesage/website-contact-scraper)** — emails, phones & socials from any list of domains (pairs perfectly with this actor).
- **[Google Ads Transparency Scraper](https://apify.com/scrapesage/google-ads-transparency-scraper)** — see who's advertising what on Google.
- **[Facebook Ad Library Scraper](https://apify.com/scrapesage/facebook-ad-library-scraper)** — competitor ad intelligence.
- **[Bark Listing Scraper](https://apify.com/scrapesage/bark-listing-scraper)** — service-provider leads from Bark.
- **[Thumbtack Scraper](https://apify.com/scrapesage/thumbtack-scraper)** — home-service pro leads, reviews & hire data.
- **[BBB Scraper](https://apify.com/scrapesage/bbb-scraper)** — Better Business Bureau profiles, ratings & accreditation.
- **[Eventbrite Scraper](https://apify.com/scrapesage/eventbrite-scraper)** — events plus organizer leads with emails.
- **[LinkedIn Jobs Scraper](https://apify.com/scrapesage/linkedin-jobs-scraper)** — job postings as hiring-intent signals.

### Tips

- **Coverage**: Google Maps caps a single search area at ~120 results. To exhaust a big metro, split into multiple `searchQueries` and/or cities, or pass tighter coordinates per neighbourhood.
- **Find prospects who need a website**: set `websiteFilter` to *Only without a website*.
- **Cleaner leads**: combine `enrichContacts` with `withEmailOnly` to keep only places that have a reachable email.
- **Recurring monitoring**: turn on `monitorMode`, give each saved search its own `monitorKey`, and pair it with a [Schedule](https://docs.apify.com/platform/schedules) — you'll only pay for new / changed places.
- **Proxies**: keep the default Apify Proxy; Google Maps responds cleanly through it.
- **Cost control**: the base search + contact enrichment is fast and cheap. Only turn on `scrapePlaceDetails` when you actually need review counts / full weekly hours — it renders each place in a browser, so it's slower and billed per place. Combine it with `maxResults` to cap how many places get the (paid) detail pass.

### FAQ

**How do I scrape Google Maps for a specific city?** Put the city in `locationQuery` (e.g. `Austin, TX`) and your category in `searchQueries` (e.g. `dentist`). The actor centres the search on that location automatically.

**Does it need a Google Maps / Places API key?** No. It reads Google Maps' own public data feed — no API key, no quota, no billing account, and far more fields than the official Places API returns.

**Where do the emails come from?** Never from Google Maps (it doesn't publish them). With `enrichContacts` on, the actor visits each business's own public website and extracts publicly listed contact emails and social links — the same thing a human visitor would see.

**How do I get the review count and full weekly opening hours?** Turn on `scrapePlaceDetails`. Google serves the total review count and the complete Monday–Sunday hours only on its rendered place page (not in the fast search feed), so this mode opens each place in a real browser — it's slower and billed per place (the `placeDetails` event), but it adds `reviewsCount`, `openingHours` for all seven days, a refined rating and a popular-times flag. Leave it off for the fastest, cheapest run; the base pass still returns the rating, today's hours and open/closed status.

**Can I export to Google Sheets, CSV, or Excel?** Yes — one click in the dataset view, or automatically on every run via the [Google Drive integration](https://docs.apify.com/platform/integrations/drive).

**How do I get only new businesses over time?** Turn on `monitorMode` and run on a [Schedule](https://docs.apify.com/platform/schedules); the actor remembers what it has seen and emits only new or changed places.

**Is scraping Google Maps legal?** This actor collects publicly available data only. You are responsible for using the data in compliance with applicable laws (GDPR/CCPA for personal data) and Google's terms.

**A field is missing on some records — why?** Some places genuinely don't publish a website, phone or email. To keep exports clean, a field is simply omitted when it has no value (so CSV/Excel files never contain blank filler columns) — it's missing because the data doesn't exist, not because the scraper skipped it.

### Need help?

Open an issue on the actor's **Issues** tab, or visit the [Apify help center](https://help.apify.com/). Feature requests are welcome — this actor is actively maintained.

# Actor input Schema

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

What to search for on Google Maps — categories, business types or names, e.g. "coffee shops", "dentist", "plumbers", "law firms". Each term is combined with the location below.

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

City / area to search in, e.g. "Austin, TX", "New York, NY", "London, UK", "Berlin, Germany". It is geocoded automatically to center the search. Leave empty if you put the location inside the search term or use coordinates / start URLs.

## `latitude` (type: `integer`):

Explicit search-center latitude. Overrides the geocoded location. Use with longitude (and optionally zoom).

## `longitude` (type: `integer`):

Explicit search-center longitude.

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

Map zoom for the search viewport when using coordinates. Higher = tighter area, more local results. Typical city search: 12-14.

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

Paste Google Maps search URLs (…/maps/search/<term>/@lat,lng,zoomz). The term and viewport are read from each URL and scraped.

## `maxPlacesPerSearch` (type: `integer`):

How many places to collect per search term + location. Google Maps returns up to ~120 results per search area; split into multiple cities/terms for more coverage.

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

Global cap on the number of place records output (after filtering & sorting).

## `enrichContacts` (type: `boolean`):

For every place that has a website, crawl its home + contact/about page and extract publicly listed e-mail addresses, social profiles (Facebook, Instagram, LinkedIn, X, YouTube, TikTok) and phone numbers — turning each place into a ready-to-contact B2B lead. Google Maps never exposes emails; this is the only way to get them.

## `scrapePlaceDetails` (type: `boolean`):

Add the review count, the complete Monday–Sunday opening hours, a refined rating and a popular-times flag to each place. These are only available from Google's rendered place page, so this opens each place in a real browser — slower and billed per place (placeDetails event). Leave off for the fast, cheapest run; turn on when you need review counts and full hours.

## `detailConcurrency` (type: `integer`):

How many place pages to render in parallel when 'Scrape place details' is on. Higher = faster but heavier; 3–5 is a good balance. Run with ≥4 GB memory for details mode.

## `minRating` (type: `string`):

Keep only places with at least this average rating (e.g. 4.0). Leave empty for all.

## `categoryFilterWords` (type: `array`):

Keep only places whose Google category contains any of these words (case-insensitive), e.g. "restaurant", "bar". Useful to narrow a broad search.

## `websiteFilter` (type: `string`):

Keep all places, only those with a website, or only those without one (great for finding businesses that need a site).

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

Drop places marked as permanently or temporarily closed.

## `withPhoneOnly` (type: `boolean`):

Keep only places that have a phone number.

## `withEmailOnly` (type: `boolean`):

Keep only places for which contact enrichment found at least one e-mail address. Turn on "Enrich contacts" too.

## `nameQuery` (type: `string`):

Keep only places whose name contains this text (case-insensitive).

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

Google language code for results, e.g. en, es, de, fr, pt.

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

Google country code biasing results, e.g. us, gb, de, au, br.

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

Ordering of the (capped) output.

## `includeRawFields` (type: `boolean`):

Attach Google's raw place array (sourceArray) to each record for full transparency / advanced parsing.

## `monitorMode` (type: `boolean`):

Remember places across runs and emit only NEW or CHANGED ones (phone, website, rating or address change). Great for watching a city/category for new businesses. Works independently of Apify Schedules — pair it with a Schedule to run on a cadence.

## `monitorKey` (type: `string`):

Namespace for monitor memory. Use a distinct key per saved search so their states don't collide.

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

Google Maps responds cleanly from Apify Proxy. The default (automatic) proxy is recommended.

## Actor input object example

```json
{
  "searchQueries": [
    "coffee shops",
    "dentist"
  ],
  "locationQuery": "Austin, TX",
  "maxPlacesPerSearch": 120,
  "maxResults": 1000,
  "enrichContacts": false,
  "scrapePlaceDetails": false,
  "detailConcurrency": 4,
  "minRating": "",
  "websiteFilter": "all",
  "skipClosedPlaces": false,
  "withPhoneOnly": false,
  "withEmailOnly": false,
  "language": "en",
  "countryCode": "us",
  "sortBy": "leadScore",
  "includeRawFields": false,
  "monitorMode": false,
  "monitorKey": "default",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All scraped Google Maps place records as JSON items in the default dataset.

# 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": [
        "restaurants"
    ],
    "locationQuery": "Austin, TX"
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/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": ["restaurants"],
    "locationQuery": "Austin, TX",
}

# Run the Actor and wait for it to finish
run = client.actor("scrapesage/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": [
    "restaurants"
  ],
  "locationQuery": "Austin, TX"
}' |
apify call scrapesage/google-maps-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Maps Scraper - Places, Leads & Contacts",
        "description": "Scrape Google Maps businesses & places by keyword + location: name, address, phone, website, rating, category, opening hours, coordinates, photos & attributes. Optional website email/social enrichment, lead scoring & monitor mode. No API key. Export to CSV/JSON/Excel.",
        "version": "0.1",
        "x-build-id": "bUvRNjAoYZu2huWFv"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/scrapesage~google-maps-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-scrapesage-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/scrapesage~google-maps-scraper/runs": {
            "post": {
                "operationId": "runs-sync-scrapesage-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/scrapesage~google-maps-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-scrapesage-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 terms",
                        "type": "array",
                        "description": "What to search for on Google Maps — categories, business types or names, e.g. \"coffee shops\", \"dentist\", \"plumbers\", \"law firms\". Each term is combined with the location below.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "locationQuery": {
                        "title": "Location",
                        "type": "string",
                        "description": "City / area to search in, e.g. \"Austin, TX\", \"New York, NY\", \"London, UK\", \"Berlin, Germany\". It is geocoded automatically to center the search. Leave empty if you put the location inside the search term or use coordinates / start URLs."
                    },
                    "latitude": {
                        "title": "Center latitude (optional)",
                        "type": "integer",
                        "description": "Explicit search-center latitude. Overrides the geocoded location. Use with longitude (and optionally zoom)."
                    },
                    "longitude": {
                        "title": "Center longitude (optional)",
                        "type": "integer",
                        "description": "Explicit search-center longitude."
                    },
                    "zoom": {
                        "title": "Zoom (1-20)",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Map zoom for the search viewport when using coordinates. Higher = tighter area, more local results. Typical city search: 12-14."
                    },
                    "startUrls": {
                        "title": "Google Maps URLs (optional)",
                        "type": "array",
                        "description": "Paste Google Maps search URLs (…/maps/search/<term>/@lat,lng,zoomz). The term and viewport are read from each URL and scraped.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxPlacesPerSearch": {
                        "title": "Max places per search",
                        "minimum": 1,
                        "type": "integer",
                        "description": "How many places to collect per search term + location. Google Maps returns up to ~120 results per search area; split into multiple cities/terms for more coverage.",
                        "default": 120
                    },
                    "maxResults": {
                        "title": "Max results (total)",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Global cap on the number of place records output (after filtering & sorting).",
                        "default": 1000
                    },
                    "enrichContacts": {
                        "title": "Enrich contacts (emails, socials & phones from website)",
                        "type": "boolean",
                        "description": "For every place that has a website, crawl its home + contact/about page and extract publicly listed e-mail addresses, social profiles (Facebook, Instagram, LinkedIn, X, YouTube, TikTok) and phone numbers — turning each place into a ready-to-contact B2B lead. Google Maps never exposes emails; this is the only way to get them.",
                        "default": false
                    },
                    "scrapePlaceDetails": {
                        "title": "Scrape place details (review count + full weekly hours)",
                        "type": "boolean",
                        "description": "Add the review count, the complete Monday–Sunday opening hours, a refined rating and a popular-times flag to each place. These are only available from Google's rendered place page, so this opens each place in a real browser — slower and billed per place (placeDetails event). Leave off for the fast, cheapest run; turn on when you need review counts and full hours.",
                        "default": false
                    },
                    "detailConcurrency": {
                        "title": "Place-details concurrency",
                        "minimum": 1,
                        "maximum": 8,
                        "type": "integer",
                        "description": "How many place pages to render in parallel when 'Scrape place details' is on. Higher = faster but heavier; 3–5 is a good balance. Run with ≥4 GB memory for details mode.",
                        "default": 4
                    },
                    "minRating": {
                        "title": "Minimum star rating",
                        "enum": [
                            "",
                            "2",
                            "2.5",
                            "3",
                            "3.5",
                            "4",
                            "4.5"
                        ],
                        "type": "string",
                        "description": "Keep only places with at least this average rating (e.g. 4.0). Leave empty for all.",
                        "default": ""
                    },
                    "categoryFilterWords": {
                        "title": "Category filter words",
                        "type": "array",
                        "description": "Keep only places whose Google category contains any of these words (case-insensitive), e.g. \"restaurant\", \"bar\". Useful to narrow a broad search.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "websiteFilter": {
                        "title": "Website filter",
                        "enum": [
                            "all",
                            "with_website",
                            "without_website"
                        ],
                        "type": "string",
                        "description": "Keep all places, only those with a website, or only those without one (great for finding businesses that need a site).",
                        "default": "all"
                    },
                    "skipClosedPlaces": {
                        "title": "Skip permanently/temporarily closed",
                        "type": "boolean",
                        "description": "Drop places marked as permanently or temporarily closed.",
                        "default": false
                    },
                    "withPhoneOnly": {
                        "title": "Only places with a phone number",
                        "type": "boolean",
                        "description": "Keep only places that have a phone number.",
                        "default": false
                    },
                    "withEmailOnly": {
                        "title": "Only leads with an e-mail (requires enrichment)",
                        "type": "boolean",
                        "description": "Keep only places for which contact enrichment found at least one e-mail address. Turn on \"Enrich contacts\" too.",
                        "default": false
                    },
                    "nameQuery": {
                        "title": "Name contains",
                        "type": "string",
                        "description": "Keep only places whose name contains this text (case-insensitive)."
                    },
                    "language": {
                        "title": "Language (hl)",
                        "type": "string",
                        "description": "Google language code for results, e.g. en, es, de, fr, pt.",
                        "default": "en"
                    },
                    "countryCode": {
                        "title": "Country (gl)",
                        "type": "string",
                        "description": "Google country code biasing results, e.g. us, gb, de, au, br.",
                        "default": "us"
                    },
                    "sortBy": {
                        "title": "Sort by",
                        "enum": [
                            "leadScore",
                            "rating",
                            "distance"
                        ],
                        "type": "string",
                        "description": "Ordering of the (capped) output.",
                        "default": "leadScore"
                    },
                    "includeRawFields": {
                        "title": "Include raw source array",
                        "type": "boolean",
                        "description": "Attach Google's raw place array (sourceArray) to each record for full transparency / advanced parsing.",
                        "default": false
                    },
                    "monitorMode": {
                        "title": "Monitor mode (only new / changed)",
                        "type": "boolean",
                        "description": "Remember places across runs and emit only NEW or CHANGED ones (phone, website, rating or address change). Great for watching a city/category for new businesses. Works independently of Apify Schedules — pair it with a Schedule to run on a cadence.",
                        "default": false
                    },
                    "monitorKey": {
                        "title": "Monitor key",
                        "type": "string",
                        "description": "Namespace for monitor memory. Use a distinct key per saved search so their states don't collide.",
                        "default": "default"
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Google Maps responds cleanly from Apify Proxy. The default (automatic) proxy is recommended.",
                        "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
