# Google Maps Scraper: Places, Phones, Hours & Websites (`sandy_yclept/google-maps-scraper`) Actor

Cheap Google Maps scraper: business places with name, address, phone (E.164), website, rating, review count, categories, opening hours and coordinates, from any search term and city. Reads Google Maps itself. $1 per 1,000 places, closed places free. No review texts or images.

- **URL**: https://apify.com/sandy_yclept/google-maps-scraper.md
- **Developed by:** [Rafal Sav](https://apify.com/sandy_yclept) (community)
- **Categories:** Lead generation, Automation, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 scraped places

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

### What does Google Maps Scraper do?

**Google Maps Scraper** turns any Google Maps search into a list of businesses: name, category, address, **phone in international format**, website, rating, number of reviews, **opening hours**, coordinates and Google's own one-line description - one row per place, from any search term and city, in any language Google Maps speaks.

It reads Google Maps itself, so it is **cheap: $1 per 1,000 places** on the Free and Starter plans, where the most used Google Maps scraper charges $4 and $3. **Permanently closed places are returned free.** No API key, no Google account.

Run it from the Apify Console, through the API, on a schedule, or from an AI agent through Apify's MCP server.

### Why use it?

- **Lead lists of local businesses**: every dentist, plumber or coffee shop in a city, with a phone to call and a website to visit.
- **Market research**: how many businesses of a kind a city has, how they are rated, when they open.
- **Data for maps and apps**: coordinates, opening hours, categories and Google place IDs.
- **Cheap at scale**: 10,000 places cost $10, with nothing billed on top.

### How to use it

1. Open the **Input** tab and type what you would search on Google Maps: "dentist", "coffee shop", "Steuerberater" - one term per line.
2. Type the **location**: a city and country work best ("Austin, TX, USA").
3. Set **Places per search term**, and click **Start**.
4. Download the results as JSON, CSV, Excel or HTML from the **Output** tab.

### Input

| Field | What it does |
|---|---|
| Search terms | What you would type into Google Maps. Every term is searched in the location. |
| Location | A city and country, as free text. One per run. |
| Places per search term | How many places to take for each term. One term gives up to about 1,000 places in a big city, its suburbs included. For more, add terms or run each district apart. |
| Language | The language of names, categories, addresses and hours. |
| Proxy | Apify Proxy by default, included in the price. |

### Output

Mozart's Coffee Roasters, from the prefill's search "coffee shop" in Austin, as read on October 10, 2026 (its week of hours shortened to two days):

```json
{
  "name": "Mozart's Coffee Roasters",
  "category": "Coffee shop",
  "categories": ["Coffee shop", "Bakery", "Cafe", "Event venue", "Tourist attraction"],
  "address": "3825 Lake Austin Blvd, Austin, TX 78703",
  "street": "3825 Lake Austin Blvd",
  "city": "Austin",
  "postal_code": "78703",
  "state": "Texas",
  "country_code": "US",
  "phone": "+15124772900",
  "website": "https://mozartscoffee.com/",
  "rating": 4.5,
  "reviews_count": 10956,
  "opening_hours": [
    {"day": "Saturday", "hours": "7 AM–12 AM"},
    {"day": "Sunday", "hours": "7 AM–12 AM"}
  ],
  "open_status": "Open · Closes 12 AM",
  "description": "Lakeside coffee & desserts",
  "permanently_closed": false,
  "location": {"lat": 30.2954696, "lng": -97.7839512},
  "place_id": "ChIJTWZhRFW1RIYRrdGa7DPzT7w",
  "google_maps_url": "https://www.google.com/maps/place/?q=place_id:ChIJTWZhRFW1RIYRrdGa7DPzT7w",
  "search_string": "coffee shop in Austin, TX, USA",
  "rank": 2,
  "billed": true
}
```

| Field | Meaning |
|---|---|
| `phone` | The phone Google Maps shows, in E.164 (`+13125550100`) where it parses. |
| `website` | The website the business lists, without Google's tracking parameters. |
| `rating`, `reviews_count` | The star rating, and the number of reviews where Google's search results give it. |
| `opening_hours` | Day by day, as Google Maps shows them. |
| `permanently_closed` | True for a business Google marks as permanently closed - returned, never billed. |
| `location` | Latitude and longitude. |
| `search_string`, `rank` | The search that found the place, and its position in the results. |

### How complete is it?

Measured on October 10, 2026: 11 searches in seven countries (restaurants in London, dentists in New York, garages in Berlin, hotels in Madrid, bakeries in Mexico City...), 1,926 places in 4 minutes, not one request refused.

| Field | Places with it |
|---|---|
| Coordinates | 1,926 (100%) |
| Rating | 1,833 (95%) |
| Postcode | 1,823 (95%) |
| Phone, in E.164 | 1,816 (94%) |
| Website | 1,676 (87%) |
| Number of reviews | 1,629 (85%) |
| Opening hours | 1,629 (85%), the full week for 1,467 (76%) |

Google answers some pages with today's hours only and no review counts; such a page is asked again up to twice, which brought the full week from 49% to 76% of places and review counts from 56% to 85%. One search for "restaurant" in London gave 1,000 places, all in Greater London, in 3 minutes.

On the 15 searches of an earlier test in six countries (300 places, October 9), 285 places were in the country searched; the most used Google Maps contact scraper, on the same searches, put 213 of its 300 there.

What it does not return: review texts, photos, popular times, and emails. For each business's email from its own website, use [Google Maps Email Extractor](https://apify.com/sandy_yclept/google-maps-email-extractor).

### How much does it cost?

**$1 per 1,000 places** on the Free and Starter plans, $0.90 on Scale, $0.80 from Business up, plus Apify's start fee of $0.00005 a run. Permanently closed places cost nothing. A search Google refuses costs nothing, and the run says so.

### FAQ

**Is it legal to scrape Google Maps?** It reads public business listings, as a visitor would. You are responsible for how you use the data under the GDPR and local law, and for Google's Terms of Service.

**Why fewer places than I asked for?** Google lists up to about 200 places for one search; the Actor then asks the city in pieces, its suburbs included, up to about 1,000. Small towns simply have fewer businesses of a kind.

**Why the wrong Berlin?** A name several places share is read by Google: "car repair in Berlin" gives a few garages in Berlin, Maryland too. Give the country in the location: "Berlin, Germany".

**Why no review count or only today's hours for some places?** Google's search results leave them out for some places, and the Actor asks a page again when Google answered it in its short form - up to twice. Languages other than English get the short form more often.

### Related Actors

- [Google Maps Email Extractor](https://apify.com/sandy_yclept/google-maps-email-extractor) - the same places, each with the email from its own website.
- [Google Maps Phone Number Scraper](https://apify.com/sandy_yclept/google-maps-phone-number-scraper) - only the places with a phone, priced per phone number.
- [No Website Leads](https://apify.com/sandy_yclept/no-website-leads) - the businesses on Google Maps without a real website.
- [Website Contact & Email Scraper](https://apify.com/sandy_yclept/website-contact-email-scraper) - emails, phones and social profiles from any list of websites.

### Support

A place that is wrong or missing? Open an issue on the **Issues** tab with the search term and location.

# Actor input Schema

## `searchStringsArray` (type: `array`):

What you would type into Google Maps, one term per line: "dentist", "coffee shop", "Steuerberater". Every term is searched in the location below. This Actor reads Google Maps itself: no other scraper runs on your account and nothing is billed per search.

## `locationQuery` (type: `string`):

Where to search, as free text: a city and country work best ("Austin, TX, USA", "Köln, Deutschland"). One location per run. Leave it empty when the search terms already say where.

## `maxCrawledPlacesPerSearch` (type: `integer`):

How many places to take for each search term, $1 per 1,000 on the Free and Starter plans. One term gives up to about 1,000 places in a big city, its suburbs included; for more, add terms ("dentist", "dental clinic") or run each district apart.

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

Language of the place names, categories, addresses and opening hours Google Maps returns. The number of reviews is given for English results; in other languages Google often leaves it out.

## `proxyConfiguration` (type: `object`):

Google Maps is read through Apify Proxy by default, which is included. Set your own proxies here only if you want the searches to go through them.

## Actor input object example

```json
{
  "searchStringsArray": [
    "dentist",
    "orthodontist"
  ],
  "locationQuery": "Chicago, USA",
  "maxCrawledPlacesPerSearch": 20,
  "language": "en",
  "proxyConfiguration": {
    "useApifyProxy": 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 = {
    "searchStringsArray": [
        "coffee shop"
    ],
    "locationQuery": "Austin, TX, USA",
    "maxCrawledPlacesPerSearch": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("sandy_yclept/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 = {
    "searchStringsArray": ["coffee shop"],
    "locationQuery": "Austin, TX, USA",
    "maxCrawledPlacesPerSearch": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("sandy_yclept/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 '{
  "searchStringsArray": [
    "coffee shop"
  ],
  "locationQuery": "Austin, TX, USA",
  "maxCrawledPlacesPerSearch": 20
}' |
apify call sandy_yclept/google-maps-scraper --silent --output-dataset

```

## MCP server setup

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