# Google Maps Collector (`scrapingapp/google-maps-scraper-plus`) Actor

Extract places, reviews, photos & details from Google Maps. Get names, addresses, phones, websites, ratings, opening hours, and more. Export to CSV, JSON. Pay-per-use pricing starting at $2.80 per 1,000 places scraped - 30% below market.

- **URL**: https://apify.com/scrapingapp/google-maps-scraper-plus.md
- **Developed by:** [davz more](https://apify.com/scrapingapp) (community)
- **Categories:** Lead generation, SEO tools, Travel
- **Stats:** 2 total users, 1 monthly users, 50.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $2.80 / 1,000 result (place scraped)s

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 Plus

> Extract places, reviews, photos & details from Google Maps at 30% below market price.

***

### Why This Actor?

| Feature | Google Maps Scraper Plus | Competitors |
|---|---|---|
| **Place scraped** | $2.80 / 1,000 | $4.00 / 1,000 |
| **Review scraped** | $0.35 / 1,000 | $0.50 / 1,000 |
| **Image scraped** | $0.35 / 1,000 | $0.50 / 1,000 |
| **Details add-on** | $1.40 / 1,000 | $2.00 / 1,000 |
| **First 2 filters** | FREE | Paid |
| **Streaming results** | Real-time dataset push | Wait for full run |

**You pay only for what you scrape. No subscriptions. No minimums.**

***

### What You Get

- **Place names, categories & ratings** - core business data
- **Full addresses** - street, city, state, postal code, country, coordinates
- **Contact info** - phone, website, international phone
- **Opening hours** - weekly schedule + popular hours
- **Reviews** - text, author, rating, date, replies, tags
- **Photos** - thumbnail URLs + full image links
- **Place details** - amenities, about, reservations, order online, menus, Q\&A
- **Directories** - businesses inside malls & shopping centers
- **Web results** - related web pages per place

***

### How It Works

1. **Enter your search terms** - e.g. "restaurants", "dentist", "gym"
2. **Pick a location** - city, state, country, or custom coordinates
3. **Choose add-ons** - reviews, photos, details (only pay for what you need)
4. **Run** - results stream into your dataset in real time
5. **Export** - CSV, JSON, or integrate with your pipeline via Apify API

***

### Input Options

#### Search Mode

Type what you would search on Google Maps:

- "English breakfast" in London
- "pet shelter" in California
- Place IDs for direct lookups (e.g. ChIJ...)

#### Direct Mode

Paste Google Maps URLs or place IDs, one per line.

#### Filters (First 2 Free)

- **Category keywords** - narrow by business type
- **Minimum star rating** - 0.5 to 4.5
- **Website filter** - with / without website only
- **Skip closed places** - exclude temp/permanent closures
- **Exact name matching** - strict search matching

#### Geolocation

- Free-text location query (city, state, country)
- Structured geo fields (country, city, state, county, postal code)
- Custom lat/lng coordinates

***

### Pricing Breakdown

| Event | Price |
|---|---|
| Actor start | $0.005 / run |
| Place scraped | $0.0028 / place |
| Filter per place (beyond 2 free) | $0.0007 / filter / place |
| Additional details | $0.0014 / place |
| Review scraped | $0.00035 / review |
| Image scraped | $0.00035 / image |

#### Example: 500 restaurants in Paris, with reviews & photos

- 500 places x $0.0028 = **$1.40**
- 500 details x $0.0014 = **$0.70**
- 12,500 reviews x $0.00035 = **$4.38**
- 10,000 images x $0.00035 = **$3.50**
- **Total: ~$9.98** (competitors would charge ~$14.30)

***

### Use Cases

- **Lead generation** - build targeted business lists for outreach
- **Market research** - analyze competitor presence by location
- **SEO monitoring** - track local search visibility
- **Real estate** - map amenities around properties
- **Travel & hospitality** - curate attraction and restaurant databases
- **Data enrichment** - add location intelligence to existing datasets
- **Acquisition targeting** - find businesses for potential purchase

***

### Sample Output

Each record is pushed to the Apify dataset with fields ordered for readability:

```json
{
  "google_maps_url": "https://www.google.com/maps/place/?q=place_id:ChIJjQmUmSGxrBIRqcx4Q0O7J2E",
  "place_id": "ChIJjQmUmSGxrBIRqcx4Q0O7J2E",
  "name": "Les Clédoux",
  "category": "Restaurant",
  "categories": ["Restaurant", "Bar tabac"],
  "rating": 3.9,
  "review_count": 105,
  "reviews_fetched": 10,
  "photos_fetched": 18,
  "images_count": 19,
  "price": "€10–20",
  "price_level": 1,
  "address": "Les Clédoux, D703, 24370 Pechs-de-l'Espérance, France",
  "street": "D703",
  "city": "Pechs-de-l'Espérance",
  "postal_code": "24370",
  "country_code": "FR",
  "latitude": 44.8819918,
  "longitude": 1.4253851,
  "phone": "+33 5 53 59 62 11",
  "opening_hours": [
    { "day": "Monday", "hours": "6 AM to 9:30 PM" },
    { "day": "Tuesday", "hours": "6 AM to 9:30 PM" },
    { "day": "Wednesday", "hours": "6 AM to 9:30 PM" },
    { "day": "Thursday", "hours": "6 AM to 9:30 PM" },
    { "day": "Friday", "hours": "6 AM to 9:30 PM" },
    { "day": "Saturday", "hours": "Closed" },
    { "day": "Sunday", "hours": "Closed" }
  ],
  "reviews_distribution": {
    "one_star": 20,
    "two_star": 2,
    "three_star": 8,
    "four_star": 15,
    "five_star": 60
  },
  "reviews_tags": [
    { "title": "welcome", "count": 8 },
    { "title": "atmosphere", "count": 6 },
    { "title": "restrooms", "count": 4 },
    { "title": "tobacco", "count": 3 },
    { "title": "tasty cuisine", "count": 2 }
  ],
  "additional_info": {
    "Service options": ["Dine-in", "Delivery", "Drive-through"],
    "Accessibility": ["Wheelchair accessible entrance", "Wheelchair accessible parking lot"],
    "Offerings": ["Alcohol", "Beer", "Cocktails", "Coffee", "Vegan options"],
    "Payments": ["Credit cards", "Debit cards", "NFC mobile payments"]
  },
  "people_also_search": [
    { "title": "L'ESCAPADE", "rating": 4.5, "review_count": 209 },
    { "title": "Le Relais de Maure", "rating": 4.4, "review_count": 381 }
  ],
  "plus_code": "VCJG+Q5 Pechs-de-l'Espérance, France",
  "cid": "7000770043339918505",
  "kgmid": "/g/11b6dp7syw",
  "permanently_closed": false,
  "temporarily_closed": false,
  "is_advertisement": false,
  "claim_this_business": true,
  "reviews": [
    {
      "name": "guiz mo trucker",
      "stars": 5,
      "text": "Très bonne adresse je recommande",
      "published_at": "2025-10-28",
      "review_url": "https://www.google.com/maps/reviews/...",
      "reviewer_url": "https://www.google.com/maps/contrib/...",
      "is_local_guide": true,
      "review_detailed_rating": { "Food": 5, "Service": 5, "Atmosphere": 5 }
    }
  ],
  "photos": [
    { "image_url": "https://lh3.googleusercontent.com/...", "author_name": null },
    { "image_url": "https://lh3.googleusercontent.com/...", "author_name": null }
  ],
  "source": "fresh",
  "scraped_at": "2026-08-05T10:13:07Z"
}
```

Export as **CSV**, **JSON**, or stream into your pipeline via the Apify Dataset API.

***

### Tips for Best Results

- Use **unique search terms** for faster processing
- Set `maxCrawledPlacesPerSearch` to control volume per term
- Enable `subdivide` for larger areas (splits search into regions)
- Use `maxCostPerRun` to set a spending cap
- Results appear in your dataset **as they are scraped** - no waiting for the full run to finish

***

### API Access

Run programmatically via the Apify API:

```bash
curl -X POST \
  -H "Authorization: Bearer YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchStringsArray":["restaurant"],"locationQuery":"Bordeaux, France","maxCrawledPlacesPerSearch":50}' \
  "https://api.apify.com/v2/acts/EDt97PbCVbzLYUggz/run?token=YOUR_TOKEN"
```

***

**Questions?** Open an issue or contact support through the Apify console.

# Actor input Schema

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

Type what you'd normally search for in Google Maps, like 'English breakfast' or 'pet shelter'. Aim for unique terms for faster processing. Using similar terms may increase capture rate but is less efficient. You can also paste place IDs directly (e.g. ChIJ8\_JBApXMDUcRDzXcYUPTGUY) or with prefix (place\_id:ChIJ...).

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

Define location using free text. Simpler formats work best; e.g., use City + Country rather than City + Country + State. You can set the whole country or state as the location. Verify with OpenStreetMap webapp for visual validation.

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

Maximum number of places to collect per search term or direct URL. Set to 0 for unlimited.

## `geo_country` (type: `string`):

Geolocation country (alternative to location).

## `geo_city` (type: `string`):

Geolocation city.

## `geo_state` (type: `string`):

Geolocation state.

## `geo_county` (type: `string`):

Geolocation county.

## `geo_postal` (type: `string`):

Geolocation postal code.

## `directUrls` (type: `string`):

Paste one Google Maps URL per line. These are sent through the direct job endpoint.

## `directPlaceIds` (type: `string`):

Paste one Google Maps place ID per line. Example: ChIJjQmUmSGxrBIRqcx4Q0O7J2E

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

Results details will show in this language.

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

Google Maps country code used for localization.

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

Limit scraped places by category. First 2 filters are free, then $0.0007/filter/place.

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

Scrape only places with a rating equal to or above the selected stars. Counts as 1 filter (free within first 2).

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

Exclude places without a website, or vice versa. Counts as 1 filter (free within first 2).

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

Skip places marked as temporary or permanently closed. Counts as 1 filter (free within first 2).

## `searchMatching` (type: `string`):

Restrict places by name matching. Counts as 1 filter (free within first 2).

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

Scrape detail pages of each place. Extracts reviewsDistribution, openingHours, amenities, peopleAlsoSearch, reviewsTags, questionsAndAnswers, hotel fields, and more. Priced at $0.0014/place (30% below market).

## `scrapeTableReservationProvider` (type: `boolean`):

Scrape table reservation provider data like name, address, email or phone.

## `scrapeOrderOnline` (type: `boolean`):

Scrape the Order Online section of restaurants to get pickup and delivery providers.

## `includeWebResults` (type: `boolean`):

Extract the Web results section located at the bottom of every place listing.

## `scrapeDirectories` (type: `boolean`):

Some places can have multiple businesses located inside them. Turn this on to include those places.

## `maxQuestions` (type: `integer`):

Set the number of Q\&A questions per place. Set to 0 to skip. Note: some fields contain personal data.

## `scrapeReviews` (type: `boolean`):

Extract reviews for each place found. Priced at $0.00035/review (30% below market).

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

How many reviews to pull per place.

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

Ordering used when fetching reviews.

## `reviewsDateFrom` (type: `string`):

Only keep reviews posted on or after this date (YYYY-MM-DD format).

## `scrapeImages` (type: `boolean`):

Extract additional photos for each place. Priced at $0.00035/image (30% below market).

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

How many photos to pull per place beyond the main image.

## `maxCostPerRun` (type: `number`):

Set a spending cap. Run stops if estimated cost exceeds this value. Leave 0 for unlimited.

## `subdivide` (type: `boolean`):

Split the search area into smaller regions for more comprehensive results.

## Actor input object example

```json
{
  "searchStringsArray": [
    ""
  ],
  "locationQuery": "",
  "maxCrawledPlacesPerSearch": 50,
  "geo_country": "",
  "geo_city": "",
  "geo_state": "",
  "geo_county": "",
  "geo_postal": "",
  "directUrls": "",
  "directPlaceIds": "",
  "language": "en",
  "country": "us",
  "categoryFilterWords": [],
  "placeMinimumStars": "0",
  "website": "both",
  "skipClosedPlaces": false,
  "searchMatching": "partial",
  "scrapePlaceDetailPage": false,
  "scrapeTableReservationProvider": false,
  "scrapeOrderOnline": false,
  "includeWebResults": false,
  "scrapeDirectories": false,
  "maxQuestions": 0,
  "scrapeReviews": false,
  "maxReviews": 25,
  "reviewsSort": "relevant",
  "reviewsDateFrom": "",
  "scrapeImages": false,
  "maxImages": 20,
  "maxCostPerRun": 0,
  "subdivide": false
}
```

# Actor output Schema

## `places` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapingapp/google-maps-scraper-plus").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("scrapingapp/google-maps-scraper-plus").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 '{}' |
apify call scrapingapp/google-maps-scraper-plus --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=scrapingapp/google-maps-scraper-plus",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/zYGCIUmHVdnXU33ek/builds/Yo8vF9n3VTsarTcg8/openapi.json
