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

Scrape Google Maps businesses: name, address, phone, website, rating, categories, GPS coordinates, opening hours. Search any query. Pure HTTP, no browser. Fast and cheap at 256MB.

- **URL**: https://apify.com/thirdwatch/google-maps-scraper.md
- **Developed by:** [Thirdwatch](https://apify.com/thirdwatch) (community)
- **Categories:** Lead generation, Travel
- **Stats:** 18 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## 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/platform/actors/running/actors-in-store#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 Scraper

> **Thirdwatch portfolio:** 5K users across 88 public Actors, 2M+ records delivered, and >99% 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`. |

### 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)

### Pricing

Pay-per-result pricing. Tiered discounts apply automatically based on usage volume.

| Tier | Price per result |
|------|------------------|
| FREE | $0.002 |
| BRONZE | $0.0017 |
| SILVER | $0.0013 |
| GOLD | $0.001 |

### 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): Our $0.001-$0.002 tiered pricing is 2-4x cheaper 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) and [TripAdvisor Scraper](https://apify.com/thirdwatch/tripadvisor-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-04

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": 120,
  "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("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=thirdwatch/google-maps-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/uGhArey9Z9zhiQAyT/builds/c87uAnS09lYY6pDvc/openapi.json
