# Google Maps Reviews Scraper Pro (`goldenbios/my-actor`) Actor

Extract Google Maps reviews with review text, ratings, dates, photos, and owner responses for reputation management, local SEO, and market research. Filter by date and rating, isolate photo or owner-answered reviews, skip textless reviews, and get a per-place analytics summary.

- **URL**: https://apify.com/goldenbios/my-actor.md
- **Developed by:** [Goldenbios](https://apify.com/goldenbios) (community)
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.50 / 1,000 results

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 Pro

Extract Google Maps reviews with the data fields and controls serious review analysis needs: review text, star ratings, publication dates, reviewer details, photos, and owner responses. Use it for reputation management, local SEO, customer research, competitor monitoring, and review reporting without copying reviews from Google Maps by hand.

Google Maps Reviews Scraper Pro goes beyond a basic list of reviews. It can isolate the exact slice you need with date and rating filters, return only reviews with photos, return only reviews answered or not answered by the owner, and remove textless reviews before export. Every place can also produce an analytics summary with a rating histogram, average rating, owner response rate, photo rate, reviews per month, and completeness accounting that compares the reviews fetched with the total reported by Google.

### Why switch

| Capability | Google Maps Reviews Scraper Pro | Most popular alternative |
|---|---:|---:|
| Extract review text, ratings, dates, photos, and owner responses | Yes | Yes |
| Full date range with both a start date and an end date | Yes | No end date |
| Minimum and maximum rating filters | Yes | No |
| Return only reviews with photos | Yes | No |
| Return only reviews with an owner response | Yes | No |
| Return only unanswered reviews | Yes | No |
| Skip textless, star-only reviews | Yes | No |
| Use Google Maps share links, including share.google links | Yes | No |
| Per-place analytics summary | Yes | No |
| Completeness accounting against the Google reported total | Yes | No |
| Resume an interrupted run from saved progress | Yes | No |

### What you can do with it

- Audit a business and find reviews the owner has not answered.
- Collect low-rated reviews for customer support and service recovery.
- Track review volume, rating trends, photo usage, and owner response rates.
- Compare locations or competitors over a defined date range.
- Export structured review data to JSON, CSV, Excel, or your own pipeline through the Apify API.
- Build a clean review dataset by removing star-only reviews or focusing on reviews with written feedback and photos.

### Inputs

| Input | Description | Default |
|---|---|---|
| `startUrls` | Google Maps place URLs. Full place URLs and short share links are supported, including share.google, goo.gl/maps, and maps.app.goo.gl links. | Example place URL prefilled |
| `placeIds` | Google Place IDs beginning with ChIJ or Google Maps feature IDs in the 0x...:0x... format. | Empty |
| `maxReviews` | Maximum number of reviews to return for each place. | 10,000,000 |
| `reviewsSort` | Sort order: `newest`, `mostRelevant`, `highestRanking`, or `lowestRanking`. | `newest` |
| `reviewsStartDate` | Only return reviews published on or after this date, in YYYY-MM-DD format. | Empty |
| `reviewsEndDate` | Only return reviews published on or before this date, in YYYY-MM-DD format. | Empty |
| `reviewsFilterString` | Only return reviews whose text contains this keyword, ignoring case. | Empty |
| `language` | Language code for the result context, such as `en`, `fr`, `de`, `es`, or `ar`. | `en` |
| `reviewsOrigin` | Choose reviews from all sources Google aggregates or native Google reviews only. | `all` |
| `minRating` | Only return reviews with at least this rating. Use it alone or with `maxRating` to create a rating range. | Empty |
| `maxRating` | Only return reviews with at most this rating. Use it alone or with `minRating` to create a rating range. | Empty |
| `onlyWithPhotos` | Return only reviews that include at least one photo. | `false` |
| `onlyWithOwnerResponse` | Return only reviews that have an owner response. | `false` |
| `onlyUnanswered` | Return only reviews that do not have an owner response. | `false` |
| `skipTextlessReviews` | Exclude reviews that contain a rating but no written text. | `false` |
| `personalData` | Include reviewer names, profile links, avatars, and reviewer statistics when available. Turn it off to remove those fields from review items. | `true` |
| `includeSummary` | Add one summary item for each place with analytics and completeness accounting. | `true` |
| `resume` | Save progress during extraction and reuse it if the same run is restarted. | `true` |
| `maxPagesSafety` | Internal safety limit for the maximum number of result pages fetched for one place. | 10,000 |
| `proxyConfiguration` | Proxy settings used by the Actor. The prepared default uses Apify Proxy residential proxies. | Apify Proxy, RESIDENTIAL |
| `diagnosticMode` | Internal measurement mode for support and diagnostics. Leave it off for normal review extraction. | `false` |

### Output

The default dataset contains review items and, when `includeSummary` is enabled, one summary item for each place. Filter items by the `type` field.

#### Review items

Each item with `type` set to `review` can contain:

| Field | Description |
|---|---|
| `placeId`, `placeName`, `placeAddress` | The Google place associated with the review. Name and address are included when resolved. |
| `reviewId` | Google review identifier. |
| `reviewUrl` | Direct review URL when the source data provides one. This field can be null. |
| `origin` | Review source reported by Google, normally `Google` on the primary extraction route. |
| `reviewerName`, `reviewerProfileUrl`, `reviewerAvatarUrl` | Public reviewer details when available and when `personalData` is enabled. |
| `reviewerReviewCount`, `localGuideLevel` | Reviewer statistics when the source data provides them. These fields can be null. |
| `rating`, `ratingScale` | Review rating and the scale used by the source. |
| `text`, `textOriginal`, `textTranslated` | Review text, its original form, and a translation when Google provides one. |
| `language`, `translatedLanguage` | Language codes for the review and translation, when available. |
| `publishedAt`, `publishedAtUnix`, `publishedAtUnixMicros` | Publication time in ISO format and Unix formats, when available. |
| `updatedAtUnixMicros` | Updated time in Unix microseconds, when the source data provides it. |
| `relativeTime` | Google's relative publication label, such as a label equivalent to “3 months ago”, when available. |
| `photos` | URLs of photos attached to the review. |
| `hasOwnerResponse` | Whether the place owner responded to the review. |
| `ownerResponseText`, `ownerResponseLanguage` | Owner response text and language, when present. |
| `ownerResponseAt`, `ownerResponseAtUnix`, `ownerResponseAtUnixMicros` | Owner response time in ISO and Unix formats, when the source data provides it. These fields can be null. |
| `likeCount` | Review like count when the source data provides it. This field can be null. |

#### Summary items

Each item with `type` set to `summary` describes one place and the extraction result for that place:

| Field | Description |
|---|---|
| `placeId`, `placeName`, `placeAddress`, `placeUrl` | Place identity and source URL. Name and address are included when resolved. |
| `googleReportedTotal` | Total review count reported by Google for the place, when it can be resolved. |
| `fetchedCount` | Unique valid reviews fetched before output filters were applied. |
| `emittedCount` | Reviews written to the dataset after filters were applied. |
| `duplicatesSkipped` | Duplicate review records skipped during extraction. |
| `malformedDropped` | Source records dropped because they could not be decoded as valid reviews. |
| `filteredOutCount` | Valid reviews removed by the selected filters. |
| `tokenExhausted` | Whether extraction reached the end of the available review pages. |
| `stoppedReason` | Why extraction stopped, such as reaching `maxReviews`, exhausting the available pages, or reaching a safety limit. |
| `signedOutCapSuspected` | Whether the result shape suggested an anonymous access cap. |
| `isComplete` | Whether pagination reached the end of the available reviews. |
| `completenessPct` | Percentage calculated from `fetchedCount` divided by `googleReportedTotal`, when the Google total is available. |
| `ratingHistogram` | Counts of emitted reviews by star rating, from 1 to 5. |
| `averageRating` | Average rating of the emitted reviews. |
| `pctWithOwnerResponse` | Percentage of emitted reviews with an owner response. |
| `pctWithPhotos` | Percentage of emitted reviews with at least one photo. |
| `reviewsPerMonth` | Emitted review counts for the most recent 12 monthly buckets. |
| `newestReviewAt`, `oldestReviewAt` | Publication dates of the newest and oldest emitted reviews. |
| `extractionRoute` | Internal route label identifying how the reviews were extracted, when a named production route produced the result. |

Failed places can produce an item with `type` set to `error`, including the place ID, place URL, error message, and diagnostic details. Diagnostic runs can produce items with `type` set to `diagnostic`; normal production runs should leave `diagnosticMode` off.

### Popular recipes

#### Find unanswered negative reviews

Set `minRating` to 1, `maxRating` to 2, and `onlyUnanswered` to true. This creates a focused list for customer recovery and reputation work.

#### Build a dated reputation report

Set both `reviewsStartDate` and `reviewsEndDate`, keep `includeSummary` enabled, and use the summary for rating distribution, response rate, photo rate, and review volume by month.

#### Collect reviews with visual proof

Turn on `onlyWithPhotos` when you need reviews that include customer photos for research, listings, marketing review, or product analysis.

#### Remove star-only rows

Turn on `skipTextlessReviews` when your analysis needs written customer feedback rather than ratings alone.

#### Monitor new reviews

Use `reviewsSort` set to `newest` and run the Actor on a schedule through Apify. Compare each new dataset with the previous export in your own workflow.

### FAQ

#### How much does it cost?

The Actor price is $0.50 per 1,000 reviews. Apify platform usage and any proxy usage are charged separately by Apify under your account and plan. Your total cost therefore depends on the run and the proxy settings you choose.

#### Will I always get every review?

The Actor paginates through the reviews Google makes available and reports what happened in the summary. Check `googleReportedTotal`, `fetchedCount`, `isComplete`, `tokenExhausted`, and `stoppedReason` to see whether the result reached the end or stopped because of a limit you selected. This accounting is intentional: a partial result is labeled as partial instead of being presented as complete.

#### Which languages are supported?

Use the `language` input with a language code such as `en`, `fr`, `de`, `es`, or `ar`. Review items preserve the review text supplied by Google and include language fields when available. A translated text field is included only when the source data provides a translation.

#### Can I use it through the API?

Yes. Start the Actor with the Apify API or client libraries, pass the same input fields shown above, and read the resulting dataset items through the Apify dataset API. The dataset can also be exported from the Apify Console in common data formats.

#### Does it accept short Google Maps links?

Yes. Paste a full Google Maps place URL or a short share link. Supported short link hosts include share.google, goo.gl/maps, and maps.app.goo.gl.

#### What does the summary add?

The summary turns a raw review export into an audit trail. It shows how many reviews were fetched and emitted, how many were duplicates, malformed, or filtered out, whether extraction reached the end, and how the emitted reviews are distributed by rating, owner response, photos, and month.

### Honest notes

- This Actor extracts public Google Maps data made available anonymously. It does not use a Google account, private data, or data behind a sign-in.
- Google can change or limit what its public surfaces return. The summary is designed to make limits visible through completeness and stop-reason fields.
- `googleReportedTotal` is best effort. It can be null when Google does not expose or resolve a total for a place, in which case `completenessPct` is also null.
- Some source fields are not available for every review or every extraction surface. Nullable fields are returned as null rather than filled with invented values.
- Review availability and ordering can change as Google adds reviews and updates its public result sets.

# Actor input Schema

## `diagnosticMode` (type: `boolean`):

Measurement only: resolves each target via the /maps/search page through the proxy and attempts one session-bound review RPC page; writes type='diagnostic' items instead of scraping.

## `includeSummary` (type: `boolean`):

Emit one summary item per place: rating histogram, average rating, % answered, % with photos, reviews per month, and completeness (fetched vs Google's reported total).

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

Language code for the results (e.g. en, fr, de, es, ar).

## `maxPagesSafety` (type: `integer`):

Internal safety guard: maximum RPC pages fetched per place (20 reviews per page). Pagination normally stops on its own when Google runs out of reviews.

## `maxRating` (type: `number`):

Only reviews with at most this rating (1-5). Combine with Minimum rating for a range, e.g. 1-2 to mine unhappy customers.

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

Maximum number of reviews to return per place. The default fetches everything Google will serve.

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

Only reviews with at least this rating (1-5).

## `onlyUnanswered` (type: `boolean`):

Skip reviews that already have an owner response. Ideal for reputation-management prospecting.

## `onlyWithOwnerResponse` (type: `boolean`):

Skip reviews the business never answered.

## `onlyWithPhotos` (type: `boolean`):

Skip reviews that have no photos.

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

When off, reviewer names, profile links, avatars and reviewer stats are removed from the output.

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

Google Place IDs (ChIJ...) or Maps feature IDs (0x...:0x...). Place IDs are resolved to feature IDs automatically.

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

Google blocks requests from datacenter IP addresses (HTTP 403), which is why this actor runs its browser through a proxy. Residential proxies are strongly recommended and are the default below. You pay only your own run's proxy usage; traffic is small because the browser blocks images and map tiles.

## `resume` (type: `boolean`):

Progress is saved after every page. If a run is restarted, already-fetched pages are skipped instead of re-scraped.

## `reviewsEndDate` (type: `string`):

Only reviews published on or before this date (YYYY-MM-DD). The other scraper has no end date; this one does.

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

Only reviews whose text contains this keyword (case-insensitive).

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

'all' keeps reviews from every source Google aggregates; 'google' keeps native Google reviews only.

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

Sort order. 'newest' always fetches fresh (no cached pages).

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

Only reviews published on or after this date (YYYY-MM-DD).

## `skipTextlessReviews` (type: `boolean`):

Exclude star-only reviews with no written text.

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

Google Maps place URLs. Short links work too: share.google.com, goo.gl/maps and maps.app.goo.gl URLs are resolved automatically.

## Actor input object example

```json
{
  "diagnosticMode": false,
  "includeSummary": true,
  "language": "en",
  "maxPagesSafety": 10000,
  "maxReviews": 10000000,
  "onlyUnanswered": false,
  "onlyWithOwnerResponse": false,
  "onlyWithPhotos": false,
  "personalData": true,
  "placeIds": [],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "resume": true,
  "reviewsFilterString": "",
  "reviewsOrigin": "all",
  "reviewsSort": "newest",
  "skipTextlessReviews": false,
  "startUrls": [
    {
      "url": "https://www.google.com/maps/place/Joe's+Pizza+Broadway/@40.7579,-73.9876,17z/data=!4m8!3m7!1s0x89c259ab3c1ef289:0x3b67a41175949f55"
    }
  ]
}
```

# Actor output Schema

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

Default dataset containing review items and per-place summary items.

# 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 = {
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    },
    "startUrls": [
        {
            "url": "https://www.google.com/maps/place/Joe's+Pizza+Broadway/@40.7579,-73.9876,17z/data=!4m8!3m7!1s0x89c259ab3c1ef289:0x3b67a41175949f55"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("goldenbios/my-actor").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 = {
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
    "startUrls": [{ "url": "https://www.google.com/maps/place/Joe's+Pizza+Broadway/@40.7579,-73.9876,17z/data=!4m8!3m7!1s0x89c259ab3c1ef289:0x3b67a41175949f55" }],
}

# Run the Actor and wait for it to finish
run = client.actor("goldenbios/my-actor").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 '{
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "startUrls": [
    {
      "url": "https://www.google.com/maps/place/Joe'\''s+Pizza+Broadway/@40.7579,-73.9876,17z/data=!4m8!3m7!1s0x89c259ab3c1ef289:0x3b67a41175949f55"
    }
  ]
}' |
apify call goldenbios/my-actor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,goldenbios/my-actor"
        }
    }
}
```

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/6xEzug8mbttjmhaSa/builds/2krm2NpPzQl6vYOUZ/openapi.json
