# Google Maps Business Leads Scraper (Email, Phone...) (`lurkapi/google-maps-business-leads-scraper`) Actor

Scrape business listings from Google Maps and enrich with emails, phones, and social profiles from each company website. Lead generation in one click.

- **URL**: https://apify.com/lurkapi/google-maps-business-leads-scraper.md
- **Developed by:** [LurkAPI](https://apify.com/lurkapi) (community)
- **Categories:** Automation, Lead generation
- **Stats:** 5 total users, 3 monthly users, 88.9% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.69 / 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 Business Leads Scraper (Email, Phone...)

Find local businesses on Google Maps and get their contact details, all in one click. Phone numbers, emails, social profiles, opening hours, and more, ready for sales outreach.

### 🎯 What it does

Give it a search keyword and a location, and it will:

1. **Search Google Maps** for matching businesses (restaurants, plumbers, dentists, anything you can search for).
2. **Pull every public detail** Google shows about each business: name, address, phone, website, rating, reviews, hours, popular times, price range, photos, and more.
3. **Visit each company website** to find emails, secondary phone numbers, and links to Facebook, Instagram, LinkedIn, Twitter / X, TikTok, YouTube, and Pinterest.
4. **Return everything** as a clean dataset you can export to CSV, Excel, JSON, or push straight into your CRM.

### 📋 How to use it

#### Step 1: Configure input

- **Search terms**: One keyword per line. Example: `coffee shop`, `dentist`, `plumber`.
- **Location**: City, region, or country. Example: `New York, NY`, `London, UK`, `United States`.
- **Max places per search term**: Cap how many results come back per keyword (Google itself caps total results per query at about 120).

Optional:
- **Google Maps URLs**: Paste search or place URLs directly to scrape them.
- **Skip these place IDs**: Place IDs you already collected from prior runs. Skipped without charge, so you only pay for new leads.
- **Filters**: Minimum rating, minimum review count, only places with a website. Filtered places are not charged.
- **Output Fields**: Toggle each field to trim row size. Disabling fields you do not need can dramatically reduce CSV size for large runs.

#### Step 2: Run it

Click **Start** and wait. Results stream into the Output tab as each search term completes, so you do not have to wait for the whole run.

#### Step 3: Get your results

Open the **Output** tab. Each row is one business. The `status` field shows whether the lookup succeeded; everything else is the data.

Key fields:

| Field | What it is |
|---|---|
| `status` | Always present. `Success` on a clean row, or a human-readable error message. |
| `placeId` | Google's permanent identifier for this business. Use this to dedupe across runs. |
| `title`, `category`, `address`, `city`, `state`, `country` | Identity and location. |
| `phone`, `website`, `email` | Primary contact details. |
| `phones`, `emails` | All phones and emails found via the website crawl. |
| `facebook`, `instagram`, `linkedin`, `twitter`, `tiktok`, `youtube`, `pinterest` | Social profile links. |
| `rating`, `reviewCount`, `priceRange` | Quality and pricing signals. |
| `openingHours`, `popularTimes`, `currentStatus` | When the business is open and how busy it gets. |
| `googleMapsUrl` | Direct link back to the listing on Google Maps. |

### 🌐 Proxy settings

By default, this Actor uses Apify Datacenter proxies, which are fast and cheap. You can change this in the input form:

- **Datacenter (default)**: Best for most runs.
- **Residential**: Switch to this if you start to see frequent blocks (rare, but possible on very large or repeated runs).
- **Own proxies**: Provide your own URLs if you have a specific provider.
- **No proxy**: Disable proxies entirely. Not recommended for large runs.

### 💰 Pricing

Pay-per-result. The base scrape is `$1.99 per 1,000 places` returned. Optional add-ons charge only when they return a decisive positive result; misses cost nothing.

**Base**

| Item | Price |
|---|---|
| Place scraped | **$1.99 / 1,000** |

**Add-ons** (pay only on a successful match)

| Add-on | Charges when | Price |
|---|---|---|
| Detect Google Ads activity | A live Google Ads advertiser is matched | **$1.00 / 1,000** |
| Detect Meta (Facebook / Instagram) Ads activity | A live Meta advertiser is matched | **$1.00 / 1,000** |
| LinkedIn company enrichment | A LinkedIn company page is enriched | **$1.00 / 1,000** |
| Company registry enrichment | An official registry record is matched | **$2.00 / 1,000** |
| Find the legal entity behind the listing | A legal entity is decisively resolved | **$2.00 / 1,000** |
| Validate primary email + classify provider | An email is validated (MX + provider) | **$0.50 / 1,000** |

### 💡 Good to know

- Not every business has a website, and not every website lists an email. Coverage depends on the business owner's web presence.
- Phone numbers from Google Maps are clean E.164 format (`+13239923635`). Phones discovered on websites are best-effort and may include uncertain matches.
- Emails are not validated for deliverability in this version. If you need SMTP-level validation, add it as a downstream step.
- Google Maps caps search results per query around 120 places. To pull more from a city, use multiple specific keywords (`coffee shop`, `cafe`, `espresso bar`).
- Data is stored in your Apify dataset. Retention depends on your Apify plan.

### ❓ FAQ

**Why did some places not get an email?**

Either the business has no website, the website does not list a public email, or the website blocked the crawl. This is the normal floor of any Google Maps email scraper. For better coverage, layer a dedicated email finder over the websites we return.

**Which proxy should I use?**

Start with the default Datacenter. Switch to Residential only if you see frequent blocks in the logs. Residential costs more compute, so do not flip it on by default.

**Can I scrape more than 120 places per keyword?**

Google caps total results per single query at around 120. Split your search into more specific terms (different cuisines, price levels, neighborhoods) to get past that. The `placeIdsToSkip` input lets you avoid double-paying for businesses you already have.

**How long are the results stored?**

They are stored in your Apify dataset. How long they are kept depends on your Apify plan.

**Is this legal?**

Public data on Google Maps is generally considered fair game for collection. You are responsible for following Google's Terms of Service, GDPR, CCPA, and any other applicable laws in your jurisdiction. Do not contact people on this list in ways that violate anti-spam laws (CAN-SPAM, CASL, etc.).

### 🔗 Other tools you might like

- [Google Ads Scraper](https://apify.com/lurkapi/google-ads-scraper) — see which ads any advertiser is running on Google.
- [Google Shopping Ads Scraper](https://apify.com/lurkapi/google-shopping-ads-spy-scraper) — pull all sponsored Shopping listings for any keyword.

### ⚖️ Disclaimer

This tool is for personal, research, and educational use. You are responsible for complying with Google's Terms of Service and applicable laws in your jurisdiction. The developer is not liable for misuse. Data availability depends on Google Maps at run time.

**Keywords:** google maps scraper, business leads, lead generation, email finder, phone finder, contact extractor

# Actor input Schema

## `searchTerms` (type: `array`):

Keywords to search on Google Maps. One per line. Each is paired with the Location field below.
## `location` (type: `string`):

City, region, or country to search in. A city name alone works (e.g. 'Austin'); add state or country for precision (e.g. 'Austin, TX' or 'Paris, France').
## `language` (type: `string`):

Google Maps language. Default 'en'.
## `maxPlacesPerSearch` (type: `integer`):

Cap how many places are returned per search term. Google Maps limits results to ~120 per query regardless.
## `googleMapsUrls` (type: `array`):

Paste Google Maps search URLs or place URLs to scrape directly. When this list is non-empty, the search-terms / location pair above is ignored; only the URLs you provide are processed.
## `placeIdsToSkip` (type: `array`):

Place IDs you've already collected. Skipped without charge. Bulk-paste many at once: one per line, or comma-separated.
## `searchCircle` (type: `object`):

Limit search to a circular area. Provide { "lat": <number>, "lng": <number>, "radiusMiles": <number> }. Centers the Maps viewport here and drops places outside the radius. Combine with Search terms; Location is ignored when this is set.
## `searchPolygon` (type: `array`):

Limit search to an arbitrary polygon. Provide an array of [lng, lat] pairs (GeoJSON convention; first and last point can match). Centers the viewport on the polygon's bounding box and filters places to those inside. Takes precedence over Search circle when both are set.
## `minRating` (type: `integer`):

Skip places below this average rating. Filtered places are not charged.
## `minReviewCount` (type: `integer`):

Skip places with fewer than this many reviews. Filtered places are not charged.
## `hasWebsite` (type: `boolean`):

If on, skip listings that have no website. Filtered places are not charged.
## `webHostFilter` (type: `array`):

Multi-select. When set, only places whose website is detected as running one of these platforms are kept (rest are dropped without charge). Useful if you're a web agency only working with WordPress (or Shopify, Webflow, etc.) clients and want to filter leads to your stack.
## `outputPlaceId` (type: `boolean`):

Google's permanent identifier for the business.
## `outputCid` (type: `boolean`):

Google's hex CID identifier for the business.
## `outputTitle` (type: `boolean`):

Display name shown on Google Maps.
## `outputPhone` (type: `boolean`):

Primary phone listed on the Google Maps profile.
## `outputWebsite` (type: `boolean`):

Business website URL listed on Google Maps.
## `outputEmail` (type: `boolean`):

First email discovered while crawling the website.
## `outputGoogleMapsUrl` (type: `boolean`):

Direct link to the listing on Google Maps.
## `outputSearchKeyword` (type: `boolean`):

Keyword that produced this row.
## `outputError` (type: `boolean`):

Technical error string when a lookup fails.
## `outputCategory` (type: `boolean`):

First category Google assigns to the business.
## `outputCategories` (type: `boolean`):

All categories Google assigns to the business.
## `outputWebsiteBusinessType` (type: `boolean`):

Schema.org @type values from the website's own structured data (e.g. Restaurant, MedicalBusiness, AutoRepair). Often more specific than Google's category and standardized to a known vocabulary.
## `outputWebHost` (type: `boolean`):

Detected web platform / hosting layer of the business website (WordPress, Shopify, Webflow, Vercel, Cloudflare, etc.). Useful for B2B segmentation by tech stack.
## `outputAddress` (type: `boolean`):

Complete street address.
## `outputCity` (type: `boolean`):

City component of the address.
## `outputState` (type: `boolean`):

State or region component of the address.
## `outputCountry` (type: `boolean`):

Country component of the address.
## `outputPostalCode` (type: `boolean`):

Postal code component of the address.
## `outputLatitude` (type: `boolean`):

Latitude in decimal degrees.
## `outputLongitude` (type: `boolean`):

Longitude in decimal degrees.
## `outputRating` (type: `boolean`):

Average review rating (1 to 5).
## `outputReviewCount` (type: `boolean`):

Total number of reviews.
## `outputPriceRange` (type: `boolean`):

Price range string (such as $$ or US$10-20).
## `outputDescription` (type: `boolean`):

Editorial description shown on the listing.
## `outputOpeningHours` (type: `boolean`):

Opening hours per day of the week.
## `outputPopularTimes` (type: `boolean`):

Hourly busyness percentages from Google.
## `outputCurrentStatus` (type: `boolean`):

Current status string (Open, Closed, Permanently closed).
## `outputTimezone` (type: `boolean`):

IANA timezone string for the location.
## `outputPlusCode` (type: `boolean`):

Google plus code for the location.
## `outputMainImage` (type: `boolean`):

Primary photo of the business.
## `outputImages` (type: `boolean`):

List of additional photo URLs.
## `outputServiceOptions` (type: `boolean`):

Service options listed on the business profile.
## `outputAdditionalInfo` (type: `boolean`):

Additional attributes Google publishes for the business.
## `outputMenu` (type: `boolean`):

Menu link if the business publishes one.
## `outputReservations` (type: `boolean`):

Reservation links if the business publishes any.
## `outputOrderOnline` (type: `boolean`):

Order-online links if the business publishes any.
## `outputOwner` (type: `boolean`):

Listing owner or top contributor info if available.
## `outputEmails` (type: `boolean`):

All emails found while crawling the website.
## `outputPhones` (type: `boolean`):

All phone numbers found while crawling the website.
## `outputSocials` (type: `boolean`):

Social profile URLs found while crawling the website.
## `checkGoogleAdsActive` (type: `boolean`):

Flag businesses currently advertising on Google. Adds a googleAdsActive boolean and a link to their public Ads Transparency Center profile when a match is found.
## `checkMetaAdsActive` (type: `boolean`):

Flag businesses currently advertising on Facebook or Instagram. Adds a metaAdsActive boolean and a link to their Meta Ad Library page when a match is found.
## `enrichLinkedIn` (type: `boolean`):

Pull public company data from LinkedIn: name, follower count, headcount range, industry, headquarters, founded year, specialties, logo, cover image, and whether the company has posted in the last 30 days. Only runs when a LinkedIn URL is found on the website.
## `enrichRegistry` (type: `boolean`):

Look up the business in official government registries: registration number, legal status, incorporation date, registered address, and IDs like EIN / SIREN / NZBN. Covers the US, UK, Australia, France, and New Zealand, plus a worldwide LEI fallback.
## `enrichLegalEntity` (type: `boolean`):

Find the legal company behind the trade name. Many businesses operate under a brand that differs from the entity that owns it (a 'Subway' franchise may legally belong to 'Doctor's Associates LLC'). Also extracts tax and registration IDs (VAT, EIN, SIREN, ABN, NZBN, etc.) from the website.
## `enrichDomain` (type: `boolean`):

Get the website's domain age, registrar, creation date, and expiry. Useful as a credibility signal: a domain registered in 1999 is an established business; one registered last week is a red flag.
## `validateEmail` (type: `boolean`):

Check that each scraped email's domain accepts mail and isn't on a disposable-email list. Also classifies the email host (Google Workspace, Microsoft 365, Zoho, etc.), which helps separate real businesses from personal Gmail / Outlook setups.
## `enableLeadScoring` (type: `boolean`):

Compute a 0 to 100 lead score per place from signals already in the row (email, phone, website, rating, social, Google Ads activity, email provider type, etc.). Free, no extra fetches. Tune the defaults via Lead score weights below.
## `leadScoreWeights` (type: `object`):

Override the default scoring weights. Provide any subset of: emailDomainMatch (default 25), emailPresent (8), phonePresent (12), websitePresent (8), ratingAtLeast4 (8), descriptionPresent (5), mainImagePresent (5), additionalInfoPopulated (5), socialAny (10), googleAdsActive (15), emailValidValid (10), emailProviderBusiness (6; fires when the email is hosted on a paid business provider like Google Workspace, Microsoft 365, or Zoho rather than a free consumer mailbox). Keys you don't specify keep their defaults. Permanently-closed places always score 0.
## `proxyConfig` (type: `object`):

Proxy used for Google Maps requests and website enrichment. Datacenter is the default for cost efficiency. Switch to Residential if you see frequent blocks.

## Actor input object example

```json
{
  "searchTerms": [
    "restaurants"
  ],
  "location": "New York, NY",
  "language": "en",
  "maxPlacesPerSearch": 50,
  "outputPlaceId": true,
  "outputCid": true,
  "outputTitle": true,
  "outputPhone": true,
  "outputWebsite": true,
  "outputEmail": true,
  "outputGoogleMapsUrl": true,
  "outputSearchKeyword": true,
  "outputError": true,
  "outputCategory": true,
  "outputCategories": true,
  "outputWebsiteBusinessType": true,
  "outputWebHost": true,
  "outputAddress": true,
  "outputCity": true,
  "outputState": true,
  "outputCountry": true,
  "outputPostalCode": true,
  "outputLatitude": true,
  "outputLongitude": true,
  "outputRating": true,
  "outputReviewCount": true,
  "outputPriceRange": true,
  "outputDescription": true,
  "outputOpeningHours": true,
  "outputPopularTimes": true,
  "outputCurrentStatus": true,
  "outputTimezone": true,
  "outputPlusCode": true,
  "outputMainImage": true,
  "outputImages": true,
  "outputServiceOptions": true,
  "outputAdditionalInfo": true,
  "outputMenu": true,
  "outputReservations": true,
  "outputOrderOnline": true,
  "outputOwner": true,
  "outputEmails": true,
  "outputPhones": true,
  "outputSocials": true,
  "checkGoogleAdsActive": false,
  "checkMetaAdsActive": false,
  "enrichLinkedIn": false,
  "enrichRegistry": false,
  "enrichLegalEntity": false,
  "enrichDomain": false,
  "validateEmail": false,
  "enableLeadScoring": false,
  "proxyConfig": {
    "useApifyProxy": true,
    "apifyProxyGroups": []
  }
}
````

# Actor output Schema

## `overview` (type: `string`):

No description

## `contacts` (type: `string`):

No description

## `hours` (type: `string`):

No description

## `location` (type: `string`):

No description

## `quality` (type: `string`):

No description

## `enrichments` (type: `string`):

No description

# 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 = {
    "searchTerms": [
        "restaurants"
    ],
    "location": "New York, NY",
    "maxPlacesPerSearch": 50,
    "proxyConfig": {
        "useApifyProxy": true,
        "apifyProxyGroups": []
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("lurkapi/google-maps-business-leads-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 = {
    "searchTerms": ["restaurants"],
    "location": "New York, NY",
    "maxPlacesPerSearch": 50,
    "proxyConfig": {
        "useApifyProxy": True,
        "apifyProxyGroups": [],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("lurkapi/google-maps-business-leads-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 '{
  "searchTerms": [
    "restaurants"
  ],
  "location": "New York, NY",
  "maxPlacesPerSearch": 50,
  "proxyConfig": {
    "useApifyProxy": true,
    "apifyProxyGroups": []
  }
}' |
apify call lurkapi/google-maps-business-leads-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Maps Business Leads Scraper (Email, Phone...)",
        "description": "Scrape business listings from Google Maps and enrich with emails, phones, and social profiles from each company website. Lead generation in one click.",
        "version": "0.0",
        "x-build-id": "SWeW8o8OiFgPdevIh"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/lurkapi~google-maps-business-leads-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-lurkapi-google-maps-business-leads-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/lurkapi~google-maps-business-leads-scraper/runs": {
            "post": {
                "operationId": "runs-sync-lurkapi-google-maps-business-leads-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/lurkapi~google-maps-business-leads-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-lurkapi-google-maps-business-leads-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": {
                    "searchTerms": {
                        "title": "Search terms",
                        "type": "array",
                        "description": "Keywords to search on Google Maps. One per line. Each is paired with the Location field below.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "City, region, or country to search in. A city name alone works (e.g. 'Austin'); add state or country for precision (e.g. 'Austin, TX' or 'Paris, France')."
                    },
                    "language": {
                        "title": "Language",
                        "type": "string",
                        "description": "Google Maps language. Default 'en'.",
                        "default": "en"
                    },
                    "maxPlacesPerSearch": {
                        "title": "Max places per search term",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Cap how many places are returned per search term. Google Maps limits results to ~120 per query regardless.",
                        "default": 100
                    },
                    "googleMapsUrls": {
                        "title": "Google Maps URLs (replaces keyword search if set)",
                        "type": "array",
                        "description": "Paste Google Maps search URLs or place URLs to scrape directly. When this list is non-empty, the search-terms / location pair above is ignored; only the URLs you provide are processed.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "placeIdsToSkip": {
                        "title": "Place IDs to skip",
                        "type": "array",
                        "description": "Place IDs you've already collected. Skipped without charge. Bulk-paste many at once: one per line, or comma-separated.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "searchCircle": {
                        "title": "Search circle (lat / lng / radius miles)",
                        "type": "object",
                        "description": "Limit search to a circular area. Provide { \"lat\": <number>, \"lng\": <number>, \"radiusMiles\": <number> }. Centers the Maps viewport here and drops places outside the radius. Combine with Search terms; Location is ignored when this is set."
                    },
                    "searchPolygon": {
                        "title": "Search polygon (GeoJSON ring)",
                        "type": "array",
                        "description": "Limit search to an arbitrary polygon. Provide an array of [lng, lat] pairs (GeoJSON convention; first and last point can match). Centers the viewport on the polygon's bounding box and filters places to those inside. Takes precedence over Search circle when both are set."
                    },
                    "minRating": {
                        "title": "Minimum rating (1–5)",
                        "minimum": 1,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Skip places below this average rating. Filtered places are not charged."
                    },
                    "minReviewCount": {
                        "title": "Minimum review count",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Skip places with fewer than this many reviews. Filtered places are not charged."
                    },
                    "hasWebsite": {
                        "title": "Only places with a website",
                        "type": "boolean",
                        "description": "If on, skip listings that have no website. Filtered places are not charged."
                    },
                    "webHostFilter": {
                        "title": "Only places running these web platforms",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Multi-select. When set, only places whose website is detected as running one of these platforms are kept (rest are dropped without charge). Useful if you're a web agency only working with WordPress (or Shopify, Webflow, etc.) clients and want to filter leads to your stack.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "WordPress",
                                "WordPress.com",
                                "Shopify",
                                "Wix",
                                "Squarespace",
                                "Webflow",
                                "Ghost",
                                "Drupal",
                                "Joomla",
                                "Magento",
                                "BigCommerce",
                                "HubSpot CMS",
                                "Duda",
                                "Weebly",
                                "Jimdo",
                                "WP Engine",
                                "Kinsta",
                                "Pantheon",
                                "Vercel",
                                "Netlify",
                                "GitHub Pages",
                                "Cloudflare Pages",
                                "AWS Amplify",
                                "Google Sites",
                                "Heroku",
                                "AWS / CloudFront",
                                "Cloudflare",
                                "Fastly",
                                "Akamai"
                            ],
                            "enumTitles": [
                                "WordPress (self-hosted)",
                                "WordPress.com (hosted SaaS)",
                                "Shopify",
                                "Wix",
                                "Squarespace",
                                "Webflow",
                                "Ghost",
                                "Drupal",
                                "Joomla",
                                "Magento",
                                "BigCommerce",
                                "HubSpot CMS",
                                "Duda",
                                "Weebly",
                                "Jimdo",
                                "WP Engine",
                                "Kinsta",
                                "Pantheon",
                                "Vercel",
                                "Netlify",
                                "GitHub Pages",
                                "Cloudflare Pages",
                                "AWS Amplify",
                                "Google Sites",
                                "Heroku",
                                "AWS / CloudFront",
                                "Cloudflare",
                                "Fastly",
                                "Akamai"
                            ]
                        }
                    },
                    "outputPlaceId": {
                        "title": "Place ID",
                        "type": "boolean",
                        "description": "Google's permanent identifier for the business.",
                        "default": true
                    },
                    "outputCid": {
                        "title": "CID (long-form ID)",
                        "type": "boolean",
                        "description": "Google's hex CID identifier for the business.",
                        "default": true
                    },
                    "outputTitle": {
                        "title": "Business name",
                        "type": "boolean",
                        "description": "Display name shown on Google Maps.",
                        "default": true
                    },
                    "outputPhone": {
                        "title": "Primary phone (from Google Maps)",
                        "type": "boolean",
                        "description": "Primary phone listed on the Google Maps profile.",
                        "default": true
                    },
                    "outputWebsite": {
                        "title": "Website URL (from Google Maps)",
                        "type": "boolean",
                        "description": "Business website URL listed on Google Maps.",
                        "default": true
                    },
                    "outputEmail": {
                        "title": "Primary email (first found via website)",
                        "type": "boolean",
                        "description": "First email discovered while crawling the website.",
                        "default": true
                    },
                    "outputGoogleMapsUrl": {
                        "title": "Google Maps URL",
                        "type": "boolean",
                        "description": "Direct link to the listing on Google Maps.",
                        "default": true
                    },
                    "outputSearchKeyword": {
                        "title": "Source search keyword",
                        "type": "boolean",
                        "description": "Keyword that produced this row.",
                        "default": true
                    },
                    "outputError": {
                        "title": "Error details (when status is not Success)",
                        "type": "boolean",
                        "description": "Technical error string when a lookup fails.",
                        "default": true
                    },
                    "outputCategory": {
                        "title": "Primary category",
                        "type": "boolean",
                        "description": "First category Google assigns to the business.",
                        "default": true
                    },
                    "outputCategories": {
                        "title": "All categories",
                        "type": "boolean",
                        "description": "All categories Google assigns to the business.",
                        "default": true
                    },
                    "outputWebsiteBusinessType": {
                        "title": "Website business type (schema.org)",
                        "type": "boolean",
                        "description": "Schema.org @type values from the website's own structured data (e.g. Restaurant, MedicalBusiness, AutoRepair). Often more specific than Google's category and standardized to a known vocabulary.",
                        "default": true
                    },
                    "outputWebHost": {
                        "title": "Web host / platform (WordPress, Shopify, etc.)",
                        "type": "boolean",
                        "description": "Detected web platform / hosting layer of the business website (WordPress, Shopify, Webflow, Vercel, Cloudflare, etc.). Useful for B2B segmentation by tech stack.",
                        "default": true
                    },
                    "outputAddress": {
                        "title": "Full address",
                        "type": "boolean",
                        "description": "Complete street address.",
                        "default": true
                    },
                    "outputCity": {
                        "title": "City",
                        "type": "boolean",
                        "description": "City component of the address.",
                        "default": true
                    },
                    "outputState": {
                        "title": "State / region",
                        "type": "boolean",
                        "description": "State or region component of the address.",
                        "default": true
                    },
                    "outputCountry": {
                        "title": "Country",
                        "type": "boolean",
                        "description": "Country component of the address.",
                        "default": true
                    },
                    "outputPostalCode": {
                        "title": "Postal / zip code",
                        "type": "boolean",
                        "description": "Postal code component of the address.",
                        "default": true
                    },
                    "outputLatitude": {
                        "title": "Latitude",
                        "type": "boolean",
                        "description": "Latitude in decimal degrees.",
                        "default": true
                    },
                    "outputLongitude": {
                        "title": "Longitude",
                        "type": "boolean",
                        "description": "Longitude in decimal degrees.",
                        "default": true
                    },
                    "outputRating": {
                        "title": "Average rating",
                        "type": "boolean",
                        "description": "Average review rating (1 to 5).",
                        "default": true
                    },
                    "outputReviewCount": {
                        "title": "Review count",
                        "type": "boolean",
                        "description": "Total number of reviews.",
                        "default": true
                    },
                    "outputPriceRange": {
                        "title": "Price range",
                        "type": "boolean",
                        "description": "Price range string (such as $$ or US$10-20).",
                        "default": true
                    },
                    "outputDescription": {
                        "title": "Editorial description",
                        "type": "boolean",
                        "description": "Editorial description shown on the listing.",
                        "default": true
                    },
                    "outputOpeningHours": {
                        "title": "Opening hours (per day)",
                        "type": "boolean",
                        "description": "Opening hours per day of the week.",
                        "default": true
                    },
                    "outputPopularTimes": {
                        "title": "Popular times (busyness % per hour)",
                        "type": "boolean",
                        "description": "Hourly busyness percentages from Google.",
                        "default": true
                    },
                    "outputCurrentStatus": {
                        "title": "Current open / closed status",
                        "type": "boolean",
                        "description": "Current status string (Open, Closed, Permanently closed).",
                        "default": true
                    },
                    "outputTimezone": {
                        "title": "Timezone (IANA)",
                        "type": "boolean",
                        "description": "IANA timezone string for the location.",
                        "default": true
                    },
                    "outputPlusCode": {
                        "title": "Plus code",
                        "type": "boolean",
                        "description": "Google plus code for the location.",
                        "default": true
                    },
                    "outputMainImage": {
                        "title": "Main image URL",
                        "type": "boolean",
                        "description": "Primary photo of the business.",
                        "default": true
                    },
                    "outputImages": {
                        "title": "Image gallery URLs",
                        "type": "boolean",
                        "description": "List of additional photo URLs.",
                        "default": true
                    },
                    "outputServiceOptions": {
                        "title": "Service options (Delivery / Takeout / Dine-in)",
                        "type": "boolean",
                        "description": "Service options listed on the business profile.",
                        "default": true
                    },
                    "outputAdditionalInfo": {
                        "title": "Additional info (LGBTQ+ friendly, accessibility, etc.)",
                        "type": "boolean",
                        "description": "Additional attributes Google publishes for the business.",
                        "default": true
                    },
                    "outputMenu": {
                        "title": "Menu link",
                        "type": "boolean",
                        "description": "Menu link if the business publishes one.",
                        "default": true
                    },
                    "outputReservations": {
                        "title": "Reservation links",
                        "type": "boolean",
                        "description": "Reservation links if the business publishes any.",
                        "default": true
                    },
                    "outputOrderOnline": {
                        "title": "Order-online links",
                        "type": "boolean",
                        "description": "Order-online links if the business publishes any.",
                        "default": true
                    },
                    "outputOwner": {
                        "title": "Owner / contributor info",
                        "type": "boolean",
                        "description": "Listing owner or top contributor info if available.",
                        "default": true
                    },
                    "outputEmails": {
                        "title": "All emails (from website crawl)",
                        "type": "boolean",
                        "description": "All emails found while crawling the website.",
                        "default": true
                    },
                    "outputPhones": {
                        "title": "All phones (from website crawl)",
                        "type": "boolean",
                        "description": "All phone numbers found while crawling the website.",
                        "default": true
                    },
                    "outputSocials": {
                        "title": "Social profiles (Facebook, Instagram, LinkedIn, etc.)",
                        "type": "boolean",
                        "description": "Social profile URLs found while crawling the website.",
                        "default": true
                    },
                    "checkGoogleAdsActive": {
                        "title": "Detect Google Ads activity",
                        "type": "boolean",
                        "description": "Flag businesses currently advertising on Google. Adds a googleAdsActive boolean and a link to their public Ads Transparency Center profile when a match is found.",
                        "default": false
                    },
                    "checkMetaAdsActive": {
                        "title": "Detect Meta (Facebook / Instagram) Ads activity",
                        "type": "boolean",
                        "description": "Flag businesses currently advertising on Facebook or Instagram. Adds a metaAdsActive boolean and a link to their Meta Ad Library page when a match is found.",
                        "default": false
                    },
                    "enrichLinkedIn": {
                        "title": "LinkedIn company enrichment",
                        "type": "boolean",
                        "description": "Pull public company data from LinkedIn: name, follower count, headcount range, industry, headquarters, founded year, specialties, logo, cover image, and whether the company has posted in the last 30 days. Only runs when a LinkedIn URL is found on the website.",
                        "default": false
                    },
                    "enrichRegistry": {
                        "title": "Company registry enrichment",
                        "type": "boolean",
                        "description": "Look up the business in official government registries: registration number, legal status, incorporation date, registered address, and IDs like EIN / SIREN / NZBN. Covers the US, UK, Australia, France, and New Zealand, plus a worldwide LEI fallback.",
                        "default": false
                    },
                    "enrichLegalEntity": {
                        "title": "Find the legal entity behind the listing",
                        "type": "boolean",
                        "description": "Find the legal company behind the trade name. Many businesses operate under a brand that differs from the entity that owns it (a 'Subway' franchise may legally belong to 'Doctor's Associates LLC'). Also extracts tax and registration IDs (VAT, EIN, SIREN, ABN, NZBN, etc.) from the website.",
                        "default": false
                    },
                    "enrichDomain": {
                        "title": "Domain registration data (age + registrar)",
                        "type": "boolean",
                        "description": "Get the website's domain age, registrar, creation date, and expiry. Useful as a credibility signal: a domain registered in 1999 is an established business; one registered last week is a red flag.",
                        "default": false
                    },
                    "validateEmail": {
                        "title": "Validate primary email + classify provider",
                        "type": "boolean",
                        "description": "Check that each scraped email's domain accepts mail and isn't on a disposable-email list. Also classifies the email host (Google Workspace, Microsoft 365, Zoho, etc.), which helps separate real businesses from personal Gmail / Outlook setups.",
                        "default": false
                    },
                    "enableLeadScoring": {
                        "title": "Score each lead (0 to 100)",
                        "type": "boolean",
                        "description": "Compute a 0 to 100 lead score per place from signals already in the row (email, phone, website, rating, social, Google Ads activity, email provider type, etc.). Free, no extra fetches. Tune the defaults via Lead score weights below.",
                        "default": false
                    },
                    "leadScoreWeights": {
                        "title": "Lead score weights (override defaults)",
                        "type": "object",
                        "description": "Override the default scoring weights. Provide any subset of: emailDomainMatch (default 25), emailPresent (8), phonePresent (12), websitePresent (8), ratingAtLeast4 (8), descriptionPresent (5), mainImagePresent (5), additionalInfoPopulated (5), socialAny (10), googleAdsActive (15), emailValidValid (10), emailProviderBusiness (6; fires when the email is hosted on a paid business provider like Google Workspace, Microsoft 365, or Zoho rather than a free consumer mailbox). Keys you don't specify keep their defaults. Permanently-closed places always score 0."
                    },
                    "proxyConfig": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Proxy used for Google Maps requests and website enrichment. Datacenter is the default for cost efficiency. Switch to Residential if you see frequent blocks.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": []
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
