# Google Maps Local Business Lead Trigger Radar (`nexascout/google-maps-local-business-lead-trigger-radar`) Actor

Find local businesses on Google Maps, detect profile changes and sales triggers, and export qualified leads with contact details and explainable opportunity scores.

- **URL**: https://apify.com/nexascout/google-maps-local-business-lead-trigger-radar.md
- **Developed by:** [NexaScout](https://apify.com/nexascout) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 1,000 analyzed local businesses

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 Local Business Lead & Trigger Radar

Turn public Google Maps business data into explainable, outreach-ready leads for web studios, SEO agencies, reputation-management teams, local marketers, and lead-generation agencies.

This Actor is intentionally not a generic Google Maps export. It searches and monitors local businesses, enriches public contact paths, compares scheduled runs, and explains why an agency should contact each prospect now.

### What it detects

- new businesses or competitors since the previous run;
- missing website, phone, public email, or linked social profiles;
- low public review count;
- rating drops and review-activity surges;
- sampled negative-review spikes;
- recent negative reviews without a detected owner response;
- phone, address, and website changes;
- temporary closure and reopening signals.

Every analyzed business receives:

- a transparent 0–100 `leadScore`;
- `HOT`, `WARM`, or `WATCH` lead tier;
- machine-readable trigger codes;
- readable evidence and score contribution;
- a concise `reasonToContact`;
- credible `recommendedServices`.

### Quick start

```json
{
  "searchQueries": ["dentists", "roofing contractors"],
  "locations": ["Queens, New York, USA"],
  "maxPlacesPerQuery": 5,
  "maxTotalPlaces": 5,
  "minimumLeadScore": 25,
  "enrichWebsites": true,
  "collectRecentReviews": false,
  "maxRecentReviews": 0,
  "compareWithPreviousRun": true,
  "historyKey": "queens-agency-prospects"
}
```

For direct analysis, provide Google Maps search or place links in `googleMapsUrls`.

### Monitoring workflow

1. The first run creates a private baseline and still reports static lead opportunities.
2. Save the input as an Apify Task.
3. Schedule the Task daily or weekly with the same `historyKey`.
4. Later runs compare the current listings with the saved baseline.
5. Filter `snapshotStatus`, `leadTier`, or `isQualifiedLead` for outreach and alerts.

The baseline is stored in a named key-value store within the account running the Actor. Use a different `historyKey` for each market or campaign. Enable `resetBaseline` only when you intentionally want to start a new history.

### Pricing

- **$0.008 per analyzed local business**;
- **$8 per 1,000 analyzed businesses**;
- Apify platform usage is included in the event price;
- the synthetic Actor Start event costs $0.00005 per charge.

Each analyzed business is returned as a visible dataset item. A record is charged whether or not it reaches the requested qualified-lead threshold because collection, enrichment, trigger analysis, and scoring have already been performed. Use `maxTotalPlaces` to control the maximum number of billable records. For example, 25 analyzed businesses cost approximately **$0.20**, plus the small Actor Start charge.

`isQualifiedLead` is a value classification rather than a billing filter. Filter `isQualifiedLead`, `leadTier`, or `leadScore` to select the strongest outreach opportunities.

### Cost controls

- hard `maxTotalPlaces` limit;
- browser concurrency defaults to 1 and is capped at 4;
- the Actor uses 2 GB by default because the Google Maps browser reached critical memory pressure at 1 GB during production testing;
- datacenter Apify Proxy is used unless the user explicitly changes it;
- website enrichment is capped at three public pages per business;
- recent review sampling is capped at ten reviews per business;
- failed or blocked pages are recorded in `OUTPUT` diagnostics instead of causing unbounded retries.

### Public data and responsible use

The Actor collects public business listings, public reviews, and contact details visibly published by businesses. It does not log in, reveal gated emails, solve CAPTCHAs, or use a third-party data API or another Actor. Users remain responsible for lawful outreach, privacy compliance, anti-spam rules, and the terms that apply to their use case.

### Data caveats

Google Maps changes page structure and labels. The Actor uses multiple selectors and preserves diagnostics, but fields may be unavailable for some listings or languages. Keep `language` set to `en` for the most reliable review and closure parsing in version 0.1.

# Changelog

This Actor's version history is a separate document: https://apify.com/nexascout/google-maps-local-business-lead-trigger-radar/changelog.md

# Actor input Schema

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

Business types or services to find, such as dentists, roofers, restaurants, or HVAC contractors.

## `locations` (type: `array`):

Cities, neighborhoods, ZIP codes, or regions combined with every search query.

## `googleMapsUrls` (type: `array`):

Optional Google Maps search or place URLs to analyze directly.

## `maxPlacesPerQuery` (type: `integer`):

Maximum place candidates collected from each query-location combination.

## `maxTotalPlaces` (type: `integer`):

Hard cost and runtime limit across every query and direct URL.

## `minimumLeadScore` (type: `integer`):

Businesses at or above this transparent 0–100 score are marked as qualified leads. All analyzed businesses remain visible and billable.

## `enrichWebsites` (type: `boolean`):

Visit public business websites and extract visible email addresses and social links.

## `maxWebsitePages` (type: `integer`):

Maximum public website pages checked per business, including the homepage.

## `collectRecentReviews` (type: `boolean`):

Sample recent reviews to detect negative feedback and missing owner responses. This uses more browser time.

## `maxRecentReviews` (type: `integer`):

Maximum recent reviews sampled from each business.

## `compareWithPreviousRun` (type: `boolean`):

Save a private baseline and report new businesses, rating drops, review spikes, contact changes, closures, and reopenings on later runs.

## `historyKey` (type: `string`):

Optional stable key shared by scheduled runs. Leave empty to derive it automatically from the searches and locations.

## `resetBaseline` (type: `boolean`):

Ignore prior history and replace it with this run after collection.

## `ratingDropThreshold` (type: `number`):

Minimum decrease in Google rating that creates a rating-drop trigger.

## `reviewGrowthThreshold` (type: `integer`):

Minimum number of new reviews between runs that creates a review-activity trigger.

## `negativeReviewSpikeThreshold` (type: `integer`):

Minimum increase in sampled negative reviews between runs.

## `lowReviewCountThreshold` (type: `integer`):

Businesses below this known review count receive a review-growth opportunity signal.

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

Language code used for consistent labels and parsing.

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

Two-letter country hint used by Google Maps.

## `maxConcurrency` (type: `integer`):

Keep this at 1 for reliable, memory-safe, and cost-controlled Google Maps collection.

## `navigationTimeoutSecs` (type: `integer`):

Maximum duration of an individual Google Maps navigation.

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

Apify Proxy is recommended. Residential groups are not selected by default, which keeps the initial cost predictable.

## Actor input object example

```json
{
  "searchQueries": [
    "dentists"
  ],
  "locations": [
    "Queens, New York, USA"
  ],
  "googleMapsUrls": [],
  "maxPlacesPerQuery": 5,
  "maxTotalPlaces": 5,
  "minimumLeadScore": 25,
  "enrichWebsites": true,
  "maxWebsitePages": 2,
  "collectRecentReviews": false,
  "maxRecentReviews": 0,
  "compareWithPreviousRun": true,
  "historyKey": "",
  "resetBaseline": false,
  "ratingDropThreshold": 0.2,
  "reviewGrowthThreshold": 5,
  "negativeReviewSpikeThreshold": 1,
  "lowReviewCountThreshold": 20,
  "language": "en",
  "countryCode": "US",
  "maxConcurrency": 1,
  "navigationTimeoutSecs": 45,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `businessLeads` (type: `string`):

One dataset row per analyzed business. Filter isQualifiedLead or leadTier for outreach-ready prospects.

## `runSummary` (type: `string`):

Search coverage, qualified lead totals, history status, failures, and diagnostics.

# 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("nexascout/google-maps-local-business-lead-trigger-radar").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("nexascout/google-maps-local-business-lead-trigger-radar").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 '{}' |
apify call nexascout/google-maps-local-business-lead-trigger-radar --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nexascout/google-maps-local-business-lead-trigger-radar"
        }
    }
}
```

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/7Y29uvVkNq5ghPKGa/builds/b7q2FeyMDbRS9bzFc/openapi.json
