# Google Maps Business Search Scraper (`captainhandsome/google-maps-business-search`) Actor

Search Google Maps and export normalized business name, category, address, phone, website, rating, review count, opening hours, plus code, coordinates, and place URL.

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

## Pricing

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

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 & Leads Extractor

Scrape Google Maps businesses by keyword and location into clean, CSV-ready records. Get separate address, phone, website, rating, review count, category, opening-hours, Plus Code, and coordinate fields instead of a concatenated details blob. No Google API key is required.

### What data can I extract?

- Business name and primary category
- Separate street address and formatted/dialable phone fields
- Business website and canonical Google Maps place URL
- Numeric rating and review count
- Today's displayed opening hours
- Plus Code, latitude, and longitude when available
- Source search URL and Google place identifier when exposed

### Input example

```json
{
  "search_query": "commercial electricians",
  "location": "Dallas, Texas",
  "max_items": 25,
  "include_details": true
}
```

Use `search_queries` for a batch of up to 25 terms. `max_items` is a hard run-wide output ceiling so humans and agents can bound cost before calling the Actor.

### Output example

```json
{
  "name": "Example Electric Company",
  "place_url": "https://www.google.com/maps/place/...",
  "place_id": "ChIJ...",
  "category": "Electrician",
  "address": "123 Main St, Dallas, TX 75201",
  "phone": "+1 214-555-0199",
  "phone_unformatted": "+12145550199",
  "website": "https://example.com",
  "rating": 4.7,
  "reviews_count": 480,
  "opening_hours_today": "Open until 6 PM",
  "plus_code": "Q5X4+9C Dallas",
  "latitude": 32.7767,
  "longitude": -96.797,
  "search_url": "https://www.google.com/maps/search/commercial+electricians+Dallas"
}
```

Output is available from the default Apify dataset as JSON, CSV, Excel, XML, or RSS.

### Common use cases

- Build local-business lead lists with phone numbers and websites
- Find service providers, branches, stores, restaurants, or competitors by city
- Compare ratings and review counts across local markets
- Enrich CRM records with public business contact and location data
- Supply structured local-business context to AI agents

### Use with AI agents and MCP

Apify's MCP server can discover and call this Actor. Give the agent a bounded intent, for example:

> Find 50 HVAC companies in Phoenix and return business name, address, phone, website, rating, and review count.

Equivalent input:

```json
{
  "search_query": "HVAC companies",
  "location": "Phoenix, Arizona",
  "max_items": 50,
  "include_details": true
}
```

### Pricing and cost control

The suggested launch price is **$0.004 per result**. At that rate, output charges are approximately $0.40 for 100 businesses, $4.00 for 1,000, or $40.00 for 10,000, plus any platform charges displayed by Apify. The live Store pricing is authoritative. Set `max_items` to cap billable output.

### Reliability

The Actor scrolls result feeds, deduplicates places, and enriches individual place pages. Search-result selectors are monitored by the fleet's contract canaries and self-healing workflow. Required output fields are validated before repaired selectors are promoted.

### Limitations and responsible use

- Public Google Maps data only; some profiles omit phone, website, hours, or coordinates.
- Search results vary by query, geography, language, and upstream personalization.
- A displayed field may change or disappear when the source profile changes.
- Comply with applicable law, Google terms, privacy obligations, and outreach rules.

### Integrate with No-Code, Webhooks & Spreadsheets

- **Google Sheets & Excel:** In Apify Console under the Actor's **Dataset** tab, click **Export**, select **CSV**, and paste the permanent API URL into `=IMPORTDATA("https://api.apify.com/v2/datasets/DATASET_ID/items?format=csv")` for auto-refreshing lead lists.
- **Zapier & Make:** Connect your Apify account to Zapier or Make. Use the "Actor run finished" trigger to automatically post leads into HubSpot, Salesforce, Airtable, or your CRM.
- **Webhooks:** Under the Actor's **Integrations** tab, attach a webhook targeting your custom endpoint or Slack channel whenever a run completes.
- **Python / Node.js:** Query leads directly into pandas DataFrames or backend services using the official `apify-client` SDK in under 5 lines of code.

### Related data tools and workflows

- **Tech Stack Detector (`captainhandsome/tech-stack-detector`):** Inspect websites extracted from Google Maps to identify which CMS, CRM, e-commerce, or analytics tools each business uses.
- **US Business Entity Search (`captainhandsome/us-business-entity-search`):** Verify official state corporate registrations, legal names, and good standing for extracted businesses.
- **US Contractor License Search (`captainhandsome/us-contractor-license-search`):** Cross-reference contractor licenses, classifications, and insurance status for trade leads.

### FAQ

#### How do I scrape phone numbers from Google Maps?

Set `include_details` to `true`. The Actor opens each public place page and returns `phone` and `phone_unformatted` separately when available.

#### Can I export Google Maps businesses to CSV?

Yes. Run the Actor, open its default dataset, and choose CSV or Excel export.

#### Can I search several business categories in one run?

Yes. Supply `search_queries` and a single location. Results are deduplicated and constrained by the run-wide `max_items` ceiling.

#### Does this use the Google Places API?

No Google API key is required. The Actor extracts publicly displayed Google Maps data.

See [CHANGELOG.md](CHANGELOG.md) for maintained schema changes.

# Actor input Schema

## `search_query` (type: `string`):

Business category, service, product, or business name to find.

## `search_queries` (type: `array`):

Optional list of business queries. When supplied, these are run instead of search\_query.

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

City, state, postal code, region, or country in which to search.

## `max_items` (type: `integer`):

Hard maximum number of unique business records returned and billed across all queries.

## `include_details` (type: `boolean`):

Open each business page to extract address, phone, website, hours, review count, plus code, and coordinates.

## Actor input object example

```json
{
  "search_query": "commercial electricians",
  "location": "Dallas, Texas",
  "max_items": 25,
  "include_details": true
}
```

# Actor output Schema

## `results` (type: `string`):

Extracted records, one object per row on the source page.

# 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 = {
    "search_query": "commercial electricians",
    "location": "Dallas, Texas"
};

// Run the Actor and wait for it to finish
const run = await client.actor("captainhandsome/google-maps-business-search").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 = {
    "search_query": "commercial electricians",
    "location": "Dallas, Texas",
}

# Run the Actor and wait for it to finish
run = client.actor("captainhandsome/google-maps-business-search").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 '{
  "search_query": "commercial electricians",
  "location": "Dallas, Texas"
}' |
apify call captainhandsome/google-maps-business-search --silent --output-dataset

```

## MCP server setup

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

```

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/TC0kItzB0YS9OXnFs/builds/EQQGqzdasuxrmYy5I/openapi.json
