# Google Maps Lead Extractor — Business Emails, Phones & Socials (`juramoshkov/google-maps-lead-extractor`) Actor

Turn a Google Maps search into a contact list: one row per business with a verified email, phone and social profiles scraped from its website, plus address, category, rating and reviews. Query like "dentists in Austin, TX". Leads mode bills only for rows that carry a contact.

- **URL**: https://apify.com/juramoshkov/google-maps-lead-extractor.md
- **Developed by:** [Jura Moshkov](https://apify.com/juramoshkov) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $11.00 / 1,000 business contact founds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Extractor — Business Emails, Phones & Socials

Turn a Google Maps search into a ready-to-use contact list. Give it a query like
`dentists in Austin, TX` and get **one row per business** with a **verified email, phone and social
profiles** scraped from the business website, on top of the full Google Maps record: address,
category, rating, reviews, opening hours and coordinates.

Built for **lead generation, sales prospecting and AI agents**. In `leads` mode you **pay only for
rows that carry a contact** — businesses with no reachable email or social still appear, for free, so
you see the real coverage.

### What you get per business

| Field | Example |
|---|---|
| name, type, subtypes | Chapter One Coffee — Coffee shop |
| **email** (from the website) | `bjoern@chapter-one-coffee.com` |
| **phone**, phoneDigits | +49 30 25922799 |
| **socials** | facebook, instagram, linkedin, tiktok, twitter, youtube, pinterest, yelp |
| website | http://www.chapter-one-coffee.com |
| full address, street, city, state, zip, country | Mittenwalder Str. 30, 10961 Berlin, DE |
| rating, reviewCount, priceLevel, verified | 4.6 · 1017 reviews |
| latitude, longitude | 52.49 · 13.39 |
| placeId, cid, googleId, Maps link | — |

### Modes

- **leads** (default) — search WITH website enrichment. One row per business with email, phone and
  socials. Billed only for rows that carry an email or a social profile.
- **places** — Google Maps data only (no website enrichment), cheaper per row. Use it when you just
  need the business list, ratings and Maps phone.

### Example queries

Type a query the way you would in Google Maps: `<what> in <where>`. A run can take many at once.

- `coffee shops in Berlin, Germany`
- `dentists in Austin, TX`
- `law firms in Manchester, UK`
- `plumbers in Sydney, Australia`
- `real estate agencies in Miami, FL`
- `digital marketing agencies in Toronto, Canada`
- `gyms and fitness studios in Dubai`
- `restaurants in Lisbon, Portugal`
- `car dealerships in Chicago, IL`
- `hair salons in Los Angeles, CA`
- `wedding photographers in Barcelona, Spain`
- `roofing contractors in Denver, CO`

### Common use cases

- **Cold outreach lists** — verified emails + socials for a category in a city.
- **Local SEO / agency prospecting** — find businesses, spot who has no website or weak socials.
- **CRM enrichment** — feed a query, import the CSV, dial the phones.
- **Market research** — categories, ratings and review counts by area.

### Use it from an AI agent (MCP)

This Actor is available as a tool through the [Apify MCP server](https://mcp.apify.com/). An agent can
call it by name with a plain input:

```json
{ "mode": "leads", "queries": ["coffee shops in Berlin, Germany"], "maxResults": 20 }
```

Every field carries a description, so an agent can fill the input from the schema alone. Output is one
flat JSON object per business — no nesting to unwrap.

### Pricing

Pay-per-event. In `leads` mode you are billed per **CONTACT\_FOUND** (a row with an email or a social
profile); rows with only a Google phone are free. In `places` mode you are billed per **PLACE\_SCRAPED**
business. Set `maxBudgetUsd` to cap a run — it converts to a row count before the first request, so a
run never bills past your ceiling. Free-plan runs are capped and mask the email.

### Notes

- Contact fill depends on the business having a reachable website; not every business has a public
  email. That is why `leads` mode does not bill the ones without.
- `region` (e.g. `us`, `de`, `gb`) narrows results to one country's Maps; otherwise the `in <place>`
  part of the query decides.

# Actor input Schema

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

leads — one row per business WITH a verified email, phone and social profiles scraped from its website. Use this to build a contact list. places — one row per business with Google Maps data only (name, address, phone, rating), no website enrichment and far cheaper per row.

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

One "what in where" phrase per line, exactly as you would type it into Google Maps. For example "coffee shops in Berlin, Germany" or "dentists in Austin, TX". Each line is searched independently. Defaults to one query so a run with no input still returns data.

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

Billable rows to return across the whole run. Defaults to 5 so a trial run stays cheap; raise it once the output is what you need, or set it high and use Max spend to bound the run by budget. In leads mode a row is billable only when it carries an email or a social profile; businesses with just a Google phone still appear but cost nothing.

## `maxBudgetUsd` (type: `integer`):

Hard ceiling on what this run can charge. It is converted to a row count before the first request, so the run stops on its own rather than billing past it. Set 0 to remove the ceiling and rely on Max results alone.

## `region` (type: `string`):

Optional Google region, e.g. "us", "de", "gb". Narrows results to one country's Google Maps. Leave empty to let the query's own "in <place>" decide.

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

Optional UI language code, e.g. "en", "de". Leave empty for the region default.

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

Pause between upstream requests. The provider plan sets the floor: Pro allows 5/sec, Ultra 8/sec, Mega 10/sec. 0 means as fast as the plan allows.

## `apiKey` (type: `string`):

Bring your own OpenWeb Ninja key. Leave empty to use the Actor's key.

## Actor input object example

```json
{
  "mode": "leads",
  "queries": [
    "coffee shops in Berlin, Germany",
    "dentists in Austin, TX",
    "law firms in Manchester, UK"
  ],
  "maxResults": 5,
  "maxBudgetUsd": 5,
  "requestDelayMs": 0
}
```

# Actor output Schema

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

No description

## `resultsCsv` (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 = {
    "queries": [
        "coffee shops in Berlin, Germany",
        "dentists in Austin, TX",
        "law firms in Manchester, UK"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("juramoshkov/google-maps-lead-extractor").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": [
        "coffee shops in Berlin, Germany",
        "dentists in Austin, TX",
        "law firms in Manchester, UK",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("juramoshkov/google-maps-lead-extractor").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 '{
  "queries": [
    "coffee shops in Berlin, Germany",
    "dentists in Austin, TX",
    "law firms in Manchester, UK"
  ]
}' |
apify call juramoshkov/google-maps-lead-extractor --silent --output-dataset

```

## MCP server setup

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

```

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/nHeNANdVZJipzE07j/builds/htbeivTdBCRsn79eA/openapi.json
