# Google Maps Lead Enricher (`improving_victory/google-maps-lead-enricher`) Actor

Scrape Google Maps and enrich every business with verified emails, phone numbers, and social media profiles. Turn any local search into a ready-to-use B2B lead list — no code required.

- **URL**: https://apify.com/improving\_victory/google-maps-lead-enricher.md
- **Developed by:** [Dheeraj Palakurthi](https://apify.com/improving_victory) (community)
- **Categories:** Lead generation, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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 Lead Enricher — Email & Contact Scraper

**Turn any Google Maps search into a ready-to-use B2B lead list — complete with verified emails, phone numbers, and social media profiles.**

Google Maps Lead Enricher is a Google Maps scraper and email finder in one. It finds businesses on Google Maps, then visits each company's website to pull out the contact details that Maps alone never gives you — **emails, phone numbers, and social profiles**. In one run you go from *"dentists in Chicago"* to a clean spreadsheet you can drop straight into your CRM, cold-email tool, or sales workflow.

**Keywords:** Google Maps scraper · email scraper · lead generation · contact extractor · B2B leads · sales prospecting

***

### Screenshots

**Just enter a search query — no code required.**

![Input panel](https://api.apify.com/v2/key-value-stores/D8qGlTJyYJ6I1El7o/records/01-input)

**Every lead enriched with email, phone, and social profiles.**

![Enriched output table](https://api.apify.com/v2/key-value-stores/D8qGlTJyYJ6I1El7o/records/02-output)

**Export to CSV, Excel, JSON, or API in one click.**

![Export options](https://api.apify.com/v2/key-value-stores/D8qGlTJyYJ6I1El7o/records/03-export)

***

### Why use this Actor?

Google Maps has the businesses. Their websites have the contact details. This Actor connects the two automatically.

- 📧 **Real business emails** — extracted from homepages, contact pages, and structured data, then filtered to remove `noreply@`, placeholder, and junk addresses.
- 📱 **Phone numbers** — from both Google Maps and the website, in US and international formats.
- 🔗 **Social media profiles** — Facebook, Instagram, LinkedIn, Twitter/X, YouTube, TikTok, and Pinterest.
- 🏢 **Rich business data** — category, rating, review count, address, and geo-coordinates straight from Maps.
- 🧠 **Smart extraction** — reads JSON-LD / Schema.org structured data and falls back to crawling the site's contact page when the homepage comes up empty.

No code required. Just enter a search query and run.

***

### Who it's for

- **Lead generation agencies** building targeted prospect lists by city and niche.
- **Sales teams** filling their pipeline with local businesses that fit their ICP.
- **Marketing agencies** finding local clients who need websites, ads, or SEO.
- **Recruiters and researchers** compiling contact databases for outreach.

***

### How to use it

1. Click **Start** and open the input panel.
2. Enter one or more search queries, for example `dentists in Chicago, IL` or `plumbers in Miami, FL`.
3. (Optional) Set how many results you want per query and adjust the proxy.
4. Run the Actor. When it finishes, export your leads as **CSV, Excel, JSON, or via API**.

That's it — the Actor scrapes Maps and enriches every website automatically.

#### Three ways to provide input

**1. Search Google Maps (most common)**

```json
{
  "searchQueries": ["dentists in Chicago, IL", "plumbers in Miami, FL"],
  "maxResultsPerQuery": 50
}
```

**2. Enrich a list you already have** — skip Maps entirely and just add contact details to your own businesses:

```json
{
  "places": [
    {
      "title": "Smile Dental Clinic",
      "website": "https://smiledental.com",
      "address": "123 Main St, Chicago, IL 60601",
      "phone": "(312) 555-0100"
    }
  ]
}
```

**3. Enrich a previous Maps scrape** — reuse the results of an earlier Google Maps run by its dataset ID:

```json
{
  "googleMapsDatasetId": "your-dataset-id-here"
}
```

***

### Input reference

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `searchQueries` | `string[]` | `[]` | Google Maps search queries, e.g. `"coffee shops in Portland, OR"`. |
| `places` | `object[]` | `[]` | Provide businesses directly (must include a `website` to enrich). Skips Maps. |
| `googleMapsDatasetId` | `string` | `null` | Enrich the results of a previous Google Maps scraper run. |
| `maxResultsPerQuery` | `integer` | `50` | Max businesses scraped per search query (1–1000). |
| `proxyConfiguration` | `object` | Apify Proxy | Proxy settings. Apify Proxy is recommended for reliable results. |
| `skipEnrichment` | `boolean` | `false` | Return Maps data only, without visiting websites. |
| `concurrency` | `integer` | `5` | Number of websites processed in parallel (1–20). |

> You must provide at least one of `searchQueries`, `places`, or `googleMapsDatasetId`.

***

### Output

Each business is saved as one record in the dataset. Example:

```json
{
  "placeId": "ChIJ...",
  "name": "Smile Dental Clinic",
  "address": "123 Main St, Chicago, IL 60601",
  "city": "Chicago",
  "state": "IL",
  "zipCode": "60601",
  "country": "US",
  "latitude": 41.8781,
  "longitude": -87.6298,
  "phone": "(312) 555-0100",
  "website": "https://smiledental.com",
  "category": "Dentist",
  "categories": ["Dentist", "Cosmetic Dentist"],
  "rating": 4.7,
  "reviewsCount": 128,
  "googleMapsUrl": "https://www.google.com/maps/place/...",

  "emails": ["info@smiledental.com", "appointments@smiledental.com"],
  "primaryEmail": "info@smiledental.com",
  "socialLinks": {
    "facebook": "https://facebook.com/smiledental",
    "instagram": "https://instagram.com/smiledental",
    "linkedin": "https://linkedin.com/company/smiledental"
  },

  "enrichment": {
    "emails": ["info@smiledental.com", "appointments@smiledental.com"],
    "phones": ["(312) 555-0100", "312-555-0101"],
    "socialLinks": { "facebook": "https://facebook.com/smiledental" },
    "metaTitle": "Smile Dental Clinic | Chicago, IL",
    "metaDescription": "Chicago's premier dental clinic...",
    "metaKeywords": null,
    "extractedAddress": "123 Main Street, Chicago, Illinois 60601",
    "contactPageUrl": "https://smiledental.com/contact",
    "primaryEmail": "info@smiledental.com",
    "responseStatus": 200,
    "enrichedAt": "2026-08-23T10:30:00.000Z"
  }
}
```

#### Output fields

| Field | Description |
|-------|-------------|
| `name`, `placeId` | Business name and Google place identifier. |
| `address`, `city`, `state`, `zipCode`, `country` | Normalized location. |
| `latitude`, `longitude` | Geo-coordinates. |
| `phone`, `website` | Primary contact details from Google Maps. |
| `category`, `categories` | Business categories. |
| `rating`, `reviewsCount` | Google rating and number of reviews. |
| `googleMapsUrl` | Direct link to the Google Maps listing. |
| `emails`, `primaryEmail` | Business emails found on the website; `primaryEmail` is the best contact (prefers `contact@`, `info@`, `sales@`, `hello@`). |
| `socialLinks` | Detected social profiles by platform. |
| `enrichment` | Full enrichment detail, including phones, meta tags, extracted address, the contact page used, HTTP status, and timestamp. |
| `enrichment.enrichmentError` | Present when a website could not be reached or had no contact info. |

***

### How it works

1. **Collect businesses** — from your search queries (via the official `compass/crawler-google-places`), a list you provide, or a previous dataset. Results are deduplicated automatically.
2. **Visit each website** — the Actor fetches the homepage with realistic browser headers and Apify Proxy rotation.
3. **Extract contacts** — it reads structured data (JSON-LD), scans page text for emails and phones, and detects social links. If no email is found on the homepage, it automatically checks the site's contact/about page.
4. **Deliver leads** — records are written to the dataset in batches as they're processed, so you can start exporting before the run even finishes.

***

### Tips for best results

- **Be specific with queries.** `"vegan restaurants in Austin, TX"` yields better-targeted leads than `"restaurants"`.
- **Raise `concurrency` to 10–15** for faster runs on large lists; lower it to be gentler on websites.
- **Use `googleMapsDatasetId`** to enrich an existing scrape without paying to crawl Maps again.
- **Always keep Apify Proxy on** — it dramatically improves the success rate of website enrichment.
- **Check `enrichment.enrichmentError`** to see which sites blocked access or had no public contact info.

***

### Frequently asked questions

**Do I need coding skills?**
No. Enter a search query, click Start, and export the results.

**Which businesses get emails?**
Only businesses that have a website with publicly listed contact information. Listings without a website are still returned (with Maps data) and flagged accordingly.

**What formats can I export?**
CSV, Excel, JSON, JSONL, XML, or via the Apify API and integrations (Zapier, Make, Google Sheets, and more).

**Is the data accurate?**
Emails and phones are extracted directly from each company's own website in real time, so they reflect what the business currently publishes. Placeholder and no-reply addresses are filtered out automatically.

**Can I schedule it?**
Yes. Use Apify Schedules to run the Actor daily, weekly, or monthly and keep your lead lists fresh.

***

### Legal & responsible use

This Actor collects only publicly available business information. You are responsible for using the resulting data in compliance with applicable laws and regulations, including GDPR, CAN-SPAM, and local marketing rules. Always honor opt-out requests and obtain consent where required before sending outreach.

***

### Changelog

#### 1.0.0

- Initial release.
- Google Maps collection via the official `compass/crawler-google-places`.
- Website enrichment: emails, phones, and social profiles.
- Structured-data (JSON-LD / Schema.org) parsing.
- Automatic contact-page fallback when the homepage has no email.
- Input via search queries, direct places, or an existing dataset ID.
- Deduplication, batched output, and live progress reporting.

***

### Support

Found a bug or have a feature request? Open an issue on the Actor's **Issues** tab in Apify Console, and we'll take a look. We actively maintain this Actor and typically respond within one business day.

***

### About the maker

Built and maintained by **Dheeraj Palakurthi** — a developer focused on lead-generation and web-scraping tools that turn public data into clean, sales-ready datasets. This Actor is actively maintained, monitored for site changes, and improved based on user feedback.

⭐ If it saves you time, please leave a rating — it helps other users find it.

# Actor input Schema

## `searchQueries` (type: `array`):

Search queries to find businesses on Google Maps (e.g., 'dentists in Chicago', 'plumbers in Miami'). The Actor will scrape Maps and then visit each business website.

## `places` (type: `array`):

Optional: Provide places directly with name, website, etc. Skips Google Maps scraping entirely. Useful if you already have a list of businesses to enrich.

## `googleMapsDatasetId` (type: `string`):

Optional: Provide a dataset ID from a previous Google Maps scraper run. The Actor will read those results and enrich them. Skips running the Maps scraper again.

## `maxResultsPerQuery` (type: `integer`):

Maximum number of places to scrape from Google Maps per search query. Higher values cost more but yield more leads.

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

Proxy settings for web scraping. Recommended: use Apify Proxy with automatic rotation for best results.

## `skipEnrichment` (type: `boolean`):

If enabled, only returns Google Maps data without visiting websites. Useful for quick Maps-only scrapes.

## `concurrency` (type: `integer`):

Number of websites to process in parallel. Higher = faster but more resource-intensive. Lower = more polite to websites.

## Actor input object example

```json
{
  "searchQueries": [
    "dentists in Chicago, IL"
  ],
  "places": [
    {
      "title": "Example Dental Clinic",
      "website": "https://example-dental.com",
      "address": "123 Main St, Chicago, IL",
      "phone": "(555) 123-4567"
    }
  ],
  "maxResultsPerQuery": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "skipEnrichment": false,
  "concurrency": 5
}
```

# Actor output Schema

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

Business listings enriched with emails, phones, and social profiles.

# 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 = {
    "searchQueries": [
        "dentists in Chicago, IL"
    ],
    "places": [
        {
            "title": "Example Dental Clinic",
            "website": "https://example-dental.com",
            "address": "123 Main St, Chicago, IL",
            "phone": "(555) 123-4567"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("improving_victory/google-maps-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 = {
    "searchQueries": ["dentists in Chicago, IL"],
    "places": [{
            "title": "Example Dental Clinic",
            "website": "https://example-dental.com",
            "address": "123 Main St, Chicago, IL",
            "phone": "(555) 123-4567",
        }],
}

# Run the Actor and wait for it to finish
run = client.actor("improving_victory/google-maps-lead-enricher").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "dentists in Chicago, IL"
  ],
  "places": [
    {
      "title": "Example Dental Clinic",
      "website": "https://example-dental.com",
      "address": "123 Main St, Chicago, IL",
      "phone": "(555) 123-4567"
    }
  ]
}' |
apify call improving_victory/google-maps-lead-enricher --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,improving_victory/google-maps-lead-enricher"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/gkaZ3g0YbsAxSmG27/builds/rxxhPUZ8DSQMUpR8b/openapi.json
