# Google Maps Scraper – Places, Phones, Emails & Websites (`smoldesk/google-maps-scraper`) Actor

Scrape Google Maps places without login or browser: name, category, address, phone, website, rating, review count, hours and coordinates. Optional emails and social profiles from each business website, filters for leads (no website, min rating) and new-places monitoring.

- **URL**: https://apify.com/smoldesk/google-maps-scraper.md
- **Developed by:** [Smoldesk Studios](https://apify.com/smoldesk) (community)
- **Categories:** Lead generation, AI
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.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.
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 – Places, Phones, Emails & Websites

![Google Maps Scraper: places, phones, websites, emails and social profiles](https://raw.githubusercontent.com/smoldesk/apify-scrapers/main/assets/google-maps/banner.webp)

Scrape **Google Maps places** for any search and location: **name, categories, full address, phone (local and international), website, rating, review count, opening hours, coordinates, place ID** and a Maps link. Turn on **Find emails & social profiles** and the Actor also visits each business website and adds **emails, Facebook, Instagram, LinkedIn, X, TikTok, YouTube and WhatsApp links** and extra phone numbers, **charged only when it finds something**. Built for **lead lists**: filter by rating, review count, phone, category or **businesses without a website**, and schedule it to get **only new places**. No login, no API key, no browser, so runs are fast and cheap.

**Honest note before you start:** this Actor is for places and contacts. Without signing in, Google Maps shows **only the top 5 reviews per place**, so that's all it can add. If you need a place's full review history, use a dedicated reviews scraper.

### What you can use it for

- **Lead generation**: dentists, plumbers, gyms or restaurants in a city, with phone, website and email in one sheet.
- **Web design and SEO agencies**: find local businesses **without a website** or with a low rating.
- **Market research**: how many coffee shops, clinics or car dealers are in each area, and how they're rated.
- **New business alerts**: schedule a search with **Only new places** and get businesses that just appeared on Maps.
- **Data enrichment**: coordinates, opening hours, categories and place IDs for a list of business types.

### How to scrape Google Maps

1. Create a free [Apify account](https://console.apify.com/sign-up) and open this Actor.
2. In **What to search for**, type business types the way you'd search on Google Maps (`dentist`, `coffee shop`, `Starbucks`).
3. In **Where**, add one or more cities, neighborhoods or postcodes. Every term is searched in every location.
4. Set **Max places per search**. Google shows about 120 places per search; switch on **Split big areas** to get more.
5. Optional: switch on **Find emails & social profiles**, set filters (rating, reviews, website, phone, category), or **Top reviews**.
6. Click **Start**. Download the results as CSV, Excel or JSON, or read them through the API.
7. To monitor an area, save the input as a task, switch on **Only new places** and schedule it daily or weekly.

![Step 1: type what and where](https://raw.githubusercontent.com/smoldesk/apify-scrapers/main/assets/google-maps/how-to-1.webp)

![Step 2: click Start](https://raw.githubusercontent.com/smoldesk/apify-scrapers/main/assets/google-maps/how-to-2.webp)

![Step 3: export the lead list](https://raw.githubusercontent.com/smoldesk/apify-scrapers/main/assets/google-maps/how-to-3.webp)

Tips:

- **Neighborhoods beat whole countries.** `dentist in Brooklyn` + `dentist in Queens` finds more than `dentist in New York`. Split big areas does this for you with a 3×3 grid (or 9×9 with 2 levels).
- **Places found by more than one search are saved once** and charged once.
- **Filtered-out places are free.** Only places you get are charged.
- **Only new places** checks the same top places each run (your **Max places per search**, or every place Google lists when it's 0). The first run saves them all as the starting point; later runs save only places that weren't there before.

### Output

One item per place (real record, shortened):

```json
{
  "placeId": "ChIJb5gBC-u0RIYRHkntaUcdJGs",
  "cid": "7720327853776914718",
  "name": "ATX Family Dental",
  "category": "Dentist",
  "categories": ["Dentist", "Cosmetic dentist", "Dental clinic", "Emergency dental service", "Pediatric dentist"],
  "address": "1700 S 1st St, Austin, TX 78704, United States",
  "neighborhood": "Bouldin Creek",
  "street": "1700 S 1st St",
  "city": "Austin, TX, United States",
  "countryCode": "US",
  "latitude": 30.2482229,
  "longitude": -97.7559705,
  "rating": 4.9,
  "reviewsCount": 918,
  "phone": "+1 512-717-3147",
  "phoneInternational": "+1 512-717-3147",
  "website": "https://www.atxfamilydental.com/",
  "domain": "atxfamilydental.com",
  "businessStatus": "OPERATIONAL",
  "openingHours": [{"day": "Monday", "hours": "8 am–5 pm"}, {"day": "Tuesday", "hours": "8 am–5 pm"}],
  "timezone": "America/Chicago",
  "claimedByOwner": true,
  "imageUrl": "https://lh3.googleusercontent.com/…",
  "googleMapsUrl": "https://www.google.com/maps/place/?q=place_id:ChIJb5gBC-u0RIYRHkntaUcdJGs",
  "searchQuery": "dentist in Austin, TX",
  "emails": ["info@atxfamilydental.com"],
  "socialProfiles": {"instagram": ["https://www.instagram.com/atxfamilydental"]},
  "websitePhones": ["(512) 717-3147"],
  "contactsNote": null,
  "topReviews": [
    {
      "author": "Mackenzie Eveland Smith",
      "authorReviewCount": 137,
      "rating": 5,
      "text": "Today I took my toddler for her first dentist appt and honestly was dreading it but it turned out to be the best experience…",
      "publishedAgo": "Edited 2 months ago",
      "publishedAt": "2026-08-11T17:28:11.679612+00:00"
    }
  ],
  "scrapedAt": "2026-11-06T20:28:03.732083+00:00"
}
```

`emails`, `socialProfiles`, `websitePhones` and `contactsNote` appear when **Find emails & social profiles** is on; `contactsNote` says why nothing was found (`no website`, `website answered HTTP 403`, `website is a social profile`). `topReviews` appears when **Top reviews** is on. The dataset has three views: **Places**, **Leads (contacts)** and **Top reviews**.

### Input examples

Dentists in two cities with emails, only well-rated ones:

```json
{
  "searchTerms": ["dentist"],
  "locations": ["Austin, TX", "Dallas, TX"],
  "maxPlacesPerSearch": 100,
  "scrapeContacts": true,
  "minRating": 4
}
```

Restaurants without a website, whole city (split into smaller areas):

```json
{
  "searchTerms": ["restaurant"],
  "locations": ["Manchester, UK"],
  "maxPlacesPerSearch": 0,
  "splitArea": true,
  "website": "withoutWebsite",
  "requirePhone": true
}
```

A search URL copied from Google Maps (the map area in the URL is used):

```json
{
  "searchUrls": ["https://www.google.com/maps/search/pizza/@40.7306,-73.9866,14z"],
  "maxPlacesPerSearch": 60
}
```

### Pricing

Pay per result, with a lower price on bigger Apify plans. Filtered-out, duplicate and already-seen places are free.

| Event | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| Place | $2.00 / 1,000 | $1.50 / 1,000 | $1.20 / 1,000 | $1.00 / 1,000 |
| Contact details found (only when an email or social profile is found) | $2.00 / 1,000 | $1.50 / 1,000 | $1.20 / 1,000 | $1.00 / 1,000 |
| Top review (up to 5 per place) | $0.40 / 1,000 | $0.30 / 1,000 | $0.25 / 1,000 | $0.20 / 1,000 |
| Actor start | $0.00005 | $0.00005 | $0.00005 | $0.00005 |

Examples on the Free plan: **1,000 places = $2.00**. 1,000 places with contacts, where about half the websites give an email or social profile (what we measured for restaurants in Austin) = $2.00 + $1.00 = **$3.00**. Add 5 top reviews each = +$2.00.

Proxy and compute are included. Set **Maximum cost per run** in the run options and the Actor stops before going over it.

### Use with AI agents (Claude, ChatGPT, Cursor, MCP)

Add the Actor as a tool through the Apify MCP server: `https://mcp.apify.com?tools=smoldesk/google-maps-scraper`. In Claude Desktop, Claude Code, Cursor or VS Code, add this to your MCP config (you sign in to Apify in the browser on first use, or put your API token in a `headers` → `Authorization: Bearer <APIFY_TOKEN>` field instead):

```json
{
  "mcpServers": {
    "google-maps": {
      "url": "https://mcp.apify.com?tools=smoldesk/google-maps-scraper"
    }
  }
}
```

Or let the Apify CLI write it for you: `apify mcp install cursor --tools smoldesk/google-maps-scraper` (also `claude-code`, `vscode`, `codex`). Then paste this into your agent's system prompt or tool notes:

```text
Tool: smoldesk/google-maps-scraper (Google Maps Scraper, Apify)
Use it when: the user wants local businesses from Google Maps for a search and place (e.g. "dentists in Austin"): name, category, address, phone, website, rating, review count, opening hours, coordinates, and optionally emails and social profiles from their websites. Good for lead lists, "businesses without a website", market counts and new-business monitoring. No login needed.
Don't use it when: the user needs a place's full review history (only the top 5 reviews are available), popular times, or data behind a Google sign-in.
How to call: run the Actor with JSON input and read the dataset items. Results cost money per item, so keep maxPlacesPerSearch small unless the user asks for more.
Example input: {"searchTerms": ["dentist"], "locations": ["Austin, TX"], "maxPlacesPerSearch": 20, "scrapeContacts": true}
```

Questions an agent can answer with it:

- Find 50 plumbers in Leeds with a phone number and an email.
- Which restaurants in Shoreditch have no website?
- How many gyms in Kuala Lumpur are rated 4.5 or higher?

### Use with AI (LangChain / LlamaIndex / CrewAI)

With LangChain (`pip install langchain-apify`):

```python
from langchain_apify import ApifyWrapper
from langchain_core.documents import Document

apify = ApifyWrapper()  # reads APIFY_API_TOKEN
loader = apify.call_actor(
    actor_id="smoldesk/google-maps-scraper",
    run_input={"searchTerms": ["coworking space"], "locations": ["Lisbon"], "maxPlacesPerSearch": 40},
    dataset_mapping_function=lambda v: Document(
        page_content=f"{v['name']} — {v.get('category')}, {v.get('address')}. Rated {v.get('rating')} "
                     f"({v.get('reviewsCount')} reviews). Phone {v.get('phone')}. Website {v.get('website')}.",
        metadata={k: v.get(k) for k in ("placeId", "latitude", "longitude", "googleMapsUrl")},
    ),
)
docs = loader.load()
```

Already have a run? Use `ApifyDatasetLoader(dataset_id="<run's dataset ID>", dataset_mapping_function=...)`. **LlamaIndex**: `ApifyActor` from `llama-index-readers-apify`. **CrewAI**: use the Apify MCP server above.

### Limitations

- **Reviews: top 5 per place only.** Google Maps shows the full review list only to signed-in users, and this Actor doesn't sign in. For a place's full review history, use a dedicated reviews scraper.
- **About 120 places per search.** That's Google's own limit. Use more specific locations or **Split big areas** to go past it.
- **Emails come from the business's own website** (homepage plus up to 2 contact/about pages). Businesses that list no email there, block bots (some answer HTTP 403) or show the email only as an image have none. In our Austin restaurant test, about half the websites gave an email or social profile. Emails are not verified.
- **Not included**: popular times, menus, photos beyond the main image, Q\&A, owner replies, review history.
- `businessStatus` relies on Google's "Permanently closed" / "Temporarily closed" labels. Places Google hasn't marked yet show as `OPERATIONAL`.

### FAQ

**Is there a Google Maps API?** Yes, Google's Places API, which needs a billing account and charges per request. This Actor reads the public Google Maps pages instead, so you pay only per place.

**How do I get more than 120 results from Google Maps?** Split the search into smaller areas: list neighborhoods or postcodes in **Where**, or switch on **Split big areas** (3×3 grid; 2 levels = up to 81 areas).

**Can I find businesses without a website?** Yes: set **Website filter** to *Only places WITHOUT a website*, and **Only places with a phone number** if you want to call them.

**How are emails found?** The Actor opens the website listed on Maps, reads the homepage and up to 2 contact/about pages, and collects `mailto:` links, emails in the text, social profile links and `tel:` links. Already have a list of websites? [Contact Details Scraper](https://apify.com/smoldesk/contact-details-scraper) reads up to 10 pages per site, checks each email's domain and accepts a Google Maps Scraper dataset as input.

**Do I need a login, cookies or proxies?** No. It uses no Google account. It runs from Apify's servers and switches to Apify datacenter proxy on its own if Google slows it down. Residential proxies are never used.

**Is it legal to scrape Google Maps?** Business listings are public information shown without a login. You are responsible for how you use the data, especially for contacting people (GDPR, CAN-SPAM and similar rules). This Actor is not affiliated with Google.

### Feedback

Found a bug or missing a field? Open an issue in the **Issues** tab. If the Actor saved you time, a short review on this page helps other people find it.

Code examples and a quick reference are also on GitHub: [smoldesk/google-maps-scraper](https://github.com/smoldesk/google-maps-scraper).

### More Actors from Smoldesk Studios

- [Contact Details Scraper](https://apify.com/smoldesk/contact-details-scraper): emails, phone numbers, social profiles and contact forms from any list of websites, with email domains checked and junk removed, charged only when contacts are found
- [Career Site Jobs Scraper](https://apify.com/smoldesk/career-site-jobs-scraper): live jobs from 12,000+ company career sites (Greenhouse, Lever, Workday, Ashby) with salary and seniority
- [Shopify Store Analyzer](https://apify.com/smoldesk/shopify-store-analyzer): apps, contacts and products of any Shopify store
- [Google Ads Transparency Scraper](https://apify.com/smoldesk/google-ads-transparency-scraper): every ad a competitor runs on Google Search, YouTube and Shopping — creatives, landing pages, countries, EU impressions and new-ad alerts
- [Google Hotels Scraper](https://apify.com/smoldesk/google-hotels-scraper): hotel prices for your dates in any currency, ratings, review aspects and booking-site prices, worldwide
- [Google Hotels Price Calendar](https://apify.com/smoldesk/google-hotel-price-calendar): the cheapest nightly rate for every check-in date up to a year ahead, for any hotel, with taxes and booking-site prices
- [Google Trends Scraper](https://apify.com/smoldesk/google-trends-scraper): interest over time, by region and city, related queries and Trending now — no API key
- [YouTube Scraper](https://apify.com/smoldesk/youtube-scraper): videos, Shorts, channels and comments from search, channels and playlists — exact views, likes, publish dates and durations, no API key
- [YouTube Comments Scraper](https://apify.com/smoldesk/youtube-comments-scraper): comments and replies from videos, channels, playlists or keyword searches, with likes, pinned/hearted flags and authors
- [YouTube Channel Scraper](https://apify.com/smoldesk/youtube-channel-scraper): subscribers, exact total views, join date, country and social links of any channel, plus its latest videos
- [Tennis Scraper](https://apify.com/smoldesk/tennis-scraper): results, fixtures and betting odds for ATP, WTA, Challenger and ITF, with H2H and rankings
- [SEEK, JobStreet & JobsDB Scraper](https://apify.com/smoldesk/seek-jobs-scraper): jobs and salaries across Australia and Southeast Asia
- [Telegram Channel Scraper](https://apify.com/smoldesk/telegram-channel-scraper): public channel posts, views, reactions and subscribers
- [Substack Scraper](https://apify.com/smoldesk/substack-scraper): newsletters, subscriber counts and posts
- [Weibo Scraper](https://apify.com/smoldesk/weibo-scraper): keyword and hashtag search, posts, comments, profiles and the hot-search board from China's biggest microblog, no login
- [WeChat Articles Scraper](https://apify.com/smoldesk/wechat-articles-scraper): WeChat Official Account (公众号) articles from keyword search, full text as Markdown, images, account IDs and publish dates, no login
- [Toutiao Scraper](https://apify.com/smoldesk/toutiao-scraper): Toutiao (今日头条) news search with date ranges, reads and likes, comments and the hot board (热榜), no login
- [Bilibili Scraper](https://apify.com/smoldesk/bilibili-scraper): videos, stats, danmaku, comments and creators from China's video site, no login

# Actor input Schema

## `searchTerms` (type: `array`):

Business types or names, as you'd type them into Google Maps (e.g. 'dentist', 'coffee shop', 'Starbucks'). Each term is searched in each location.

## `locations` (type: `array`):

Cities, neighborhoods, postcodes or countries (e.g. 'Austin, TX', 'Shoreditch London', '10001'). Leave empty if your search terms already include a place.

## `searchUrls` (type: `array`):

Paste search URLs copied from Google Maps, e.g. https://www.google.com/maps/search/pizza/@40.73,-73.99,14z — the map area in the URL is used.

## `maxPlacesPerSearch` (type: `integer`):

Places to save for each search (term × location). Google lists about 120 per search; turn on 'Split big areas' to go past that. 0 = as many as Google gives.

## `maxPlaces` (type: `integer`):

Stop after this many places across all searches. 0 = no limit.

## `splitArea` (type: `boolean`):

When a search is full (Google shows ~120 places max), search a 3×3 grid of smaller areas inside it. More places, more requests.

## `splitDepth` (type: `integer`):

1 = up to 9 smaller areas per search, 2 = split again (up to 81) for whole cities or countries.

## `scrapeContacts` (type: `boolean`):

Visit each business website (homepage + up to 2 contact/about pages) for emails, social profiles (Facebook, Instagram, LinkedIn, X, TikTok, YouTube, WhatsApp) and extra phone numbers. Charged only when something is found.

## `maxContactPages` (type: `integer`):

Pages per website when finding contacts (homepage first, then contact/about pages).

## `topReviews` (type: `boolean`):

Add the top reviews Google shows without signing in (up to 5 per place). Full review history needs a Google login, which this Actor doesn't use.

## `website` (type: `string`):

'Without a website' is handy for finding businesses that need one.

## `minRating` (type: `number`):

Skip places rated below this (0 = no filter). Places with no rating are skipped when this is set.

## `minReviews` (type: `integer`):

Skip places with fewer reviews (0 = no filter).

## `requirePhone` (type: `boolean`):

Skip places that list no phone number.

## `categoryFilter` (type: `array`):

Keep only places whose Google category contains one of these words, e.g. 'dentist' keeps 'Dentist' and 'Cosmetic dentist'. Case-insensitive. Empty = all categories.

## `skipClosed` (type: `boolean`):

Skip places Google marks as permanently or temporarily closed.

## `onlyNewPlaces` (type: `boolean`):

Remember places from earlier runs with the same searches and filters, and save only places not seen before. Schedule the Actor to get newly listed businesses.

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

Language code for names, categories and hours (e.g. en, de, fr, es, ms, ja).

## `countryCode` (type: `string`):

Two-letter country code to bias results (e.g. us, gb, de). Usually not needed when the location is in the search.

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

Not needed: the Actor uses the run's IP and switches to Apify datacenter proxy by itself if Google slows it down. Residential proxy is not used.

## Actor input object example

```json
{
  "searchTerms": [
    "coffee shop"
  ],
  "locations": [
    "Kuala Lumpur"
  ],
  "maxPlacesPerSearch": 20,
  "maxPlaces": 0,
  "splitArea": false,
  "splitDepth": 1,
  "scrapeContacts": false,
  "maxContactPages": 3,
  "topReviews": false,
  "website": "any",
  "minRating": 0,
  "minReviews": 0,
  "requirePhone": false,
  "skipClosed": true,
  "onlyNewPlaces": false,
  "language": "en"
}
```

# Actor output Schema

## `places` (type: `string`):

One row per place: name, category, rating, phone, website, address.

## `leads` (type: `string`):

Phones, emails and social profiles per place (emails/socials when 'Find emails & social profiles' is on).

## `reviews` (type: `string`):

Up to 5 top reviews per place (when 'Top reviews' is on).

# 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 = {
    "searchTerms": [
        "coffee shop"
    ],
    "locations": [
        "Kuala Lumpur"
    ],
    "maxPlacesPerSearch": 20,
    "language": "en"
};

// Run the Actor and wait for it to finish
const run = await client.actor("smoldesk/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 = {
    "searchTerms": ["coffee shop"],
    "locations": ["Kuala Lumpur"],
    "maxPlacesPerSearch": 20,
    "language": "en",
}

# Run the Actor and wait for it to finish
run = client.actor("smoldesk/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 '{
  "searchTerms": [
    "coffee shop"
  ],
  "locations": [
    "Kuala Lumpur"
  ],
  "maxPlacesPerSearch": 20,
  "language": "en"
}' |
apify call smoldesk/google-maps-scraper --silent --output-dataset

```

## MCP server setup

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