# Google Maps Business Lead Finder & Scoring (`funny_ground/google-maps-business-lead-finder`) Actor

Find local businesses by keyword and location, enrich public contact data, remove duplicates, and rank every lead by outreach potential.

- **URL**: https://apify.com/funny\_ground/google-maps-business-lead-finder.md
- **Developed by:** [Coor Yu](https://apify.com/funny_ground) (community)
- **Categories:** Lead generation, Marketing, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 ranked business leads

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## 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 Business Lead Finder & Scoring

Find local businesses by keyword and location, enrich public company contacts, remove duplicates, and rank every lead by outreach potential.

### What this Actor does

1. Searches one business niche in a city, region, or country.
2. Calls the maintained `compass/crawler-google-places` Actor with a hard downstream spending cap.
3. Optionally enriches public emails and social profiles from company websites.
4. Removes duplicate, closed, incomplete, and wrong-country records.
5. Applies rating, review-count, and website filters locally.
6. Scores every result from 0 to 100 and assigns priority A, B, or C.
7. Exports a clean dataset ready for CSV, Excel, APIs, CRMs, or outreach research.

### Example use cases

- local business prospect lists for agencies and freelancers;
- website-development prospects with no listed website;
- reputation-management prospects with lower Google ratings;
- CRM enrichment with public business phones, emails, and social profiles;
- market maps for dentists, salons, contractors, restaurants, clinics, and other local services.

### Input example

```json
{
  "searchTerm": "beauty salon",
  "location": "Singapore",
  "countryCode": "SG",
  "maxResults": 50,
  "includeContacts": true,
  "skipClosedPlaces": true,
  "minimumRating": 0,
  "maximumRating": 5,
  "minimumReviews": 0,
  "websiteFilter": "all",
  "sortBy": "lead-score",
  "maxDownstreamChargeUsd": 0.5
}
````

#### Main options

| Field | Default | Description |
|---|---:|---|
| `searchTerm` | `beauty salon` | Business type or query. |
| `location` | `Singapore` | City, region, or country. |
| `countryCode` | `SG` | Optional ISO country code for localization and validation. |
| `maxResults` | `50` | Maximum places requested from the underlying Actor. |
| `includeContacts` | `true` | Extract public company emails and social profiles from websites. |
| `strictCountryCode` | `true` | Remove results outside the requested country. |
| `requireRelevantCategory` | `true` | Remove unrelated businesses using names, categories, and common synonyms. |
| `minimumRating` / `maximumRating` | `0` / `5` | Local post-processing filters. |
| `minimumReviews` | `0` | Local minimum review count. |
| `websiteFilter` | `all` | All, with website, or without website. |
| `sortBy` | `lead-score` | Lead score, reviews, or rating. |
| `maxDownstreamChargeUsd` | `0.5` | Hard cap passed to the underlying paid Actor. |

### Output

Each dataset item contains:

- lead priority and numeric lead score;
- business name, category, address, city, and country code;
- public phone, website, emails, Instagram, Facebook, and LinkedIn links;
- Google rating, review count, Maps URL, result rank, and Place ID;
- a suggested outreach angle;
- source and downstream run identifiers for traceability.

The `OUTPUT` key-value store record includes counts, timing, downstream usage, and the proxy policy.

### Lead scoring

The transparent score rewards records that are easy to contact and commercially useful:

- phone: +25;
- public email: +20;
- website: +15;
- at least one social profile: +10;
- 30 or more reviews: +10;
- 100 or more reviews: +5;
- rating of 4.3 or lower: +10;
- no website: +5 for website-service potential.

Priority A starts at 70, priority B at 50, and the remaining results are priority C.

### Cost and dependency disclosure

This Actor calls the public, limited-permission `compass/crawler-google-places` Actor. That Actor's pay-per-event charges are billed to the user running this Actor. Contact enrichment and closed-place filtering are optional paid features. Use `maxDownstreamChargeUsd` to control the maximum downstream charge; actual cost can be lower.

This wrapper may also have its own Store pricing shown on the Pricing tab. Always review both prices before running large jobs.

### Residential proxy policy

This Actor does not create or accept an Apify proxy configuration and never enables a residential proxy group. The downstream Actor currently exposes no proxy input; its internal network routing is controlled by its publisher. If that dependency later requires an explicit residential proxy configuration, this Actor should stop and be revised instead of silently enabling one.

### Responsible use

The output contains public business information. Users are responsible for complying with applicable website terms, privacy rules, anti-spam requirements, and local laws. Do not use the results for harassment or indiscriminate messaging.

### Local development

```bash
npm install
npm test
npm run build
```

# Actor input Schema

## `searchTerm` (type: `string`):

Examples: beauty salon, dentist, roofing contractor, digital marketing agency.

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

A city, region, or country understood by Google Maps, for example Singapore or Austin, Texas, USA.

## `countryCode` (type: `string`):

Optional ISO two-letter country code used for localization and strict country validation, for example SG, US, or AU. Clear it to accept every result inside the geocoded area.

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

Maximum number of places requested from the underlying Google Maps Scraper.

## `includeContacts` (type: `boolean`):

Visit listed company websites to extract public emails and social profiles. This is an optional paid add-on of the underlying Actor.

## `skipClosedPlaces` (type: `boolean`):

Exclude places marked permanently or temporarily closed. This is an optional paid filter of the underlying Actor.

## `strictCountryCode` (type: `boolean`):

When a country code is supplied, remove results whose returned country does not match it.

## `requireRelevantCategory` (type: `boolean`):

Require the business name or category to match the search intent using query tokens and common local-business synonyms. Applied locally without a paid upstream filter.

## `minimumRating` (type: `number`):

Applied locally after scraping, so it does not add a paid upstream filter.

## `maximumRating` (type: `number`):

Use a lower maximum to find businesses with more reputation-improvement potential.

## `minimumReviews` (type: `integer`):

Applied locally after scraping.

## `websiteFilter` (type: `string`):

Keep all businesses, only businesses with a website, or only businesses without one. Applied locally after scraping.

## `sortBy` (type: `string`):

Choose the primary ordering of the final cleaned dataset.

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

Two-letter language code, such as en, de, es, or fr.

## `maxDownstreamChargeUsd` (type: `number`):

Hard spending cap for the underlying Google Maps Scraper run. Its current minimum accepted cap is $0.50. Actual cost can be lower.

## `downstreamTimeoutSecs` (type: `integer`):

Maximum runtime for the Google Maps Scraper called by this Actor.

## Actor input object example

```json
{
  "searchTerm": "beauty salon",
  "location": "Singapore",
  "countryCode": "SG",
  "maxResults": 50,
  "includeContacts": true,
  "skipClosedPlaces": true,
  "strictCountryCode": true,
  "requireRelevantCategory": true,
  "minimumRating": 0,
  "maximumRating": 5,
  "minimumReviews": 0,
  "websiteFilter": "all",
  "sortBy": "lead-score",
  "language": "en",
  "maxDownstreamChargeUsd": 0.5,
  "downstreamTimeoutSecs": 1200
}
```

# Actor output Schema

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

Cleaned, deduplicated, filtered, and scored business leads in the default dataset.

## `summary` (type: `string`):

Input, output counts, downstream run information, timing, and proxy policy.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("funny_ground/google-maps-business-lead-finder").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("funny_ground/google-maps-business-lead-finder").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 '{}' |
apify call funny_ground/google-maps-business-lead-finder --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Maps Business Lead Finder & Scoring",
        "description": "Find local businesses by keyword and location, enrich public contact data, remove duplicates, and rank every lead by outreach potential.",
        "version": "1.0",
        "x-build-id": "aBbjXwnDA1fmvAeNW"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/funny_ground~google-maps-business-lead-finder/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-funny_ground-google-maps-business-lead-finder",
                "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/funny_ground~google-maps-business-lead-finder/runs": {
            "post": {
                "operationId": "runs-sync-funny_ground-google-maps-business-lead-finder",
                "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/funny_ground~google-maps-business-lead-finder/run-sync": {
            "post": {
                "operationId": "run-sync-funny_ground-google-maps-business-lead-finder",
                "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",
                "required": [
                    "searchTerm",
                    "location"
                ],
                "properties": {
                    "searchTerm": {
                        "title": "Business type or search term",
                        "minLength": 2,
                        "maxLength": 120,
                        "type": "string",
                        "description": "Examples: beauty salon, dentist, roofing contractor, digital marketing agency.",
                        "default": "beauty salon"
                    },
                    "location": {
                        "title": "Location",
                        "minLength": 2,
                        "maxLength": 160,
                        "type": "string",
                        "description": "A city, region, or country understood by Google Maps, for example Singapore or Austin, Texas, USA.",
                        "default": "Singapore"
                    },
                    "countryCode": {
                        "title": "Country code",
                        "pattern": "^([A-Za-z]{2})?$",
                        "type": "string",
                        "description": "Optional ISO two-letter country code used for localization and strict country validation, for example SG, US, or AU. Clear it to accept every result inside the geocoded area.",
                        "default": "SG"
                    },
                    "maxResults": {
                        "title": "Maximum places",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Maximum number of places requested from the underlying Google Maps Scraper.",
                        "default": 50
                    },
                    "includeContacts": {
                        "title": "Enrich public company contacts",
                        "type": "boolean",
                        "description": "Visit listed company websites to extract public emails and social profiles. This is an optional paid add-on of the underlying Actor.",
                        "default": true
                    },
                    "skipClosedPlaces": {
                        "title": "Skip closed businesses",
                        "type": "boolean",
                        "description": "Exclude places marked permanently or temporarily closed. This is an optional paid filter of the underlying Actor.",
                        "default": true
                    },
                    "strictCountryCode": {
                        "title": "Require matching country code",
                        "type": "boolean",
                        "description": "When a country code is supplied, remove results whose returned country does not match it.",
                        "default": true
                    },
                    "requireRelevantCategory": {
                        "title": "Remove unrelated businesses",
                        "type": "boolean",
                        "description": "Require the business name or category to match the search intent using query tokens and common local-business synonyms. Applied locally without a paid upstream filter.",
                        "default": true
                    },
                    "minimumRating": {
                        "title": "Minimum Google rating",
                        "minimum": 0,
                        "maximum": 5,
                        "type": "number",
                        "description": "Applied locally after scraping, so it does not add a paid upstream filter.",
                        "default": 0
                    },
                    "maximumRating": {
                        "title": "Maximum Google rating",
                        "minimum": 0,
                        "maximum": 5,
                        "type": "number",
                        "description": "Use a lower maximum to find businesses with more reputation-improvement potential.",
                        "default": 5
                    },
                    "minimumReviews": {
                        "title": "Minimum review count",
                        "minimum": 0,
                        "maximum": 10000000,
                        "type": "integer",
                        "description": "Applied locally after scraping.",
                        "default": 0
                    },
                    "websiteFilter": {
                        "title": "Website filter",
                        "enum": [
                            "all",
                            "with-website",
                            "without-website"
                        ],
                        "type": "string",
                        "description": "Keep all businesses, only businesses with a website, or only businesses without one. Applied locally after scraping.",
                        "default": "all"
                    },
                    "sortBy": {
                        "title": "Sort results by",
                        "enum": [
                            "lead-score",
                            "reviews",
                            "rating"
                        ],
                        "type": "string",
                        "description": "Choose the primary ordering of the final cleaned dataset.",
                        "default": "lead-score"
                    },
                    "language": {
                        "title": "Result language",
                        "pattern": "^[A-Za-z]{2}$",
                        "type": "string",
                        "description": "Two-letter language code, such as en, de, es, or fr.",
                        "default": "en"
                    },
                    "maxDownstreamChargeUsd": {
                        "title": "Maximum underlying Actor charge",
                        "minimum": 0.5,
                        "maximum": 50,
                        "type": "number",
                        "description": "Hard spending cap for the underlying Google Maps Scraper run. Its current minimum accepted cap is $0.50. Actual cost can be lower.",
                        "default": 0.5
                    },
                    "downstreamTimeoutSecs": {
                        "title": "Underlying run timeout",
                        "minimum": 120,
                        "maximum": 3600,
                        "type": "integer",
                        "description": "Maximum runtime for the Google Maps Scraper called by this Actor.",
                        "default": 1200
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
