# Google Maps Scraper + AI Lead Generation & Outreach (`buseta/google-maps-scraper`) Actor

Scrape Google Maps businesses with emails, reviews, and social links. Let AI score every lead and write personalized cold emails for you. Choose your goal (web design, SEO, reputation or custom) and get ready-to-send outreach for every lead. Free email extraction. Export to CSV, Sheets, or CRM.

- **URL**: https://apify.com/buseta/google-maps-scraper.md
- **Developed by:** [buseta](https://apify.com/buseta) (community)
- **Categories:** AI, Agents, Lead generation
- **Stats:** 9 total users, 2 monthly users, 100.0% runs succeeded, 1 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 + AI Business Intelligence

Fast, low-cost Google Maps scraper with AI-powered lead scoring and personalized outreach generation. Extract businesses, reviews, emails, and social links from Google Maps — no browser needed, pure HTTP for maximum speed and minimum cost.

### Features

- **Search with auto-grid** — Bypass Google's 20-result limit. Automatically subdivides large areas into grid cells to find hundreds or thousands of businesses
- **Multi-query batch** — Paste a list of searches (e.g., 50 cities x 1 category) and scrape them all in one run
- **Email & social extraction** — Crawl business websites to find email addresses and social media links (free, no extra charge)
- **Reviews** — Scrape reviews with text, rating, date, reviewer info, and owner responses
- **Filters** — Filter by rating range or find only businesses without a website
- **AI Lead Scoring** — AI analyzes each business and generates a lead score (0-100) with a ready-to-send cold email
- **AI Market Report** — One-click market intelligence report for your entire dataset
- **CSV-friendly output** — Flat fields ready for Excel, Google Sheets, or CRM import

### Pricing

| Event | Price |
|-------|-------|
| Place scraped | $4.00 / 1,000 |
| Review scraped | $0.50 / 1,000 |
| AI Lead Score + Outreach draft | $35.00 / 1,000 |
| AI Market Report | $0.10 / run |
| Email & social extraction | Free |
| Platform usage | Free |

#### Typical Run Costs

| Use Case | Places | Reviews | Emails | AI | Total Cost |
|----------|--------|---------|--------|-----|-----------|
| Quick lead search (20 places + emails) | $0.08 | — | Free | — | **$0.08** |
| City-wide lead gen (200 places + emails) | $0.80 | — | Free | — | **$0.80** |
| Full pipeline (200 places + emails + AI outreach) | $0.80 | — | Free | $7.00 | **$7.80** |
| Competitor research (100 places + 10 reviews each) | $0.40 | $0.50 | — | — | **$0.90** |
| Market report (500 places + AI report) | $2.00 | — | — | $0.10 | **$2.10** |

### Use Case Examples

#### 1. Lead Generation — Find businesses without websites

You're a web design agency looking for prospects in Miami.

**Input:**
```json
{
    "mode": "search",
    "search_queries": ["restaurants in Miami", "salons in Miami", "gyms in Miami"],
    "max_places": 200,
    "only_without_website": true,
    "get_emails": false,
    "ai_lead_scoring": true,
    "ai_goal": "web_design",
    "ai_sender_name": "Sarah"
}
````

**What you get:** 200 businesses in Miami that don't have a website, each with a lead score and a personalized email like:

```
Subject: Helping Miami Salons Get Found Online

Hi Bella's Beauty Lounge,

I noticed you have a great Google rating (4.8★) but no website yet — which means potential customers searching "salons near me"
might be finding your competitors first. A simple, mobile-friendly website could help you capture those local searches
and let customers book online.

Would you be open to a quick 10-minute chat about getting one set up?

Best,
Sarah
```

#### 2. SEO Agency — Find businesses with weak online presence

**Input:**

```json
{
    "mode": "search",
    "search_queries": ["plumbers in Dallas"],
    "max_places": 100,
    "get_reviews": true,
    "max_reviews_per_place": 5,
    "get_emails": true,
    "ai_lead_scoring": true,
    "ai_goal": "seo_marketing",
    "ai_sender_name": "Mike"
}
```

**What you get:** 100 plumbers in Dallas with their emails, reviews, and AI-generated outreach emails focused on SEO opportunities.

#### 3. Reputation Management — Find businesses with bad reviews

**Input:**

```json
{
    "mode": "search",
    "search_queries": ["dentists in Chicago"],
    "max_places": 200,
    "max_rating": 3.5,
    "get_reviews": true,
    "max_reviews_per_place": 10,
    "reviews_sort": "lowest",
    "ai_lead_scoring": true,
    "ai_goal": "reputation_management"
}
```

**What you get:** Dentists in Chicago with 3.5 stars or lower, their worst reviews, and personalized outreach pitching reputation management services.

#### 4. Market Research — Analyze an entire market

**Input:**

```json
{
    "mode": "search",
    "search_queries": ["coffee shops in San Francisco"],
    "max_places": 500,
    "ai_market_report": true
}
```

**What you get:** 500 coffee shops with full data, plus an AI market report:

```json
{
    "type": "ai_market_report",
    "market_summary": "The coffee shop market in San Francisco is highly saturated with 500+ providers...",
    "saturation_level": "high",
    "key_findings": [
        "Average rating is 4.4★ — quality bar is high",
        "23% of shops have no website",
        "The Mission district has 3x more shops than Sunset despite similar population"
    ],
    "opportunities": [
        {
            "opportunity": "115 coffee shops have no website",
            "target_count": 115,
            "action": "Web design outreach targeting established shops (4+ stars) without web presence"
        }
    ],
    "recommendations": [
        "Focus on the Sunset and Richmond districts — underserved relative to population",
        "Target businesses with 50+ reviews but no website — established but digitally behind"
    ]
}
```

#### 5. Custom B2B Sales — Sell anything to local businesses

You run a commercial cleaning company and want to pitch office cleaning to businesses.

**Input:**

```json
{
    "mode": "search",
    "search_queries": ["law firms in Boston", "accounting firms in Boston", "dental offices in Boston"],
    "max_places": 100,
    "get_emails": true,
    "ai_lead_scoring": true,
    "ai_goal": "custom",
    "ai_custom_pitch": "I run CleanPro Commercial Cleaning. We provide daily office cleaning, deep cleaning, and sanitization services for professional offices. Our pricing starts at $500/month.",
    "ai_sender_name": "James from CleanPro"
}
```

#### 6. Simple Scrape — Just get the data, no AI

**Input:**

```json
{
    "mode": "search",
    "search_queries": ["hotels in London"],
    "max_places": 50,
    "get_emails": true
}
```

**What you get:** 50 hotels with name, address, phone, website, rating, categories, coordinates, hours, emails, and social links.

#### 7. Scrape Specific Places by URL

**Input:**

```json
{
    "mode": "place_urls",
    "place_urls": [
        "https://www.google.com/maps/place/Gramercy+Tavern/@40.7384555,-73.9885064,17z/data=!3m1!4b1!4m6!3m5!1s0x89c259a1820824bd:0x2b79dcdc251b8415",
        "https://www.google.com/maps/place/Le+Bernardin/@40.7615199,-73.9816553,17z"
    ],
    "get_reviews": true,
    "max_reviews_per_place": 20,
    "get_emails": true
}
```

#### 8. Area Coverage with Bounding Box

Scrape all gyms within a specific geographic area:

**Input:**

```json
{
    "mode": "search",
    "search_queries": ["gym"],
    "bounding_box": {
        "sw_lat": 40.70,
        "sw_lng": -74.02,
        "ne_lat": 40.80,
        "ne_lng": -73.93
    },
    "max_places": 500
}
```

### Output Fields

Each place in the dataset includes:

| Field | Description |
|-------|-------------|
| `name` | Business name |
| `address` | Full address |
| `phone` | Phone number |
| `website` | Website URL |
| `email` | Primary email (if email extraction enabled) |
| `emails_all` | All emails found, comma-separated |
| `category` | Primary business category |
| `categories_all` | All categories, comma-separated |
| `rating` | Google rating (1.0 - 5.0) |
| `place_id` | Google Place ID |
| `google_maps_url` | Direct Google Maps link |
| `latitude` | Latitude coordinate |
| `longitude` | Longitude coordinate |
| `description` | Business description from Google |
| `price_level` | Price level ($, $$, $$$) |
| `hours_monday` ... `hours_sunday` | Opening hours per day |
| `social_facebook` | Facebook page URL |
| `social_instagram` | Instagram profile URL |
| `social_twitter` | Twitter/X profile URL |
| `social_linkedin` | LinkedIn page URL |
| `social_youtube` | YouTube channel URL |
| `reviews` | Array of review objects (if enabled) |
| `ai_lead_score` | Lead score 0-100 (if AI enabled) |
| `ai_lead_reason` | Why this score was given |
| `ai_outreach_subject` | Email subject line |
| `ai_outreach_email` | Personalized email draft |

### AI Goal Guide

When enabling AI Lead Scoring, choose the goal that matches your business:

| Goal | Best For | What AI Focuses On |
|------|----------|-------------------|
| **Web Design** | Web agencies, freelance developers | Targets businesses with no website. Pitches modern web presence, online booking, competitor comparison |
| **SEO & Marketing** | SEO agencies, Google Ads specialists | Targets businesses with low visibility, few reviews, or weak online presence vs. competitors |
| **Reputation Management** | Reputation agencies, review management tools | Targets businesses with low ratings. References specific negative review themes, offers solutions |
| **General B2B Sales** | Any product/service sold to local businesses | Professional intro pitch. Describe your offering in the "Custom pitch" field |
| **Custom** | Anything else | Write your own pitch context. AI personalizes it for each business using their profile data |

### How Auto-Grid Works

When you search for "dentists in Chicago" with `max_places: 500`, the scraper:

1. Geocodes "Chicago" to a bounding box
2. Divides the area into grid cells (~2km each)
3. Searches each cell separately (20 results per cell)
4. Deduplicates results by Place ID
5. Stops when `max_places` is reached

This bypasses Google's 20-result-per-query limit, giving you comprehensive area coverage.

### Tips

- **Start small** — Test with `max_places: 20` first to verify data quality
- **Email extraction is free** — Always enable it for lead gen use cases
- **Use multi-query** — Instead of one broad search, use specific queries: `["pizza in Brooklyn", "pizza in Queens", "pizza in Manhattan"]`
- **Filter smartly** — Use `only_without_website: true` for web design leads, or `max_rating: 3.5` for reputation management leads
- **AI works best with reviews** — Enable `get_reviews` alongside AI lead scoring for more accurate scores and better outreach personalization

# Actor input Schema

## `mode` (type: `string`):

How to find places. 'search' uses keyword + location with auto-grid for comprehensive results. 'place\_urls' scrapes specific Google Maps URLs.

## `search_queries` (type: `array`):

List of search queries. Each query should include what and where, e.g. 'dentists in Chicago'. You can add multiple queries to scrape across cities or categories in one run.

## `bounding_box` (type: `object`):

Custom search area as coordinates: {"sw\_lat": 40.70, "sw\_lng": -74.02, "ne\_lat": 40.80, "ne\_lng": -73.93}. Uses grid search to cover the entire area.

## `place_urls` (type: `array`):

List of Google Maps place URLs to scrape details from. Used in 'place\_urls' mode.

## `max_places` (type: `integer`):

Maximum number of places to scrape per search query. Set higher (500+) for comprehensive area coverage with auto-grid.

## `get_reviews` (type: `boolean`):

Extract reviews for each place. Charged at $0.50 per 1,000 reviews.

## `max_reviews_per_place` (type: `integer`):

Maximum number of reviews to scrape per place.

## `reviews_sort` (type: `string`):

How to sort reviews when scraping.

## `get_emails` (type: `boolean`):

Crawl each business website to find email addresses and social media links. Free — no extra charge.

## `only_without_website` (type: `boolean`):

Filter to only return businesses that don't have a website listed. Perfect for web design agencies looking for prospects.

## `min_rating` (type: `number`):

Only include places with this rating or higher (1.0 - 5.0).

## `max_rating` (type: `number`):

Only include places with this rating or lower. Useful for finding businesses that need help (reputation management leads).

## `ai_lead_scoring` (type: `boolean`):

AI analyzes each business and generates a lead score (0-100) with a personalized outreach email draft. Charged at $35 per 1,000 businesses.

## `ai_goal` (type: `string`):

Tell the AI what you're selling so it writes relevant outreach emails for each lead.

• Web Design — You build websites. AI targets businesses with no website or outdated sites, pitching modern web presence and how competitors are getting customers online.

• SEO & Marketing — You do SEO, Google Ads, or digital marketing. AI targets businesses with low visibility, few reviews, or weak online presence compared to local competitors.

• Reputation Management — You help businesses improve their online image. AI targets businesses with low ratings or negative reviews, highlighting specific complaints and offering solutions.

• General B2B Sales — You sell any product/service to local businesses. AI writes a professional intro pitch based on the business profile. Describe what you sell in the 'Custom pitch' field.

• Custom — Write your own pitch context. AI uses your description to craft personalized outreach for every lead.

## `ai_custom_pitch` (type: `string`):

Describe what you're selling and who you are in 1-2 sentences. Example: 'I run a commercial cleaning company. I want to pitch office cleaning services to businesses in the area.' Max 300 characters.

## `ai_sender_name` (type: `string`):

Your name to sign the AI-generated outreach emails. Leave blank for '\[Your Name]' placeholder.

## `ai_market_report` (type: `boolean`):

After all places are scraped, AI generates a market report: saturation analysis, underserved areas, competitor benchmarks, and top opportunities. Charged once per run at $0.10.

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

Language for results (ISO 639-1 code).

## `country` (type: `string`):

Country code for localized results (ISO 3166-1 alpha-2).

## `proxy_config` (type: `object`):

Proxy settings. Datacenter proxies work well for Google Maps.

## Actor input object example

```json
{
  "mode": "search",
  "search_queries": [
    "restaurants in New York"
  ],
  "place_urls": [],
  "max_places": 20,
  "get_reviews": false,
  "max_reviews_per_place": 10,
  "reviews_sort": "newest",
  "get_emails": false,
  "only_without_website": false,
  "ai_lead_scoring": false,
  "ai_goal": "general_sales",
  "ai_market_report": false,
  "language": "en",
  "country": "us",
  "proxy_config": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Google Maps business data with optional AI lead scoring and outreach

# 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 = {
    "mode": "search",
    "search_queries": [
        "restaurants in New York"
    ],
    "place_urls": [],
    "max_places": 20,
    "max_reviews_per_place": 10,
    "language": "en",
    "country": "us",
    "proxy_config": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("buseta/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 = {
    "mode": "search",
    "search_queries": ["restaurants in New York"],
    "place_urls": [],
    "max_places": 20,
    "max_reviews_per_place": 10,
    "language": "en",
    "country": "us",
    "proxy_config": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("buseta/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 '{
  "mode": "search",
  "search_queries": [
    "restaurants in New York"
  ],
  "place_urls": [],
  "max_places": 20,
  "max_reviews_per_place": 10,
  "language": "en",
  "country": "us",
  "proxy_config": {
    "useApifyProxy": true
  }
}' |
apify call buseta/google-maps-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Maps Scraper + AI Lead Generation & Outreach",
        "description": "Scrape Google Maps businesses with emails, reviews, and social links. Let AI score every lead and write personalized cold emails for you. Choose your goal (web design, SEO, reputation or custom) and get ready-to-send outreach for every lead. Free email extraction. Export to CSV, Sheets, or CRM.",
        "version": "1.0",
        "x-build-id": "Srlq9OXqA67kK7sId"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/buseta~google-maps-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-buseta-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/buseta~google-maps-scraper/runs": {
            "post": {
                "operationId": "runs-sync-buseta-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/buseta~google-maps-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-buseta-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",
                "required": [
                    "mode"
                ],
                "properties": {
                    "mode": {
                        "title": "Scrape mode",
                        "enum": [
                            "search",
                            "place_urls"
                        ],
                        "type": "string",
                        "description": "How to find places. 'search' uses keyword + location with auto-grid for comprehensive results. 'place_urls' scrapes specific Google Maps URLs.",
                        "default": "search"
                    },
                    "search_queries": {
                        "title": "Search queries",
                        "type": "array",
                        "description": "List of search queries. Each query should include what and where, e.g. 'dentists in Chicago'. You can add multiple queries to scrape across cities or categories in one run."
                    },
                    "bounding_box": {
                        "title": "Bounding box (optional, overrides location in query)",
                        "type": "object",
                        "description": "Custom search area as coordinates: {\"sw_lat\": 40.70, \"sw_lng\": -74.02, \"ne_lat\": 40.80, \"ne_lng\": -73.93}. Uses grid search to cover the entire area."
                    },
                    "place_urls": {
                        "title": "Place URLs",
                        "type": "array",
                        "description": "List of Google Maps place URLs to scrape details from. Used in 'place_urls' mode."
                    },
                    "max_places": {
                        "title": "Max places per query",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of places to scrape per search query. Set higher (500+) for comprehensive area coverage with auto-grid.",
                        "default": 100
                    },
                    "get_reviews": {
                        "title": "Scrape reviews",
                        "type": "boolean",
                        "description": "Extract reviews for each place. Charged at $0.50 per 1,000 reviews.",
                        "default": false
                    },
                    "max_reviews_per_place": {
                        "title": "Max reviews per place",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Maximum number of reviews to scrape per place.",
                        "default": 20
                    },
                    "reviews_sort": {
                        "title": "Sort reviews by",
                        "enum": [
                            "relevant",
                            "newest",
                            "highest",
                            "lowest"
                        ],
                        "type": "string",
                        "description": "How to sort reviews when scraping.",
                        "default": "newest"
                    },
                    "get_emails": {
                        "title": "Extract emails & social links",
                        "type": "boolean",
                        "description": "Crawl each business website to find email addresses and social media links. Free — no extra charge.",
                        "default": false
                    },
                    "only_without_website": {
                        "title": "Only businesses WITHOUT a website",
                        "type": "boolean",
                        "description": "Filter to only return businesses that don't have a website listed. Perfect for web design agencies looking for prospects.",
                        "default": false
                    },
                    "min_rating": {
                        "title": "Minimum rating",
                        "minimum": 1,
                        "maximum": 5,
                        "type": "number",
                        "description": "Only include places with this rating or higher (1.0 - 5.0)."
                    },
                    "max_rating": {
                        "title": "Maximum rating",
                        "minimum": 1,
                        "maximum": 5,
                        "type": "number",
                        "description": "Only include places with this rating or lower. Useful for finding businesses that need help (reputation management leads)."
                    },
                    "ai_lead_scoring": {
                        "title": "AI Lead Scoring & Outreach",
                        "type": "boolean",
                        "description": "AI analyzes each business and generates a lead score (0-100) with a personalized outreach email draft. Charged at $35 per 1,000 businesses.",
                        "default": false
                    },
                    "ai_goal": {
                        "title": "Your business goal (for AI outreach)",
                        "enum": [
                            "web_design",
                            "seo_marketing",
                            "reputation_management",
                            "general_sales",
                            "custom"
                        ],
                        "type": "string",
                        "description": "Tell the AI what you're selling so it writes relevant outreach emails for each lead.\n\n• Web Design — You build websites. AI targets businesses with no website or outdated sites, pitching modern web presence and how competitors are getting customers online.\n\n• SEO & Marketing — You do SEO, Google Ads, or digital marketing. AI targets businesses with low visibility, few reviews, or weak online presence compared to local competitors.\n\n• Reputation Management — You help businesses improve their online image. AI targets businesses with low ratings or negative reviews, highlighting specific complaints and offering solutions.\n\n• General B2B Sales — You sell any product/service to local businesses. AI writes a professional intro pitch based on the business profile. Describe what you sell in the 'Custom pitch' field.\n\n• Custom — Write your own pitch context. AI uses your description to craft personalized outreach for every lead.",
                        "default": "general_sales"
                    },
                    "ai_custom_pitch": {
                        "title": "Custom pitch context (for 'Custom' or 'General B2B Sales' goal)",
                        "maxLength": 300,
                        "type": "string",
                        "description": "Describe what you're selling and who you are in 1-2 sentences. Example: 'I run a commercial cleaning company. I want to pitch office cleaning services to businesses in the area.' Max 300 characters."
                    },
                    "ai_sender_name": {
                        "title": "Your name (for outreach emails)",
                        "type": "string",
                        "description": "Your name to sign the AI-generated outreach emails. Leave blank for '[Your Name]' placeholder."
                    },
                    "ai_market_report": {
                        "title": "AI Market Intelligence Report",
                        "type": "boolean",
                        "description": "After all places are scraped, AI generates a market report: saturation analysis, underserved areas, competitor benchmarks, and top opportunities. Charged once per run at $0.10.",
                        "default": false
                    },
                    "language": {
                        "title": "Language",
                        "type": "string",
                        "description": "Language for results (ISO 639-1 code).",
                        "default": "en"
                    },
                    "country": {
                        "title": "Country",
                        "type": "string",
                        "description": "Country code for localized results (ISO 3166-1 alpha-2).",
                        "default": "us"
                    },
                    "proxy_config": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings. Datacenter proxies work well for Google Maps."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
