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

Scrape Google Maps at scale — business names, addresses, phones, websites, ratings, reviews, categories, hours, and more. Pure HTTP, no browser. 3x faster than alternatives. Export as JSON, CSV, or Excel. Connect via API, webhooks, Zapier, Make, or as a tool for AI agents like Claude and ChatGPT.

- **URL**: https://apify.com/crustapi/google-maps-scraper.md
- **Developed by:** [CrustAPI](https://apify.com/crustapi) (community)
- **Categories:** Lead generation, Travel, AI
- **Features:** Limited permissions
- **Stats:** 160 total users, 5 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $3.30 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 & Google Maps API: Places, Ratings, Hours

### 🗺️ What is Google Maps Scraper?

Google Maps Scraper pulls business data straight from Google Maps — names, addresses, phone numbers, websites, ratings, reviews, opening hours, and more. No API key. No browser. Just fast, structured data.

#### Why is it so fast?

Most scrapers open a headless browser, wait for JavaScript to render, then scroll through results one by one. This scraper skips all of that. It sends direct HTTP requests to Google's internal endpoints, which means:

- **100 places in under 20 seconds** (3-5x faster than browser-based scrapers)
- **Lower compute costs** — no Chrome instance eating up memory
- **Higher reliability** — no page crashes, no element selectors to break

#### What data do you get?

Every place comes back with 20+ fields, automatically enriched with review counts and descriptions:

| | |
|---|---|
| 🏷️ Business name | 🆔 Google Place ID and CID |
| 🌐 Google Maps URL | 📝 Business description |
| 📍 Full address | 🏠 Street address |
| 🏙️ City and state | 📮 Postal code and country |
| 🗺️ Latitude and longitude | 📞 Phone number (formatted and raw) |
| 🌍 Website URL | 🏪 Primary category |
| 📂 All categories | ⭐ Star rating |
| 💬 Total review count | 🕐 Today's hours |
| 🚫 Permanently closed status | 📅 Scraped timestamp |

### ⬇️ Input

#### Search term(s)

Add one or more search terms — each runs as a separate Google Maps search, and results are combined and deduplicated automatically. Works exactly like the Google Maps search bar:

```
hotel
dentist near me
coworking space
HVAC contractor
Starbucks
```

You can add multiple terms in a single run. For example, searching `hotel` + `motel` + `hostel` in one location gives you all three result sets combined.

#### Location

Type any city, state, country, or street address. We convert it to coordinates automatically — no need to look up lat/lng yourself.

```
New York, USA
Miami, FL
London, UK
Tokyo, Japan
```

Defaults to New York City if left blank.

#### Number of places to extract

Controls how many results you want. Default is **100**. The scraper pages through Google Maps results automatically until it hits your limit.

Google Maps returns ~500 results per search term, so to get larger datasets, add multiple search terms or run separate queries with different locations.

#### Find businesses with no website listed

Choose **No website listed** under **Website listed on Google Maps** to find prospects for web design or local marketing services. Enter an industry and city, then export the matching businesses with the contact details available on their listings.

The choices are **All businesses** (the default), **Website listed**, and **No website listed**. This checks the website field on Google Maps. A missing listing does not prove the business has no website elsewhere.

With a website filter, **Number of places to extract** limits the matching results returned. The Actor checks up to 500 search results per term and may return fewer matches. Skipped listings are not added to the dataset. Apify platform usage still applies while searching.

For runs through the Apify API, set `websiteFilter` to `withoutWebsite`, `withWebsite`, or `all`.

#### Language

Sets the language for place names, addresses, and descriptions. Supports 16 languages: English, Spanish, French, German, Italian, Portuguese, Japanese, Korean, Chinese, Arabic, Russian, Dutch, Polish, Turkish, Thai, and Vietnamese.

### ⬆️ Output

Results land in an Apify dataset that you can browse, filter, and export.

#### Output tabs

Your results are organized into three views:

- **Overview** — Business name, category, address, rating, review count, website, phone, and Google Maps link. The quick-glance view.
- **Contact info** — Phone numbers, website, and full address breakdown (street, city, state, postal code, country). Built for CRM imports.
- **Ratings & Reviews** — Star rating, review count, description, categories, and business status. Great for filtering and prioritization.

#### Export formats

Download your data as **JSON**, **CSV**, **Excel**, **XML**, or **HTML** — or pull it programmatically through the Apify API.

#### Sample output

Here's what a single place looks like in JSON:

```json
{
    "title": "LOS TACOS No.1",
    "placeId": "ChIJ6WooklRYwokR3qd-J59t-k0",
    "cid": "0x89c2585492286ae9:0x4dfa6d9f277ea7de",
    "url": "https://www.google.com/maps/place/?q=place_id:ChIJ6WooklRYwokR3qd-J59t-k0",
    "address": "229 W 43rd St, New York, NY 10036, United States",
    "street": "229 W 43rd St",
    "city": "New York",
    "state": "New York",
    "postalCode": "10036",
    "countryCode": "US",
    "location": {
        "lat": 40.7573214,
        "lng": -73.9876540
    },
    "phone": null,
    "phoneUnformatted": null,
    "website": "http://www.lostacos1.com/",
    "categoryName": "Taco restaurant",
    "categories": [
        "Taco restaurant",
        "Mexican restaurant"
    ],
    "totalScore": 4.8,
    "reviewsCount": 12717,
    "description": "Small pit stop with standing tables serving authentic Mexican street food.",
    "openingHours": [
        {
            "day": "Thursday",
            "hours": ["11 AM–12 AM"]
        }
    ],
    "permanentlyClosed": false,
    "scrapedAt": "2026-04-09T10:25:21.625Z"
}
```

### 🔥 Tips for better results

#### Cast a wide net, then filter

It's better to scrape more places and filter afterward than to run a narrow search and miss results. Google Maps doesn't always return businesses in the order you'd expect — casting a wider net ensures you catch everything.

#### Use specific search terms

`"hotel"` returns hotels. `"boutique hotel"` returns boutique hotels. `"Hilton"` returns Hilton locations. The more specific your query, the more relevant your results.

#### Break large areas into smaller locations

If you're scraping an entire country, don't just search `"USA"`. Google Maps caps results at ~500 per query. Instead, break it into cities: `"New York"`, `"Los Angeles"`, `"Chicago"`, etc. You'll get far more complete coverage.

#### Schedule recurring runs

Use Apify's built-in scheduler for daily, weekly, or monthly scrapes. This is useful for tracking new businesses opening up, monitoring review counts over time, or keeping your lead database fresh.

### 💰 How much does it cost?

Google Maps Scraper costs **$3.90 per 1,000 places** (~$0.004 per place), plus a small Apify platform compute fee.

| Volume | Actor cost | Estimated total |
|---|---|---|
| 100 places (test run) | $0.39 | Under $1 |
| 1,000 places | $3.90 | ~$5 |
| 10,000 places | $39 | ~$45 |
| 100,000 places | $390 | ~$450 |

The Apify Free plan gives you enough credits to scrape several hundred places. Higher subscription tiers get discounted compute rates automatically.

### 🔗 Integrations

Connect Google Maps Scraper to the rest of your stack:

- **Zapier and Make** — trigger workflows when a scrape finishes
- **Google Sheets** — push results directly to a spreadsheet
- **Webhooks** — get notified the moment your data is ready
- **Apify API** — pull results programmatically into any app
- **Slack, Airbyte, GitHub**, and [dozens more](https://docs.apify.com/integrations)

### ❓ FAQ

#### Is it legal to scrape Google Maps?

This scraper only extracts publicly visible business data. No login required, no private data accessed. See Apify's posts on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/) and [ethical scraping](https://blog.apify.com/web-scraping-ethics/).

#### How is this different from other Google Maps scrapers?

Speed and cost. Most scrapers launch a headless browser to scroll through results. This one sends direct HTTP requests — no browser overhead, no waiting for pages to render. Every place also gets automatically enriched with review counts and descriptions via a second request.

#### What's the maximum number of results per run?

Google Maps returns ~500 results per search term. To go beyond that, add multiple search terms in a single run or run separate queries targeting different locations. There's no hard cap on our side — add as many search terms as you need.

#### Can I export data through the API?

Yes. The Apify API gives you RESTful endpoints to trigger runs, check status, and download results programmatically. See the [API docs](https://docs.apify.com/api/v2).

#### Something not working?

Open an issue on the actor's **Issues** tab and we'll look into it.

***

Built by [CrustAPI](https://crustapi.com/google-maps-scraper-api)

***

*This is an independent tool for collecting public Google Maps data. It is not affiliated with, endorsed by, or sponsored by Google. Google and Google Maps are trademarks of Google LLC.*

# Changelog

This Actor's version history is a separate document: https://apify.com/crustapi/google-maps-scraper/changelog.md

# Actor input Schema

## `query` (type: `array`):

Add one or more search terms. Each term runs as a separate Google Maps search — results are combined and deduplicated automatically.

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

City, state, country, or full address. We geocode it automatically so you don't need coordinates.

## `radiusMiles` (type: `integer`):

How far from the location to search. Use 1-5 for a neighborhood, 10-30 for a city, 50-100 for a metro area, or 500+ to cover a whole state/region.

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

How many places to extract for each search term. Google Maps returns up to ~500 per term. Use multiple search terms or locations to go higher. With a website filter, this is the number of matching results. We check up to 500 listings per term, so fewer matches may be returned.

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

Return all businesses, only businesses with a website listed, or only businesses with no website listed. A missing website on Google Maps does not prove the business has no website elsewhere. Filtered searches check up to 500 listings per term.

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

Language for place names, addresses, and descriptions in results.

## `includeStars` (type: `boolean`):

Add the full star distribution for each place — how many reviews are 5-star, 4-star, 3-star, 2-star, and 1-star (they add up to the total review count). This takes one extra request per place, so runs are a bit slower. Leave it off for the fastest scrape.

## Actor input object example

```json
{
  "query": [
    "hotel"
  ],
  "location": "New York, USA",
  "radiusMiles": 30,
  "maxResults": 100,
  "websiteFilter": "all",
  "language": "en",
  "includeStars": false
}
```

# Actor output Schema

## `places` (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 = {
    "query": [
        "hotel"
    ],
    "location": "New York, USA",
    "radiusMiles": 30,
    "maxResults": 100,
    "websiteFilter": "all",
    "language": "en"
};

// Run the Actor and wait for it to finish
const run = await client.actor("crustapi/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 = {
    "query": ["hotel"],
    "location": "New York, USA",
    "radiusMiles": 30,
    "maxResults": 100,
    "websiteFilter": "all",
    "language": "en",
}

# Run the Actor and wait for it to finish
run = client.actor("crustapi/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 '{
  "query": [
    "hotel"
  ],
  "location": "New York, USA",
  "radiusMiles": 30,
  "maxResults": 100,
  "websiteFilter": "all",
  "language": "en"
}' |
apify call crustapi/google-maps-scraper --silent --output-dataset

```

## MCP server setup

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