# Google Maps Scraper: Business Leads with Phones & Emails (`stratumics/google-maps-scraper`) Actor

Get the businesses on Google Maps for any search and area: name, address, phone, website, rating, review count, opening hours, plus emails and social profiles. No 120-place limit.

- **URL**: https://apify.com/stratumics/google-maps-scraper.md
- **Developed by:** [Stratum ICS](https://apify.com/stratumics) (community)
- **Categories:** Lead generation, Travel
- **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

### What does Google Maps Scraper do?

**Google Maps Scraper** extracts business listings from [Google Maps](https://www.google.com/maps) for any search term and location: **name, address, phone number, website, star rating, review count, opening hours, category and Google place ID**. Turn on contact enrichment and it also visits each business website to add **email addresses and social media profiles**, so a single run gives you a lead list you can load into a CRM.

Type what you are looking for ("dentist", "roofing contractor", "coffee shop") and where ("Austin, TX", "Manchester, UK", "Bavaria, Germany"). The scraper covers the whole area, not just the first screen of results, and returns one clean row per place. Use it from the Apify Console, through the **Apify API** as a Google Maps API alternative, or from any AI agent connected to Apify.

### Why use this Google Maps scraper?

- **No 120-place limit.** Google Maps shows a limited number of places per search. This scraper splits dense areas into smaller map views until each one is fully covered, then removes duplicates, so a city search returns hundreds or thousands of places instead of a short list.
- **Cities, counties, states and whole countries.** Write the location the way you would type it into Google Maps. For a country or a state, places across the border are left out, so "Germany" does not bring back Swiss or Austrian businesses.
- **Lead-ready fields.** Phones in international and E.164 format, the website and its domain, claimed or unclaimed listing status, structured opening hours, coordinates, the Google place ID and CID.
- **Emails and social profiles on demand.** With enrichment on, each website's homepage and contact pages are read for emails and Facebook, Instagram, LinkedIn, X, YouTube, TikTok, Pinterest and WhatsApp links. You pay the extra fee only when something is found.
- **Pay only for places you keep.** Places removed by your filters (minimum rating, with or without website, category, closed places) are skipped for free.
- **Fast and light.** Plain HTTP requests and no browser: 1,000 places usually take about a minute.

Typical uses: **lead generation** for agencies and sales teams, building prospect lists by city and category, finding businesses **without a website** or with an **unclaimed Google listing** (ideal prospects for web design and local SEO services), market and competitor research, and keeping a local business directory up to date.

### What data can you extract from Google Maps?

| Field                                                  | Example                                                               |
| ------------------------------------------------------ | --------------------------------------------------------------------- |
| `name`                                                 | Craft of Dentistry                                                    |
| `category`, `categories`                               | Dentist; Dental implants provider; Emergency dental service           |
| `address`                                              | 7002 Menchaca Rd #100, Austin, TX 78745                               |
| `street`, `city`, `state`, `postalCode`, `countryCode` | 7002 Menchaca Rd #100 · Austin · Texas · 78745 · US                   |
| `phone`, `phoneE164`                                   | +1 512-812-8956 · +15128128956                                        |
| `website`, `domain`                                    | https://www.dentistsouthaustintx.com/ · dentistsouthaustintx.com      |
| `rating`, `reviewsCount`                               | 5 · 957                                                               |
| `openingHours`                                         | Monday 8:30 AM–5 PM, with 24-hour periods for software                |
| `isClaimed`                                            | false when Google invites the owner to claim the listing              |
| `isPermanentlyClosed`, `isTemporarilyClosed`           | false · false                                                         |
| `lat`, `lng`, `timezone`                               | 30.2016 · -97.8074 · America/Chicago                                  |
| `placeId`, `cid`, `googleMapsUrl`                      | ChIJlS5kj59MW4YRUnAMiWbswWk · link to the place                       |
| `description`, `imageUrl`                              | Google's short description and main photo                             |
| `emails`, `socials`                                    | info@example.com · Facebook, Instagram, LinkedIn... (with enrichment) |

### How to scrape Google Maps

1. Open the **Input** tab and enter one or more **search terms**, for example `dentist` or `plumber`.
2. Enter a **location** such as `Austin, TX`, a postal code like `10001, USA`, or a whole state or country. To search around a point instead, fill in the **center point** and **radius**.
3. Set **Max places per search term**. This also caps what you pay.
4. Optionally add **filters** (minimum rating, website, category) and turn on **Find emails and social profiles on websites**.
5. Click **Start**. Places appear in the **Output** tab as they are found.
6. Download the results as **CSV, Excel, JSON or HTML**, or send them to Google Sheets, HubSpot, Zapier, Make or n8n.

### How much does it cost to scrape Google Maps?

You pay per place saved, plus a small fee for places where contact enrichment finds something:

| Event                                                              | Price                     |
| ------------------------------------------------------------------ | ------------------------- |
| Place saved (all Google Maps fields)                               | $0.0015 ($1.50 per 1,000) |
| Emails or social profiles found on the place's website             | $0.0015 ($1.50 per 1,000) |
| Places removed by filters, duplicates, websites with nothing found | Free                      |

**1,000 places cost about $1.50.** With contact enrichment on, if 700 of those 1,000 businesses show an email or a social profile on their website, the run costs $1.50 + $1.05 = **$2.55**. Apify's free plan includes $5 of monthly credit, enough for more than 3,000 places.

Larger Apify plans pay less per place automatically: $1.20 per 1,000 on Scale and $1.00 per 1,000 on Business, with contacts at $1.20 and $0.90. Each run also has a start fee of $0.00005.

### Input

See the **Input** tab for every option. Example:

```json
{
    "searchTerms": ["dentist"],
    "location": "Austin, TX",
    "maxPlacesPerSearch": 500,
    "minRating": 4,
    "websiteFilter": "all",
    "skipClosedPlaces": true,
    "scrapeContacts": true,
    "language": "en",
    "countryCode": "us"
}
```

- **Location**: a city, region, postal code, neighborhood or country. Add a **radius** to search only near its center. Leave the location empty to write it inside the search term instead ("dentist in Austin"); that mode returns only what Google shows for that one search.
- **Center point and radius**: `30.2672, -97.7431` with a 5 km radius searches a circle; only places inside it are saved.
- **Language and country**: change them to get categories and opening hours in another language and local address formats.

### Output

You can download the dataset in various formats such as JSON, HTML, CSV or Excel. Two records from real runs, trimmed (opening hours shortened to two days):

```json
{
    "placeId": "ChIJlS5kj59MW4YRUnAMiWbswWk",
    "cid": "7620631969617702994",
    "name": "Craft of Dentistry",
    "category": "Dentist",
    "categories": ["Dentist", "Dental implants provider", "Denture care center", "Emergency dental service"],
    "address": "7002 Menchaca Rd #100, Austin, TX 78745",
    "street": "7002 Menchaca Rd #100",
    "city": "Austin",
    "state": "Texas",
    "postalCode": "78745",
    "countryCode": "US",
    "lat": 30.201578899999998,
    "lng": -97.80743729999999,
    "phone": "+1 512-812-8956",
    "phoneE164": "+15128128956",
    "website": "https://www.dentistsouthaustintx.com/",
    "domain": "dentistsouthaustintx.com",
    "rating": 5,
    "reviewsCount": 957,
    "openingHours": [
        { "day": "Monday", "hours": "8:30 AM–5 PM", "periods": [{ "open": "08:30", "close": "17:00" }] },
        { "day": "Tuesday", "hours": "8:30 AM–5 PM", "periods": [{ "open": "08:30", "close": "17:00" }] }
    ],
    "isPermanentlyClosed": false,
    "isTemporarilyClosed": false,
    "isClaimed": true,
    "googleMapsUrl": "https://www.google.com/maps/search/?api=1&query=Craft%20of%20Dentistry&query_place_id=ChIJlS5kj59MW4YRUnAMiWbswWk",
    "timezone": "America/Chicago",
    "searchTerm": "dentist",
    "searchLocation": "Austin, TX",
    "rank": 5,
    "scrapedAt": "2026-10-18T01:07:45.458Z"
}
```

With contact enrichment on, each record also carries `emails` and `socials`:

```json
{
    "name": "Austin Lifetime Dental",
    "address": "2206 W Parmer Ln, Austin, TX 78727",
    "phone": "+1 512-835-1924",
    "website": "https://www.lifetimedental.com/?utm_source=GMB&utm_medium=organic&utm_campaign=DevOptimization&utm_content=Website",
    "rating": 4.9,
    "reviewsCount": 847,
    "emails": ["info@lifetimedental.com"],
    "socials": {
        "facebook": "https://facebook.com/austindental",
        "instagram": "https://instagram.com/austinlifetimedental",
        "linkedin": "https://linkedin.com/company/austin-lifetime-dental",
        "twitter": null,
        "youtube": "https://youtube.com/@austinlifetimedental",
        "tiktok": null,
        "pinterest": null,
        "whatsapp": null
    }
}
```

### Tips for better results

- **Use distinct search terms.** `restaurant`, `bar` and `cafe` find more places than `restaurant`, `restaurants` and `food`. Places found by several terms are saved once.
- **Search a whole state or country** with a high maximum. The scraper keeps splitting the map where businesses are dense, so you do not need to list cities one by one.
- **Selling websites?** Set **Website** to "Only places without a website". **Selling local SEO?** Sort by `isClaimed` to find businesses that never claimed their Google listing.
- **Use Category contains** to drop loosely related results; for example `dentist` keeps "Cosmetic dentist" but drops "Dental supply store".
- **Large enrichment runs** read several pages per website. For tens of thousands of places, raise the run timeout in the run options.
- Schedule the scraper monthly to keep a lead list or directory fresh.

### Integrations and API

- **API**: start runs and download results from any language. The **API** tab has ready code in Python, JavaScript and cURL.
- **Python**: `from apify_client import ApifyClient`, then `client.actor("stratumics/google-maps-scraper").call(run_input={"searchTerms": ["dentist"], "location": "Austin, TX"})`.
- **JavaScript**: `import { ApifyClient } from 'apify-client'`, then `client.actor('stratumics/google-maps-scraper').call({ searchTerms: ['dentist'], location: 'Austin, TX' })`.
- **No-code**: Zapier, Make, n8n, Google Sheets, HubSpot and Slack from the **Integrations** tab, for example to append new leads to a sheet after every scheduled run.
- **AI agents**: connect any MCP-capable assistant to Apify's MCP server (`mcp.apify.com`) and it can call this scraper as a tool to find local businesses.

### FAQ

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

This scraper collects business information that Google Maps shows to every visitor, plus the contact details businesses publish on their own websites to be contacted. It does not log in and does not collect reviews or reviewer profiles. Your results can still contain personal data, for example a sole trader's name or a named employee's email. Personal data is protected by the GDPR in the European Union and by other laws around the world, so only collect it when you have a legitimate reason, and consult a lawyer if you are unsure. When you email or call the businesses you find, follow the anti-spam and telemarketing rules of their country (for example CAN-SPAM, PECR and the GDPR). Also consider Google's Terms of Service for your use case.

#### How many places can I get from one search?

As many as Google Maps lists in the area. The scraper is not capped at the 120 places Google shows per search: it searches smaller and smaller parts of the map where results are dense. A search for dentists across Austin, TX returned more than 1,200 places.

#### Why do some places have no phone number or website?

Not every business adds them to its Google listing. Service-area businesses (plumbers, roofers, cleaners) often hide their street address too. Those fields are `null` rather than empty strings.

#### Why is `priceLevel` usually empty?

Google shows a price level for only a small share of places in search results, mostly some restaurants and hotels. The field is filled when Google provides it.

#### What does `isClaimed` mean?

`false` means Google shows the "Own this business?" link, so the listing has never been claimed by its owner. `true` means the listing has an owner. `null` means Google does not say, for example for vacation rentals.

#### Does it scrape Google reviews?

Not this Actor: it gives the star rating and the number of reviews for each place, which is what most lead lists need. For the reviews themselves (text, date, reviewer, owner reply), use our [Google Maps Reviews Scraper](https://apify.com/stratumics/google-maps-reviews-scraper).

#### What exactly does contact enrichment charge for?

The extra fee applies only to places whose own website showed at least one email address or social profile. Websites that are down, blocked or show nothing are free, and so are places without a website.

#### Found a problem or need a field?

Open an issue in the **Issues** tab with the input you used. Every issue is read and usually answered within a day.

### Other tools from Stratum ICS

- [App Store Reviews Scraper](https://apify.com/stratumics/app-store-reviews-scraper): Get Apple App Store reviews with star ratings, titles, text, app versions, helpful votes and developer replies, well past Apple's 500-review limit, for any country, plus app ratings.
- [Google News Scraper](https://apify.com/stratumics/google-news-scraper): Get Google News articles with real publisher URLs (not Google redirects), source, date, image, author and optional full text.
- [Google Play Reviews Scraper](https://apify.com/stratumics/google-play-reviews-scraper): Get Google Play reviews with star ratings, text, app versions, thumbs-up counts, developer replies and feature ratings in any language, plus app details with installs and star histogram.
- [Google Trends Scraper](https://apify.com/stratumics/google-trends-scraper): Get Google Trends data as JSON, CSV or Excel: interest over time, interest by region and city, related queries, and trending searches by country.
- [LinkedIn Jobs Scraper](https://apify.com/stratumics/linkedin-jobs-scraper): Scrape LinkedIn jobs with full descriptions, salary ranges, seniority, job type and applicant counts.
- [Telegram Channel Scraper](https://apify.com/stratumics/telegram-channel-scraper): Get messages from public Telegram channels with views, dates, media, reactions, polls and forwards, plus channel info with exact subscriber counts.
- [Website Contact Scraper](https://apify.com/stratumics/website-contact-scraper): Turn a list of websites into one row per company with verified emails, formatted phone numbers, social profiles (LinkedIn, Facebook, Instagram, X), address and contact page.
- [YouTube Scraper](https://apify.com/stratumics/youtube-scraper): Get YouTube videos from searches, channels, playlists and links with exact views, likes, comment counts, dates and tags, plus channel profiles and comments.

# Actor input Schema

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

What to look for on Google Maps, one term per line, for example "dentist", "coffee shop" or "roofing contractor". Each term is searched in the location below. Terms that mean different things find more places than synonyms do.

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

City, region, postal code, neighborhood or country, written the way you would type it into Google Maps: "Austin, TX", "Manchester, UK", "10001, USA", "Bavaria, Germany". The whole area is covered, split into smaller map views where places are dense. Leave empty to put the location inside the search terms instead (for example "dentist in Austin"); that mode returns only what Google shows for one search.

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

How many places to save for each search term. You pay per place saved, so this also caps the cost. Places that do not match your filters are never saved or charged.

## `coordinates` (type: `string`):

Search around a point instead of a named location, written as "latitude, longitude" in decimal degrees, for example "30.2672, -97.7431" (copy it from Google Maps with a right click). When set, it takes priority over the location text.

## `radiusKm` (type: `number`):

Search radius in kilometers around the center point (5 km when left at 0), or around the center of the location above. Leave at 0 with a location to cover the location's whole area.

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

Keep only places rated at least this many stars (for example 4 or 4.5). 0 keeps every place, including places without reviews.

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

Keep all places, only places with a website, or only places without one (useful when you sell websites or online marketing).

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

Keep only places whose Google category contains one of these words, for example "dentist" keeps "Dentist" and "Cosmetic dentist" but drops "Dental supply store". Leave empty to keep every category.

## `skipClosedPlaces` (type: `boolean`):

Leave out places Google marks as permanently or temporarily closed.

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

Visit each place's website (homepage plus its contact and about pages) and add the email addresses and social profiles (Facebook, Instagram, LinkedIn, X, YouTube, TikTok, Pinterest, WhatsApp) found there. Places where something is found cost a small extra fee; see the Pricing tab.

## `contactPagesPerWebsite` (type: `integer`):

The homepage plus the most likely contact pages. 4 finds contacts on most small business sites; more pages find a few more at the cost of time.

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

Language of categories, opening hours and other text, as a Google language code.

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

Two-letter country code Google uses for the search ("us", "gb", "de", "au"...). Set it to the country you search in for the most local results and address format.

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

Apify's datacenter proxy works well with Google Maps and is used by default. If Google blocks it, the scraper switches to a direct connection on its own.

## Actor input object example

```json
{
  "searchTerms": [
    "dentist"
  ],
  "location": "Austin, TX",
  "maxPlacesPerSearch": 50,
  "coordinates": "",
  "radiusKm": 0,
  "minRating": 0,
  "websiteFilter": "all",
  "categoryFilter": [],
  "skipClosedPlaces": true,
  "scrapeContacts": false,
  "contactPagesPerWebsite": 4,
  "language": "en",
  "countryCode": "us",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `contacts` (type: `string`):

No description

## `allFields` (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 = {
    "searchTerms": [
        "dentist"
    ],
    "location": "Austin, TX"
};

// Run the Actor and wait for it to finish
const run = await client.actor("stratumics/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": ["dentist"],
    "location": "Austin, TX",
}

# Run the Actor and wait for it to finish
run = client.actor("stratumics/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": [
    "dentist"
  ],
  "location": "Austin, TX"
}' |
apify call stratumics/google-maps-scraper --silent --output-dataset

```

## MCP server setup

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