# Google Maps B2B Lead Machine — Fast Local Business API (`kleioks/google-maps-b2b-lead-machine`) Actor

High-speed Google Maps B2B lead generation engine. Extracts local business names, categories, addresses, phone numbers, websites, star ratings, review counts, and actionable agency intelligence signals (missing website, low rating) at 20x the speed of browser scrapers.

- **URL**: https://apify.com/kleioks/google-maps-b2b-lead-machine.md
- **Developed by:** [Akkouch Sofiane](https://apify.com/kleioks) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.20 / 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?

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 B2B Lead Machine — High-Speed Local Business API

[![Runtime](https://img.shields.io/badge/Engine-Direct_Protobuf_JSON_RPC_%7C_HTTPX-111827?style=flat-square)](https://apify.com)
[![Validation](https://img.shields.io/badge/Schema_Contract-Pydantic_v2-0f766e?style=flat-square)](https://docs.pydantic.dev)
[![Memory Footprint](https://img.shields.io/badge/Compute_Footprint-128_MB_Min-2563eb?style=flat-square)](https://apify.com)
[![Outbound Ready](https://img.shields.io/badge/CRM_&_Outbound-Clay_%7C_Make_%7C_n8n_%7C_HubSpot-4f46e5?style=flat-square)](https://apify.com)

High-velocity Google Maps B2B lead extraction engine built specifically for **digital marketing agencies**, **SEO & reputation management firms**, **web design studios**, and **outbound sales teams**.

Traditional Google Maps scrapers spin up heavy headless Chromium instances, scroll DOM panels one card at a time, and burn dollars in Apify Compute Units. **Google Maps B2B Lead Machine** communicates directly with Google Maps' internal JSON-RPC search endpoints (`tbm=map`) over asynchronous `httpx` connections—delivering **20 validated business profiles per HTTP request in under 400 ms** while running inside a lightweight `128 MB` container.

***

### Performance & Architecture Benchmark

| Metric | Headless Browser Scrapers | Google Maps B2B Lead Machine |
| :--- | :--- | :--- |
| **Extraction Transport** | Chromium / Playwright DOM Scrolling | Direct Google Maps Protobuf-JSON RPC (`httpx`) |
| **Throughput Speed** | ~15–25 leads / minute | **300+ leads / minute** |
| **Container Memory** | `2,048 MB` – `4,096 MB` RAM | **`128 MB` – `256 MB` RAM** |
| **Built-In Agency Qualification** | Raw unsegmented dump | Automated `leadOpportunitySignal` & `hasWebsite` tagging |
| **Data Contract** | Loose / inconsistent keys | Strict **Pydantic v2** schema validation |

***

### High-ROI Agency & Outbound Workflows

Every extracted business record is automatically evaluated and tagged with a **`leadOpportunitySignal`** so your outbound campaigns can segment prospects immediately without manual spreadsheet formulas:

#### 1. Web Design & Dev Agencies (`NO_WEBSITE_OPPORTUNITY`)

Set `"onlyWithoutWebsite": true` (or filter by `leadOpportunitySignal == "NO_WEBSITE_OPPORTUNITY"`). Instantly isolate established local businesses (dentists, plumbers, roofers, law firms, architects) that are actively operating and collecting Google reviews—but **do not own a website**. Call `phone` directly with a pre-built landing page pitch.

#### 2. Reputation Management & Review SaaS (`REPUTATION_RESCUE_OPPORTUNITY`)

Set `"maxRating": 4.2` to target high-ticket local businesses suffering from a sub-optimal Google rating (`< 4.2` stars) with existing review volume (`reviewCount >= 5`). Ideal for pitching automated review generation software, customer feedback funnels, or Google Business Profile optimization.

#### 3. Local SEO & Google Ads Retainers (`LOW_REVIEW_VOLUME_SEO_LEAD`)

Target businesses tagged `LOW_REVIEW_VOLUME_SEO_LEAD` (`reviewCount < 10`) that have a live `website` and `phone` number but lack local pack authority—prime candidates for monthly Local SEO and Google Ads management retainers.

***

### Input Configuration Reference

| Parameter | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `searchQueries` | `array<string>` | `["dentiste bordeaux", "plombier lyon", "architecte paris"]` | List of local search queries combining niche and target city or postal code. |
| `maxResults` | `integer` | `20` | Maximum number of validated business leads to extract per search query (`1`–`200`). |
| `language` | `string` | `"fr"` | ISO 639-1 two-letter language code (`"fr"`, `"en"`, `"es"`, `"de"`, `"it"`) for localized categories and addresses. |
| `onlyWithoutWebsite` | `boolean` | `false` | When `true`, filters the output to return **only** businesses that have no website on Google Maps. |
| `maxRating` | `number` | `0` | Optional ceiling rating filter (`1.0`–`5.0`). Set to `4.2` to capture poorly rated businesses; `0` disables the filter. |

#### Example Input JSON

```json
{
  "searchQueries": [
    "dentiste bordeaux",
    "plombier lyon",
    "architecte paris"
  ],
  "maxResults": 25,
  "language": "fr",
  "onlyWithoutWebsite": false,
  "maxRating": 0
}
```

***

### Output Dataset Schema Reference

All records pushed to the default Apify Dataset strictly conform to `.actor/dataset_schema.json`:

| Field | Type | Description |
| :--- | :--- | :--- |
| `placeId` | `string` | Unique Google Maps Place ID (`ChIJ...`) for CRM deduplication. |
| `businessName` | `string` | Official commercial name of the business. |
| `category` | `string` | Primary Google Maps industry classification (e.g., `"Cabinet dentaire"`, `"Plombier"`). |
| `address` | `string` | Complete street address, postal code, and city. |
| `phone` | `string \| null` | Direct business phone number (international or local dial format). |
| `website` | `string \| null` | Canonical company website URL (`null` if no website is registered). |
| `hasWebsite` | `boolean` | `true` if the business has a website URL; `false` otherwise. |
| `rating` | `number \| null` | Average Google Maps star rating (`1.0` to `5.0`). |
| `reviewCount` | `integer` | Total number of customer reviews published on Google Maps. |
| `leadOpportunitySignal` | `string` | Automated agency qualification signal: `NO_WEBSITE_OPPORTUNITY`, `REPUTATION_RESCUE_OPPORTUNITY`, `LOW_REVIEW_VOLUME_SEO_LEAD`, `ESTABLISHED_LOCAL_LEADER`, or `STANDARD_LOCAL_LEAD`. |
| `latitude` | `number \| null` | WGS84 geographic latitude coordinate. |
| `longitude` | `number \| null` | WGS84 geographic longitude coordinate. |
| `googleMapsUrl` | `string` | Direct URL to the business listing on Google Maps. |
| `searchQuery` | `string` | Source search query that generated this lead. |
| `scrapedAt` | `string` | ISO 8601 UTC timestamp of extraction. |

#### Sample Output JSON

```json
{
  "placeId": "ChIJxeo1F-onVQ0RQvuf-0rYOD8",
  "businessName": "GAD Cabinet Dentaire Bordeaux",
  "category": "Cabinet dentaire",
  "address": "15 Rue Ligier, 33000 Bordeaux",
  "phone": "+33 5 57 87 22 67",
  "website": "http://selarl-gadcabinetdentaire.chirurgiens-dentistes.fr/",
  "hasWebsite": true,
  "rating": 4.8,
  "reviewCount": 868,
  "leadOpportunitySignal": "ESTABLISHED_LOCAL_LEADER",
  "latitude": 44.8343705,
  "longitude": -0.5834328,
  "googleMapsUrl": "https://www.google.com/maps/search/?api=1&query=GAD+Cabinet+Dentaire+Bordeaux&query_place_id=ChIJxeo1F-onVQ0RQvuf-0rYOD8",
  "searchQuery": "dentiste bordeaux",
  "scrapedAt": "2026-10-31T23:04:12.402190+00:00"
}
```

***

### Programmatic Usage (Python SDK)

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_API_TOKEN")

run_input = {
    "searchQueries": ["dentiste bordeaux", "plombier lyon"],
    "maxResults": 40,
    "language": "fr",
    "onlyWithoutWebsite": False,
    "maxRating": 0,
}

run = client.actor("kleioks/google-maps-b2b-lead-machine").call(run_input=run_input)

for lead in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(
        f"[{lead['leadOpportunitySignal']}] {lead['businessName']} ({lead['category']}) | "
        f"Phone: {lead['phone']} | Web: {lead['website']} | "
        f"Rating: {lead['rating']} ({lead['reviewCount']} reviews)"
    )
```

***

### No-Code, Clay, n8n & AI Agent (MCP) Integrations

#### 1. Clay.com Local Business Waterfall

1. In **Clay**, add an **Apify — Run Actor** source or enrichment column selecting `kleioks/google-maps-b2b-lead-machine`.
2. Pass your target niche + city combinations in `searchQueries` (e.g., `"dentiste bordeaux"`, `"couvreur nantes"`, `"hvac miami"`).
3. Filter directly on `leadOpportunitySignal` (`NO_WEBSITE_OPPORTUNITY` or `REPUTATION_RESCUE_OPPORTUNITY`) to trigger personalized cold emails or AI voice/SMS sequences.

#### 2. n8n & Make.com Automated Cold-Call Sheet Generator

Connect the **Apify Node** in **n8n** or **Make.com** to a **Google Sheets**, **Airtable**, or **HubSpot CRM** module. Within seconds, your sales reps receive a clean prospecting sheet with `businessName`, `phone`, `address`, `rating`, `reviewCount`, and `googleMapsUrl`.

#### 3. Model Context Protocol (MCP) for Claude, Cursor & AI Agents

Use this Actor as a real-time local business lookup tool inside **Claude Desktop**, **Cursor**, or custom AI sales agents via the official Apify MCP server:

```json
{
  "mcpServers": {
    "apify-google-maps-leads": {
      "command": "npx",
      "args": [
        "-y",
        "@apify/actors-mcp-server",
        "--actors",
        "kleioks/google-maps-b2b-lead-machine"
      ],
      "env": {
        "APIFY_TOKEN": "YOUR_APIFY_API_TOKEN"
      }
    }
  }
}
```

***

### Frequently Asked Questions (FAQ)

#### How do I find local businesses without a website on Google Maps?

Set `"onlyWithoutWebsite": true` in the Actor input (or filter the output Dataset by `hasWebsite == false` / `leadOpportunitySignal == "NO_WEBSITE_OPPORTUNITY"`). The Actor automatically strips Google redirect wrappers and isolates active businesses that have a verified phone number and address on Google Maps but no website.

#### How can marketing agencies find poorly rated businesses on Google Maps for reputation management?

Set `"maxRating": 4` in the input configuration. The Actor will return only local businesses with a star rating at or below your threshold—giving reputation management and Local SEO agencies a ready-to-call list of businesses that urgently need review generation services.

#### Why is Google Maps B2B Lead Machine 20x faster and cheaper than browser-based scrapers?

Instead of launching a heavy headless Chrome browser and scrolling DOM elements one by one, this Actor queries Google Maps' internal Protobuf-JSON RPC endpoint (`tbm=map`) directly over asynchronous `httpx` inside a `128 MB` container, extracting **20 complete business profiles per request in under 400 ms**.

***

### Complete B2B Intelligence Suite by Kleioks

Combine this Actor with our specialized B2B data engines on the Apify Store to build end-to-end GTM, RevOps, and market research pipelines:

| Actor | Primary B2B Use Case | Store Link |
| :--- | :--- | :--- |
| **Google Maps B2B Lead Machine** | High-speed local business lead extractor (phone, website, rating & missing-website signals) | [Open on Apify Store](https://apify.com/kleioks/google-maps-b2b-lead-machine) |
| **Influencer & Creator Discovery API** | Extract TikTok, Instagram & YouTube creator profiles, engagement rates & verified PR emails | [Open on Apify Store](https://apify.com/kleioks/influencer-creator-discovery) |
| **Real Estate Market Intelligence API** | Normalized property listings, automated price/m² valuation, DPE ratings & agency contacts | [Open on Apify Store](https://apify.com/kleioks/real-estate-market-scraper) |
| **Multi-ATS Career Jobs API** | Track real-time hiring intent & tech-stack signals across Greenhouse, Lever, Ashby & Workable | [Open on Apify Store](https://apify.com/kleioks/multi-ats-jobs-scraper) |
| **Reddit B2B Buying Intent Scraper** | Monitor competitor churn, software recommendations & high-intent buyer threads on Reddit | [Open on Apify Store](https://apify.com/kleioks/reddit-b2b-scraper) |
| **B2B Social Leads & Intent Extractor** | Discover SaaS founders, developers & decision-makers across Bluesky, GitHub & Hacker News | [Open on Apify Store](https://apify.com/kleioks/b2b-social-leads-scraper) |

# Actor input Schema

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

List of local business search queries combining target niche and city/postal code (e.g., 'dentiste bordeaux', 'plombier lyon', 'avocat fiscaliste paris').

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

Maximum number of business leads to extract per search query.

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

Two-letter ISO 639-1 language code for localized category labels and address formatting (e.g., 'fr', 'en', 'es', 'de', 'it').

## `onlyWithoutWebsite` (type: `boolean`):

Enable to keep only businesses that do NOT have a website listed on Google Maps (ideal for web design and digital agencies).

## `maxRating` (type: `integer`):

Optional filter to target businesses with a rating at or below this value (e.g., 4 for reputation management prospecting). Set to 0 to disable.

## Actor input object example

```json
{
  "searchQueries": [
    "dentiste bordeaux",
    "plombier lyon"
  ],
  "maxResults": 20,
  "language": "fr",
  "onlyWithoutWebsite": false,
  "maxRating": 0
}
```

# Actor output Schema

## `dataset` (type: `string`):

Dataset containing validated local business records ready for CRM and outbound enrichment.

# 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": [
        "dentiste bordeaux",
        "plombier lyon"
    ],
    "language": "fr"
};

// Run the Actor and wait for it to finish
const run = await client.actor("kleioks/google-maps-b2b-lead-machine").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": [
        "dentiste bordeaux",
        "plombier lyon",
    ],
    "language": "fr",
}

# Run the Actor and wait for it to finish
run = client.actor("kleioks/google-maps-b2b-lead-machine").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": [
    "dentiste bordeaux",
    "plombier lyon"
  ],
  "language": "fr"
}' |
apify call kleioks/google-maps-b2b-lead-machine --silent --output-dataset

```

## MCP server setup

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

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/XpNOzxa3fE2dD0uTG/builds/eXRt6kUeuei31PR90/openapi.json
