# Google Maps Reviews Scraper (Cheap) (`istmobot/google-maps-reviews-cheap`) Actor

Low-cost Google Maps reviews scraper with the same input and output fields as the most popular one: text, stars, date, reviewer, owner response, photos and place data. $0.33 per 1,000 reviews.

- **URL**: https://apify.com/istmobot/google-maps-reviews-cheap.md
- **Developed by:** [Istmobot](https://apify.com/istmobot) (community)
- **Categories:** Travel, Lead generation, Marketing
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.33 / 1,000 reviews

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/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 Reviews Scraper (Cheap)

**A cheaper drop-in alternative to the most popular Google Maps reviews scraper on Apify, with the same input and output fields.** Paste the input JSON you already use (`startUrls`, `placeIds`, `maxReviews`, `reviewsSort`, `reviewsStartDate`, `language`, `reviewsOrigin`, `personalData`) and get reviews with the same field names, types and order. Your Google Sheets, Make, Zapier, n8n or code integrations keep working. You pay **$0.33 per 1,000 reviews instead of $0.60**.

### Price comparison

| | This Actor | Popular reviews scraper (free plan price) |
|---|---|---|
| 1,000 reviews | **$0.33** | $0.60 |
| 10,000 reviews | **$3.30** | $6 |
| 100,000 reviews | **$33** | $60 |
| Actor start | $0.0005 | $0.00005 |

The per-review saving outweighs the higher start fee from 2 reviews per run. Failed places return a free error row. You are only charged for reviews in the dataset. Set a maximum cost per run in Apify and the Actor stops when it is reached.

### What data do you get?

One record per review, with the place's data on each record:

- **Review:** `text`, `textTranslated`, `originalLanguage`, `translatedLanguage`, `publishAt`, `publishedAtDate`, `likesCount`, `reviewId`, `reviewUrl`, `reviewOrigin`, `stars`, `rating`, `reviewImageUrls`, `reviewContext`, `reviewDetailedRating`
- **Owner response:** `responseFromOwnerText`, `responseFromOwnerDate`
- **Reviewer:** `name`, `reviewerId`, `reviewerUrl`, `reviewerPhotoUrl`, `reviewerNumberOfReviews`, `isLocalGuide`
- **Place:** `title`, `placeId`, `fid`, `cid`, `kgmid`, `businessProfileId`, `address`, `street`, `neighborhood`, `city`, `postalCode`, `state`, `countryCode`, `location`, `categoryName`, `categories`, `totalScore`, `reviewsCount`, `price`, `hotelStars`, `imageUrl`, `url`, `permanentlyClosed`, `temporarilyClosed`
- **Run:** `searchString`, `language`, `scrapedAt`

```json
{
    "searchString": "place_id:ChIJafcWm6FZwokRAD6WiHiQdpE",
    "textTranslated": null,
    "translatedLanguage": "en",
    "text": "The food was incredible.",
    "originalLanguage": "en",
    "publishAt": "a week ago",
    "publishedAtDate": "2026-10-29T07:23:03.042Z",
    "likesCount": 0,
    "reviewOrigin": "Google",
    "stars": 5,
    "responseFromOwnerText": null,
    "reviewImageUrls": [],
    "reviewContext": { "Meal type": "Dinner" },
    "reviewDetailedRating": { "Food": 5, "Service": 5, "Atmosphere": 5 },
    "title": "Barbounia",
    "address": "250 Park Ave S, New York, NY 10003",
    "totalScore": 4.7,
    "reviewsCount": 5353,
    "language": "en"
}
```

### Use cases

- **Reputation monitoring:** schedule a run with `reviewsStartDate` set to `"1 day"` and get only the new reviews.
- **Competitor research:** compare ratings and complaints across places.
- **Sentiment analysis:** feed the text and the detailed ratings into your own models.
- **Lead generation:** find businesses with poor ratings or no owner responses.

### Input

```json
{
    "startUrls": [{ "url": "https://www.google.com/maps/place/Yellowstone+National+Park/@44.58,-110.51,9z/data=!3m1!4b1!4m5!3m4!1s0x5351e55555555555:0xaca8f930348fe1bb!8m2!3d44.42!4d-110.58" }],
    "placeIds": ["ChIJafcWm6FZwokRAD6WiHiQdpE"],
    "maxReviews": 100,
    "reviewsSort": "newest",
    "reviewsStartDate": "30 days",
    "language": "en",
    "reviewsOrigin": "all",
    "personalData": true
}
```

- `maxReviews` is per place. Leave it out for all reviews.
- `reviewsSort`: `newest`, `mostRelevant`, `highestRanking` or `lowestRanking`.
- `reviewsStartDate`: an absolute date (`2024-05-03`, UTC) or a relative one (`8 days`, `3 months`). It needs the `newest` sort.
- `reviewsOrigin`: `all` also returns partner reviews such as Tripadvisor; `google` returns only Google reviews.
- `personalData: false` nulls the reviewer's ID, name, URL and photo, and the review URL.

### What is different

- `reviewsFilterString` is accepted but ignored, so reviews come back unfiltered. The popular scraper currently does the same.
- `visitedIn` is always `null`.
- Search URLs read the first 20 places of the search, without the map viewport. Place URLs are the reliable input.
- Place IDs starting with `GhIJ` are not supported; they return a free error row.

### FAQ

**Is it legal to scrape Google Maps reviews?** Reviews are public, but they contain personal data such as reviewer names. You are responsible for having a legal basis to collect and use it. Set `personalData` to `false` if you don't need it.

**Does it need a Google account or cookies?** No.

**Does it need a residential proxy?** No. The default Apify datacenter proxy works, which keeps the cost low.

**Why are some `text` values empty?** Many Google reviews are only a star rating.

# Actor input Schema

## `startUrls` (type: `array`):

Google Maps URLs: place URLs, review URLs, <code>google.com/maps?cid=...</code>, or search URLs (the first 20 places are read).

## `placeIds` (type: `array`):

List of place IDs in the format <code>ChIJreV9aqYWdkgROM_boL6YbwA</code>. Only IDs starting with <code>ChIJ</code> are supported.

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

Max number of reviews per place to scrape. If you want to scrape all reviews, remove the prefilled value.

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

Define how reviews are sorted.

## `reviewsStartDate` (type: `string`):

Either absolute date (e.g. `2024-05-03`) or relative date from now into the past (e.g. `8 days`, `3 months`). JSON input also supports adding time in both absolute (ISO standard, e.g. `2024-05-03T20:00:00`) and relative (e.g. `3 hours`) formats. Absolute time is always interpreted in the UTC timezone, not your local timezone - please convert accordingly. Supported relative date & time units: `minutes`, `hours`, `days`, `weeks`, `months`, `years`. <br><br> ⚠️ Heads up: If this parameter is specified, you must choose the 'Newest' sort by value. The reason for this is that with this parameter entered, the Actor stops scraping reviews as soon as it finds the first review that's older than the specified date. If the sorting is not set to 'Newest', it might encounter a review older than the specified date before it reaches the desired review count and not scrape the desired amount of reviews.

## `reviewsFilterString` (type: `string`):

Accepted for compatibility but currently ignored, as in the popular scraper: reviews come back unfiltered.

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

Results will be scraped in this language.

## `reviewsOrigin` (type: `string`):

Select whether you want all reviews (from Google, Tripadvisor, etc.) or only reviews from Google.

## `personalData` (type: `boolean`):

This setting allows you to get personal data about the reviewer (their ID, name, URL, and photo URL) and about the review (URL). Note: review ID (<code>reviewId</code>) is always included regardless of this setting. <br><br>⚠️ This returns personal data. You're responsible for having a legal basis to collect and use it under privacy laws.

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

Apify datacenter proxy works and keeps the price low. The Actor switches IP on every blocked request.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.google.com/maps/place/Yellowstone+National+Park/@44.5857951,-110.5140571,9z/data=!3m1!4b1!4m5!3m4!1s0x5351e55555555555:0xaca8f930348fe1bb!8m2!3d44.427963!4d-110.588455?hl=en-GB"
    }
  ],
  "maxReviews": 100,
  "reviewsSort": "newest",
  "reviewsFilterString": "",
  "language": "en",
  "reviewsOrigin": "all",
  "personalData": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "startUrls": [
        {
            "url": "https://www.google.com/maps/place/Yellowstone+National+Park/@44.5857951,-110.5140571,9z/data=!3m1!4b1!4m5!3m4!1s0x5351e55555555555:0xaca8f930348fe1bb!8m2!3d44.427963!4d-110.588455?hl=en-GB"
        }
    ],
    "maxReviews": 100,
    "language": "en",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("istmobot/google-maps-reviews-cheap").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 = {
    "startUrls": [{ "url": "https://www.google.com/maps/place/Yellowstone+National+Park/@44.5857951,-110.5140571,9z/data=!3m1!4b1!4m5!3m4!1s0x5351e55555555555:0xaca8f930348fe1bb!8m2!3d44.427963!4d-110.588455?hl=en-GB" }],
    "maxReviews": 100,
    "language": "en",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("istmobot/google-maps-reviews-cheap").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 '{
  "startUrls": [
    {
      "url": "https://www.google.com/maps/place/Yellowstone+National+Park/@44.5857951,-110.5140571,9z/data=!3m1!4b1!4m5!3m4!1s0x5351e55555555555:0xaca8f930348fe1bb!8m2!3d44.427963!4d-110.588455?hl=en-GB"
    }
  ],
  "maxReviews": 100,
  "language": "en",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call istmobot/google-maps-reviews-cheap --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,istmobot/google-maps-reviews-cheap"
        }
    }
}
```

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/14esZj7dg5ZhlAtZ9/builds/apHuXFduXR1TEMdKz/openapi.json
