# Cracks Google Maps Business Scraper (`generous_fog/cracks-google-maps-business-scraper`) Actor

Scrape Google Maps businesses and places by keyword, location, URL, or Place ID. Extract phone numbers, websites, emails, social links, ratings, reviews count, opening hours, addresses, Plus Codes, and coordinates. Export local business leads to JSON, CSV, Excel, API, webhooks, or n8n.

- **URL**: https://apify.com/generous\_fog/cracks-google-maps-business-scraper.md
- **Developed by:** [Cracks API](https://apify.com/generous_fog) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.75 / 1,000 scraped 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?

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 Scraper & Lead Extractor

Cracks Google Maps Business Scraper is a fast local business data extractor and lead-generation tool. Search Google Maps by keyword and location, Google Maps URL, or Place ID, then export public business names, categories, addresses, phone numbers, websites, emails, social profiles, ratings, review counts, opening hours, coordinates, Plus Codes, and actionable lead signals.

Use the results in JSON, CSV, Excel, XML, HTML, webhooks, n8n, or through the Apify API. No Google account or cookies are required.

> **Unofficial.** This is an independent, unofficial Actor and is not affiliated with, endorsed by, or sponsored by Google or Google Maps. Google Maps is a trademark of its respective owner.

### What can this Google Maps scraper do?

- Search businesses and places by keyword plus city, region, or country
- Scrape Google Maps search URLs and individual place URLs
- Look up businesses directly from Google Place IDs
- Extract phone numbers, websites, ratings, review counts, opening hours, and coordinates
- Find public emails and social media links from business websites
- Filter by minimum rating, website availability, open status, and category
- Deduplicate places using stable Google Maps identities
- Score local-business opportunities with transparent lead flags
- Export Google Maps business leads to CSV, Excel, JSON, XML, HTML, webhooks, n8n, or API

### Popular use cases

- Local lead generation and sales prospecting
- Google Maps email and phone number extraction
- Agency outreach lists for SEO, web design, ads, and automation services
- Competitor and market research
- Business directory building and CRM enrichment
- Franchise, retail, restaurant, healthcare, and service-business discovery
- No-website and low-review business opportunity research
- Local business monitoring and data workflows

### What data does it extract?

- Business name, Google Place ID, feature ID, CID, and Google Maps URL
- Primary category and all detected categories
- Full address, street, neighborhood, city, state, postal code, and country code
- Latitude, longitude, timezone, and Plus Code
- Rating and reviews count
- Phone number and unformatted phone
- Website and business description
- Weekly opening hours and current open status when available
- Permanent closure status and price level when available
- Representative image URL when available
- Optional public website emails and LinkedIn, Instagram, Facebook, YouTube, and X links
- Search query, location query, rank, scrape timestamp, parse warnings, lead flags, and lead score

### How to use the Google Maps Business Scraper

1. Add one or more business keywords such as **dentist**, **restaurant**, or **digital marketing agency**.
2. Enter a location such as **Jaipur, Rajasthan, India**.
3. Choose the maximum results per query.
4. Optionally filter by rating, website availability, category, or open status.
5. Enable website contact enrichment if you need public emails and social links.
6. Click **Start** and export the dataset in your preferred format.

You can also skip keyword search and provide Google Maps URLs or Google Place IDs directly.

### Input

| Field | Type | Description |
|---|---|---|
| `searchQueries` | string\[] | Business types or keywords to find |
| `location` | string | Required for keyword searches, e.g. Jaipur, Rajasthan, India |
| `startUrls` | URL\[] | Google Maps search or place URLs |
| `placeIds` | string\[] | Google Place IDs |
| `maxResultsPerQuery` | integer | 1-120 results per input, default 20 |
| `language` | string | Result language code, default en |
| `countryCode` | string | Localization country code, default in |
| `minRating` | number | Optional minimum rating filter |
| `websiteFilter` | enum | all, hasWebsite, or noWebsite |
| `openStatusFilter` | enum | all, openNow, closed, or permanentlyClosed |
| `categoryIncludes` | string\[] | Match one or more category terms |
| `enrichWebsiteContacts` | boolean | Inspect public business pages for emails and social links |
| `maxWebsitePages` | integer | Maximum pages per website, 1-5 |
| `includeFullDetails` | boolean | Fetch fuller review counts, weekly hours, address metadata, and Plus Code |
| `includeLeadFlags` | boolean | Add transparent lead flags and opportunity score |
| `deduplicate` | boolean | Deduplicate stable place identities |
| `proxyConfiguration` | object | Apify Proxy configuration |

At least one search query, start URL, or Place ID is required. A location is required when using `searchQueries`.

### Input example

```json
{
  "searchQueries": ["digital marketing agency"],
  "location": "Jaipur, Rajasthan, India",
  "maxResultsPerQuery": 20,
  "language": "en",
  "countryCode": "in",
  "websiteFilter": "all",
  "includeFullDetails": true,
  "deduplicate": true,
  "enrichWebsiteContacts": false,
  "includeLeadFlags": true,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

### Output example

```json
{
  "title": "Example Business",
  "categoryName": "Marketing agency",
  "address": "Jaipur, Rajasthan, India",
  "city": "Jaipur",
  "state": "Rajasthan",
  "countryCode": "IN",
  "phone": "+91 90000 00000",
  "website": "https://example.com/",
  "rating": 4.8,
  "reviewsCount": 189,
  "latitude": 26.9124,
  "longitude": 75.7873,
  "placeId": "ChIJ...",
  "openingHours": [{ "day": "Monday", "hours": "9:00 AM–6:00 PM" }],
  "emails": ["hello@example.com"],
  "socialLinks": { "linkedin": ["https://linkedin.com/company/example"] },
  "leadFlags": ["HAS_WEBSITE_CONTACTS"],
  "leadScore": 25,
  "searchQuery": "digital marketing agency",
  "locationQuery": "Jaipur, Rajasthan, India",
  "rank": 1
}
```

Results are stored in the default dataset and can be exported as JSON, CSV, Excel, XML, or HTML. The dataset includes a **Places overview** view and an **Agency leads** view.

### Website contact and email enrichment

When enabled, the Actor visits the listed public business website and a small number of likely contact or about pages on the same domain. It extracts public email addresses and links to LinkedIn, Instagram, Facebook, YouTube, and X. It does not log in, bypass access controls, or infer private contact data.

### Lead flags

- `NO_WEBSITE`: no public website is listed
- `NO_EMAIL`: website enrichment found no public email
- `NO_PHONE`: no public phone is listed
- `LOW_RATING`: rating is below 4.0
- `LOW_REVIEW_VOLUME`: fewer than 25 reviews
- `PERMANENTLY_CLOSED`: Maps explicitly reports permanent closure
- `CLOSED_NOW`: currently reported closed
- `HAS_WEBSITE_CONTACTS`: enrichment found an email or social link
- `HIGH_VALUE_LOCAL_LEAD`: strong local outreach opportunity based on explicit profile gaps

The score is a transparent opportunity score, not a prediction of revenue or buying intent.

### Pricing behavior

The pay-per-event model charges only for valid, deduplicated places saved to the default dataset. Filtered results, duplicates, and failed parsing are not charged. Website contact enrichment is included in the per-result price with no separate enrichment event fee.

### Frequently asked questions

#### Can I scrape Google Maps by city or country?

Yes. Combine a search query with a city, region, postal area, or country in the location field. A single public search can normally expose up to about 120 results.

#### Can I extract emails from Google Maps?

Google Maps does not consistently list emails. Enable website contact enrichment to inspect the business's public website for published email addresses and social profiles.

#### Can I export results to Excel or CSV?

Yes. Apify datasets can be downloaded as Excel, CSV, JSON, XML, or HTML and connected to webhooks, n8n, Make, Zapier, or custom API workflows.

#### Does the Actor need a Google account?

No Google account, login, or cookies are required.

### Limitations

- Google Maps results can vary by time, language, country, proxy location, and personalization.
- A search query can normally expose up to about 120 results.
- Phone, website, opening hours, Place ID, and images may be absent from public responses.
- Website contact extraction only returns details publicly present on inspected pages.
- Internal Google response formats can change, so parsing is quality-monitored and intentionally conservative.

### Responsible use

Use the data lawfully and respect applicable privacy, marketing, and data-protection rules. Do not use this Actor for harassment, spam, discrimination, or decisions with legal or similarly significant effects.

# Actor input Schema

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

Business types or keywords to search. A location is required when using search queries.

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

City, state, or country for query searches.

## `startUrls` (type: `array`):

Optional Google Maps search or place URLs.

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

Optional Google Place IDs, such as ChIJ...

## `maxResultsPerQuery` (type: `integer`):

Google Maps normally exposes up to about 120 search results per query.

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

Two-letter Google Maps language code.

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

Two-letter country code used to localize results.

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

Only keep places with at least this Google rating.

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

Return all places, only places with a website, or only places without one.

## `openStatusFilter` (type: `string`):

Filter by the currently reported business status.

## `categoryIncludes` (type: `array`):

Keep a place when any category contains one of these terms.

## `deduplicate` (type: `boolean`):

Deduplicate by Place ID, feature ID, CID, or Maps URL.

## `enrichWebsiteContacts` (type: `boolean`):

Visit public business website pages to find emails and social links.

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

Homepage plus likely contact/about pages to inspect per website.

## `includeLeadFlags` (type: `boolean`):

Calculate transparent lead flags and a lead-opportunity score.

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

Apify Proxy is recommended for reliable larger runs.

## `includeFullDetails` (type: `boolean`):

Fetch each place detail payload for fuller review counts, weekly hours, address metadata, description, and Plus Code.

## Actor input object example

```json
{
  "searchQueries": [
    "digital marketing agency"
  ],
  "location": "Jaipur, Rajasthan, India",
  "maxResultsPerQuery": 5,
  "language": "en",
  "countryCode": "in",
  "websiteFilter": "all",
  "openStatusFilter": "all",
  "deduplicate": true,
  "enrichWebsiteContacts": false,
  "maxWebsitePages": 3,
  "includeLeadFlags": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "includeFullDetails": true
}
```

# Actor output Schema

## `results` (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 = {
    "searchQueries": [
        "digital marketing agency"
    ],
    "location": "Jaipur, Rajasthan, India",
    "maxResultsPerQuery": 5,
    "language": "en",
    "countryCode": "in",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("generous_fog/cracks-google-maps-business-scraper").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": ["digital marketing agency"],
    "location": "Jaipur, Rajasthan, India",
    "maxResultsPerQuery": 5,
    "language": "en",
    "countryCode": "in",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("generous_fog/cracks-google-maps-business-scraper").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": [
    "digital marketing agency"
  ],
  "location": "Jaipur, Rajasthan, India",
  "maxResultsPerQuery": 5,
  "language": "en",
  "countryCode": "in",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call generous_fog/cracks-google-maps-business-scraper --silent --output-dataset

```

## MCP server setup

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

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/QQnbP8hue94fJGNVZ/builds/gEDu3CIBrEodg8Dmb/openapi.json
