# Google Maps Reviews Scraper — Photos, Ratings & Translations (`herus13/google-maps-reviews-scraper`) Actor

Scrape Google Maps reviews by place URL or place ID. Get review text with English translation, star ratings, attached photos, likes, owner responses, dates, and reviewer profiles — 20 fields. $0.50 per 1,000 reviews; pay only for what you get.

- **URL**: https://apify.com/herus13/google-maps-reviews-scraper.md
- **Developed by:** [bootforge](https://apify.com/herus13) (community)
- **Categories:** Lead generation, SEO tools, Travel
- **Stats:** 2 total users, 1 monthly users, 83.3% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.30 / 1,000 per reviews

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 Reviews Scraper — Extract Reviews, Ratings, Photos & Owner Responses

*Last updated: June 2026*

**Google Maps Reviews Scraper** is an [Apify](https://apify.com) actor that extracts every review from any Google Maps place — by place URL or place ID. It returns one row per review with 20 fields: rating, full review text (plus an English translation for non-English reviews), attached review photos, direct review link, relative and absolute date, owner response, reviewer name, profile URL, review count, photo, likes, and language. Purpose-built for reputation monitoring, sentiment analysis, and anyone who needs review data at scale. Priced at **$0.0005 per review delivered** ($0.50 per 1,000).

### How to Scrape Google Maps Reviews

- **Pay only for what you get** — $0.0005/review ($0.50 per 1,000), $0.01 per run start, nothing else
- **Two ways to target a place** — paste its Google Maps URL, or supply its hex place ID
- **Deep pagination** — fetches every review up to `maxReviews`, across all pages
- **Sort control** — newest, most relevant, highest rating, or lowest rating (e.g. set `highestRating` + `maxReviews: 5` to grab a place's top 5 reviews)
- **Owner responses captured** — the business reply is a first-class field, not buried in text
- **Rich reviewer data** — profile URL, total review count, photo, and likes per review
- **CSV-friendly output** — flat row per review, no nested objects

> **Note on review counts.** Google's total (e.g. "25 reviews") counts star-only ratings that have no written text. This actor returns reviews **with text** — so the number of rows is usually lower than the headline count. That is expected, not missing data.

### Use Cases

- **Reputation monitoring** — track new reviews for your business or a competitor; alert on low ratings
- **Sentiment analysis** — feed `text` + `rating` into an NLP pipeline for voice-of-customer insights
- **Lead generation** — identify businesses with clusters of negative reviews (service opportunities)
- **Market research** — compare review velocity and rating distributions across competitors
- **Review datasets** — build training corpora for LLMs or fine-tuning sentiment classifiers
- **Agency reporting** — pull monthly review snapshots for client SEO/reputation dashboards

### How to Get a Google Maps Place URL

This is the easiest input — just copy it from Google Maps:

1. Open [Google Maps](https://www.google.com/maps) and search for the business.
2. Click the place so its panel opens on the left.
3. Copy the **full URL from your browser's address bar**. It looks like:
   `https://www.google.com/maps/place/Business+Name/@9.29,105.73,17z/data=!4m8!3m7!1s0x31a1090bfc613b0d:0x236a0a4f8f3febce!...`
4. Paste it into **Place URLs** (one per line for multiple places).

The important part is the `…!1s0x…:0x…` segment — that's the place's ID. Copying from the address bar always includes it. Short links (`maps.app.goo.gl/…`) and bare name URLs without the `data=` segment may not resolve — use the full address-bar URL.

### Quick Start

#### By place URL

```json
{
  "startUrls": [
    "https://www.google.com/maps/place/Tr%C3%A0+s%E1%BB%AFa+Feeling+Tea/@9.2958277,105.7306288,17z/data=!4m8!3m7!1s0x31a1090bfc613b0d:0x236a0a4f8f3febce!8m2!3d9.2958224!4d105.7332037!9m1!1b1"
  ],
  "maxReviews": 100,
  "reviewsSort": "newest"
}
````

#### Top 5 reviews (highest rated)

```json
{
  "startUrls": ["https://www.google.com/maps/place/.../data=...!1s0x...:0x..."],
  "maxReviews": 5,
  "reviewsSort": "highestRating"
}
```

#### By hex place ID

> **Important:** only the hex `0x…:0x…` feature-ID format is accepted. The `ChIJ…` place ID shown in some Maps URLs is not supported — paste the full place URL instead.

```json
{
  "placeIds": ["0x8644b5003b80596b:0x6b271d491de49e1e"],
  "maxReviews": 200,
  "reviewsSort": "lowestRating"
}
```

### Input Parameters

| Parameter | Default | Description |
|-----------|---------|-------------|
| `startUrls` | `[]` | Google Maps place URLs to scrape reviews from (see "How to get a place URL") |
| `placeIds` | `[]` | Hex feature IDs (`0x…:0x…` form only — see note above) |
| `maxReviews` | 100 | Max reviews per place. `0` = unlimited. Counts reviews **with text** only |
| `reviewsSort` | `newest` | Sort order: `newest`, `mostRelevant`, `highestRating`, `lowestRating` |
| `language` | `en` | Language for reviews (BCP-47 code, e.g., `en`, `de`, `fr`, `vi`) |
| `proxy` | null | Proxy config — residential recommended |

At least one of `startUrls` or `placeIds` is required.

### Sample Output — Google Maps Review Row

```json
{
  "place_id": "0x8644b5003b80596b:0x6b271d491de49e1e",
  "business_name": "ATX Family Dental",
  "business_url": "https://www.google.com/maps?cid=7720627710330453534",
  "review_id": "ChdDSUhNMG9nS0VJQ0FnSURydXBfcXdBEAE",
  "review_url": "https://www.google.com/maps/reviews/data=!4m8!14m7!1m6!2m5!1sChdDSUhNMG9nS0VJQ0FnSURydXBfcXdBEAE!...",
  "rating": 5,
  "text": "Absolutely love this place. The staff is kind, professional, and always on time. Dr. Chen explained everything clearly and I left with zero anxiety. 10/10 recommend.",
  "text_translated": null,
  "review_images": ["https://lh3.googleusercontent.com/grass-cs/AN..."],
  "relative_time": "2 months ago",
  "absolute_date": "March 2026",
  "language": "en",
  "review_likes": 3,
  "owner_response": "Thank you so much! We love having you as a patient and look forward to seeing you at your next visit.",
  "has_owner_response": true,
  "reviewer_name": "Sarah M.",
  "reviewer_profile_url": "https://www.google.com/maps/contrib/113456789012345678901",
  "reviewer_review_count": 47,
  "reviewer_photo_url": "https://lh3.googleusercontent.com/a-/ALV-UjV...",
  "scraped_at": "2026-06-19T08:30:00+00:00"
}
```

Every review row has these 20 fields: `place_id`, `business_name`, `business_url` (an openable `maps?cid=` link), `review_id`, `review_url` (direct link to the review), `rating` (1–5), `text`, `text_translated` (Google's English translation; `null` if the review is already in the requested language), `review_images` (list of attached review photo URLs), `relative_time`, `absolute_date`, `language`, `review_likes`, `owner_response`, `has_owner_response`, `reviewer_name`, `reviewer_profile_url`, `reviewer_review_count`, `reviewer_photo_url`, `scraped_at`.

### How Much Does It Cost to Scrape Google Maps Reviews?

**$0.0005 per review ($0.50 per 1,000)** + $0.01 per run start.

| Use case | Reviews | Est. cost |
|----------|---------|-----------|
| Monitor one business (latest 100) | 100 | ~$0.06 |
| Competitive snapshot (10 businesses × 100 reviews) | 1,000 | ~$0.51 |
| Sentiment dataset — one category in one city | 10,000 | ~$5.01 |
| Full competitor audit — 100 businesses × 200 reviews | 20,000 | ~$10.01 |

One run start = $0.01 regardless of how many places or reviews you pull. You only pay for reviews actually delivered — if a place has 30 reviews and you set `maxReviews: 100`, you are charged for 30.

### Google Maps Reviews Scraper Comparison

How this actor compares to other Google Maps review scrapers on Apify (prices as of June 2026, free tier):

| Scraper | Price / 1,000 reviews | Review text | English translation | Review photos | Likes | Owner response |
|---|---|---|---|---|---|---|
| **This actor** | **$0.50** | ✅ | ✅ | ✅ | ✅ | ✅ |
| Compass | $0.60 | ✅ | ❌ | ❌ | ❌ | ✅ |
| beatanalytics | $0.50 | ✅ | ❌ | ❌ | ❌ | ✅ |
| memo23 | $0.50 | ✅ | ❌ | ✅ | ❌ | ✅ |

This actor delivers the most complete review row — **English translations and review likes that the others omit, plus attached photos** — at the lowest mainstream price. You pay only for reviews actually delivered, with no per-place or subscription fees.

### Proxy Configuration

Works without proxy for small runs (under ~100 reviews). For larger scrapes or if you hit rate limits, a residential proxy is strongly recommended.

```json
// Apify managed proxy (easiest)
{"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}

// Bright Data
{"provider": "brightdata", "username": "YOUR_USER", "password": "YOUR_PASS", "zone": "residential", "country": "US"}

// Oxylabs
{"provider": "oxylabs", "username": "YOUR_USER", "password": "YOUR_PASS", "proxy_type": "residential", "country": "US"}

// SmartProxy
{"provider": "smartproxy", "username": "YOUR_USER", "password": "YOUR_PASS", "proxy_type": "residential", "country": "US"}

// Any proxy URL
{"provider": "raw_urls", "urls": ["http://user:pass@proxy.example.com:8080"]}
```

### Error Handling

| Situation | What happens |
|-----------|-------------|
| Google cookie-consent page on a fresh proxy IP | Dismissed automatically during session setup |
| Place URL has no place ID (short link / bare name) | Logs a warning, skips that URL, continues |
| A place returns no reviews | Logs, moves to next place — partial results always returned |
| `maxReviews` reached | Stops pagination cleanly, dataset is complete |
| Run hits spending limit | Stops gracefully — no partial-page leakage |

### Frequently Asked Questions

**Do I need a proxy?**
Not for small runs (under ~100 reviews total). For large scrapes or scraping reviews for many places at once, a residential proxy reduces the chance of rate limiting. Set `proxy.useApifyProxy = true` with group `RESIDENTIAL` for the easiest option.

**What is the difference between `startUrls` and `placeIds`?**
Both fetch reviews from the same Google endpoint — they only differ in how you point at the place. `startUrls` takes the Google Maps URL (recommended — just copy it from the address bar). `placeIds` takes the raw hex feature ID (`0x…:0x…`) if you already have it.

**How do I target a place?** See [How to Get a Google Maps Place URL](#how-to-get-a-google-maps-place-url) — copy the full URL from your browser's address bar and paste it into **Place URLs**. That's all most users need.

**Why doesn't `ChIJ…` work as a place ID?**
The `ChIJ…` string is a base64-encoded identifier; the reviews endpoint requires the raw hex feature ID (`0x…:0x…`). Just pass the full place URL instead — it contains the hex ID in its `…!1s0x…:0x…` segment and resolves automatically.

**Why do I get fewer reviews than the count shown on Google?**
Google's headline count (e.g. "25 reviews") includes star-only ratings with no written text. This actor returns reviews **with text**, so the row count is usually lower. The star-only ratings are not individually retrievable.

**How many reviews can I scrape per place?**
As many as the business has. Google Maps shows up to several thousand reviews per place depending on the sort order. Set `maxReviews` as high as needed — the actor paginates automatically.

**Why are some review texts empty?**
Occasionally a returned review has `text: null` (the rating, date, and reviewer metadata are still present). Star-only ratings that Google never lists as individual reviews are not returned at all.

**Why are some `absolute_date` values approximate (e.g., "March 2026" vs a full date)?**
Google Maps exposes an approximate date string for most reviews (month + year). The exact day is not available through the reviews endpoint.

**How do I sort reviews to find the most critical ones?**
Set `reviewsSort: "lowestRating"` — the actor fetches 1-star reviews first.

**Can I scrape reviews in other languages?**
Yes. Set `language` to any BCP-47 code (e.g., `de`, `fr`, `ja`, `es`). This controls the language of relative time strings and UI text in the response; it does not filter reviews — Google returns reviews in all languages regardless.

**Is this cheaper than other review scrapers on Apify?**
At $0.0005/review ($0.50 per 1,000), this matches the lowest mainstream per-review rates on the platform — and includes English translations, review photos, likes, and owner responses with no add-on fees. You only pay for reviews actually delivered.

### Related Actors

Building a broader data pipeline? These actors use the same proxy config format and Pydantic-validated output.

#### Local business intelligence

- **[Google Maps Scraper](https://apify.com/herus13/google-maps-scraper)** — Extract business leads — emails, phone numbers, social links, 24 fields per business. Flat $7 per 1,000 results with emails included.

#### Lead generation

- **[LinkedIn Profile Scraper](https://apify.com/herus13/linkedin-profile-scraper)** — Scrape LinkedIn profiles via your li\_at cookie. Structured fields, full experience history, optional contact enrichment.

#### Lead generation / Hiring

- **[LinkedIn Jobs Scraper](https://apify.com/herus13/linkedin-jobs-scraper)** — Scrape LinkedIn job listings with 30 fields per job — company enrichment, salary, recruiter info, full description.

#### E-commerce intelligence

- **[TikTok Shop Product Scraper](https://apify.com/herus13/tiktok-shop-scraper)** — Scrape TikTok Shop products across 10 regions — variants, prices, seller info, ratings, sold counts.

# Actor input Schema

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

Google Maps place URLs to scrape reviews from. Open the place in Google Maps, copy the full URL from your browser's address bar, and paste it here (one per line). Example: <code>https://www.google.com/maps/place/Trà+sữa+Feeling+Tea/@9.29,105.73,17z/data=!4m8!3m7!1s0x31a1090bfc613b0d:0x236a0a4f8f3febce!...</code>. See the README for how to get a place URL.

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

Raw Google place IDs in the <b>hex feature-id form</b> <code>0x…:0x…</code>. Most users should paste a Place URL above instead — use this only if you already have hex IDs. <code>ChIJ…</code> IDs are not supported; paste the place's URL instead.

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

Maximum number of reviews to scrape per place. Set to <code>0</code> for unlimited. Note: Google counts star-only ratings (no text) in a place's total, but only reviews <i>with text</i> are returned as records.

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

Order of returned reviews. Use <b>Highest rating first</b> with a small Max reviews to get a place's top reviews; <b>Newest first</b> for monitoring fresh feedback.

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

BCP-47 language code for review text (e.g. <code>en</code>, <code>de</code>, <code>fr</code>, <code>vi</code>). Affects the language Google returns review text in.

## `proxy` (type: `object`):

Proxy configuration. Residential proxies are recommended — Google rate-limits datacenter IPs aggressively for review endpoints.

## `debugDumpRaw` (type: `boolean`):

If on, the first raw <code>batchexecute</code> reviews response is saved to the key-value store (key <code>DEBUG\_LISTUGCPOSTS\_RAW</code>) for troubleshooting. Leave off for normal runs.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.google.com/maps/place/Tr%C3%A0+s%E1%BB%AFa+Feeling+Tea+B%E1%BA%A1c+Li%C3%AAu/@9.2958277,105.7306288,17z/data=!4m8!3m7!1s0x31a1090bfc613b0d:0x236a0a4f8f3febce!8m2!3d9.2958224!4d105.7332037!9m1!1b1!16s%2Fg%2F11s_z0qsz8"
  ],
  "maxReviews": 100,
  "reviewsSort": "newest",
  "language": "en",
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "debugDumpRaw": false
}
```

# Actor output Schema

## `results` (type: `string`):

List of reviews with rating, text, owner response, and reviewer details extracted from Google Maps

# 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": [
        "https://www.google.com/maps/place/Tr%C3%A0+s%E1%BB%AFa+Feeling+Tea+B%E1%BA%A1c+Li%C3%AAu/@9.2958277,105.7306288,17z/data=!4m8!3m7!1s0x31a1090bfc613b0d:0x236a0a4f8f3febce!8m2!3d9.2958224!4d105.7332037!9m1!1b1!16s%2Fg%2F11s_z0qsz8"
    ],
    "maxReviews": 100,
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("herus13/google-maps-reviews-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 = {
    "startUrls": ["https://www.google.com/maps/place/Tr%C3%A0+s%E1%BB%AFa+Feeling+Tea+B%E1%BA%A1c+Li%C3%AAu/@9.2958277,105.7306288,17z/data=!4m8!3m7!1s0x31a1090bfc613b0d:0x236a0a4f8f3febce!8m2!3d9.2958224!4d105.7332037!9m1!1b1!16s%2Fg%2F11s_z0qsz8"],
    "maxReviews": 100,
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("herus13/google-maps-reviews-scraper").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 '{
  "startUrls": [
    "https://www.google.com/maps/place/Tr%C3%A0+s%E1%BB%AFa+Feeling+Tea+B%E1%BA%A1c+Li%C3%AAu/@9.2958277,105.7306288,17z/data=!4m8!3m7!1s0x31a1090bfc613b0d:0x236a0a4f8f3febce!8m2!3d9.2958224!4d105.7332037!9m1!1b1!16s%2Fg%2F11s_z0qsz8"
  ],
  "maxReviews": 100,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call herus13/google-maps-reviews-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Maps Reviews Scraper — Photos, Ratings & Translations",
        "description": "Scrape Google Maps reviews by place URL or place ID. Get review text with English translation, star ratings, attached photos, likes, owner responses, dates, and reviewer profiles — 20 fields. $0.50 per 1,000 reviews; pay only for what you get.",
        "version": "0.1",
        "x-build-id": "gzkAoI7EPzUypqEWG"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/herus13~google-maps-reviews-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-herus13-google-maps-reviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/herus13~google-maps-reviews-scraper/runs": {
            "post": {
                "operationId": "runs-sync-herus13-google-maps-reviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/herus13~google-maps-reviews-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-herus13-google-maps-reviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "startUrls": {
                        "title": "Place URLs",
                        "type": "array",
                        "description": "Google Maps place URLs to scrape reviews from. Open the place in Google Maps, copy the full URL from your browser's address bar, and paste it here (one per line). Example: <code>https://www.google.com/maps/place/Trà+sữa+Feeling+Tea/@9.29,105.73,17z/data=!4m8!3m7!1s0x31a1090bfc613b0d:0x236a0a4f8f3febce!...</code>. See the README for how to get a place URL.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "placeIds": {
                        "title": "Place IDs",
                        "type": "array",
                        "description": "Raw Google place IDs in the <b>hex feature-id form</b> <code>0x…:0x…</code>. Most users should paste a Place URL above instead — use this only if you already have hex IDs. <code>ChIJ…</code> IDs are not supported; paste the place's URL instead.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxReviews": {
                        "title": "Max reviews per place",
                        "type": "integer",
                        "description": "Maximum number of reviews to scrape per place. Set to <code>0</code> for unlimited. Note: Google counts star-only ratings (no text) in a place's total, but only reviews <i>with text</i> are returned as records.",
                        "default": 100
                    },
                    "reviewsSort": {
                        "title": "Sort order",
                        "enum": [
                            "newest",
                            "mostRelevant",
                            "highestRating",
                            "lowestRating"
                        ],
                        "type": "string",
                        "description": "Order of returned reviews. Use <b>Highest rating first</b> with a small Max reviews to get a place's top reviews; <b>Newest first</b> for monitoring fresh feedback.",
                        "default": "newest"
                    },
                    "language": {
                        "title": "Language",
                        "type": "string",
                        "description": "BCP-47 language code for review text (e.g. <code>en</code>, <code>de</code>, <code>fr</code>, <code>vi</code>). Affects the language Google returns review text in.",
                        "default": "en"
                    },
                    "proxy": {
                        "title": "Proxy",
                        "type": "object",
                        "description": "Proxy configuration. Residential proxies are recommended — Google rate-limits datacenter IPs aggressively for review endpoints."
                    },
                    "debugDumpRaw": {
                        "title": "Debug: dump raw API response",
                        "type": "boolean",
                        "description": "If on, the first raw <code>batchexecute</code> reviews response is saved to the key-value store (key <code>DEBUG_LISTUGCPOSTS_RAW</code>) for troubleshooting. Leave off for normal runs.",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
