# Google Maps Scraper + Emails: Business Leads & Socials (`falcon-sol/google-maps-leads-emails`) Actor

Google Maps scraper with emails built in: phone, website, split address, rating, star breakdown, hours & coordinates, plus emails and socials from each business website. No API key. $0.003/place + $0.001 only when the site loads. Ready-to-call B2B lead lists.

- **URL**: https://apify.com/falcon-sol/google-maps-leads-emails.md
- **Developed by:** [falcon.sol](https://apify.com/falcon-sol) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.40 / 1,000 place scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## 📍 Google Maps Scraper + Emails: Business Leads & Socials

**Type a business type and a city, get a ready-to-call lead list.** Every Google Maps result comes with phone, website, full address, rating and star breakdown, hours and coordinates, plus **emails and social profiles pulled from the business's own website**, all in the same run. No login, no Google API key, no add-ons to configure.

### 🎯 Who it's for

- **Agencies and freelancers** prospecting local businesses (web design, SEO, ads, reputation management)
- **B2B sales teams** building territory lists for cold email and cold calling
- **SaaS and service companies** selling to restaurants, clinics, contractors, salons, gyms and more
- **Market researchers** mapping competitors, ratings and review volume by city
- **Developers and AI agents** that need local business data behind a simple API

### 🚀 Why this one

- 📧 **Emails and socials built in.** Contact enrichment is on by default and visits each business's home, contact, about and impressum pages. It decodes hidden emails (Cloudflare-protected, `name [at] domain (dot) com`), validates phone numbers and finds 13 social networks. There's no separate add-on to find and enable.
- 💸 **Two flat prices, no tiers.** $0.0034 per place and $0.0015 when the website was actually reached. Unreachable sites aren't charged for contacts.
- ⚡ **Fast.** Only the results list uses a browser. Place details and websites are fetched in parallel over HTTP, and each lead is saved as soon as it's done. In our measured test, 50 Tampa plumbers *with* contacts took about 20 seconds.
- 🧱 **Spreadsheet-ready rows.** The address is split into street, neighborhood, city, state, postal code and country, there are five star-count columns, and `contactsStatus` tells you why a row has no email.
- ⭐ **Quality filters.** Set a minimum rating, skip closed places, and optionally keep up to 8 reviews per place.
- 🔌 **Works everywhere.** Export CSV, Excel or JSON, or connect through the API, Zapier, Make, Google Sheets or the Apify MCP server.

### ⚡ Quick start

1. Enter **Search terms**, e.g. `dentist`, `plumber`, `roofing contractor`.
2. Enter a **Location**, e.g. `Austin, TX`.
3. Set **Max places per search term** and click **Start**.

```json
{ "searchTerms": ["plumber"], "location": "Tampa, FL", "maxPlacesPerSearch": 50, "extractContacts": true }
```

> 💡 Google Maps shows up to about 120 places per search. To cover a big metro area, add several nearby cities or ZIP codes, or several distinct search terms.

### 📊 Sample output (real result from a test run, 23 Oct 2026)

```json
{
  "title": "EVERYDAYPLUMBER.com",
  "category": "Plumber",
  "categories": ["Plumber", "Drainage service", "Gas installation service"],
  "address": "3912 W South Ave, Tampa, FL 33614",
  "street": "3912 W South Ave",
  "neighborhood": "Westshore",
  "city": "Tampa",
  "state": "Florida",
  "postalCode": "33614",
  "countryCode": "US",
  "phone": "+18138720200",
  "website": "https://everydayplumber.com/",
  "rating": 4.9,
  "reviewsCount": 1770,
  "reviewsDistribution": { "oneStar": 40, "twoStar": 9, "threeStar": 7, "fourStar": 10, "fiveStar": 1704 },
  "imagesCount": 242,
  "openingHours": ["Friday: Open 24 hours", "Saturday: Open 24 hours"],
  "location": { "lat": 27.991171, "lng": -82.507795 },
  "placeId": "ChIJ3XEHCdDDwogRQANou4CXUic",
  "emails": ["info@everydayplumber.com"],
  "socials": { "instagram": ["https://www.instagram.com/everydayplumber"] },
  "contactsStatus": "ok"
}
```

#### Measured run: "plumber" in Tampa, FL (50 places, contacts on, local, no proxy, 24 Oct 2026)

| | Result |
|---|---|
| Wall clock, start to finish | **about 21 s** |
| Rating, reviews, star distribution, categories, phone, coordinates, place ID | 50 / 50 |
| Website | 46 / 50 |
| Opening hours / split address | 39 / 50, 40 / 50 |
| Website reached | 46 |
| **At least one email** | **25** |
| At least one social profile | 33 |

Results vary by niche and city. Many small businesses don't publish an email on their site.

### 💵 Pricing, in plain English

| Event | When it's charged | Price |
|---|---|---|
| `place-scraped` | Each unique business saved | **$0.0034** |
| `contacts-enriched` | Only when that business's website was reached | **$0.0015** |

**1,000 leads with contact enrichment cost at most $4.90.** That's $3.40 for places, plus $1.50 only if every website loads. Turn `extractContacts` off and it's $3.40 per 1,000. Platform usage is included.

### 💡 Use cases

- Cold-email and cold-call lists for any local niche
- Finding businesses with no website or weak reviews to pitch web design or reputation services
- Competitor mapping: who ranks, their ratings and their review counts
- Territory planning with coordinates and postal codes
- Enriching a CRM (HubSpot, Pipedrive, Salesforce) through Zapier or Make
- Feeding local business data to AI sales agents through the API or MCP

### 🧾 Output fields

`title`, `category`, `categories`, `address`, `street`, `neighborhood`, `city`, `state`, `postalCode`, `countryCode`, `phone`, `website`, `rating`, `reviewsCount`, `reviewsDistribution`, `imagesCount`, `openingHours`, `location`, `placeId`, closed flags, `emails`, `phones` from the website, `socials`, `contactsStatus` (`ok`, `skipped`, `no_website`, `website_unreachable`), and optional `reviews`. Description, menu and reservation links, popular times and price level are included when Google sends them in the place data. Logged-out responses often leave out popular times. Photo files aren't downloaded, but `imagesCount` is included.

### ❓ FAQ

**Do I need a Google API key or account?**
No. The actor collects public Google Maps data without logging in.

**Why do some rows have no email?**
Check `contactsStatus`. `no_website` means the listing has no site, and `website_unreachable` means the site didn't load (you aren't charged for contacts). `ok` with an empty `emails` field means the site doesn't publish an email.

**How do I get more than ~120 results?**
Split the area into several locations (neighborhoods, ZIPs or nearby cities) or use several distinct search terms.

**Can I get reviews?**
Yes. Set `maxReviews` from 1 to 8 to keep that many reviews per place. It doesn't open extra review pages.

**Which proxy should I use?**
The default Apify datacenter proxy works for most runs. Switch to residential only if you see blocks.

**Is it legal?**
It collects only publicly available business data. You're responsible for using contact data lawfully (GDPR, CAN-SPAM and similar laws).

**Saved task not returning emails?**
A saved Apify task keeps its old input. Make sure "Extract emails & socials from websites" is checked in that task.

***

*Keywords: Google Maps scraper, Google Maps email extractor, Google Maps leads, local business leads, business email finder, Google Places scraper without API, lead generation tool, B2B prospecting, contact scraper, phone number scraper, Google Maps data export to CSV and Excel.*

***

**Built by [falcon.sol](https://x.com/ygfalcon)**: anon dev shipping pay-per-call data tools and x402 APIs for builders and agents. [X](https://x.com/ygfalcon) · [GitHub](https://github.com/ygfalcon) · [Apify](https://apify.com/falcon-sol)

# Actor input Schema

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

What you'd type into Google Maps, one per line, e.g. dentist, plumber, roofing contractor. Use distinct terms: near-duplicates add time, not leads.

## `location` (type: `string`):

City, region or ZIP, e.g. Austin, TX or 33614. Leave empty if your search terms already include a place.

## `maxPlacesPerSearch` (type: `integer`):

Leads to collect per search term. Google Maps lists up to ~120 places per search, so split big areas into several locations or terms.

## `extractContacts` (type: `boolean`):

Visits each business's website (home, contact, about, team and impressum/imprint legal pages) to collect emails, phone numbers and social profiles. Adds $0.0015 per place, charged only when the site loads. Turn off for places-only data at $0.0034 each.

## `maxContactPages` (type: `integer`):

How many pages per website to scan for contacts: home page first, then contact, about, team and impressum/imprint pages. More pages can find more emails but take a little longer.

## `maxReviews` (type: `integer`):

Keep up to this many Google reviews per place (0–8). 0 leaves reviews empty. This doesn't open extra review pages.

## `minRating` (type: `integer`):

Only keep places rated at or above this many stars (0 keeps everything).

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

Leave out places Google marks as temporarily or permanently closed.

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

Language code for Google Maps results, e.g. en, es, de, fr.

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

Optional. Paste Google Maps search URLs to scrape them in addition to the search terms.

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

The Apify datacenter proxy works for most runs. Switch to residential only if you see blocks.

## Actor input object example

```json
{
  "searchTerms": [
    "dentist"
  ],
  "location": "Austin, TX",
  "maxPlacesPerSearch": 20,
  "extractContacts": true,
  "maxContactPages": 3,
  "maxReviews": 0,
  "minRating": 0,
  "skipClosed": false,
  "language": "en",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

One row per business with Maps details and, if enabled, website emails and socials.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchTerms": [
        "dentist"
    ],
    "location": "Austin, TX",
    "extractContacts": true,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("falcon-sol/google-maps-leads-emails").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchTerms": ["dentist"],
    "location": "Austin, TX",
    "extractContacts": True,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("falcon-sol/google-maps-leads-emails").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 '{
  "searchTerms": [
    "dentist"
  ],
  "location": "Austin, TX",
  "extractContacts": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call falcon-sol/google-maps-leads-emails --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,falcon-sol/google-maps-leads-emails"
        }
    }
}
```

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/TfpUSl6f35wnRy5Qf/builds/LckVCBGl6wbdZkJ3u/openapi.json
