# Google Workspace Marketplace Category Tracker (`dataspryva/google-workspace-marketplace-category-tracker`) Actor

Track ranked apps in any Google Workspace Marketplace category. Returns app name, developer, rating, review count, pricing model, categories, description, icon URL and direct app URL - sorted by rank.

- **URL**: https://apify.com/dataspryva/google-workspace-marketplace-category-tracker.md
- **Developed by:** [Dataspryva](https://apify.com/dataspryva) (community)
- **Categories:** Automation, Developer tools, Integrations
- **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 Category Tracker

Track ranked apps across every Google Workspace Marketplace category, run keyword searches, look up specific apps, and pull their public reviews — without a Google account, API key or proxy.

The actor reads the same public pages and embedded JSON the marketplace serves to a browser. Listings are capped at 100 apps per request, so the actor automatically unions Google's own rating, pricing and "works with" slices to reach deeper into a category when you ask for more rows.

### What it does

- **Category tracking** — 27 categories and curated lists (Most Popular, Top Rated, Featured Partner Apps, Business Tools, Productivity, Education, Connectors and every subcategory), with site rank preserved for the default slice.
- **Keyword search** — one or more queries, ranked separately and deduplicated.
- **App lookup** — pass numeric IDs or full marketplace URLs and get the complete public listing.
- **Reviews** — paginated review rows (10 at a time) with rating, text, date, helpful votes and reviewer name; filter by star range and date, sort by helpful or newest.
- **Real filters** — works-with host, pricing model, minimum rating, review count, installs and developer substring.
- **Extra detail** — exact OAuth scopes, sensitive-access flags and the independent security-verification badge for each app.
- **Deep listings** — when `maxItems` exceeds what the default page returns, the actor fetches additional rating/pricing/host slices and deduplicates by app ID.
- **Omit-empty output** — a field the marketplace does not publish is left out of that record, never `null` or a placeholder.

### Modes

| Mode | What it returns | Required input |
|---|---|---|
| `category` (default) | Ranked apps from one or more categories or curated lists | `categories` (defaults to `popular-apps`) |
| `search` | Ranked apps for one or more keyword queries | `searchQueries` |
| `appDetails` | Full records for specific apps | `appIds` |
| `reviews` | Review rows only | `appIds` |

Add `includeReviews` to `category`, `search` or `appDetails` to emit app rows and review rows in the same run.

### Input options

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | select | `category` | What to scrape |
| `categories` | multi-select | `["popular-apps"]` | Category/curated-list slugs (mode=category) |
| `searchQueries` | string list | — | Keywords (mode=search) |
| `appIds` | string list | — | Numeric IDs or marketplace URLs (appDetails/reviews) |
| `worksWith` | select | `any` | Drive, Docs, Sheets, Slides, Forms, Gmail, Calendar, Chat, Meet, Classroom, Gemini, Studio |
| `pricing` | select | `any` | Free, Free trial, Freemium, Paid |
| `minRating` | number | `0` | Keep apps rated at least this (0–5) |
| `minReviews` | integer | `0` | Keep apps with at least this many ratings |
| `minInstalls` | integer | `0` | Keep apps with at least this many exact installs |
| `developerFilter` | text | — | Keep apps whose developer name or website contains this text |
| `includeDetails` | boolean | `false` | Add OAuth scopes, sensitive-access flags and security badge |
| `includeReviews` | boolean | `false` | Emit review rows for matched apps |
| `sortBy` | select | `helpful` | `helpful` or `recent` |
| `minReviewRating` | integer | `1` | Lowest review star rating to keep |
| `maxReviewRating` | integer | `5` | Highest review star rating to keep |
| `reviewsSince` | text | — | ISO date, e.g. `2026-01-01` |
| `maxReviewsPerApp` | integer | `50` | Review cap per app |
| `includeCategoryMembership` | boolean | `false` | Scan all 27 listings to fill each app's `categories` |
| `maxItems` | integer | `100` | Max app rows (max review rows in `reviews` mode) |

### Output fields

#### App rows (`recordType: "workspace_app"`)

| Field | Description |
|---|---|
| `rankInCategory` | 1-based rank in the category's default listing (omitted for apps only found in later slices) |
| `rankInResults` | 1-based rank in the keyword search default listing |
| `category` / `categories` | Selected category and (when resolved) the app's category memberships |
| `searchQuery` / `searchQueries` | Keyword that matched the app |
| `appId`, `slug`, `name` | Identity |
| `shortDescription`, `longDescription` | Listing descriptions |
| `developer`, `developerWebsite` | Publisher |
| `rating`, `reviewCount` | Average stars and rating count |
| `installCount`, `installsLabel` | Exact installs (e.g. `97456341`) and the public band (e.g. `97M+`) |
| `pricingModel` | `Free`, `Free trial`, `Freemium` or `Paid` (omitted when the listing does not state pricing) |
| `worksWith` | Google apps the listing works with |
| `lastUpdated` | Listing update date (`YYYY-MM-DD`) |
| `iconUrl`, `bannerUrl`, `screenshots` | Public image URLs |
| `supportUrl`, `privacyPolicyUrl`, `termsOfServiceUrl` | Links published on the listing |
| `appUrl`, `sourceUrl` | Canonical marketplace app page |
| `securityVerified` | `true` when the independent security-verification badge is shown |
| `oauthScopes`, `oauthScopeCount`, `sensitiveAccess` | Requested OAuth scopes and flags such as `gmailFullAccess` |
| `recordType`, `scrapedAt` | Row metadata |

#### Review rows (`recordType: "workspace_review"`)

`reviewId`, `appId`, `appName`, `appUrl`, `reviewerName`, `reviewerAvatarUrl`, `rating`, `reviewText`, `reviewDate`, `helpfulCount`, `sourceUrl`, `scrapedAt`.

### Example inputs

Track the top 50 apps in a category, including OAuth permissions:

```json
{
  "mode": "category",
  "categories": ["business-tools/sales-and-crm"],
  "maxItems": 50,
  "includeDetails": true
}
```

Deep-scan productivity with a filter, plus reviews:

```json
{
  "mode": "category",
  "categories": ["productivity"],
  "worksWith": "sheets",
  "minRating": 4,
  "maxItems": 250,
  "includeReviews": true,
  "sortBy": "recent",
  "maxReviewRating": 2,
  "maxReviewsPerApp": 20
}
```

Look up apps by URL or ID:

```json
{
  "mode": "appDetails",
  "appIds": [
    "https://workspace.google.com/marketplace/app/lucidchart/7081045131",
    "1014160490159"
  ],
  "includeDetails": true
}
```

Pull 100 newest reviews for one app:

```json
{
  "mode": "reviews",
  "appIds": ["7081045131"],
  "sortBy": "recent",
  "maxItems": 100
}
```

### Example output

```json
{
  "recordType": "workspace_app",
  "rankInCategory": 1,
  "category": "productivity",
  "categories": ["productivity"],
  "appId": "1014160490159",
  "slug": "colaboratory",
  "name": "Colaboratory",
  "shortDescription": "This allows Google Colaboratory to open and create files in Google Drive.",
  "developer": "Colaboratory team",
  "developerWebsite": "https://colab.research.google.com",
  "rating": 4.68,
  "reviewCount": 3824,
  "installCount": 97456341,
  "installsLabel": "97M+",
  "worksWith": ["Drive"],
  "lastUpdated": "2025-08-25",
  "iconUrl": "https://lh3.googleusercontent.com/bY20qlnjiFpsT_MtcuOGIAZ70lsnGe00yNVFF4hWT3QCz0-r7Rk",
  "appUrl": "https://workspace.google.com/marketplace/app/colaboratory/1014160490159",
  "sourceUrl": "https://workspace.google.com/marketplace/app/colaboratory/1014160490159",
  "scrapedAt": "2026-11-08T10:00:00+00:00"
}
```

### FAQ

**Do I need a Google account, API key or proxy?**
No. Every field comes from public marketplace pages and their embedded JSON. The actor makes direct HTTP requests and needs no credentials.

**How do I get more than 100 apps from one category?**
The marketplace returns at most 100 apps per request. The actor works around this by fetching the category through Google's own rating, pricing and works-with slices and merging the results. Set `maxItems` above 100 to enable the extra slices. Very broad categories can still be deeper than the slice union; split them by subcategory or add a works-with filter for full coverage of a narrower slice.

**Why is `rankInCategory` missing on some rows?**
Rank comes from the category's default (unsliced) page. Apps that only appear in a later slice have no position on that page, so the field is omitted rather than invented.

**Why do some apps have no `pricingModel`?**
Some listings do not state pricing. That row simply omits the field instead of guessing "Free".

**How many reviews can I get?**
The actor pages through the marketplace's review endpoint 10 at a time, up to `maxReviewsPerApp` (maximum 2,000). The marketplace may report slightly different totals between calls, so reviews are deduplicated by review ID and the actor stops when a page adds nothing new.

**Can I get developer replies to reviews?**
No. The public review payload does not contain developer replies, so the actor does not invent them.

**What does `includeCategoryMembership` do?**
The marketplace does not expose an app's category list on its app page. That option scans all 27 category listings and records which ones include the app. Because each listing shows at most 100 apps, membership is limited to those listing pages.

**What are `sensitiveAccess` flags?**
They summarise OAuth scopes: `gmailFullAccess`, `driveFullAccess`, `calendarFullAccess`, `contacts` and `adminDirectory`. Use them to audit what an add-on can access before installing it.

**Can I monitor changes between runs?**
Export the dataset on a schedule and compare snapshots. This actor returns current data; it does not store state.

### Limitations

- Each marketplace listing request is capped at 100 apps. Deep listing coverage is best-effort through Google's rating, pricing and works-with slices.
- Google ignores the Gemini and Studio host filters on listing URLs; those works-with values are applied to the rows the actor already fetched.
- Category membership is limited to the top-100 page of each category.
- Review totals reported by the marketplace fluctuate; review pagination stops at the reported total or when three consecutive pages add nothing new.
- Developer replies, emails, phone numbers and trader addresses are not published in the listing payload and are not fabricated.

### Data source

Public pages under `workspace.google.com/marketplace`: category and curated-list pages, search results, app detail pages, and the marketplace's own review endpoint. This actor is independent and not affiliated with Google.

# Actor input Schema

## `mode` (type: `string`):

Pick a category/curated list, a keyword search, specific apps, or their reviews.

## `categories` (type: `array`):

One or more marketplace categories or curated lists. All selected categories are unioned and deduplicated.

## `searchQueries` (type: `array`):

Keywords to search in the marketplace, e.g. "mail merge", "crm", "pdf". Each query is ranked separately and results are deduplicated.

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

Numeric app IDs or full marketplace app URLs, e.g. 7081045131 or https://workspace.google.com/marketplace/app/lucidchart/7081045131.

## `worksWith` (type: `string`):

Only keep apps that integrate with this Google app. Applied to listings and app lookups.

## `pricing` (type: `string`):

Only keep apps with this pricing model. Apps that do not state pricing are excluded when a specific model is selected.

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

Only keep apps rated at least this (0–5). Leave 0 for any rating.

## `minReviews` (type: `integer`):

Only keep apps with at least this many ratings. Leave 0 for any.

## `minInstalls` (type: `integer`):

Only keep apps with at least this many exact installs. Leave 0 for any.

## `developerFilter` (type: `string`):

Only keep apps whose developer name or website contains this text, e.g. "zoho" or "lucidchart.com".

## `includeDetails` (type: `boolean`):

Open each app page to add the exact OAuth scopes, sensitive-access flags and independent security-verification badge. Adds one request per app.

## `includeReviews` (type: `boolean`):

Also output the reviews of every matched app as separate rows (recordType workspace_review). Adds one app page request plus up to maxReviewsPerApp / 10 review-page requests per app.

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

Order of reviews when reviews are collected.

## `minReviewRating` (type: `integer`):

Only include reviews with at least this star rating (1–5).

## `maxReviewRating` (type: `integer`):

Only include reviews with at most this star rating (1–5). Set 2 for complaints only.

## `reviewsSince` (type: `string`):

Only include reviews posted on or after this date, e.g. 2026-01-01. Leave blank for no date limit.

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

Stop after this many matching reviews per app.

## `includeCategoryMembership` (type: `boolean`):

Scan all 27 category listings to fill each app's categories list (top-100 listings only). Adds 27 requests.

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

Maximum app rows to return. Listings are fetched in slices until this many matching apps are found (or the marketplace is exhausted). In reviews mode this caps review rows instead.

## Actor input object example

```json
{
  "mode": "category",
  "categories": [
    "popular-apps"
  ],
  "searchQueries": [],
  "appIds": [],
  "worksWith": "any",
  "pricing": "any",
  "minRating": 0,
  "minReviews": 0,
  "minInstalls": 0,
  "developerFilter": "",
  "includeDetails": false,
  "includeReviews": false,
  "sortBy": "helpful",
  "minReviewRating": 1,
  "maxReviewRating": 5,
  "reviewsSince": "",
  "maxReviewsPerApp": 50,
  "includeCategoryMembership": false,
  "maxItems": 3
}
```

# Actor output Schema

## `apps` (type: `string`):

Dataset containing apps with rank, metadata, URLs, works-with hosts and optional OAuth permission data.

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

Dataset containing review rows when includeReviews is on or mode=reviews.

# 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 = {
    "mode": "category",
    "categories": [
        "popular-apps"
    ],
    "worksWith": "any",
    "pricing": "any",
    "minRating": 0,
    "minReviews": 0,
    "minInstalls": 0,
    "includeDetails": false,
    "includeReviews": false,
    "sortBy": "helpful",
    "minReviewRating": 1,
    "maxReviewRating": 5,
    "maxReviewsPerApp": 50,
    "includeCategoryMembership": false,
    "maxItems": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("dataspryva/google-workspace-marketplace-category-tracker").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 = {
    "mode": "category",
    "categories": ["popular-apps"],
    "worksWith": "any",
    "pricing": "any",
    "minRating": 0,
    "minReviews": 0,
    "minInstalls": 0,
    "includeDetails": False,
    "includeReviews": False,
    "sortBy": "helpful",
    "minReviewRating": 1,
    "maxReviewRating": 5,
    "maxReviewsPerApp": 50,
    "includeCategoryMembership": False,
    "maxItems": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("dataspryva/google-workspace-marketplace-category-tracker").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 '{
  "mode": "category",
  "categories": [
    "popular-apps"
  ],
  "worksWith": "any",
  "pricing": "any",
  "minRating": 0,
  "minReviews": 0,
  "minInstalls": 0,
  "includeDetails": false,
  "includeReviews": false,
  "sortBy": "helpful",
  "minReviewRating": 1,
  "maxReviewRating": 5,
  "maxReviewsPerApp": 50,
  "includeCategoryMembership": false,
  "maxItems": 3
}' |
apify call dataspryva/google-workspace-marketplace-category-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dataspryva/google-workspace-marketplace-category-tracker"
        }
    }
}
```

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/gwPRRDAv7ARz2kf6J/builds/mQKNO4t6I3leVDPHs/openapi.json
