# Google Workspace Marketplace App Review Extractor by App ID (`nimbryxo-studio/google-workspace-marketplace-app-review-extractor`) Actor

Pull public reviews for a specific Google Workspace Marketplace app by its App ID, with reviewer name, star rating, review text, posting date and helpful-vote count, filterable by minimum rating and sort order.

- **URL**: https://apify.com/nimbryxo-studio/google-workspace-marketplace-app-review-extractor.md
- **Developed by:** [Nimbryxo-studio](https://apify.com/nimbryxo-studio) (community)
- **Categories:** Automation, Integrations, Other
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 1,000 results

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/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 Workspace Marketplace App Review Extractor

Collect the public user reviews of any Google Workspace Marketplace app - stars, review text, date, reviewer, helpful votes and the developer's replies - for one app or a whole watchlist. No Google account, cookie, API key or proxy is needed.

The actor paginates the public review list and deduplicates overlapping pages, so a request for 100 reviews returns 100 unique reviews instead of repeated first-page rows.

### What this actor does

- **One row per review** - rating, text, date, reviewer, helpful votes and developer replies
- **Multiple apps** - pass app IDs or full Marketplace URLs in one run
- **Pagination** - follows the public review list page by page and removes duplicates
- **Filters** - rating range, date window and review-text keyword
- **Languages** - 28 Marketplace language slices or the mixed "All languages" stream
- **App context** - developer, listing rating, exact installs, pricing class, icon and links
- **Empty fields are omitted** - never `null`, blank or placeholder values

### Output per review

One row per review:

| Field | Meaning |
|---|---|
| `reviewId` | Marketplace review identifier |
| `appId`, `appName`, `appUrl`, `sourceUrl` | App identity and listing URL |
| `rating` | 1-5 stars |
| `reviewText` | Review body (omitted for rating-only reviews) |
| `reviewDate`, `reviewTimestamp` | Posting date and full UTC timestamp |
| `reviewerName`, `reviewerAvatarUrl` | Public reviewer identity and avatar |
| `helpfulCount` | Other users' helpful votes |
| `reviewLanguage` | Language slice when a specific language is requested |
| `developerReply`, `developerReplyDate`, `developerReplyTimestamp`, `developerReplyAuthor` | Latest developer reply |
| `developerReplies[]` | Every reply on the review (`text`, `date`, `timestamp`, `author`, `avatarUrl`, `replyId`) |
| `hasDeveloperReply`, `replyCount` | Reply flags |
| `appDeveloper`, `appDeveloperWebsite` | Publisher identity |
| `appRating`, `appReviewCount`, `appInstallCount`, `appInstallsLabel` | Listing rating, rating count and exact installs |
| `appPricingModel` | Free, Free trial, Freemium or Paid (omitted when unpublished) |
| `appIconUrl`, `appWorksWith[]`, `appLastUpdated` | Listing media, Google apps it plugs into, last update date |
| `appTermsUrl`, `appPrivacyUrl`, `appSupportUrl`, `appWebsiteUrl` | Published listing links |
| `recordType`, `scrapedAt` | Record marker and scrape time |

Empty values are omitted at every depth, so every row contains only real data.

### Input

| Input | Default | What it does |
|---|---|---|
| `appIds` | `["539341275670"]` | App IDs or full Marketplace URLs. Duplicates are removed. Legacy saved tasks that send a single `appId` still work. |
| `maxItems` | `100` | Total reviews saved across all apps. |
| `maxReviewsPerApp` | `2000` | Hard per-app ceiling; unused slots are offered to the next app. |
| `sortBy` | `MostRelevant` | `MostRelevant` / `MostHelpful` use Google's helpful ranking; `Newest` uses the date ranking; `HighestRated` / `LowestRated` sort the fetched reviews. |
| `reviewLanguage` | `en` | 28 Marketplace language slices, or `all` for the site's mixed "All languages" stream. |
| `minRating`, `maxRating` | - | Star range (1-5). `maxRating: 2` keeps complaints only. |
| `sinceDate`, `untilDate` | - | ISO date/datetime, or a relative period such as `30 days`, `2 weeks`, `6 months`. |
| `reviewKeyword` | - | Case-insensitive text that must appear in the review. |

Only `appIds` (or the legacy `appId`) is needed. Everything else has a working default.

#### Examples

One app, newest first:

```json
{
  "appIds": ["539341275670"],
  "maxItems": 100,
  "sortBy": "Newest"
}
```

A watchlist of IDs and URLs, complaints from the last 90 days:

```json
{
  "appIds": [
    "539341275670",
    "https://workspace.google.com/marketplace/app/form_presenter+timer/93519377337"
  ],
  "maxItems": 200,
  "maxReviewsPerApp": 100,
  "maxRating": 2,
  "sinceDate": "90 days"
}
```

German reviews that mention a specific word:

```json
{
  "appIds": ["218858140171"],
  "reviewLanguage": "de",
  "reviewKeyword": "Rechnung",
  "maxItems": 50
}
```

### Reliability and coverage

- **Pagination** stops at the source total, repeated pages with no new review IDs, the per-app cap, or a safety page cap. Review IDs are deduplicated, so page overlap never produces duplicate rows.
- **Replies** are attached to the reviews that carry them.
- **Rating, date and keyword filters** are applied to the fetched reviews. Restrictive filters scan more pages automatically; raise `maxReviewsPerApp` for deeper history.
- **Network errors** are retried on 429/5xx. A bad App ID is skipped with a clear status message, and the remaining apps still run.
- **No proxy, no cookies**: no account, login, cookie, API key or proxy setup is needed.

### Use cases

- **App due diligence** - read recent complaints and developer responses before adopting an add-on
- **Review monitoring** - track new reviews for a watchlist of Marketplace apps
- **Competitive research** - compare ratings, installs and feedback across similar apps
- **Product quality** - surface recurring issues by rating, date or keyword
- **Localization QA** - inspect reviews in a specific language slice

### FAQ

**How many reviews can I collect?** Up to 2,000 per app (`maxReviewsPerApp`) and up to 5,000 per run (`maxItems`). The Marketplace serves text reviews in 10-review pages; rating-only reviews have no body and are not part of the text review total.

**Why does an app show thousands of ratings but fewer text reviews?** The listing's rating count includes rating-only reviews. The review service returns reviews with text, split by language. Both numbers are real.

**Why pick a language?** The site serves one language slice at a time. `reviewLanguage` gives the complete slice for that language. `all` uses the site's mixed "All languages" stream, whose total can be shorter than the sum of the individual language slices.

**Are review names always present?** Most reviews show a public name and avatar; some are anonymous. Those fields are omitted rather than filled with a placeholder.

**Do all apps have developer replies?** Replies are shown when the developer posted one. They are attached to the reviews that carry them; the actor never invents a reply.

**Are `HighestRated` and `LowestRated` real Marketplace sorts?** The Marketplace only offers helpful and newest ordering. The actor fetches newest reviews and sorts that window by stars. Increase `maxReviewsPerApp` to widen the window.

**Can I search for apps by keyword?** This actor takes app IDs or URLs. Keyword app discovery is a separate Marketplace surface; use the ID from any app URL.

**Can I monitor new reviews?** Use `sinceDate` (for example `7 days`) on a schedule; the actor returns only reviews in that window. Cross-run "new since last run" state is not part of this extractor.

**A URL field looks broken?** App icons, banners and reviewer avatars are public `lh3.googleusercontent.com` URLs and return images without cookies. Listing pages are public HTML. If an app's own terms/privacy/support link is dead, that is the publisher's link, not a scrape error.

**What about an invalid App ID?** The Marketplace returns HTTP 400 for an unknown ID. The actor reports it in the status message and continues with the other apps.

### Limitations

- Caps are 2,000 reviews per app and 5,000 per run.
- The Marketplace exposes two real server sorts; `HighestRated`/`LowestRated` sort the fetched window client-side.
- Reviewer names, avatars and developer replies can be absent upstream; missing values are omitted, never filled.
- Per-review permalinks are not published; `sourceUrl` is the app page.
- Restrictive filters scan a bounded page budget; raise `maxReviewsPerApp` for deeper history.

# Actor input Schema

## `appIds` (type: `array`):

One or more Google Workspace Marketplace apps. Paste numeric App IDs (e.g. 539341275670) or full app URLs. Duplicate IDs are removed automatically.

## `sortBy` (type: `string`):

Most relevant and Most helpful use Google's helpful ranking. Newest uses the date ranking. Highest rated and Lowest rated sort the fetched reviews in the actor; increase Max reviews per app to widen the window.

## `reviewLanguage` (type: `string`):

The Marketplace serves reviews one language at a time. Pick a language for a complete slice, or All languages for the mixed stream the site shows under 'All languages'.

## `minRating` (type: `integer`):

Only include reviews with this rating or higher (1-5). Leave empty for all ratings.

## `maxRating` (type: `integer`):

Only include reviews with this rating or lower (1-5). Use 2 to collect complaints only. Leave empty for all ratings.

## `sinceDate` (type: `string`):

Only reviews posted on or after this date. Use an ISO date (2026-01-01), an ISO datetime, or a relative period such as '30 days', '2 weeks' or '6 months'.

## `untilDate` (type: `string`):

Only reviews posted on or before this date. Use an ISO date (2026-12-31) or an ISO datetime. A bare date includes the whole day.

## `reviewKeyword` (type: `string`):

Case-insensitive text that must appear in the review. Useful for complaints, feature names or product terms. Leave empty for all reviews.

## `maxItems` (type: `integer`):

Maximum number of reviews to save across all apps.

## `maxReviewsPerApp` (type: `integer`):

Maximum reviews to save for any single app. Raise this to scan deeper for sparse filters or rating sorts.

## Actor input object example

```json
{
  "appIds": [
    "539341275670"
  ],
  "sortBy": "MostRelevant",
  "reviewLanguage": "en",
  "maxItems": 3,
  "maxReviewsPerApp": 3
}
```

# Actor output Schema

## `reviews` (type: `string`):

Dataset containing every scraped review. Each row also carries the app's name, developer, rating, install count, pricing model and other listing context.

# 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 = {
    "appIds": [
        "539341275670"
    ],
    "sortBy": "MostRelevant",
    "reviewLanguage": "en",
    "maxItems": 3,
    "maxReviewsPerApp": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("nimbryxo-studio/google-workspace-marketplace-app-review-extractor").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 = {
    "appIds": ["539341275670"],
    "sortBy": "MostRelevant",
    "reviewLanguage": "en",
    "maxItems": 3,
    "maxReviewsPerApp": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("nimbryxo-studio/google-workspace-marketplace-app-review-extractor").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 '{
  "appIds": [
    "539341275670"
  ],
  "sortBy": "MostRelevant",
  "reviewLanguage": "en",
  "maxItems": 3,
  "maxReviewsPerApp": 3
}' |
apify call nimbryxo-studio/google-workspace-marketplace-app-review-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nimbryxo-studio/google-workspace-marketplace-app-review-extractor"
        }
    }
}
```

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/XWYg10KEeEDb00gfo/builds/5sUVXMCnWoObzQLM5/openapi.json
