# Ultimate Google Places Scraper (`happitap/ultimate-google-places-scraper`) Actor

Extract business data from Google Maps including reviews, ratings, contact details, opening hours, and images. Get structured data from restaurants, hotels, shops, and any business listed on Google Maps.

- **URL**: https://apify.com/happitap/ultimate-google-places-scraper.md
- **Developed by:** [HappiTap](https://apify.com/happitap) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

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

## Ultimate Google Places Scraper

**Extract business data from Google Maps including reviews, ratings, contact details, opening hours, and images. Get structured data from restaurants, hotels, shops, and any business listed on [Google Maps](https://www.google.com/maps).**

The Ultimate Google Places Scraper is your **Google Maps API alternative** that lets you scrape unlimited business listings with reviews, photos, and complete contact information. Perfect for lead generation, market research, competitor analysis, and building business directories.

### What can Google Places Scraper do?

- ✅ **Search any business type** - restaurants, hotels, dentists, gyms, or any category on Google Maps
- ✅ **Extract complete data** - name, address, phone, website, ratings, reviews, images, opening hours
- ✅ **Get customer reviews** - scrape reviews with ratings, dates, and full text
- ✅ **Multiple search methods** - search by keyword + location, coordinates, or direct Google Maps URLs
- ✅ **Filter results** - by star rating, category, or skip permanently closed businesses
- ✅ **Export in any format** - JSON, CSV, Excel, HTML, or RSS feed
- ✅ **Schedule runs** - automate data collection daily, weekly, or monthly
- ✅ **API access** - integrate scraped data directly into your applications
- ✅ **No coding required** - simple point-and-click interface

### Why scrape Google Maps?

Google Maps contains millions of business listings with valuable data for:

- 🎯 **Lead generation** - Build targeted lists of potential customers
- 📊 **Market research** - Analyze competitors and market trends
- 📍 **Location intelligence** - Map business density and distribution
- ⭐ **Reputation monitoring** - Track reviews and ratings over time
- � **App development** - Enrich your applications with business data
- 🏢 **Directory building** - Create niche business directories

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

The scraper extracts comprehensive business information from Google Maps:

| Data Field | Description | Example |
|------------|-------------|---------|
| **Business Name** | Official business name | "Joe's Pizza Restaurant" |
| **Address** | Full street address | "123 Main St, New York, NY 10001" |
| **Phone Number** | Contact phone | "+1 212-555-0123" |
| **Website** | Business website URL | "https://joespizza.com" |
| **Coordinates** | Latitude & longitude | 40.7128, -74.0060 |
| **Rating** | Average star rating | 4.5 stars |
| **Reviews Count** | Total number of reviews | 1,234 reviews |
| **Categories** | Business categories | "Restaurant", "Pizza", "Italian" |
| **Opening Hours** | Business hours by day | "Mon-Fri: 9 AM - 10 PM" |
| **Customer Reviews** | Review text, rating, date | Full review content with ratings |
| **Photos** | Business images | Interior, exterior, food photos |
| **Place ID** | Unique Google identifier | "ChIJ..." |
| **Google Maps URL** | Direct link to listing | Full Google Maps URL |
| **Permanently Closed** | Business status | true/false |

### How to scrape Google Maps data

1. **Click "Try for free"** to start using the scraper
2. **Enter your search** - Type what you're looking for (e.g., "restaurants") and where (e.g., "Los Angeles")
3. **Configure options** - Set how many results you want and whether to include reviews/images
4. **Start the scraper** - Click "Start" and let it run
5. **Download results** - Export your data as JSON, CSV, Excel, or connect via API

The scraper will automatically handle pagination, load all results, and extract complete information from each business listing.

### Input

The scraper has a simple input interface. Click on the **Input** tab above to see all available options. The most important settings are:

- **Search terms** - What you're looking for (e.g., "restaurant", "dentist", "hotel")
- **Location** - Where to search (e.g., "New York, NY", "London, UK")
- **Max results** - How many places to extract per search (default: 20)
- **Include reviews** - Whether to scrape customer reviews (yes/no)
- **Include images** - Whether to scrape business photos (yes/no)

All fields have helpful tooltips. For advanced options like filtering by star rating or searching by coordinates, check the Input tab.

### Output

You can download your scraped data in multiple formats:

- **JSON** - For developers and API integrations
- **CSV** - For Excel and data analysis
- **Excel** - Ready-to-use spreadsheet
- **HTML** - For viewing in browser
- **RSS** - For feed readers

#### Output example

Here's what the data looks like for a single business:

```json
{
  "title": "Joe's Pizza Restaurant",
  "address": "123 Main St, New York, NY 10001",
  "phone": "+1 212-555-0123",
  "website": "https://joespizza.com",
  "totalScore": 4.5,
  "reviewsCount": 1234,
  "categories": ["Restaurant", "Pizza", "Italian"],
  "location": { "lat": 40.7128, "lng": -74.0060 },
  "openingHours": [
    { "day": "Monday", "hours": "11:00 AM - 10:00 PM" },
    { "day": "Tuesday", "hours": "11:00 AM - 10:00 PM" }
  ],
  "reviews": [
    {
      "name": "John Smith",
      "stars": 5,
      "text": "Best pizza in NYC! Great service and atmosphere.",
      "date": "2 weeks ago"
    }
  ],
  "images": [
    { "url": "https://...", "description": "Interior view" }
  ]
}
```

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

Google Maps scraping on Apify uses a **pay-per-use** model based on compute units (CUs). You only pay for what you use.

**Free tier**: New Apify users get **$5 in free credits** - enough to scrape approximately **500-1,000 business listings** with basic data.

**Cost estimates**:

- **Basic data only** (no reviews/images): ~100-200 places per $1
- **With reviews** (5-10 per place): ~50-100 places per $1
- **With reviews + images**: ~30-50 places per $1

**Tips to reduce costs**:

- Set `maxCrawledPlacesPerSearch` to limit results
- Disable reviews/images if you don't need them
- Use filters to get only relevant businesses
- Lower `maxConcurrency` to 3-4 for more efficient runs

The scraper automatically optimizes performance and handles retries, so you get reliable data without wasting compute units.

### Is it legal to scrape Google Maps?

Yes, scraping publicly available data from Google Maps is legal in most jurisdictions. This scraper only extracts **publicly visible information** that anyone can see without logging in - business names, addresses, phone numbers, ratings, and public reviews.

**What we DON'T extract**:

- Private user data
- Email addresses
- Personal information not publicly displayed

**Best practices**:

- Use scraped data ethically and responsibly
- Respect robots.txt and rate limits
- Don't use data for spam or harassment
- Consider Google's Terms of Service for your use case

For commercial use at scale, you may want to review Google's official [Places API](https://developers.google.com/maps/documentation/places/web-service/overview). However, the API has strict rate limits and can be expensive for large datasets.

### Troubleshooting

#### No results or empty dataset?

- Check that your search terms and location are correct
- Increase `maxCrawledPlacesPerSearch` if you're getting fewer results than expected
- Make sure you're not filtering too aggressively (star ratings, categories)
- Look for the "✅ SAVED TO DATASET" messages in the log to confirm data is being saved

#### Scraper running slow or timing out?

- Reduce `maxCrawledPlacesPerSearch` to 10-20 for faster runs
- Set `includeReviews: false` and `includeImages: false` to speed up extraction
- Lower `maxConcurrency` to 3-4
- Increase the timeout in Run options (default is 300 seconds)

#### Getting blocked by Google?

- Use **residential proxies** in proxy configuration
- Reduce `maxConcurrency` to 3-4
- Add more delay between requests
- Try running at different times of day

#### No Results?

- Check if selectors need updating (Google changes UI frequently)
- Verify search terms and location are valid
- Enable `debugMode` to inspect HTML

#### Missing Data?

- Some places may not have all fields (phone, website, etc.)
- Reviews/images require `scrapePlaceDetailPage: true`
- Check if place is permanently closed

#### Reviews not showing up?

- Make sure `includeReviews: true` is set
- Set `maxReviews` to a number greater than 0
- Some businesses may have no reviews
- Review sorting may fail on some pages (this is normal)

### Use cases

#### Lead Generation

Extract contact details for businesses in your target market. Perfect for B2B sales teams looking to build prospect lists of restaurants, retailers, service providers, or any business type.

#### Market Research

Analyze competitor locations, ratings, and customer sentiment. Identify market gaps, popular areas, and business trends in your industry.

#### Local SEO

Monitor your business listings and competitors. Track rating changes, new reviews, and business information accuracy across locations.

#### Real Estate Analysis

Map business density and types in different neighborhoods. Identify commercial opportunities and understand local business ecosystems.

#### App Development

Enrich your application with real business data. Build location-based services, business directories, or recommendation engines.

### Google Maps API alternative

The official Google Places API has strict limitations:

- **Rate limits**: Limited requests per day
- **Cost**: Expensive for large datasets ($17 per 1,000 requests)
- **Restrictions**: Complex quota management

This scraper offers:

- ✅ **Unlimited results** - No API quotas
- ✅ **Cost-effective** - Pay only for compute time
- ✅ **Complete data** - All publicly visible information
- ✅ **Flexible** - Custom filters and search options
- ✅ **Easy to use** - No API keys or complex setup

### Integrations

Connect your scraped data with 1000+ apps:

- **Google Sheets** - Auto-update spreadsheets with new data
- **Slack** - Get notifications when scraping completes
- **Webhooks** - Send data to your own applications
- **Make/Zapier** - Automate workflows with scraped data
- **API** - Access data programmatically via REST API

Learn more about [Apify integrations](https://apify.com/integrations).

### Support and feedback

- 📧 **Issues?** Use the **Issues** tab above to report bugs
- 💬 **Questions?** Check the troubleshooting section first
- 🔧 **Custom solution?** Contact us for tailored scraping needs
- ⭐ **Feedback?** We're always improving - let us know what you need!

### Related Actors

Looking for more scraping tools? Check out these Actors:

- **Instagram Scraper** - Extract posts, profiles, and hashtags
- **LinkedIn Scraper** - Scrape company and people data
- **Amazon Scraper** - Extract product listings and reviews
- **Yelp Scraper** - Business data from Yelp

Browse all [Apify Actors](https://apify.com/store).

***

**License**: Apache-2.0 | **Version**: 1.0.0 | **Last updated**: January 2024

# Actor input Schema

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

Array of search terms (e.g., 'restaurant', 'dentist', 'hotel'). Required for search-based scraping.

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

Free-text location (e.g., 'New York, NY', 'London, UK'). Used with search terms.

## `country` (type: `string`):

Country name for structured location search.

## `state` (type: `string`):

State/province name for structured location search.

## `county` (type: `string`):

County name for structured location search.

## `city` (type: `string`):

City name for structured location search.

## `postalCode` (type: `string`):

Postal/ZIP code for structured location search.

## `lat` (type: `number`):

Latitude for point-based search (requires lng and optional radiusKm).

## `lng` (type: `number`):

Longitude for point-based search (requires lat and optional radiusKm).

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

Search radius in kilometers for point-based search. Default: 5km.

## `geoJson` (type: `object`):

GeoJSON search area polygon

## `directUrlsOrPlaceIds` (type: `array`):

Array of direct Google Maps URLs or Place IDs to scrape (bypasses search).

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

Maximum number of places to extract per search term.

## `maxReviews` (type: `integer`):

Maximum number of reviews to scrape per place. 0 = none.

## `reviewsSort` (type: `string`):

Sort order for reviews.

## `placeMinimumStars` (type: `string`):

Filter places by minimum star rating.

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

Skip permanently closed places.

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

Language code for Google Maps interface (e.g., 'en', 'es', 'fr').

## `categoryFilterWords` (type: `array`):

Filter places by category keywords (e.g., \['restaurant', 'cafe']). Only places matching these will be scraped.

## `scrapePlaceDetailPage` (type: `boolean`):

Enable deep scraping of place detail pages (required for full data).

## `includeReviews` (type: `boolean`):

Scrape reviews for each place.

## `includeImages` (type: `boolean`):

Scrape images for each place.

## `maxImages` (type: `integer`):

Maximum number of images to scrape per place.

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

Attempt to enrich contact details via website scraping (experimental).

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

Enable debug mode (saves HTML + screenshots for first 10 search + 20 detail pages).

## `maxConcurrency` (type: `integer`):

Maximum concurrent requests. Lower values reduce blocking risk.

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

Apify Proxy configuration.

## Actor input object example

```json
{
  "searchStringsArray": [
    "restaurant"
  ],
  "locationQuery": "San Francisco, CA",
  "radiusKm": 5,
  "maxCrawledPlacesPerSearch": 20,
  "maxReviews": 10,
  "reviewsSort": "newest",
  "skipClosedPlaces": false,
  "language": "en",
  "scrapePlaceDetailPage": true,
  "includeReviews": true,
  "includeImages": true,
  "maxImages": 10,
  "scrapeContacts": false,
  "debugMode": false,
  "maxConcurrency": 6,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

Dataset containing scraped Google Places data

# 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": [
        "restaurant"
    ],
    "locationQuery": "San Francisco, CA",
    "maxCrawledPlacesPerSearch": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("happitap/ultimate-google-places-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": ["restaurant"],
    "locationQuery": "San Francisco, CA",
    "maxCrawledPlacesPerSearch": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("happitap/ultimate-google-places-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": [
    "restaurant"
  ],
  "locationQuery": "San Francisco, CA",
  "maxCrawledPlacesPerSearch": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call happitap/ultimate-google-places-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,happitap/ultimate-google-places-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/9uhjMZxZ5iDaL9Dqa/builds/K4GwR0M08FziIubzG/openapi.json
