# Google Maps Scraper (`callapi/google-maps-scraper`) Actor

Find businesses on Google Maps by keyword and city. Get name, address, phone, website, rating, categories, coordinates and Plus Code for up to 500 places per search.

- **URL**: https://apify.com/callapi/google-maps-scraper.md
- **Developed by:** [CallAPI](https://apify.com/callapi) (community)
- **Stats:** 1 total users, 1 monthly users, 82.8% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.25 / search term (up to 500 places)

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

### 📍 What Does Google Maps Scraper Do?

**Google Maps Scraper** finds businesses on Google Maps by keyword and city and gives you a clean list you can download as Excel, CSV, JSON or HTML, or send straight to Google Sheets, Make, Zapier or your own app.

Type what you are looking for (for example `dentist`, `plumber` or `coffee shop`), pick a city, and get up to **500 places per search term** for one flat price.

| ✅ You Get | |
|---|---|
| 🏢 Business name and categories | 📞 Phone number in international format |
| 🏠 Full address, plus city, state and country in separate columns | 🌐 Website |
| ⭐ Google rating | 🗺️ Latitude, longitude and Plus Code |
| 🆔 Google Maps data ID | 🔎 The search term that found each place |

No Google account, no API key and no coding needed.

### 🚀 Why Use This Google Maps Scraper?

- 💰 **Flat price per search.** One search term costs the same whether you get 50 or 500 places. No surprises on the bill.
- 🆓 **Empty searches are free.** If a search finds nothing, you pay nothing for it.
- 🏙️ **Whole city coverage.** The actor searches the full city area, not just the first screen of Google Maps, so you get many more places than a manual search shows.
- 🧹 **Clean, ready-to-use data.** International phone numbers, city, state and country in their own columns, and no duplicates.
- 🔤 **Google-style field names.** Fields use the same names as the official Google Places API (`displayName`, `formattedAddress`, `internationalPhoneNumber`, `websiteUri`, `rating`, `types`, `plusCode`), so the data drops straight into tools built for Google data.
- ⚡ **Instant repeat searches.** A search that was already run before for the same city returns in seconds.
- 🧩 **Simple input.** A keyword, a city and a country. That is all.

### 💼 What Can You Use It For?

- 🎯 **Lead generation:** build lists of local businesses with phone numbers and websites for sales outreach.
- 📊 **Market research:** count how many gyms, clinics or restaurants a city has and how well they are rated.
- 🥊 **Competitor analysis:** see every competitor in a city with ratings and locations.
- 📈 **Local SEO and agencies:** find businesses without a website, or with low ratings, as prospects.
- 🗺️ **Maps and data projects:** get coordinates for every place to plot them on a map or join them with your own data.

### 🛠️ How To Use Google Maps Scraper

1. Click **Try for free**.
2. In **Search Terms**, add one or more keywords, one per line (for example `dentist`, `orthodontist`).
3. Enter the **City** and **Country**. Add the **State** if your city name exists in more than one place.
4. Set **Max Results Per Search Term** (up to 500).
5. Click **Start** and wait. Each search term usually takes about a minute.
6. Download your data from the **Output** tab in the format you need. 🎉

### ⌨️ Input

| Field | Required | Description |
|-------|----------|-------------|
| Search Terms | Yes | What to look for, one per line. Each term is a separate search. Up to 20 terms per run. |
| City | Yes | City, town or village name. Areas, suburbs and street names are not accepted. |
| State | No | State or region. Helps pick the right city when two share a name. |
| Country | Yes | Country name or ISO code, for example `United States` or `US`. |
| Max Results Per Search Term | No | 1 to 500. Default 500. |

Example input:

```json
{
    "searchTerms": ["florist", "gift shop"],
    "city": "New York",
    "state": "New York",
    "country": "United States",
    "maxResults": 500
}
```

💡 **Tip:** to cover several cities, run the actor once per city, or create a task for each city and schedule them.

### 📦 Output

Each place is one row. Example:

```json
{
    "data_id": "0x89c25bc9f5f488d5:0x23dc8e9285579363",
    "displayName": "The Fleurista",
    "types": ["Florist", "Flower delivery", "Gift shop", "Wedding service"],
    "formattedAddress": "88 Bergen St, Brooklyn, NY 11201, United States",
    "city": "Brooklyn",
    "state": "NY",
    "country": "United States",
    "internationalPhoneNumber": "+19179091717",
    "websiteUri": "http://shopfleurista.com/",
    "rating": 5,
    "latitude": 40.6863962,
    "longitude": -73.9901308,
    "plusCode": "87G8M2P5+HW",
    "searchTerm": "florist"
}
```

| Field | Description |
|-------|-------------|
| `displayName` | Business name |
| `types` | Categories shown on Google Maps, for example "Dental clinic" |
| `formattedAddress` | Full address |
| `city`, `state`, `country` | Address parts in separate columns |
| `internationalPhoneNumber` | Phone number with country code, or `null` |
| `websiteUri` | Website, or `null` |
| `rating` | Google rating (0 to 5) |
| `latitude`, `longitude` | Coordinates |
| `plusCode` | Google Plus Code |
| `data_id` | Google Maps data ID of the place |
| `searchTerm` | The search term that found this place |

📥 Download the results as **JSON, CSV, Excel, XML, HTML or RSS**, or read them through the Apify API.

### 💵 How Much Does It Cost?

**$0.25 per search term, up to 500 places.** That is as low as **$0.50 per 1,000 places**.

| Search | Places | You Pay |
|--------|--------|---------|
| 1 search term | up to 500 | $0.25 |
| 4 search terms | up to 2,000 | $1.00 |
| 20 search terms | up to 10,000 | $5.00 |

- 🆓 A search term that finds no places is **not charged**.
- 🛑 Set **Maximum cost per run** before you start. The actor stops before any search your limit cannot cover.
- 🎁 New Apify users get free monthly platform credit, enough to try the actor.

### ℹ️ Good To Know

- 🔢 **Up to 500 places per search term.** If a city has fewer matching places, you get fewer. A small town may have only a handful of bakeries.
- 🏙️ **One city per run.** Areas, suburbs and street names are not accepted as the city. Use the city name and filter by address afterwards if needed.
- 🇬🇧 **English results.** Names and categories are returned in English where Google has them.
- 🚫 **Not included:** emails, reviews, photos, opening hours and social media profiles.
- ⏱️ **Speed:** a new search usually takes about a minute per search term. Several terms run one after another.
- 🚦 **Busy times:** when many people search at once, your run waits for a free slot and shows "server busy" in its status, so every search still gets its full results. Waiting is never charged.

### 🔗 Integrations

Connect Google Maps Scraper to almost any tool with Apify integrations: **Google Sheets, Google Drive, Make, Zapier, n8n, Slack, Airbyte, GitHub** and webhooks. For example, add new leads to a Google Sheet every time a run finishes.

### 👩‍💻 Using Google Maps Scraper With The Apify API

Run the actor and get results from your own code with the Apify API. The **API** tab on this page has ready-made examples for JavaScript, Python, cURL and the Apify CLI. You can also use the official [Apify JavaScript client](https://docs.apify.com/api/client/js) or [Python client](https://docs.apify.com/api/client/python).

### ❓ FAQ

#### ⚖️ Is It Legal To Scrape Google Maps?

This actor collects publicly visible business information, such as names, addresses, phone numbers and websites. It does not collect private personal data. Business data is generally fine to collect, but results can still include personal data (for example a sole trader's phone number), which is protected by laws such as GDPR in some countries. Do not use the data for spam, and check with a lawyer if you are unsure about your use case. Read more in Apify's blog post on [the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

#### 🤔 Why Did I Get Fewer Results Than Max Results?

The city simply has fewer places matching your search term on Google Maps, or the search reached its time limit. The price per search term stays the same.

#### 🌍 Can I Search A Whole Country Or A Neighborhood?

Not directly. The actor searches one city at a time. For a country, run it for each city you need. For a neighborhood, search the city and filter the results by address or coordinates.

#### 📍 Why Did My Run Fail With "Location Not Found"?

The city could not be matched in the country you gave. Check the spelling, add the State, or use the nearest larger city.

#### 🔑 Do I Need A Google API Key?

No. Everything is handled for you.

### 💬 Feedback

Found a bug or missing a feature? Open an issue on the **Issues** tab. We read every message.

# Actor input Schema

## `searchTerms` (type: `array`):

What to search for on Google Maps, one per line. For example: dentist, plumber, coffee shop. Each term is a separate search in the city below.

## `city` (type: `string`):

City, town or village name. Areas, suburbs and street names are not accepted.

## `state` (type: `string`):

Optional. State or region. Helps when two cities share the same name.

## `country` (type: `string`):

Country name or ISO code, for example United States or US.

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

Most places to return for each search term (1 to 500). You get fewer when the city has fewer matching places.

## Actor input object example

```json
{
  "searchTerms": [
    "florist"
  ],
  "city": "New York",
  "state": "New York",
  "country": "United States",
  "maxResults": 500
}
```

# Actor output Schema

## `places` (type: `string`):

Every place found, one row per place: name, categories, address, city, state, country, phone, website, rating, coordinates and Plus Code.

# 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 = {
    "searchTerms": [
        "florist"
    ],
    "city": "New York",
    "state": "New York",
    "country": "United States",
    "maxResults": 500
};

// Run the Actor and wait for it to finish
const run = await client.actor("callapi/google-maps-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 = {
    "searchTerms": ["florist"],
    "city": "New York",
    "state": "New York",
    "country": "United States",
    "maxResults": 500,
}

# Run the Actor and wait for it to finish
run = client.actor("callapi/google-maps-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 '{
  "searchTerms": [
    "florist"
  ],
  "city": "New York",
  "state": "New York",
  "country": "United States",
  "maxResults": 500
}' |
apify call callapi/google-maps-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,callapi/google-maps-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/LaAqAV2E2PvePFa2o/builds/fWuGYSSgpxUjvBKqB/openapi.json
