# Google Maps Website Email & Contact Extractor (`wishful_knowledge/google-maps-website-lead-enricher`) Actor

Extract public emails, contact links, social profiles, tech stack signals, and outreach scores from Google Maps Scraper website exports.

- **URL**: https://apify.com/wishful\_knowledge/google-maps-website-lead-enricher.md
- **Developed by:** [sanfeng zhang](https://apify.com/wishful_knowledge) (community)
- **Categories:** Lead generation, Business, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

## 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 Website Email & Contact Extractor

Turn Google Maps Scraper exports, local business website lists, or agency prospecting spreadsheets into contactable leads with public emails, contact links, social profiles, tech stack clues, and outreach scores.

Paste an Apify dataset ID from Google Maps Scraper, upload website URLs, or provide source rows. This Actor analyzes public websites only, extracts business contact signals, detects website technology, and ranks each lead for practical B2B outreach.

### Fast start

If you already ran a Google Maps Scraper, paste its dataset ID or dataset URL into `apifyDatasetId`. The Actor will look for website fields such as `website`, `websiteUrl`, `domain`, `homepage`, or `businessWebsite`.

You can also test with direct website URLs:

```json
{
  "startUrls": ["https://www.allbirds.com"],
  "includeSearchDiscovery": false,
  "requireBusinessEmail": true,
  "includePhones": false,
  "includePersonalEmails": false,
  "minOpportunityScore": 40,
  "maxSites": 1,
  "maxPagesPerSite": 5
}
````

Or pass Google Maps-style rows directly:

```json
{
  "sourceItems": [
    {
      "title": "Example Local Business",
      "categoryName": "Local service",
      "city": "Austin",
      "website": "https://example.com"
    }
  ],
  "requireBusinessEmail": true,
  "maxSites": 1
}
```

### Example output

Each saved row keeps the source business context and adds website contact intelligence:

```json
{
  "domain": "example.com",
  "sourceBusiness": {
    "name": "Example Local Business",
    "category": "Local service",
    "city": "Austin"
  },
  "emails": ["hello@example.com"],
  "socials": { "facebook": ["https://www.facebook.com/example"] },
  "techSignals": { "analytics": ["Google Analytics"], "platform": ["WordPress"] },
  "opportunityScore": 72,
  "suggestedAngles": ["Offer analytics or paid ads tracking cleanup"]
}
```

The run also writes `RUN_SUMMARY` so users can see how many sites were loaded, analyzed, filtered, and saved.

### Best for

- Local SEO agency prospecting
- Google Maps Scraper dataset enrichment
- Google Maps website email extraction
- Website redesign and speed audit outreach
- CRM cleanup from local business lists
- B2B agency lead scoring

### What it extracts

- Public business role emails
- Optional public phones and WhatsApp numbers
- Public social profile links
- Website platform and marketing stack signals
- Contact/about/support links
- Outreach score, pain points, and suggested angles
- Source business metadata from Google Maps-style rows when provided

### Quality defaults

- `requireBusinessEmail=true`: only save contactable leads by default.
- `includePersonalEmails=false`: filter individual-looking emails by default.
- `includePhones=false`: phone extraction is off by default.
- `respectRobotsTxt=true`: skip disallowed paths when enabled.
- `minOpportunityScore=40`: avoid charging users for weak results.

### Input

Use one or more of these:

- `startUrls`: known website URLs or domains.
- `apifyDatasetId`: optional Apify dataset ID or Console dataset URL, useful for Google Maps Scraper exports or other lead lists.
- `sourceItems`: optional JSON rows with fields such as `website`, `websiteUrl`, `url`, `domain`, or `homepage`.
- `queries` with `includeSearchDiscovery=true`: best-effort public search discovery.

### Pricing

Suggested launch pricing: USD 0.01 per saved local business website lead.

Websites that fail the email, score, or platform filter are counted in `RUN_SUMMARY`, but are not saved as paid dataset leads by default.

### Local run

```powershell
node .\src\main.js --input .\sample-input.json
```

### Compliance

This Actor only analyzes public web pages. It does not log in, bypass paywalls, collect private account data, or scrape personal social profiles beyond public links already shown on websites. Conservative defaults avoid phone extraction and individual-looking email addresses.

### Keywords

Google Maps email finder, Google Maps website email extractor, Google Maps website contact extractor, Google Maps contact extractor, Google Maps lead enrichment, local business leads, local SEO leads, agency prospecting, business email finder, website contact scraper, local business website audit, Google Maps Scraper add-on.

# Actor input Schema

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

Search terms used to discover candidate local business website websites when search discovery is enabled.

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

Known local business websites or domains to analyze directly.

## `apifyDatasetId` (type: `string`):

Optional dataset ID or Console dataset URL. Useful for Google Maps Scraper exports or other website lists that contain website/domain fields.

## `sourceItems` (type: `array`):

Optional JSON rows from a lead list. The Actor looks for website, websiteUrl, url, domain, site, homepage, or businessWebsite fields.

## `includeSearchDiscovery` (type: `boolean`):

When enabled, the Actor uses best-effort public HTML search pages to find candidate websites from the search queries.

## `requireTargetPlatform` (type: `boolean`):

Optional platform filter. This local-business enricher normally keeps this disabled.

## `includePhones` (type: `boolean`):

When enabled, extracts public phone and WhatsApp numbers shown on website pages.

## `includePersonalEmails` (type: `boolean`):

When disabled, keeps only generic business role emails such as info@, support@, sales@, and hello@.

## `requireBusinessEmail` (type: `boolean`):

When enabled, only websites with at least one public business role email are saved to the dataset.

## `minOpportunityScore` (type: `integer`):

Only records with this score or higher are saved to the dataset.

## `maxSites` (type: `integer`):

Maximum number of unique website domains to analyze.

## `maxSearchResultsPerQuery` (type: `integer`):

Maximum candidate URLs to collect from each query.

## `maxPagesPerSite` (type: `integer`):

Maximum public pages to fetch from each website, including homepage, contact, about, support, and policy pages.

## `requestDelayMs` (type: `integer`):

Delay between requests, in milliseconds.

## `timeoutSecs` (type: `integer`):

Timeout for each HTTP request.

## `respectRobotsTxt` (type: `boolean`):

Skips paths disallowed for generic crawlers by robots.txt when enabled.

## `userAgent` (type: `string`):

HTTP User-Agent header used for requests.

## Actor input object example

```json
{
  "queries": [
    "dentists chicago website email",
    "roofing contractors austin website email"
  ],
  "startUrls": [
    "https://www.allbirds.com",
    "https://www.notion.so"
  ],
  "apifyDatasetId": "",
  "sourceItems": [],
  "includeSearchDiscovery": false,
  "requireTargetPlatform": false,
  "includePhones": false,
  "includePersonalEmails": false,
  "requireBusinessEmail": true,
  "minOpportunityScore": 40,
  "maxSites": 25,
  "maxSearchResultsPerQuery": 10,
  "maxPagesPerSite": 5,
  "requestDelayMs": 750,
  "timeoutSecs": 15,
  "respectRobotsTxt": true,
  "userAgent": "Mozilla/5.0 (compatible; GoogleMapsWebsiteLeadEnricher/0.1; +https://apify.com/)"
}
```

# Actor output Schema

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

Websites that passed the opportunity score and business email filters.

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

Counts, filtering decisions, and cost-control information for the run.

# 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 = {
    "queries": [
        "dentists chicago website email",
        "roofing contractors austin website email"
    ],
    "startUrls": [
        "https://www.allbirds.com",
        "https://www.notion.so"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("wishful_knowledge/google-maps-website-lead-enricher").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 = {
    "queries": [
        "dentists chicago website email",
        "roofing contractors austin website email",
    ],
    "startUrls": [
        "https://www.allbirds.com",
        "https://www.notion.so",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("wishful_knowledge/google-maps-website-lead-enricher").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 '{
  "queries": [
    "dentists chicago website email",
    "roofing contractors austin website email"
  ],
  "startUrls": [
    "https://www.allbirds.com",
    "https://www.notion.so"
  ]
}' |
apify call wishful_knowledge/google-maps-website-lead-enricher --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Maps Website Email & Contact Extractor",
        "description": "Extract public emails, contact links, social profiles, tech stack signals, and outreach scores from Google Maps Scraper website exports.",
        "version": "0.1",
        "x-build-id": "GknBHONJciy4r1pmN"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/wishful_knowledge~google-maps-website-lead-enricher/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-wishful_knowledge-google-maps-website-lead-enricher",
                "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/wishful_knowledge~google-maps-website-lead-enricher/runs": {
            "post": {
                "operationId": "runs-sync-wishful_knowledge-google-maps-website-lead-enricher",
                "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/wishful_knowledge~google-maps-website-lead-enricher/run-sync": {
            "post": {
                "operationId": "run-sync-wishful_knowledge-google-maps-website-lead-enricher",
                "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": {
                    "queries": {
                        "title": "Search queries",
                        "type": "array",
                        "description": "Search terms used to discover candidate local business website websites when search discovery is enabled.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "Seed website URLs",
                        "type": "array",
                        "description": "Known local business websites or domains to analyze directly.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "apifyDatasetId": {
                        "title": "Apify dataset ID or URL",
                        "type": "string",
                        "description": "Optional dataset ID or Console dataset URL. Useful for Google Maps Scraper exports or other website lists that contain website/domain fields.",
                        "default": ""
                    },
                    "sourceItems": {
                        "title": "Source business rows",
                        "type": "array",
                        "description": "Optional JSON rows from a lead list. The Actor looks for website, websiteUrl, url, domain, site, homepage, or businessWebsite fields.",
                        "default": []
                    },
                    "includeSearchDiscovery": {
                        "title": "Discover URLs from search",
                        "type": "boolean",
                        "description": "When enabled, the Actor uses best-effort public HTML search pages to find candidate websites from the search queries.",
                        "default": false
                    },
                    "requireTargetPlatform": {
                        "title": "Require target platform signal",
                        "type": "boolean",
                        "description": "Optional platform filter. This local-business enricher normally keeps this disabled.",
                        "default": false
                    },
                    "includePhones": {
                        "title": "Include public phone and WhatsApp numbers",
                        "type": "boolean",
                        "description": "When enabled, extracts public phone and WhatsApp numbers shown on website pages.",
                        "default": false
                    },
                    "includePersonalEmails": {
                        "title": "Include individual-looking emails",
                        "type": "boolean",
                        "description": "When disabled, keeps only generic business role emails such as info@, support@, sales@, and hello@.",
                        "default": false
                    },
                    "requireBusinessEmail": {
                        "title": "Require business email for saved leads",
                        "type": "boolean",
                        "description": "When enabled, only websites with at least one public business role email are saved to the dataset.",
                        "default": true
                    },
                    "minOpportunityScore": {
                        "title": "Minimum opportunity score",
                        "minimum": 0,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Only records with this score or higher are saved to the dataset.",
                        "default": 40
                    },
                    "maxSites": {
                        "title": "Max sites",
                        "minimum": 1,
                        "maximum": 250,
                        "type": "integer",
                        "description": "Maximum number of unique website domains to analyze.",
                        "default": 25
                    },
                    "maxSearchResultsPerQuery": {
                        "title": "Max search results per query",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Maximum candidate URLs to collect from each query.",
                        "default": 10
                    },
                    "maxPagesPerSite": {
                        "title": "Max pages per site",
                        "minimum": 1,
                        "maximum": 12,
                        "type": "integer",
                        "description": "Maximum public pages to fetch from each website, including homepage, contact, about, support, and policy pages.",
                        "default": 5
                    },
                    "requestDelayMs": {
                        "title": "Request delay",
                        "minimum": 0,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Delay between requests, in milliseconds.",
                        "default": 750
                    },
                    "timeoutSecs": {
                        "title": "Request timeout",
                        "minimum": 5,
                        "maximum": 60,
                        "type": "integer",
                        "description": "Timeout for each HTTP request.",
                        "default": 15
                    },
                    "respectRobotsTxt": {
                        "title": "Respect robots.txt",
                        "type": "boolean",
                        "description": "Skips paths disallowed for generic crawlers by robots.txt when enabled.",
                        "default": true
                    },
                    "userAgent": {
                        "title": "User agent",
                        "type": "string",
                        "description": "HTTP User-Agent header used for requests.",
                        "default": "Mozilla/5.0 (compatible; GoogleMapsWebsiteLeadEnricher/0.1; +https://apify.com/)"
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
