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

Scrape Google Maps places for any search and location: name, category, address, phone, website, rating, review count, opening hours, coordinates and place ID. Big areas are split into a grid automatically to go past the 120-result limit. Export to JSON, CSV or Excel.

- **URL**: https://apify.com/piotrv1001/google-maps-scraper.md
- **Developed by:** [FalconScrape](https://apify.com/piotrv1001) (community)
- **Categories:** Lead generation, Travel, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 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

### 🚀 Google Maps Scraper

Scrape **Google Maps places for any search term and location**. The **Google Maps Scraper** collects each place's name, categories, full address, coordinates, phone, website, star rating, review count, opening hours, description, amenities, place ID and CID. Large areas are split into a grid of map searches automatically, so you are not stuck at the ~120 results Google Maps shows for one search. Use it for lead lists, local market research, competitor mapping, store locators or enriching your CRM.

### ✨ Features

- 📍 **Full Place Data**: Name, categories, address with street / city / ZIP / state / country, neighborhood, latitude and longitude.
- ☎️ **Contact Details**: Phone (local and international format), website and table-booking link where the place has one.
- ⭐ **Ratings**: Star rating and total review count for every place.
- 🕒 **Opening Hours**: Hours for each day of the week, plus the time zone.
- ♿ **Amenities**: Accessibility, service options, payments and other "About" details as yes/no flags.
- 🆔 **Stable IDs**: Place ID, CID and feature ID, ready for the [Google Maps Reviews Scraper](https://apify.com/piotrv1001/google-maps-reviews-scraper).
- 🗺️ **Goes Past the Result Limit**: A city is searched as a grid of smaller map views until your limit is reached or the area has no more places. Every place is saved once.
- 🏷️ **Unclaimed Businesses**: `claimThisBusiness` is `true` when the owner has not claimed the listing yet.

### 🛠️ How It Works

1. **Enter search terms** – e.g. `restaurants`, `dentist`, `coffee shop`, one per line.
2. **Enter a location** – a city, district or region such as `New York, NY` or `Berlin, Germany`.
3. **Set how many places you want** and run. Places can be downloaded as JSON, CSV or Excel or pulled through the API.

The scraper first searches the whole area, then splits it into smaller and smaller map views wherever Google Maps still has more results. When the area runs out of places before your limit, the run's status message says so.

### ⚙️ Input

| Field            | What it does                                                                                 |
| ---------------- | -------------------------------------------------------------------------------------------- |
| **Search terms** | What to search for on Google Maps, one per line. Default `restaurants`.                      |
| **Location**     | City, district or region to search in. Default `New York, NY`.                               |
| **Max places**   | Stop after this many places in total (all search terms together). Default 50.               |
| **Language**     | Language of categories, opening hours and other texts (`en`, `de`, `es`, `pt-BR`...). Default `en`. |

```json
{
    "searchQueries": ["coffee shop", "bakery"],
    "location": "Austin, TX",
    "maxItems": 500
}
```

### 💰 Pricing

Pay only for the places you get. No monthly rental.

| Event           | Price                                | What you get                              |
| --------------- | ------------------------------------ | ----------------------------------------- |
| **Place**       | $0.002 per place ($2 per 1,000)      | One place with all fields below           |
| **Actor start** | $0.00005 per run                     | Charged once when the run starts.         |

Examples: 1,000 places = $2.00 · 10,000 places = $20.00.

### 📊 Sample Output Data

```json
{
    "searchQuery": "dentist",
    "name": "Tech Ridge Dental",
    "placeId": "ChIJg6Z3MsjORIYRZh2Pk4RntBw",
    "cid": "2068391947978874214",
    "featureId": "0x8644cec83277a683:0x1cb46784938f1d66",
    "kgmid": "/g/1xfsp3vb",
    "url": "https://www.google.com/maps/search/?api=1&query=Tech%20Ridge%20Dental&query_place_id=ChIJg6Z3MsjORIYRZh2Pk4RntBw",
    "category": "Dentist",
    "categories": ["Dentist", "Dental clinic", "Dental hygienist", "Dental implants provider", "Emergency dental service", "Teeth whitening service"],
    "address": "12400 N Interstate Hwy 35 Ste A131, Austin, TX 78753",
    "street": "12400 N Interstate Hwy 35 Ste A131",
    "city": "Austin",
    "postalCode": "78753",
    "state": "Texas",
    "countryCode": "US",
    "neighborhood": "North Austin",
    "lat": 30.4043561,
    "lng": -97.6759803,
    "phone": "(512) 821-2394",
    "phoneInternational": "+15128212394",
    "website": "http://www.techridgedental.com/",
    "rating": 5,
    "reviewsCount": 1187,
    "description": null,
    "openingHours": [
        { "day": "Sunday", "hours": "Closed" },
        { "day": "Monday", "hours": "7:30 AM–4:30 PM" },
        { "day": "Tuesday", "hours": "7:30 AM–4:30 PM" },
        { "day": "Wednesday", "hours": "7:30 AM–4:30 PM" },
        { "day": "Thursday", "hours": "7:30 AM–4:30 PM" },
        { "day": "Friday", "hours": "7:30 AM–4:30 PM" },
        { "day": "Saturday", "hours": "Closed" }
    ],
    "timezone": "America/Chicago",
    "reservationUrl": null,
    "claimThisBusiness": false,
    "additionalInfo": {
        "Accessibility": {
            "Wheelchair accessible entrance": true,
            "Wheelchair accessible parking lot": true,
            "Wheelchair accessible restroom": true
        }
    },
    "scrapedAt": "2026-10-18T10:41:31.355Z"
}
```

### ❓ FAQ

**Do I need a Google account or API key?** No.

**Why do I get more than ~120 places for one search?** The area is covered by many smaller map searches, the same way you would zoom in and pan around Google Maps. Places that show up in several of them are saved and charged once.

**Can the results include places just outside my city?** Yes. The area is the rectangle Google Maps shows for your location, so places near its edges (for example New Jersey for "New York, NY") can appear. Use a district name (e.g. `Brooklyn`) for a tighter area.

**Can I use a ZIP code as the location?** Use a city, district or region name. ZIP codes on their own are not recognized as an area.

**Why are some fields empty?** Not every place lists a phone, website, hours or description on Google Maps; empty fields are `null`.

**I searched several terms with a small limit. Why are all places from the first term?** The limit counts all terms together, and terms are searched at the same time; the one that answers first can fill a small limit.

### 🔗 More Google Maps Actors

- [Google Maps Reviews Scraper](https://apify.com/piotrv1001/google-maps-reviews-scraper): every review of any place with exact date, author, photos and owner response.

# Actor input Schema

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

What to search for on Google Maps, one per line, e.g. restaurants, dentist, coffee shop.

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

City, district, ZIP code or region to search in, e.g. "New York, NY" or "Berlin, Germany". Large areas are covered with a grid of searches automatically.

## `maxItems` (type: `integer`):

Stop after this many places in total (all search terms together).

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

Language of categories, opening hours and other texts, as a code like en, de, es or pt-BR.

## Actor input object example

```json
{
  "searchQueries": [
    "restaurants",
    "coffee shop"
  ],
  "location": "New York, NY",
  "maxItems": 50,
  "language": "en"
}
```

# 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": [
        "restaurants"
    ],
    "location": "New York, NY",
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("piotrv1001/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 = {
    "searchQueries": ["restaurants"],
    "location": "New York, NY",
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("piotrv1001/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 '{
  "searchQueries": [
    "restaurants"
  ],
  "location": "New York, NY",
  "maxItems": 50
}' |
apify call piotrv1001/google-maps-scraper --silent --output-dataset

```

## MCP server setup

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