# Google Maps Scraper - Businesses, Phones, Ratings (`thirdwatch/google-maps-scraper`) Actor

Extract Google Maps business listings by search query and location. Get names, addresses, phone numbers, websites, ratings, categories, coordinates, and available opening hours for lead generation and market research.

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

## Pricing

from $0.0011 / result

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

> **Thirdwatch portfolio:** 8,800+ users across 140+ public Actors, 2M+ records delivered, >95% run success. [Explore all Thirdwatch Actors](https://apify.com/thirdwatch).

> Scrape Google Maps search results — business names, addresses, phone numbers, websites, ratings, categories, GPS coordinates, and opening hours.

### What you get

Business-listing data from Google Maps for any search query in any location — "plumbers in Houston", "dentists in Chicago", "hotels in Paris". Returns structured results with contact info, ratings, categories, GPS coordinates, area/neighborhood, description, and current opening status. Ideal for lead generation, market research, and location intelligence.

Returns **up to 2,000 results per run**. Past ~120 results the actor automatically lays a geographic grid over the search area (geo-grid tiling) so you get deep, city-wide coverage instead of just Google's top page.

### Output fields

| Field | Description |
|-------|-------------|
| `name` | Business name |
| `address` | Full formatted address |
| `phone` | Phone number |
| `website` | Business website URL |
| `rating` | Google rating (1.0-5.0) |
| `reviews_count` | Review count (best-effort; usually null in search results) |
| `category` | Primary business category (e.g., "Plumber") |
| `categories` | All business categories |
| `latitude` | GPS latitude |
| `longitude` | GPS longitude |
| `place_id` | Google Place ID |
| `google_maps_cid` | Google Maps customer ID |
| `plus_code` | Open Location Code (best-effort) |
| `google_maps_url` | Direct link to the Google Maps listing |
| `area` | Neighborhood / area name |
| `description` | Business description (when available) |
| `opening_status` | Current status (e.g., "Open - Closes 8 PM") |
| `opening_hours` | Structured day-by-day schedule (when available) |

### Example output

```json
{
    "name": "Village Plumbing, Air & Electric",
    "address": "10644 W Little York Rd Suite 200, Houston, TX 77041",
    "phone": "(281) 607-5357",
    "website": "https://www.villageplumbing.com/",
    "rating": 4.8,
    "categories": ["Plumber", "Air conditioning contractor", "Electrician"],
    "latitude": 29.8640568,
    "longitude": -95.5618629,
    "place_id": "ChIJIc-2aF_AQIYRJabyrgymSoA",
    "google_maps_url": "https://www.google.com/maps/place/?q=place_id:ChIJIc-2aF_AQIYRJabyrgymSoA",
    "area": "Carverdale",
    "opening_status": "Open - Closes 8 PM"
}
```

### Input parameters

| Parameter | Required | Description |
|-----------|----------|-------------|
| `searchQuery` | Yes | Google Maps search query (e.g., "plumbers in Houston", "dentists in Chicago", "hotels in Paris"). Include a location for best results. |
| `maxResults` | No | Maximum results (1-2000). Default `120`. Above ~120, geo-grid tiling auto-activates for wider coverage. |
| `geoGrid` | No | `auto` (default), `on` (always tile), or `off` (single-query pagination only). |
| `language` | No | Language code (`en`, `es`, `fr`, `de`, `ja`, etc.). Default `en`. |
| `region` | No | Country code to bias results (`us`, `uk`, `in`, `de`, etc.). Default `us`. |
| `debugMode` | No | Enables verbose diagnostic logging for troubleshooting a specific run. Default `false`. |

### Use cases

- **Lead generation**: Build prospect lists of local businesses with phone and website for cold outreach.
- **Market research**: Analyze business density, rating bands, and category mix in any city or neighborhood.
- **Local SEO**: Audit competitor listings and track ratings over time for clients.
- **Data enrichment**: Append addresses, GPS coordinates, and categories to CRM and customer records.
- **Real estate and retail siting**: Map businesses around a property or territory to inform site-selection.
- **Field operations**: Generate contact lists for door-to-door or phone-based outreach campaigns.

### Use cases & recipes

Step-by-step guides on [thirdwatch.dev/blog](https://thirdwatch.dev/blog):

- [Build a Local Business Database with Google Maps (2026)](https://thirdwatch.dev/blog/build-local-business-database-with-google-maps)
- [Find Restaurants by Cuisine and Rating on Google Maps (2026)](https://thirdwatch.dev/blog/find-restaurants-by-cuisine-and-rating)
- [Scrape Business Phone and Website from Google Maps (2026)](https://thirdwatch.dev/blog/scrape-business-phone-and-website-from-google-maps)
- [Scrape Google Maps Businesses for Lead Generation (2026)](https://thirdwatch.dev/blog/scrape-google-maps-businesses-for-lead-gen)

### Limitations

- Review count, price level, and plus code are best-effort — they are usually not present in Google Maps' lightweight search response (only `rating` and categories are reliable). They return `null` when absent.
- Up to 2,000 results per run via automatic geo-grid tiling. A single un-tiled query tops out around 120-150 results (Google's own search depth limit); the grid breaks past this by searching each map tile separately.
- Results depend on Google Maps' own ranking for that query, language, and region.
- Sponsored results are handled as Google Maps presents them.
- Opening hours are returned only when Google Maps itself publishes a structured schedule for the business.

### Compared to alternatives

- **vs. compass/crawler-google-places** (350K users, $0.004/result): This actor costs less per result for the same core fields (name, phone, website, rating, coordinates).
- **vs. Google Places API**: The Places API charges per call, caps responses at 60 results per query, and requires billing setup — this actor returns up to 2,000 results per run with geo-grid coverage and simpler pricing.

Pairs well with [Yelp Business Scraper](https://apify.com/thirdwatch/yelp-business-scraper?fpr=9m2cd6) for full local-business intelligence.

### FAQ

**Can I scrape outside the US?**
Yes. Set `region` to the country code (e.g., `uk`, `in`, `de`, `fr`) and optionally `language` to a matching locale.

**Why isn't review count in the output?**
Review counts are not reliably exposed in Google Maps' search-results response — they mostly appear on individual business pages. This actor is a search-results scraper, so `reviews_count` is best-effort and usually `null`; `rating` and categories are always reliable.

**Can I get more than 120 results?**
Yes. Set `maxResults` up to 2,000 and the actor automatically tiles the search area into a geographic grid, searching each tile separately and de-duplicating. This breaks past Google's ~120-150 single-query depth limit and gives city-wide coverage without you having to split queries manually.

**Does the output include opening hours?**
Yes, when Google Maps publishes a structured schedule for the business. The `opening_hours` field returns a day-by-day array when available, and `opening_status` gives the live "Open / Closes at X" label.

**How fresh is the data?**
Pulled live at run time — as fresh as Google Maps itself.

Last verified: 2026-10

More scrapers at [thirdwatch.dev](https://thirdwatch.dev).

# Actor input Schema

## `searchQuery` (type: `string`):

Google Maps search query (e.g. 'plumbers in Houston', 'dentists in Chicago', 'hotels in Paris'). Include a location for best results.

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

Maximum number of business results to return (up to 2000). Above ~120, geo-grid tiling automatically kicks in to cover the whole area.

## `geoGrid` (type: `string`):

Tile the search area into a grid for dense coverage. 'auto' enables it past ~120 results; 'on' always tiles; 'off' uses single-query pagination only.

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

Language code for results (e.g. 'en', 'es', 'fr', 'de', 'ja'). Defaults to English.

## `region` (type: `string`):

Country code to bias results (e.g. 'us', 'uk', 'in', 'de'). Defaults to US.

## `debugMode` (type: `boolean`):

Log the raw response structure of the first result (for maintenance only).

## Actor input object example

```json
{
  "searchQuery": "restaurants near Times Square",
  "maxResults": 10,
  "geoGrid": "auto",
  "language": "en",
  "region": "us",
  "debugMode": false
}
```

# 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 = {
    "searchQuery": "restaurants near Times Square"
};

// Run the Actor and wait for it to finish
const run = await client.actor("thirdwatch/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 = { "searchQuery": "restaurants near Times Square" }

# Run the Actor and wait for it to finish
run = client.actor("thirdwatch/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 '{
  "searchQuery": "restaurants near Times Square"
}' |
apify call thirdwatch/google-maps-scraper --silent --output-dataset

```

## MCP server setup

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