# 📩📍 Google Maps Email Extractor Pro (`ayeeyee/google-maps-email-extractor-pro`) Actor

Search Google Maps by keyword and extract verified business emails, phones, websites, addresses, ratings and social profiles. DNS/MX-validated emails, confidence scoring, CSV/JSON export. Built for lead generation and local outreach.

- **URL**: https://apify.com/ayeeyee/google-maps-email-extractor-pro.md
- **Developed by:** [Virtual Footprint LLC](https://apify.com/ayeeyee) (community)
- **Categories:** Lead generation, Automation, SEO tools
- **Stats:** 2 total users, 1 monthly users, 76.9% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.35 / 1,000 results

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 Email Extractor Pro

![Apify](https://img.shields.io/badge/Apify-Actor-ff6b37?logo=apify)
![Version](https://img.shields.io/badge/version-2.0-blue)
![Pricing](https://img.shields.io/badge/pricing-PAY_PER_EVENT-success)
![Platform](https://img.shields.io/badge/platform-Google%20Maps-purple)
![Modes](https://img.shields.io/badge/modes-fast_lookup%7Cenrich%7Cbatch-orange)
![MCP-ready](https://img.shields.io/badge/MCP-ready-brightgreen)

> Extract verified emails, phones, tech stacks, and confidence-scored business intelligence from Google Maps at scale. Multi-API fallback chain, DNS/MX email validation, and MCP-ready `providerHealth` metadata on every result.

---

### Why This Actor Is Better

This actor is engineered to outperform every Google Maps email extractor on the Apify Store on reliability, data completeness, output quality, and price.

#### Competitor comparison

| Feature | **This Actor** | Google Maps Scraper (top free) | Local Lead Scraper | Outscraper |
|---|:---:|:---:|:---:|:---:|
| Email extraction | ✅ | ❌ | ✅ | ✅ |
| DNS/MX email validation | ✅ open-source | ❌ | ❌ paid add-on | ❌ |
| Tech stack detection | ✅ 16 fingerprints | ❌ | ❌ | ❌ |
| Confidence score (0-1) | ✅ every result | ❌ | ❌ | ❌ |
| Source attribution | ✅ per-field | ❌ | partial | partial |
| Provider fallback chain | ✅ Playwright→HTTP | ❌ | ❌ | ❌ |
| Cache (KVS) | ✅ 24h TTL | ❌ | ❌ | ❌ |
| MCP-ready metadata | ✅ `providerHealth` | ❌ | ❌ | ❌ |
| Optional Hunter.io / Clearbit | ✅ user keys | ❌ | ❌ | ❌ |
| Price / 1K results | **$1.35** | free (rate-limited) | ~$2.50 | ~$3.00 |

#### Key Features

- 🛡️ **Multi-API fallback chain** — Playwright primary scraper with automatic HTTP fallback. Never fails silently.
- ✉️ **Email extraction + validation** — regex extraction from business websites + open-source DNS/MX validation (no paid API required).
- 🧪 **Tech stack detection** — 16 fingerprints (Cloudflare, React, WordPress, Shopify, Wix, Magento, GA, GTM, etc.).
- 📊 **Confidence scoring** — every result gets a 0.0–1.0 score so you can filter noise.
- 🔗 **Source attribution** — know exactly which provider contributed each field (`google_maps`, `website_scraper`, `dns_validator`, `hunter_io`, `clearbit`).
- ⚡ **Cache-first mode** — `fast_lookup` hits the Apify KVS cache for <800ms responses.
- 🤖 **MCP-ready** — every result carries `providerHealth{}` so MCP agents can route around failed providers.
- 🔌 **Optional paid enrichment** — drop in `HUNTER_API_KEY` / `CLEARBIT_API_KEY` env vars for higher match rates. Disabled by default.
- 💰 **Transparent PPE pricing** — pay only for successful results, no subscription.

---

### Architecture

```mermaid
flowchart TD
    A[Input: queries[] + mode] --> B{Cache hit?}
    B -- yes --> C[Return cached base results]
    B -- no --> D[Primary: Google Maps Playwright scraper]
    D -- fails --> E[Fallback: Google Maps HTTP search]
    D -- ok --> F[Parse business listings]
    E --> F
    F --> G[Parallel website contact scraper]
    G --> H[Enrichment layer]
    H --> H1[DNS/MX email validation]
    H --> H2[Tech stack fingerprinting]
    H --> H3[Social profile extraction]
    H --> H4[Optional: Hunter.io / Clearbit]
    H1 --> I[Confidence scoring + source attribution]
    H2 --> I
    H3 --> I
    H4 --> I
    I --> J[Progressive dataset push]
    J --> K[Webhook + MCP-ready metadata]
    C --> K
````

**Data flow:** Input → Cache check → Primary scraper (fallback on failure) → Parallel website enrichment → DNS/MX validation → Tech stack detection → Optional paid enrichment → Confidence scoring → Progressive dataset push → Webhook delivery.

Every result includes `providerHealth{}` tracking per-provider status, latency, and errors — making this actor safe to call from MCP agents that need to route around failures.

***

### Modes

| Mode | Description | Target latency | Use case |
|---|---|---|---|
| `fast_lookup` | Cache-first, base results only | <800ms cached | Quick lookups, deduplication |
| `enrich` | Full multi-provider enrichment | ~3-8s/result | Lead generation, sales enrichment |
| `batch` | Queue-based, full enrichment, per-item isolation | varies | Large query lists (100+ queries) |

***

### Input

| Parameter | Type | Required | Default | Description |
|---|---|:---:|---|---|
| `mode` | string | — | `enrich` | `fast_lookup` | `enrich` | `batch` |
| `queries` | array | ✅ | `["restaurants in New York"]` | Search queries or business names |
| `maxResults` | integer | — | `25` | Max listings per query (1–1000) |
| `extractEmails` | boolean | — | `true` | Enable email extraction from websites |
| `verifyEmails` | boolean | — | `false` | Validate emails via open-source MX/DNS (~3s/email) |
| `extractPhones` | boolean | — | `true` | Extract phone numbers |
| `extractSocialMedia` | boolean | — | `true` | Extract Facebook/Instagram/Twitter/etc. links |
| `includeTechStack` | boolean | — | `true` | Detect website technologies |
| `includeReviews` | boolean | — | `true` | Include rating + review count |
| `language` | string | — | `en` | Search language code |
| `country` | string | — | `us` | Search country code |
| `webhookUrl` | string | — | — | Webhook for completion notification |

#### Example input

```json
{
  "mode": "enrich",
  "queries": ["plumbers in Austin TX", "dentists in Miami FL"],
  "maxResults": 50,
  "verifyEmails": true,
  "includeTechStack": true,
  "webhookUrl": "https://your-app.com/webhook"
}
```

***

### Output

Results are stored in the Apify dataset as structured JSON. See `.actor/output_schema.json` for the canonical schema.

| Field | Type | Description |
|---|---|---|
| `query` | string | Input query that produced this result |
| `name` | string | Business name |
| `address` | string | Business address |
| `rating` | string | Average rating (e.g. "4.7") |
| `reviewCount` | string | Number of reviews |
| `googleMapsUrl` | string | Google Maps place URL |
| `website` | string | null | Business website URL |
| `emails` | array | Extracted + validated email addresses |
| `phones` | array | Extracted phone numbers |
| `socialMedia` | array | Social profile links |
| `techStack` | array | Detected technologies |
| `companyInfo` | object | null | Clearbit company data (if key provided) |
| `confidenceScore` | number | 0.0–1.0 reliability score |
| `sources` | array | Provider attribution (`google_maps`, `website_scraper`, `dns_validator`, `hunter_io`, `clearbit`) |
| `providerHealth` | object | Per-provider status/latency/error for MCP routing |
| `cacheStatus` | string | `hit` | `miss` | `degraded` |
| `mode` | string | Execution mode used |
| `extractedAt` | string | ISO timestamp |

#### Example output

```json
{
  "query": "plumbers in Austin TX",
  "name": "ABC Plumbing Co",
  "address": "123 Main St, Austin, TX 78701",
  "rating": "4.8",
  "reviewCount": "342",
  "googleMapsUrl": "https://www.google.com/maps/place/...",
  "website": "https://abcplumbing.com",
  "emails": ["info@abcplumbing.com", "service@abcplumbing.com"],
  "phones": ["+1 512-555-0100"],
  "socialMedia": ["facebook.com/abcplumbing", "instagram.com/abcplumbing"],
  "techStack": ["WordPress", "Cloudflare", "Google Analytics", "jQuery"],
  "confidenceScore": 0.9,
  "sources": ["google_maps", "website_scraper", "dns_validator"],
  "providerHealth": {
    "google_maps_playwright": {"status": "ok", "latency_ms": 4200, "error": null},
    "website_scraper": {"status": "ok", "latency_ms": 1800, "error": null},
    "dns_validator": {"status": "ok", "latency_ms": 900, "error": null}
  },
  "cacheStatus": "miss",
  "mode": "enrich",
  "extractedAt": "2026-06-28T23:30:00.000Z"
}
```

***

### Pricing

Transparent pay-per-event (PPE) pricing. You only pay for successful results.

| Plan | Price per 1K results | Savings vs. top competitor |
|---|---|---|
| Leading competitors | ~$1.82/1K | — |
| **This actor (≤10K results/mo)** | **$1.35/1K** | **26% cheaper** |
| **This actor (10K–100K/mo)** | **$1.20/1K** | **34% cheaper** |
| **This actor (100K+/mo)** | **$1.00/1K** | **45% cheaper** |

Volume discounts apply automatically based on monthly usage. A small one-time Actor Start fee ($0.00005) applies per run. Optional enrichment events:

| Event | Price | When charged |
|---|---|---|
| `email_found` | $0.20/1K | Per verified email with MX/DNS validation |
| `tech_stack_found` | $0.10/1K | Per business with detected tech stack |

No monthly subscription required. No paid API keys required for core extraction.

***

### Use Cases

- **B2B lead generation** — build local prospect lists with verified emails and phones
- **Sales enrichment** — append emails, tech stacks, and social profiles to existing account lists
- **Agency prospecting** — find businesses by category and city at scale for outreach campaigns
- **Market research** — map business density, ratings, and technology adoption by region
- **CRM hygiene** — update stale records with current website, contact, and tech stack data
- **MCP agent workflows** — call from LLM agents; `providerHealth` lets agents route around failures
- **Competitive intelligence** — track which CMS/frameworks competitors use via tech stack detection
- **Local SEO audits** — identify businesses missing websites or with outdated tech stacks

***

### Integration Examples

#### Python (Apify SDK)

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("ayeeyee/google-maps-email-extractor-pro").call(run_input={
    "mode": "enrich",
    "queries": ["plumbers in Austin TX"],
    "maxResults": 50,
    "verifyEmails": True,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{item['name']}: {item['emails']} (confidence: {item['confidenceScore']})")
```

#### cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/ayeeyee~google-maps-email-extractor-pro/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"mode":"enrich","queries":["dentists in Miami FL"],"maxResults":25}'
```

#### Zapier / n8n / Make.com

1. Add an **HTTP Request** or **Apify** module.
2. Use actor ID `ayeeyee/google-maps-email-extractor-pro`.
3. Map your trigger output to the `queries` input array.
4. Consume the dataset items in the next step.

#### MCP (Model Context Protocol)

This actor is MCP-ready. Register it via `@apify/actors-mcp-server`:

```bash
npx -y @apify/actors-mcp-server --tools actors,ayeeyee/google-maps-email-extractor-pro
```

Agents can then call `call-actor` with the input above and use `providerHealth` + `confidenceScore` to route around failed providers.

***

### FAQ

**Q: Do I need any paid API keys?**
No. Core extraction (Google Maps scraping, website email extraction, DNS/MX validation, tech stack detection) is fully open-source. Optional Hunter.io / Clearbit enrichment only runs if you set `HUNTER_API_KEY` / `CLEARBIT_API_KEY` environment variables.

**Q: How accurate are the emails?**
Emails are extracted via regex from business websites and optionally validated via DNS/MX records. Enable `verifyEmails: true` for MX validation (~3s/email). For higher match rates, provide a Hunter.io key.

**Q: What's the difference between the three modes?**

- `fast_lookup` — cache-first, returns base Google Maps data in <800ms on cache hit. No enrichment.
- `enrich` — full pipeline: scrape → website contacts → email validation → tech stack → confidence score.
- `batch` — queue-based processing for large query lists with per-item error isolation.

**Q: How does the fallback chain work?**
If the primary Playwright scraper fails (blocked, timeout, no results), the actor automatically falls back to a lightweight HTTP search. The `providerHealth` field on every result shows which providers succeeded/failed and their latency.

**Q: Can I call this from an LLM agent?**
Yes. The actor is MCP-ready. Every result includes `providerHealth{}` and `confidenceScore` so agents can make routing decisions. Register it via `@apify/actors-mcp-server`.

**Q: What is the cache TTL?**
24 hours. Cached results in `fast_lookup` mode return in <800ms. Enrichment results are not cached (always fresh).

**Q: Is this legal?**
Yes. This actor scrapes publicly available business listing data from Google Maps. See the Legal & Compliance section below.

**Q: How do volume discounts work?**
Pricing automatically drops as your monthly usage increases: $1.35/1K (≤10K/mo) → $1.20/1K (10K–100K/mo) → $1.00/1K (100K+/mo).

***

### Legal & Compliance

This actor scrapes **publicly available** business listing data from Google Maps. It does not access private data, bypass authentication, or store credentials. Users are responsible for complying with applicable data protection laws (GDPR, CCPA, etc.) and Google's Terms of Service.

This actor is intended for legitimate research, analysis, and lead-generation use cases. It must not be used for spam, harassment, or unlawful activity.

***

### AI-DLC / Data Lifecycle

This actor follows AI-DLC principles for ethical data handling:

- **Collection** — Public data only; respects robots.txt and rate limits.
- **Processing** — In-memory normalization; no PII logging.
- **Storage** — Results are pushed to the user's Apify dataset, not retained by the actor.
- **Usage** — Designed for analysis, enrichment, and legitimate outreach.
- **Disposal** — No long-term caching of user data between runs (cache TTL 24h for base results only).

***

### Enhancement Roadmap (API / MCP Integrations)

- **Hunter.io / Apollo.io email enrichment MCP** — higher match rates via paid email-finder APIs (optional, user keys)
- **Clearbit logo/revenue enrichment** — company firmographics for lead scoring (optional, user keys)
- **URLbox / Browserless screenshot MCP** — visual prospecting with website screenshots
- **LangGraph conditional workflow** — multi-step: Google Maps → LinkedIn → AI scoring (see `multi-api-orchestration-spec.md`)
- **Vector store integration** — semantic deduplication across runs

***

### Changelog

- **v2.0** — Multi-API orchestration edition: added provider fallback chain (Playwright→HTTP), MCP-ready `providerHealth` metadata, optional Hunter.io/Clearbit enrichment, 16 tech stack fingerprints, expanded FAQ, integration examples, volume pricing tiers.
- **v1.1** — Premium README, full output schema, AI-DLC documentation, confidence scoring, source attribution.
- **v1.0** — Initial release with core scraping, structured output, confidence scoring, pay-per-event pricing.

***

### Links

- **Apify Store:** https://apify.com/ayeeyee/google-maps-email-extractor-pro
- **Actor ID:** `jWqBubAIeaRU8pQke`
- **Documentation:** See this README
- **Support:** Open an issue on the actor's Apify Store page

# Actor input Schema

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

fast\_lookup: cache-first, base results only, target <800ms. enrich: multi-provider enrichment with emails, phones, tech stack, social. batch: queue-based full enrichment for large query lists.

## `queries` (type: `array`):

List of search queries or business names to find on Google Maps (e.g., 'restaurants in New York', 'plumbers near Los Angeles')

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

Maximum number of business listings to extract per search query (1-1000)

## `extractEmails` (type: `boolean`):

Enable email extraction from business websites

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

Validate extracted emails using open-source MX/DNS check (adds ~3s per email, no paid API required)

## `extractPhones` (type: `boolean`):

Extract phone numbers from business listings and websites

## `extractSocialMedia` (type: `boolean`):

Extract social media profile links (Facebook, Instagram, LinkedIn, etc.)

## `includeTechStack` (type: `boolean`):

Detect website technology stack (CMS, frameworks, analytics) using open-source fingerprinting

## `includeReviews` (type: `boolean`):

Include review count and average rating in output

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

Language code for search results (e.g., 'en', 'es', 'fr')

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

Country code for search results (e.g., 'us', 'uk', 'ca')

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

Optional webhook URL to receive completion notification

## Actor input object example

```json
{
  "mode": "enrich",
  "queries": [
    "restaurants in New York"
  ],
  "maxResults": 25,
  "extractEmails": true,
  "verifyEmails": false,
  "extractPhones": true,
  "extractSocialMedia": true,
  "includeTechStack": true,
  "includeReviews": true,
  "language": "en",
  "country": "us",
  "webhookUrl": ""
}
```

# Actor output Schema

## `results` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("ayeeyee/google-maps-email-extractor-pro").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("ayeeyee/google-maps-email-extractor-pro").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 '{}' |
apify call ayeeyee/google-maps-email-extractor-pro --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "📩📍 Google Maps Email Extractor Pro",
        "description": "Search Google Maps by keyword and extract verified business emails, phones, websites, addresses, ratings and social profiles. DNS/MX-validated emails, confidence scoring, CSV/JSON export. Built for lead generation and local outreach.",
        "version": "2.0",
        "x-build-id": "tdsMMsxzXQ27cZkM8"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/ayeeyee~google-maps-email-extractor-pro/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-ayeeyee-google-maps-email-extractor-pro",
                "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/ayeeyee~google-maps-email-extractor-pro/runs": {
            "post": {
                "operationId": "runs-sync-ayeeyee-google-maps-email-extractor-pro",
                "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/ayeeyee~google-maps-email-extractor-pro/run-sync": {
            "post": {
                "operationId": "run-sync-ayeeyee-google-maps-email-extractor-pro",
                "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": [
                    "queries"
                ],
                "properties": {
                    "mode": {
                        "title": "Execution Mode",
                        "enum": [
                            "fast_lookup",
                            "enrich",
                            "batch"
                        ],
                        "type": "string",
                        "description": "fast_lookup: cache-first, base results only, target <800ms. enrich: multi-provider enrichment with emails, phones, tech stack, social. batch: queue-based full enrichment for large query lists.",
                        "default": "enrich"
                    },
                    "queries": {
                        "title": "Search Queries",
                        "type": "array",
                        "description": "List of search queries or business names to find on Google Maps (e.g., 'restaurants in New York', 'plumbers near Los Angeles')",
                        "default": [
                            "restaurants in New York"
                        ]
                    },
                    "maxResults": {
                        "title": "Max Results per Query",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum number of business listings to extract per search query (1-1000)",
                        "default": 25
                    },
                    "extractEmails": {
                        "title": "Extract Emails",
                        "type": "boolean",
                        "description": "Enable email extraction from business websites",
                        "default": true
                    },
                    "verifyEmails": {
                        "title": "Verify Emails (MX/DNS)",
                        "type": "boolean",
                        "description": "Validate extracted emails using open-source MX/DNS check (adds ~3s per email, no paid API required)",
                        "default": false
                    },
                    "extractPhones": {
                        "title": "Extract Phone Numbers",
                        "type": "boolean",
                        "description": "Extract phone numbers from business listings and websites",
                        "default": true
                    },
                    "extractSocialMedia": {
                        "title": "Extract Social Media Links",
                        "type": "boolean",
                        "description": "Extract social media profile links (Facebook, Instagram, LinkedIn, etc.)",
                        "default": true
                    },
                    "includeTechStack": {
                        "title": "Detect Tech Stack",
                        "type": "boolean",
                        "description": "Detect website technology stack (CMS, frameworks, analytics) using open-source fingerprinting",
                        "default": true
                    },
                    "includeReviews": {
                        "title": "Include Review Summary",
                        "type": "boolean",
                        "description": "Include review count and average rating in output",
                        "default": true
                    },
                    "language": {
                        "title": "Language",
                        "type": "string",
                        "description": "Language code for search results (e.g., 'en', 'es', 'fr')",
                        "default": "en"
                    },
                    "country": {
                        "title": "Country",
                        "type": "string",
                        "description": "Country code for search results (e.g., 'us', 'uk', 'ca')",
                        "default": "us"
                    },
                    "webhookUrl": {
                        "title": "Webhook URL",
                        "type": "string",
                        "description": "Optional webhook URL to receive completion notification",
                        "default": ""
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
