# Google Maps Scraper + Email Extractor & AI Lead Enrichment (`entranced_gelato/google-maps-lead-engine`) Actor

Scrape Google Maps businesses, extract & verify emails from their websites, and let AI score which leads to contact first. CRM-ready B2B lead output.

- **URL**: https://apify.com/entranced\_gelato/google-maps-lead-engine.md
- **Developed by:** [AIDevs](https://apify.com/entranced_gelato) (community)
- **Categories:** Lead generation, Automation, AI
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$5.00 / 1,000 leads

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/docs.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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 B2B Lead Finder + Email Verifier + AI Enricher

Turn Google Maps search results into **outreach-ready business leads**. This Actor searches Google Maps for local businesses, crawls each business website for contact details, discovers and verifies email addresses, runs AI-based qualification, and outputs clean, scored lead objects ready for your CRM, outreach sequences, or downstream automation.

**Extract local businesses from Google Maps, discover and verify contact channels, and let AI score which leads are worth contacting first.**

### What does this Actor do?

1. Searches Google Maps by keyword + location (or direct Maps URLs) and extracts place records: name, category, address, phone, website, rating, review count, coordinates, and open/closed status.
2. Deduplicates places found across multiple search terms (place ID, domain, phone, name+address keys).
3. Crawls each first-party business website (contact, about, and team pages first) and extracts emails (including `mailto:`, obfuscated, and JSON-LD sources), phone numbers, contact forms, booking links, and social profiles.
4. Verifies discovered emails - syntax, disposable-domain, and MX checks - using the standard verification vocabulary: `ok`, `invalid`, `disposable`, `catch_all`, `unknown`, `error`.
5. Runs AI enrichment (Anthropic, OpenAI, OpenRouter, or free built-in heuristics): niche classification, website quality score, digital maturity, opportunity tags, pain-point signals, and a one-line personalization hook.
6. Scores every lead 0-100 with an A/B/C/D quality band across contactability, commercial fit, digital-presence gap, reputation, and legitimacy.
7. Delivers results to the dataset (JSON/CSV/Excel export), a run-summary record, and an optional webhook.

### Who is it for?

Lead generation agencies, local SEO and web design agencies, B2B sales teams, franchise expansion and market research teams, and AI workflow builders using n8n, Make, LangChain, or custom APIs.

### Quick start

```json
{
    "searchTerms": ["dentist", "dental clinic"],
    "locationQuery": "Malmö, Sweden",
    "maxPlaces": 200,
    "crawlWebsite": true,
    "verifyEmails": true,
    "enableAiEnrichment": true,
    "aiProvider": "none"
}
````

Set `aiProvider` to `anthropic`, `openai`, or `openrouter` with your own `aiApiKey` for LLM-grade enrichment, or keep `none` for free rule-based enrichment.

### Output example

```json
{
    "business": {
        "name": "Bright Smile Dental",
        "categoryName": "Dentist",
        "address": "Storgatan 1, 211 34 Malmö",
        "phone": "+46 40 123 456",
        "website": "https://brightsmile.se",
        "rating": 4.7,
        "reviewsCount": 132
    },
    "contacts": {
        "emails": [
            {
                "email": "info@brightsmile.se",
                "type": "generic",
                "sameDomain": true,
                "verification": { "status": "ok", "subResult": "mx_accepts_mail" }
            }
        ],
        "contactForms": ["https://brightsmile.se/contact"],
        "socials": { "facebook": ["https://facebook.com/brightsmile"] }
    },
    "ai": {
        "normalizedNiche": "family dental clinic",
        "digitalMaturityLevel": "medium",
        "websiteQualityScore": 62,
        "serviceOpportunityTags": ["needs-seo", "no-booking-flow"],
        "personalizationHook": "Family clinic with strong ratings but no online booking flow.",
        "leadQualityScore": 81
    },
    "scoring": {
        "leadQualityScore": 78,
        "leadQualityBand": "A",
        "contactabilityScore": 84
    }
}
```

Three dataset views are provided in the Output tab: **Business leads**, **Contacts**, and **AI summary**. A `RUN_SUMMARY` record with aggregate metrics is saved to the key-value store.

### Pricing (pay per event)

You pay only for what the Actor actually produces:

| Event | When it's charged |
|---|---|
| Place scraped | A business record passed your filters |
| Website crawled | A first-party website was successfully crawled |
| Same-domain email found | A unique same-domain email was discovered |
| Email verified (decisive) | Verification returned `ok`, `invalid`, or `disposable` - non-decisive results are free |
| AI enrichment produced | A valid AI enrichment result was produced |
| Qualified lead | A lead reached the A/B quality band |

Base extraction stays cheap; you opt into website crawling, verification, and AI scoring only when you need them. Cost controls are built in: `maxPlaces`, `maxWebsitePages`, `maxAiEnrichments`, and `minLeadQualityScore`.

### Input reference

See the Input tab for all options. Highlights:

| Field | Purpose |
|---|---|
| `searchTerms` + `locationQuery` | Broad geographic discovery (recommended - covers more than a raw Maps URL) |
| `startUrls` | Direct Maps search/place URLs (note: Google caps a single search URL at ~120 results) |
| `minRating`, `minReviews`, `skipClosed`, `categoryFilters` | Maps-level filters |
| `crawlWebsite`, `maxWebsitePages`, `contactPagePriority` | Website crawl policy |
| `discoverEmails`, `verifyEmails` | Email discovery + verification |
| `enableAiEnrichment`, `aiProvider`, `aiApiKey`, `aiPromptProfile` | AI qualification |
| `requireWebsite`, `requireEmailOrForm`, `minLeadQualityScore` | Commercial usability filters |
| `webhookUrl`, `batchId` | Downstream automation |

### Example automations

- Push A-band leads into HubSpot/Pipedrive via the webhook + Make/n8n.
- Schedule weekly runs per territory using `batchId` to track batches.
- Chain with an outreach tool: filter dataset to `verification.status = "ok"` and export CSV.

### Limitations

- Google Maps markup changes over time; the Actor uses defensive selectors and retries, but extraction coverage can vary. Report issues and we ship fixes.
- A single direct Maps URL search is capped by Google at roughly 120 results; use `searchTerms` + `locationQuery` for full coverage.
- Built-in email verification uses DNS/MX checks (no SMTP mailbox probe), so `ok` means the domain accepts mail, not a guaranteed mailbox.
- Use of proxies (`proxyConfiguration` with residential proxies) is strongly recommended for runs above ~100 places.

### Legal & compliance

This Actor extracts publicly available business information (not private personal data). Scraping public data is generally legal, but you are responsible for how you use the output: respect GDPR/CAN-SPAM and regional outreach rules, honor takedown requests, and review the target sites' terms of use. Person-level extraction is off by default; the Actor practices data minimization (no raw HTML stored unless you opt in).

# Actor input Schema

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

Business queries to search on Google Maps, e.g. <code>dentist</code>, <code>roofing contractor</code>. Each term is searched against the location below.

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

City, region, postal area, or country, e.g. <code>Malmö, Sweden</code> or <code>Austin, TX</code>. Required when using search terms.

## `maxPlaces` (type: `integer`):

Maximum number of unique places to process per run (cost control).

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

Direct Google Maps search or place URLs. Note: a single Maps search URL may be capped at ~120 results by Google; structured location search covers more.

## `minRating` (type: `number`):

Skip places rated below this value (0 = no filter).

## `minReviews` (type: `integer`):

Skip places with fewer reviews (0 = no filter).

## `skipClosed` (type: `boolean`):

Exclude permanently or temporarily closed businesses.

## `categoryFilters` (type: `array`):

Keep only places whose Google Maps category contains one of these strings (case-insensitive).

## `excludeCategories` (type: `array`):

Drop places whose category contains one of these strings.

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

Preferred results locale (hl parameter), e.g. <code>en</code>, <code>sv</code>, <code>de</code>.

## `crawlWebsite` (type: `boolean`):

Visit each first-party business website to extract emails, phones, forms, socials, and quality signals.

## `maxWebsitePages` (type: `integer`):

Pages inspected per domain (homepage + contact/about/team pages first).

## `contactPagePriority` (type: `array`):

Path keywords crawled first, in priority order.

## `discoverEmails` (type: `boolean`):

Extract emails from mailto links, visible text, obfuscations, and JSON-LD.

## `verifyEmails` (type: `boolean`):

Verify discovered emails (syntax, disposable-domain, and MX checks). Only decisive results (ok / invalid / disposable) are billed.

## `extractSocialLinks` (type: `boolean`):

Capture LinkedIn, Facebook, Instagram, YouTube, TikTok, and X profiles.

## `extractContactForms` (type: `boolean`):

Capture contact form URLs as a fallback outreach path.

## `enableAiEnrichment` (type: `boolean`):

Run AI qualification: niche classification, website quality, opportunity tags, personalization hooks, and lead scores.

## `aiProvider` (type: `string`):

LLM provider for enrichment. 'Built-in heuristics' produces rule-based enrichment without any API key.

## `aiModel` (type: `string`):

Model identifier, e.g. <code>claude-haiku-4-5-20251001</code> or <code>gpt-4o-mini</code>. Leave empty for a sensible default.

## `aiApiKey` (type: `string`):

Your API key for the selected provider. Stored encrypted; used only for enrichment calls.

## `aiPromptProfile` (type: `string`):

Tunes AI outputs to your use case.

## `maxAiEnrichments` (type: `integer`):

Cost control for LLM calls.

## `includeAiRationale` (type: `boolean`):

Include the reasoning behind lead quality scores in output.

## `requireWebsite` (type: `boolean`):

Keep only businesses that have a website.

## `requireEmailOrForm` (type: `boolean`):

Keep only businesses with at least one direct outreach path.

## `minLeadQualityScore` (type: `integer`):

Drop leads scoring below this composite score (0 = keep all).

## `excludeDomains` (type: `array`):

Skip businesses whose website is on these domains (chains, directories, aggregators).

## `batchId` (type: `string`):

Optional identifier for multi-run orchestration; echoed on every record.

## `webhookUrl` (type: `string`):

POSTs the run summary JSON here when the run finishes.

## `includeRawHtml` (type: `boolean`):

Keep raw page text samples for debugging (increases output size).

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

Proxies for Google Maps and website crawling. Residential proxies recommended for large runs.

## Actor input object example

```json
{
  "searchTerms": [
    "dentist"
  ],
  "locationQuery": "San Diego, CA",
  "maxPlaces": 100,
  "minRating": 0,
  "minReviews": 0,
  "skipClosed": true,
  "language": "en",
  "crawlWebsite": true,
  "maxWebsitePages": 8,
  "contactPagePriority": [
    "contact",
    "about",
    "team",
    "impressum",
    "kontakt"
  ],
  "discoverEmails": true,
  "verifyEmails": true,
  "extractSocialLinks": true,
  "extractContactForms": true,
  "enableAiEnrichment": false,
  "aiProvider": "none",
  "aiPromptProfile": "sales-outreach",
  "maxAiEnrichments": 500,
  "includeAiRationale": true,
  "requireWebsite": false,
  "requireEmailOrForm": false,
  "minLeadQualityScore": 0,
  "includeRawHtml": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `leads` (type: `string`):

One row per business with contacts, AI enrichment, and lead scores.

## `runSummary` (type: `string`):

Aggregate metrics: places found, emails found, verified emails, qualified leads, top opportunity tags.

# 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": [
        "dentist"
    ],
    "locationQuery": "San Diego, CA"
};

// Run the Actor and wait for it to finish
const run = await client.actor("entranced_gelato/google-maps-lead-engine").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": ["dentist"],
    "locationQuery": "San Diego, CA",
}

# Run the Actor and wait for it to finish
run = client.actor("entranced_gelato/google-maps-lead-engine").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": [
    "dentist"
  ],
  "locationQuery": "San Diego, CA"
}' |
apify call entranced_gelato/google-maps-lead-engine --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Maps Scraper + Email Extractor & AI Lead Enrichment",
        "description": "Scrape Google Maps businesses, extract & verify emails from their websites, and let AI score which leads to contact first. CRM-ready B2B lead output.",
        "version": "1.0",
        "x-build-id": "QXvLbsXY87b5Mu0n2"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/entranced_gelato~google-maps-lead-engine/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-entranced_gelato-google-maps-lead-engine",
                "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/entranced_gelato~google-maps-lead-engine/runs": {
            "post": {
                "operationId": "runs-sync-entranced_gelato-google-maps-lead-engine",
                "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/entranced_gelato~google-maps-lead-engine/run-sync": {
            "post": {
                "operationId": "run-sync-entranced_gelato-google-maps-lead-engine",
                "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": "Business queries to search on Google Maps, e.g. <code>dentist</code>, <code>roofing contractor</code>. Each term is searched against the location below.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "locationQuery": {
                        "title": "Location",
                        "type": "string",
                        "description": "City, region, postal area, or country, e.g. <code>Malmö, Sweden</code> or <code>Austin, TX</code>. Required when using search terms."
                    },
                    "maxPlaces": {
                        "title": "Max places",
                        "minimum": 1,
                        "maximum": 100000,
                        "type": "integer",
                        "description": "Maximum number of unique places to process per run (cost control).",
                        "default": 100
                    },
                    "startUrls": {
                        "title": "Direct Google Maps URLs (optional)",
                        "type": "array",
                        "description": "Direct Google Maps search or place URLs. Note: a single Maps search URL may be capped at ~120 results by Google; structured location search covers more.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "minRating": {
                        "title": "Minimum rating",
                        "minimum": 0,
                        "maximum": 5,
                        "type": "number",
                        "description": "Skip places rated below this value (0 = no filter).",
                        "default": 0
                    },
                    "minReviews": {
                        "title": "Minimum review count",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Skip places with fewer reviews (0 = no filter).",
                        "default": 0
                    },
                    "skipClosed": {
                        "title": "Skip closed businesses",
                        "type": "boolean",
                        "description": "Exclude permanently or temporarily closed businesses.",
                        "default": true
                    },
                    "categoryFilters": {
                        "title": "Category filters",
                        "type": "array",
                        "description": "Keep only places whose Google Maps category contains one of these strings (case-insensitive).",
                        "items": {
                            "type": "string"
                        }
                    },
                    "excludeCategories": {
                        "title": "Exclude categories",
                        "type": "array",
                        "description": "Drop places whose category contains one of these strings.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "language": {
                        "title": "Language",
                        "type": "string",
                        "description": "Preferred results locale (hl parameter), e.g. <code>en</code>, <code>sv</code>, <code>de</code>.",
                        "default": "en"
                    },
                    "crawlWebsite": {
                        "title": "Crawl business websites",
                        "type": "boolean",
                        "description": "Visit each first-party business website to extract emails, phones, forms, socials, and quality signals.",
                        "default": true
                    },
                    "maxWebsitePages": {
                        "title": "Max pages per website",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Pages inspected per domain (homepage + contact/about/team pages first).",
                        "default": 8
                    },
                    "contactPagePriority": {
                        "title": "Contact page keywords",
                        "type": "array",
                        "description": "Path keywords crawled first, in priority order.",
                        "default": [
                            "contact",
                            "about",
                            "team",
                            "impressum",
                            "kontakt"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "discoverEmails": {
                        "title": "Discover emails",
                        "type": "boolean",
                        "description": "Extract emails from mailto links, visible text, obfuscations, and JSON-LD.",
                        "default": true
                    },
                    "verifyEmails": {
                        "title": "Verify emails",
                        "type": "boolean",
                        "description": "Verify discovered emails (syntax, disposable-domain, and MX checks). Only decisive results (ok / invalid / disposable) are billed.",
                        "default": true
                    },
                    "extractSocialLinks": {
                        "title": "Extract social links",
                        "type": "boolean",
                        "description": "Capture LinkedIn, Facebook, Instagram, YouTube, TikTok, and X profiles.",
                        "default": true
                    },
                    "extractContactForms": {
                        "title": "Extract contact forms",
                        "type": "boolean",
                        "description": "Capture contact form URLs as a fallback outreach path.",
                        "default": true
                    },
                    "enableAiEnrichment": {
                        "title": "Enable AI enrichment",
                        "type": "boolean",
                        "description": "Run AI qualification: niche classification, website quality, opportunity tags, personalization hooks, and lead scores.",
                        "default": false
                    },
                    "aiProvider": {
                        "title": "AI provider",
                        "enum": [
                            "none",
                            "anthropic",
                            "openai",
                            "openrouter"
                        ],
                        "type": "string",
                        "description": "LLM provider for enrichment. 'Built-in heuristics' produces rule-based enrichment without any API key.",
                        "default": "none"
                    },
                    "aiModel": {
                        "title": "AI model",
                        "type": "string",
                        "description": "Model identifier, e.g. <code>claude-haiku-4-5-20251001</code> or <code>gpt-4o-mini</code>. Leave empty for a sensible default."
                    },
                    "aiApiKey": {
                        "title": "AI provider API key",
                        "type": "string",
                        "description": "Your API key for the selected provider. Stored encrypted; used only for enrichment calls."
                    },
                    "aiPromptProfile": {
                        "title": "Enrichment profile",
                        "enum": [
                            "sales-outreach",
                            "local-seo",
                            "market-research",
                            "generic"
                        ],
                        "type": "string",
                        "description": "Tunes AI outputs to your use case.",
                        "default": "sales-outreach"
                    },
                    "maxAiEnrichments": {
                        "title": "Max AI enrichments per run",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Cost control for LLM calls.",
                        "default": 500
                    },
                    "includeAiRationale": {
                        "title": "Include AI score rationale",
                        "type": "boolean",
                        "description": "Include the reasoning behind lead quality scores in output.",
                        "default": true
                    },
                    "requireWebsite": {
                        "title": "Require website",
                        "type": "boolean",
                        "description": "Keep only businesses that have a website.",
                        "default": false
                    },
                    "requireEmailOrForm": {
                        "title": "Require email or contact form",
                        "type": "boolean",
                        "description": "Keep only businesses with at least one direct outreach path.",
                        "default": false
                    },
                    "minLeadQualityScore": {
                        "title": "Minimum lead quality score",
                        "minimum": 0,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Drop leads scoring below this composite score (0 = keep all).",
                        "default": 0
                    },
                    "excludeDomains": {
                        "title": "Exclude domains",
                        "type": "array",
                        "description": "Skip businesses whose website is on these domains (chains, directories, aggregators).",
                        "items": {
                            "type": "string"
                        }
                    },
                    "batchId": {
                        "title": "Batch ID",
                        "type": "string",
                        "description": "Optional identifier for multi-run orchestration; echoed on every record."
                    },
                    "webhookUrl": {
                        "title": "Webhook URL",
                        "type": "string",
                        "description": "POSTs the run summary JSON here when the run finishes."
                    },
                    "includeRawHtml": {
                        "title": "Include raw HTML samples",
                        "type": "boolean",
                        "description": "Keep raw page text samples for debugging (increases output size).",
                        "default": false
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxies for Google Maps and website crawling. Residential proxies recommended for large runs.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
