# Google Maps Business Intelligence (`happitap/google-maps-business-intelligence`) Actor

Collect structured lead data and competitive insights from Google Maps for lead generation, local SEO, and market research. Perfect for digital agencies, sales teams, and market researchers

- **URL**: https://apify.com/happitap/google-maps-business-intelligence.md
- **Developed by:** [HappiTap](https://apify.com/happitap) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## 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 Business Intelligence Actor

**Collect structured lead data and competitive insights from Google Maps for lead generation, local SEO, and market research.**

### 🎯 What This Actor Does

This Actor scrapes Google Maps to extract comprehensive business intelligence including:

- **Business Information**: Name, category, address, phone, website, coordinates
- **Ratings & Reviews**: Star ratings, review counts, individual reviews with sentiment
- **Contact Enrichment**: Email addresses, social media links (Facebook, Instagram, LinkedIn, Twitter)
- **Competitive Analysis**: Benchmark against top competitors, calculate market gaps
- **Lead Scoring**: Automatic scoring based on agency opportunity signals
- **Local SEO Data**: Local rankings, visibility metrics, optimization opportunities

Perfect for:

- 🎯 Digital marketing agencies (lead generation + audits)
- 📊 Local SEO consultants
- 💼 Sales teams targeting local businesses
- 📈 Data resellers and list builders
- 🔍 Market research and competitive analysis

### 🚀 Quick Start

#### Example 1: Find Dentists in Kochi with Contact Info

```json
{
  "searchKeywords": ["dentist", "dental clinic"],
  "location": "Kochi, Kerala",
  "maxResults": 300,
  "minRating": 3.5,
  "extractEmailsFromWebsite": true,
  "extractSocialLinks": true,
  "benchmarkCompetitors": true
}
```

#### Example 2: Find Plumbers in Dubai (High-Value Leads)

```json
{
  "searchKeywords": ["plumber", "plumbing service"],
  "location": "Dubai, UAE",
  "maxResults": 500,
  "hasWebsiteOnly": false,
  "extractEmailsFromWebsite": true,
  "includeReviews": true,
  "reviewsLimit": 20,
  "benchmarkCompetitors": true
}
```

#### Example 3: Restaurant Analysis with Reviews

```json
{
  "searchKeywords": ["restaurant"],
  "location": "Mumbai, India",
  "maxResults": 200,
  "minRating": 4.0,
  "minReviews": 50,
  "includeReviews": true,
  "reviewsLimit": 100,
  "reviewsSort": "newest",
  "benchmarkCompetitors": true,
  "computeLocalRank": true
}
```

### 📥 Input Configuration

#### Search Modes

Choose one of three search modes:

##### 1. Keyword + Location (Most Common)

```json
{
  "searchMode": "keyword_location",
  "searchKeywords": ["dentist", "dental clinic"],
  "location": "Kochi, Kerala",
  "countryCode": "IN"
}
```

##### 2. Geo Coordinates + Radius

```json
{
  "searchMode": "geo_radius",
  "searchKeywords": ["restaurant"],
  "centerLat": 9.9312,
  "centerLng": 76.2673,
  "radiusKm": 5
}
```

##### 3. Direct Place URLs/IDs

```json
{
  "searchMode": "place_urls",
  "placeUrls": [
    "https://www.google.com/maps/place/...",
    "https://goo.gl/maps/..."
  ]
}
```

#### Output Controls

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `maxResults` | number | 100 | Maximum businesses to collect (1-5000) |
| `dedupeBy` | string | "place\_id" | Deduplication method: `place_id`, `cid`, `name_address` |
| `outputFormat` | string | "dataset" | Output format: `dataset`, `json`, `csv` |

#### Filters

| Field | Type | Description |
|-------|------|-------------|
| `minRating` | number | Minimum star rating (0-5) |
| `minReviews` | number | Minimum number of reviews |
| `hasWebsiteOnly` | boolean | Only businesses with websites |
| `hasPhoneOnly` | boolean | Only businesses with phone numbers |
| `openNowOnly` | boolean | Only currently open businesses |
| `categoriesInclude` | array | Only include these categories |
| `categoriesExclude` | array | Exclude these categories |

#### Enrichment Features

| Feature | Field | Description |
|---------|-------|-------------|
| **Email Extraction** | `extractEmailsFromWebsite` | Crawl websites to find email addresses |
| **Social Links** | `extractSocialLinks` | Extract Facebook, Instagram, LinkedIn, Twitter |
| **Website Metadata** | `fetchWebsiteMeta` | Get title, description, tech stack |
| **Email Verification** | `verifyEmailDeliverability` | Verify email deliverability (slower) |

#### Reviews Intelligence

```json
{
  "includeReviews": true,
  "reviewsLimit": 50,
  "reviewsSort": "newest",
  "aiReviewSummary": false
}
```

#### Competitor Benchmarking

```json
{
  "benchmarkCompetitors": true,
  "benchmarkTopN": 20,
  "computeLocalRank": true
}
```

Provides:

- Average competitor ratings and reviews
- Rating and review gaps
- Percentile rankings
- Local search position
- Competitive insights

#### Performance Settings

| Field | Default | Description |
|-------|---------|-------------|
| `useProxy` | true | Use Apify proxy (recommended) |
| `proxyGroups` | \["RESIDENTIAL"] | Proxy groups to use |
| `maxConcurrency` | 5 | Parallel browser instances |
| `maxRetries` | 3 | Retry attempts for failures |
| `delayMsMin` | 1000 | Minimum delay between requests |
| `delayMsMax` | 3000 | Maximum delay between requests |

### 📤 Output Data

#### Business Fields

Each business listing includes:

```json
{
  "placeId": "ChIJ...",
  "cid": "12345...",
  "name": "SmileCare Dental Clinic",
  "primaryCategory": "Dental clinic",
  "categories": ["Dental clinic", "Cosmetic dentist"],
  "mapUrl": "https://www.google.com/maps/...",
  "shareUrl": "https://goo.gl/maps/...",
  
  "phone": "+91 484 1234567",
  "internationalPhone": "+91 484 1234567",
  "address": "MG Road, Kochi, Kerala 682016",
  "plusCode": "W7J8+2H Kochi",
  "city": "Kochi",
  "state": "Kerala",
  "country": "India",
  "postalCode": "682016",
  "lat": 9.9312,
  "lng": 76.2673,
  
  "rating": 4.2,
  "reviewsCount": 132,
  "priceLevel": 2,
  "openNow": true,
  
  "website": "https://example.com",
  "emails": ["contact@example.com"],
  "socialLinks": {
    "facebook": "https://facebook.com/...",
    "instagram": "https://instagram.com/..."
  },
  
  "websiteTitle": "SmileCare Dental Clinic - Best Dentist in Kochi",
  "websiteDescription": "Professional dental care...",
  "techSignals": ["WordPress", "Google Analytics"],
  
  "localRank": 7,
  "topCompetitorAvgRating": 4.5,
  "topCompetitorAvgReviews": 180,
  "gapRating": -0.3,
  "gapReviews": -48,
  
  "leadScore": 68,
  "leadReasons": [
    "Competitors have 48 more reviews on average",
    "No social media presence detected"
  ],
  "scoreBreakdown": {
    "category": "Warm Lead",
    "priority": "Medium",
    "recommendation": "Good prospect - schedule follow-up within 1 week"
  },
  
  "searchKeyword": "dentist",
  "searchLocation": "Kochi, Kerala",
  "scrapedAt": "2025-12-25T11:30:00Z"
}
```

#### Reviews Data (if enabled)

```json
{
  "reviews": [
    {
      "reviewId": "...",
      "authorName": "John Doe",
      "rating": 5,
      "date": "2 weeks ago",
      "text": "Excellent service! Very professional..."
    }
  ],
  "lastReviewDate": "2 weeks ago"
}
```

### 🎯 Lead Scoring System

Businesses are automatically scored (0-100) based on agency opportunity signals:

#### Scoring Criteria

| Signal | Points | Description |
|--------|--------|-------------|
| No website | +25 | Needs web presence |
| Low rating, high reviews | +20 | Reputation management opportunity |
| Few reviews (< 10) | +15 | Needs review generation |
| No recent reviews (90+ days) | +10 | Low engagement |
| No social media | +10 | Missing social presence |
| Missing phone/email | +5 each | Incomplete contact info |
| Competitor review gap | +15 | Behind competitors |
| Competitor rating gap | +10 | Rating improvement needed |
| Low local rank (> 10) | +15 | SEO opportunity |
| No analytics tracking | +8 | Missing insights |

#### Score Categories

- **🔥 Hot Lead (70-100)**: Immediate outreach recommended - multiple high-value opportunities
- **🌡️ Warm Lead (50-69)**: Good prospect - schedule follow-up within 1 week
- **❄️ Cold Lead (30-49)**: Some opportunities - add to nurture campaign
- **⚪ Low Priority (0-29)**: Limited opportunities - focus on higher-value leads

### 📊 Output Views

The Actor provides multiple dataset views:

1. **All Businesses** - Complete dataset with all fields
2. **Overview** - Quick summary with key metrics
3. **High-Value Leads** - Businesses with high lead scores
4. **Contact Directory** - Phone, email, and address information
5. **Competitive Analysis** - Benchmarking and ranking data
6. **Run Summary** - Statistics and top leads

### 💡 Use Cases

#### 1. Lead Generation for Digital Agencies

Find businesses that need:

- Website development (no website)
- SEO services (low local rank)
- Reputation management (low ratings)
- Social media marketing (no social presence)
- Review generation (few reviews)

```json
{
  "searchKeywords": ["dentist"],
  "location": "Your City",
  "maxResults": 500,
  "extractEmailsFromWebsite": true,
  "benchmarkCompetitors": true
}
```

#### 2. Local SEO Audits

Analyze competitive landscape:

- Local rankings
- Rating distribution
- Review volume trends
- Market gaps

```json
{
  "searchKeywords": ["restaurant"],
  "location": "Your City",
  "includeReviews": true,
  "benchmarkCompetitors": true,
  "computeLocalRank": true
}
```

#### 3. Sales Prospecting

Build targeted contact lists:

- Phone numbers
- Email addresses
- Website URLs
- Social profiles

```json
{
  "searchKeywords": ["plumber"],
  "location": "Dubai",
  "maxResults": 1000,
  "extractEmailsFromWebsite": true,
  "extractSocialLinks": true,
  "hasPhoneOnly": true
}
```

#### 4. Market Research

Understand market dynamics:

- Competitor analysis
- Category trends
- Service adoption rates
- Technology usage

```json
{
  "searchKeywords": ["coffee shop"],
  "location": "Mumbai",
  "fetchWebsiteMeta": true,
  "benchmarkCompetitors": true
}
```

### 🔧 Advanced Features

#### Webhook Integration

Send results to your CRM or automation platform:

```json
{
  "webhookUrl": "https://your-webhook-url.com/endpoint",
  "webhookPayloadType": "full"
}
```

Payload types:

- `full`: Complete dataset + stats
- `incremental`: Businesses only
- `summary`: Stats + top 10 leads

#### Batch Processing

Process multiple locations:

```json
{
  "searchKeywords": ["dentist"],
  "location": "Kochi, Kerala",
  "maxResults": 300
}
```

Run multiple times with different locations or use the Actor in a workflow.

### ⚡ Performance

- **Speed**: ~1000 listings in 1-2 hours (depending on enrichment)
- **Accuracy**: High-quality data with deduplication
- **Reliability**: Proxy rotation, retry logic, anti-detection
- **Scalability**: Up to 5000 results per run

### 💰 Pricing

**Pay-per-result**: $0.001 per business listing

Example costs:

- 100 businesses = $0.10
- 500 businesses = $0.50
- 1000 businesses = $1.00

*Note: Enrichment features (email extraction, reviews) may increase processing time but not cost.*

### 🛠️ Technical Details

#### Technologies Used

- **Playwright**: Browser automation with anti-detection
- **Apify SDK**: Actor framework and dataset management
- **Cheerio**: HTML parsing for enrichment
- **Axios**: HTTP requests for website crawling

#### Anti-Detection Measures

- Browser fingerprinting
- Random delays
- Proxy rotation
- User-agent spoofing
- Realistic scrolling patterns

#### Error Handling

- Automatic retries with exponential backoff
- Graceful degradation (partial results on failure)
- Detailed logging for debugging
- Captcha detection and recovery

### 📝 Example Output

See the **Output** tab after running the Actor for:

- Interactive table view
- Downloadable CSV/JSON
- API access URLs
- Run statistics

### 🤝 Support

Need help?

- Check the [Apify documentation](https://docs.apify.com)
- Review the input schema for field descriptions
- Contact support for custom requirements

### 📄 License

Apache-2.0

***

**Ready to generate leads?** Click "Start" to begin scraping! 🚀

# Actor input Schema

## `searchMode` (type: `string`):

Choose how to search for businesses

## `searchKeywords` (type: `array`):

Keywords to search for (e.g., 'dentist', 'plumber', 'restaurant')

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

City, region, or address (e.g., 'Kochi, Kerala' or 'Dubai Marina')

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

Optional ISO country code (e.g., 'IN', 'AE', 'US')

## `centerLat` (type: `number`):

Latitude for geo radius search

## `centerLng` (type: `number`):

Longitude for geo radius search

## `radiusKm` (type: `number`):

Search radius in kilometers

## `placeUrls` (type: `array`):

Direct Google Maps place URLs or share links

## `placeIds` (type: `array`):

Google Maps Place IDs

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

Maximum number of results to collect

## `dedupeBy` (type: `string`):

Field to use for deduplication

## `outputFormat` (type: `string`):

Format for output data

## `includeRawHtml` (type: `boolean`):

Include raw HTML in output (for debugging)

## `minRating` (type: `number`):

Filter businesses with rating >= this value

## `minReviews` (type: `integer`):

Filter businesses with reviews >= this value

## `hasWebsiteOnly` (type: `boolean`):

Only include businesses with a website

## `hasPhoneOnly` (type: `boolean`):

Only include businesses with a phone number

## `openNowOnly` (type: `boolean`):

Only include businesses currently open

## `categoriesInclude` (type: `array`):

Only include these categories

## `categoriesExclude` (type: `array`):

Exclude these categories

## `extractEmailsFromWebsite` (type: `boolean`):

Crawl business websites to find email addresses

## `extractSocialLinks` (type: `boolean`):

Extract Facebook, Instagram, LinkedIn links

## `fetchWebsiteMeta` (type: `boolean`):

Extract website title, description, and tech signals

## `verifyEmailDeliverability` (type: `boolean`):

Verify if extracted emails are deliverable (slower)

## `includeReviews` (type: `boolean`):

Fetch customer reviews for each business

## `reviewsLimit` (type: `integer`):

Maximum number of reviews to fetch per business

## `reviewsSort` (type: `string`):

How to sort reviews

## `aiReviewSummary` (type: `boolean`):

Generate AI summary of reviews (requires OpenAI API key)

## `benchmarkCompetitors` (type: `boolean`):

Compare each business against top competitors

## `competitorKeywords` (type: `array`):

Keywords for competitor search (defaults to searchKeywords)

## `benchmarkTopN` (type: `integer`):

Number of top competitors to benchmark against

## `computeLocalRank` (type: `boolean`):

Calculate approximate ranking position for each business

## `webhookUrl` (type: `string`):

Send results to this webhook URL

## `webhookPayloadType` (type: `string`):

Type of data to send to webhook

## `useProxy` (type: `boolean`):

Use Apify proxy to avoid blocks

## `proxyGroups` (type: `array`):

Proxy groups to use (RESIDENTIAL recommended)

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

Maximum number of parallel browser instances

## `maxRetries` (type: `integer`):

Maximum retry attempts for failed requests

## `delayMsMin` (type: `integer`):

Minimum delay between requests in milliseconds

## `delayMsMax` (type: `integer`):

Maximum delay between requests in milliseconds

## `openaiApiKey` (type: `string`):

Required for AI review summaries

## Actor input object example

```json
{
  "searchMode": "keyword_location",
  "searchKeywords": [
    "dentist",
    "dental clinic"
  ],
  "location": "Kochi, Kerala",
  "maxResults": 100,
  "dedupeBy": "place_id",
  "outputFormat": "dataset",
  "includeRawHtml": false,
  "hasWebsiteOnly": false,
  "hasPhoneOnly": false,
  "openNowOnly": false,
  "extractEmailsFromWebsite": false,
  "extractSocialLinks": false,
  "fetchWebsiteMeta": false,
  "verifyEmailDeliverability": false,
  "includeReviews": false,
  "reviewsLimit": 0,
  "reviewsSort": "most_relevant",
  "aiReviewSummary": false,
  "benchmarkCompetitors": false,
  "benchmarkTopN": 20,
  "computeLocalRank": false,
  "webhookPayloadType": "full",
  "useProxy": true,
  "proxyGroups": [
    "RESIDENTIAL"
  ],
  "maxConcurrency": 5,
  "maxRetries": 3,
  "delayMsMin": 1000,
  "delayMsMax": 3000
}
```

# Actor output Schema

## `businesses` (type: `string`):

Complete dataset of all scraped business listings

## `overview` (type: `string`):

Quick overview with key business metrics

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

Businesses with high lead scores and contact information

## `contacts` (type: `string`):

Business contact information including phone, email, and address

## `competitive` (type: `string`):

Competitive benchmarking data and local rankings

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

Statistics and summary of the scraping run

# 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("happitap/google-maps-business-intelligence").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("happitap/google-maps-business-intelligence").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 happitap/google-maps-business-intelligence --silent --output-dataset

```

## MCP server setup

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

```

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/USvLJU2lRgHra4i7A/builds/8nDRdpKtXYzw7j2TJ/openapi.json
