# Google Workspace Marketplace Scraper: Apps & Reviews (`signalscope-data/workspace-marketplace-tracker`) Actor

Scrape & monitor Google Workspace Marketplace apps & developers (Gmail, Docs, Sheets add-ons): exact installs, ratings, OAuth scopes, reviews with complaint insights, market reports. $2/1,000 apps.

- **URL**: https://apify.com/signalscope-data/workspace-marketplace-tracker.md
- **Developed by:** [Bin](https://apify.com/signalscope-data) (community)
- **Categories:** Developer tools, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 apps

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 Workspace Marketplace Scraper: Apps & Reviews

Scrape and **monitor apps on the Google Workspace Marketplace**: the add-ons and integrations for Gmail, Google Docs, Sheets, Slides, Forms, Drive, Calendar, Chat, Meet and Classroom. Each app comes back with its **exact install count** (e.g. `3,638,156`, not just "3M+"), rating, review count, developer, website, pricing model, the Google apps it works with, the listing-updated date and, optionally, **the OAuth permissions it requests** and **the user reviews** (stars, text, date and the developer's reply).

New: **one row per developer** (`outputLevel: "developers"`): every app a company has on the marketplace, with total exact installs, total reviews, weighted rating, website domain and EU trader status, plus developer-level alerts (new app launched, install growth).

New: **market reports** (`includeMarketReport` / `marketReportOnly`): one row per keyword or category that sizes the niche by exact installs: install concentration, median installs, ratings, integrations, pricing mix, stale listings, top developers, **weak incumbents** (big apps with poor ratings) and, on scheduled runs, the fastest-growing apps.

New: **review insights & competitor comparison** (`includeReviewInsights`): what users complain about in each add-on (bugs, authorization, permissions, quota limits, pricing, Google integration, support…) with example quotes, feature requests, rating trend (last 90 days vs older) and developer reply rate, plus a side-by-side comparison that shows each app's **relative weaknesses and strengths** against its competitors.

In monitor mode each run is compared with the previous one. You get **new apps, install growth, new reviews, rating moves, rank changes, listing updates, pricing changes and permission changes**, so a daily schedule becomes an alert feed for your category.

No login, no API key, no browser. It reads the data the marketplace embeds in its public pages, so it's fast and cheap.

### Why this one?

- **Exact installs, not buckets.** The marketplace shows "1M+", but the page data has the exact number. You get `installs` (exact) and `installsLabel`, plus `installsChange` / `installsChangePct` between runs. That's the best public traction metric for Workspace apps.
- **Monitor mode built in.** `outputMode: "new"` returns only apps never seen before; `"changed"` adds `installs-up/down` (with a % threshold), `reviews-up`, `rating-up/down`, `rank-up/down`, `entered-list`, `listing-updated`, `pricing-change`, `renamed` and `permissions-change`.
- **OAuth permissions audit.** With `includeDetails`, every app gets its requested scopes and simple flags such as `gmailFullAccess`, `driveFullAccess`, `calendarFullAccess`, `contacts`, `adminDirectory`, `externalRequests`.
- **User reviews with developer replies.** `includeReviews` adds one row per review: stars, text, date, `developerReply` and `developerReplyAt`. Newest or most helpful first, any review language, complaints-only filter (`maxReviewRating: 2`), date limit, and in monitor mode only reviews posted since the last run.
- **Review insights, not just a review dump.** `includeReviewInsights` adds one `review-insights` row per app: rating distribution, negative share, **rating trend** (`improving` / `stable` / `declining`), **top complaint themes in 1-3★ reviews** with mentions, share and example quotes, **feature requests**, frequent two-word phrases, developer **reply rate and median reply time** — and, with 2+ apps, a `review-comparison` row (themes per 100 reviews for every app, relative weaknesses ≥1.5× the peer median, strengths, rankings). Themes are tuned for Workspace add-ons (quota limits, authorization, OAuth permissions, Google integration). Every review row also gets `topics`.
- **Search, categories and watchlists in one run.** Keyword searches, any of 26 categories and curated lists (Popular, Top rated, Sales & CRM, Education…) and a list of specific app URLs.
- **Filters that matter.** Works with (only Gmail add-ons, only Sheets add-ons…), pricing model, developer, min installs / rating / reviews.
- **Developer view (account list).** `outputLevel: "developers"` groups apps by company and finds the developer's **other apps** too (the marketplace has no developer pages, so it searches the developer's names and website domains). Apps listed under several names or websites of one company (e.g. `Zoho Corporation` + `zoho.com`, `lucidchart.com` + `lucidspark.com`) are merged. Each row: `appCount`, `totalInstalls`, `totalReviews`, `averageRating`, `topApp`, `worksWith`, `pricingModels`, `latestListingUpdate`, `appsNotUpdatedInYear`, `websiteDomain(s)`, `traderStatus`, plus `new-app` / `app-removed` / `installs-up` / `reviews-up` / rating alerts in monitor mode.
- **Market report per niche.** `marketReportOnly: true` turns 100 search results into one row: how much of the installs the top 3 apps own, what most apps charge, which Google apps they plug into, how many listings are stale, and which big apps have weak ratings (an opening for a better product). Add `trackChanges` and a schedule to see new entrants and the fastest-growing apps each week.
- **No contact harvesting.** Developer trader addresses and emails are deliberately not exported. You get the developer name, website and support/privacy/terms links.

### Use cases

- **Workspace app developers (ISVs):** track your own listing and competitors daily: install growth, new reviews (with their text, so you can answer them fast), rating changes, your rank for your main keywords, and alerts when a new competitor launches.
- **SaaS partnerships & integrations teams:** map who already ships a Gmail, Sheets or Calendar integration in your category, and how big they are.
- **Product & customer research:** read what users complain about in competing add-ons (1-2 star reviews) and how their developers reply, before you build or position a feature.
- **Security & IT admins:** audit which marketplace apps request full Gmail or Drive access before allowing them in your domain, and get alerted when an app's permissions change.
- **B2B lead generation:** companies that ship a Workspace add-on are a well-defined account list. The developer view gives one row per company with website domain, total installs and app count, ready for CRM enrichment (company data only, no personal data).
- **Investors & market research:** size categories by installs, spot fast-growing apps (install velocity) and stale listings (`daysSinceUpdate`).
- **Founders choosing what to build:** run `marketReportOnly` on 10 candidate keywords and compare concentration, median installs, pricing and weak incumbents in one table.

### Input

| Field | Description |
|---|---|
| `searchTerms` | Keywords, e.g. `"crm"`, `"email tracking"`, `"mail merge"`, `"ai"` |
| `categories` | e.g. `popular-apps`, `top-rated`, `business-tools/sales-and-crm`, `productivity/task-management`, `education` (26 options) |
| `appUrls` | Watchlist: app URLs or numeric ids |
| `maxResultsPerQuery` | Max apps per search / category (the marketplace shows at most 100) |
| `worksWith` | `gmail`, `docs`, `sheets`, `slides`, `forms`, `drive`, `calendar`, `chat`, `meet`, `classroom`, `web-app` |
| `pricing` | `free`, `freemium`, `free-trial`, `paid` |
| `developers` | Developer name or website contains, e.g. `"zoho"` |
| `minInstalls`, `minRating`, `minReviews` | Quality filters |
| `includeDetails` | Add OAuth scopes, `sensitiveAccess` flags and full description |
| `outputLevel` | `apps` (default) or `developers` (one row per developer company with all its apps and totals) |
| `includeMarketReport` | Add one `market-report` row per search term / category |
| `marketReportOnly` | Output only the market report rows (no app rows) |
| `includeReviews` | Add user reviews as separate rows (`recordType: "review"`) |
| `maxReviewsPerApp` | Max reviews per app (default 50, up to 2,000) |
| `reviewSort` | `recent` (newest first) or `helpful` |
| `reviewLanguage` | Review language code, e.g. `en` (default), `de`, `es`, `fr`, `pt-BR`, `ja` |
| `maxReviewRating` | `2` = only 1-2 star reviews; `5` = all |
| `reviewsSince` | `"30 days"`, `"2 weeks"` or a date like `"2026-09-01"` |
| `includeReviewInsights` | One `review-insights` row per app + a `review-comparison` row for 2+ apps (works without `includeReviews`; set `maxReviewsPerApp` to e.g. 200 for the sample size) |
| `outputMode` | `all`, `new` (never seen before) or `changed` (new + any change) |
| `trackChanges` | Add change fields in `all` mode too |
| `minInstallsChangePct`, `minRankChange` | Alert thresholds (default 2% and 5 positions) |
| `stateKey` | Monitor name: use one per schedule |

Example: compare three niches before building an add-on (one row each):

```json
{
  "searchTerms": ["mail merge", "crm", "invoice"],
  "marketReportOnly": true,
  "trackChanges": true,
  "stateKey": "niche-research"
}
```

Example: CRM landscape with permissions:

```json
{
  "searchTerms": ["crm"],
  "categories": ["business-tools/sales-and-crm"],
  "includeDetails": true
}
```

Example: daily alert of new or changed Gmail add-ons for email tracking:

```json
{
  "searchTerms": ["email tracking", "mail merge"],
  "worksWith": ["gmail"],
  "outputMode": "changed",
  "stateKey": "gmail-addons-watch"
}
```

Example: watch your app and two competitors:

```json
{
  "appUrls": [
    "https://workspace.google.com/marketplace/app/insightly_crm/340379804296",
    "800057673271"
  ],
  "outputMode": "changed",
  "stateKey": "competitors"
}
```

Example: complaints about two competitors in the last 6 months, with developer replies:

```json
{
  "appUrls": ["800057673271", "340379804296"],
  "includeReviews": true,
  "maxReviewRating": 2,
  "reviewsSince": "6 months",
  "maxReviewsPerApp": 200
}
```

Example: daily feed of new reviews for your app (only reviews posted since the previous run):

```json
{
  "appUrls": ["https://workspace.google.com/marketplace/app/streak_crm_for_google_workspace/800057673271"],
  "includeReviews": true,
  "outputMode": "changed",
  "stateKey": "my-app-reviews"
}
```

Example: one row per developer for the top CRM add-ons, with weekly developer alerts:

```json
{
  "searchTerms": ["crm"],
  "outputLevel": "developers",
  "outputMode": "changed",
  "stateKey": "crm-developers"
}
```

### Output

```json
{
  "id": "340379804296",
  "slug": "insightly_crm",
  "name": "Insightly CRM",
  "tagline": "Insightly",
  "description": "Insightly provides customer relationship management (CRM) and project management software ...",
  "developer": "insightly.com",
  "developerWebsite": "https://insightly.com",
  "traderStatus": "unspecified",
  "installs": 3638156,
  "installsLabel": "3M+",
  "rating": 4.24,
  "reviewCount": 364,
  "pricing": null,
  "worksWith": ["web-app"],
  "listingUpdated": null,
  "daysSinceUpdate": null,
  "supportUrl": "https://www.insightly.com/features/google-apps/",
  "termsUrl": "https://www.insightly.com/terms-of-service/",
  "privacyPolicyUrl": "https://www.insightly.com/privacy-policy/",
  "url": "https://workspace.google.com/marketplace/app/insightly_crm/340379804296",
  "oauthScopes": ["https://www.googleapis.com/auth/drive", "https://mail.google.com/", "https://www.googleapis.com/auth/calendar", "..."],
  "oauthScopeCount": 8,
  "sensitiveAccess": ["gmailFullAccess", "driveFullAccess", "calendarFullAccess", "contacts", "adminDirectory"],
  "rank": 1,
  "query": "search:crm",
  "isNew": false,
  "previousInstalls": 3561020,
  "installsChange": 77136,
  "installsChangePct": 2.17,
  "reviewsChange": 1,
  "changeTypes": ["installs-up", "reviews-up"],
  "scrapedAt": "2026-10-05T14:33:05.907Z"
}
```

With `includeReviews`, each review is its own row (the **Reviews** view in the dataset):

```json
{
  "recordType": "review",
  "appId": "93519377337",
  "appName": "Form Presenter+Timer",
  "appUrl": "https://workspace.google.com/marketplace/app/form_presenter+timer/93519377337",
  "reviewId": "12668142882758386030",
  "rating": 1,
  "text": "After publishing the form, the person only Attempt remaining 0/1 but unable to proceed. ...",
  "createdAt": "2026-09-18T06:16:30.650Z",
  "developerReply": "Thanks for reaching out! We completely understand how frustrating it is ...",
  "developerReplyAt": "2026-09-25T05:04:09.101Z",
  "hasDeveloperReply": true,
  "language": "en",
  "scrapedAt": "2026-10-06T03:40:12.511Z"
}
```

With `outputLevel: "developers"`, each developer is one row (`recordType: "developer"`, the **Developers** view):

```json
{
  "recordType": "developer",
  "developer": "Lucid Software",
  "developerNames": ["Lucid Software"],
  "website": "http://www.lucidchart.com",
  "websiteDomain": "lucidchart.com",
  "websiteDomains": ["lucidchart.com", "lucidspark.com", "lucidscale.com"],
  "traderStatus": "trader",
  "appCount": 4,
  "totalInstalls": 53093228,
  "totalReviews": 9954,
  "averageRating": 4.06,
  "topApp": { "name": "Lucidchart", "installs": 47158259, "rating": 4.06, "reviewCount": 9848 },
  "worksWith": ["chat", "docs", "sheets", "slides", "calendar", "drive", "meet", "gmail"],
  "pricingModels": { "freemium": 4 },
  "latestListingUpdate": "2025-11-18",
  "appsNotUpdatedInYear": 3,
  "matchedApps": ["Lucidchart"],
  "apps": [{ "id": "7081045131", "name": "Lucidchart", "installs": 47158259, "rating": 4.06, "pricing": "freemium", "...": "..." }]
}
```

In monitor mode developer rows add `changeTypes` (`new`, `new-app`, `app-removed`, `installs-up/down`, `reviews-up`, `rating-up/down`), `newApps`, `removedApps`, `totalInstallsChange(Pct)` and `reviewsChange`. An app only counts as removed when its marketplace page is gone. `portfolioSearchCapped: true` means a portfolio search hit the 100-result limit (very large developers such as Zoho), so a few apps may be missing.

#### Market report rows

Real numbers from a test run (`"searchTerms": ["mail merge"]`, `marketReportOnly`, trimmed):

```json
{
  "recordType": "market-report",
  "query": "search:mail merge",
  "appsAnalyzed": 100,
  "developers": 78,
  "totalInstalls": 244413901,
  "medianInstalls": 166413.5,
  "installsDistribution": { "under 1K": 16, "1K-10K": 14, "10K-100K": 15, "100K-1M": 21, "1M-10M": 29, "10M+": 5 },
  "topAppInstallSharePct": 16.5,
  "top3InstallSharePct": 37.5,
  "top10InstallSharePct": 66.7,
  "reviewWeightedRating": 4.73,
  "ratingDistribution": { "4.5-5": 47, "4.0-4.4": 27, "3.0-3.9": 15, "below 3": 5, "unrated": 6 },
  "worksWith": [{ "value": "sheets", "count": 81, "pct": 81 }, { "value": "docs", "count": 25, "pct": 25 }, "..."],
  "pricing": [{ "value": "freemium", "count": 45, "pct": 45 }, { "value": "free", "count": 28, "pct": 28 }, "..."],
  "updatedLast90DaysPct": 42.4,
  "notUpdatedInYearPct": 34.3,
  "topDevelopersByInstalls": [{ "developer": "Talarian", "apps": 2, "installs": 40995383, "installSharePct": 16.8 }, "..."],
  "weakIncumbents": [{ "name": "Mail merge for Google Docs", "installs": 4826008, "rating": 3.49, "reviewCount": 683 }, "..."],
  "sinceLastRun": { "newApps": 3, "installsChangePct": 2.75, "fastestGrowing": [{ "name": "Mailmeteor: Mail merge for Google Sheets", "previousInstalls": 6372821, "installs": 7966027, "installsChangePct": 25 }] }
}
```

`sinceLastRun` appears from the second run with `trackChanges` (or a monitor mode) and the same `stateKey` (the numbers above come from a test with an edited snapshot). With `includeDetails` the report adds `medianOauthScopes`, `sensitiveAccess` and `appsWithSensitiveAccessPct`.

#### Review insights rows

Real test, `searchTerms: ["mail merge"]`, `maxResultsPerQuery: 3`, `includeReviewInsights: true`, `maxReviewsPerApp: 150` (newest 150 reviews per app, trimmed):

```json
{
  "recordType": "review-insights",
  "appName": "Yet Another Mail Merge: Mail Merge for Gmail",
  "reviewsAnalyzed": 150,
  "averageRating": 4.56,
  "negativeSharePct": 10,
  "ratingTrend": { "last90DaysReviews": 5, "last90DaysAverage": 3.8, "olderAverage": 4.59, "change": -0.79, "direction": "declining" },
  "topIssues": [
    { "theme": "quota & limits", "mentions": 6, "examples": [{ "rating": 2, "text": "YAMM has unfortunately been gradually reducing the effectiveness of it's free service. Initially, you could send 50 emails a day…" }] },
    { "theme": "pricing & paywall", "mentions": 6 },
    { "theme": "billing & subscription", "mentions": 5 }
  ],
  "developerReplies": { "replied": 23, "replyRatePct": 15.3, "medianReplyHours": 134.39 }
}
```

The `review-comparison` row of the same run: YAMM is weak in **quota & limits** and **pricing & paywall** (4 per 100 reviews vs a peer median of 0.34); Mailmeteor's relative weaknesses are Google integration and customer support, its strengths quota and pricing. The comparison is also saved as the `REVIEW_COMPARISON` record.

App rows have `recordType: "app"`. Reviewer names and profile photos are not collected.

`pricing` is `free`, `freemium`, `free-trial`, `paid` or `null` (not stated). `traderStatus` is the EU trader declaration (`trader`, `non-trader`, `unspecified`). OAuth fields appear with `includeDetails` (watchlist apps always include them when it is on). Change fields appear when `outputMode` is `new` / `changed` or `trackChanges` is on. A run summary is saved to the `SUMMARY` record in the key-value store.

### Pricing

Pay per result, no subscription:

- **$2 per 1,000 apps** returned
- **+$3 per 1,000 apps** with `includeDetails` (OAuth permissions + full description, one extra page per app)
- **$0.50 per 1,000 reviews** with `includeReviews`
- **$5 per 1,000 developer rows** with `outputLevel: "developers"` (each row includes the developer's whole app portfolio; portfolio apps are not charged separately)
- **$0.01 per review insights row** (`includeReviewInsights`, one per app + one comparison row). The reviews read for the analysis are not charged unless you also output them with `includeReviews`.
- **$0.02 per market report row** (`includeMarketReport` / `marketReportOnly`). In report-only mode apps are not charged, so sizing 10 niches costs $0.20.

A 100-app category costs $0.20 ($0.50 with permissions). In `new` / `changed` mode you pay only for apps that are new or changed, so a daily monitor usually costs cents per month.

### FAQ

**Can I scrape Google Workspace Marketplace reviews?**
Yes. Turn on `includeReviews`. You get the star rating, review text, date and the developer's reply for every review the marketplace shows, newest or most helpful first, up to 2,000 per app.

**Why does an app show 364 reviews but I get fewer?**
`reviewCount` counts reviews in all languages, while the marketplace serves reviews one language at a time (like the Language selector on the Reviews tab). Set `reviewLanguage` (e.g. `de`, `es`, `pt-BR`) to get the others. Many reviews are rating-only and have no text.

**How do I get only new reviews every day?**
Use `outputMode: "changed"` (or `"new"`) with a `stateKey` and a daily schedule. After the first run, only reviews posted since the previous run are returned, and apps whose review count did not change are not even requested.

**How are complaint themes detected?**
With keyword rules (no AI), the same method as our App Store / Google Play review tool, with themes adapted to Workspace add-ons: bugs & errors, authorization & login, permissions & privacy, quota & limits, billing, pricing & paywall, speed, Google integration, recent update, customer support, usability, data loss, spam & ads, and feature requests. A review can match several themes. Results are reproducible, but a keyword can misfire, so check the example quotes.

**Do insights work in monitor mode?**
Yes. With `outputMode: "new"` / `"changed"` only new reviews are output, but the insights always analyse the newest `maxReviewsPerApp` reviews, so a weekly schedule gives you a comparable snapshot every week.

**Do you collect reviewer names?**
No. Reviewer names and profile photos are left out on purpose. Review text and developer replies are public on the app page.

**Can I get one row per developer / publisher instead of per app?**
Yes. Set `outputLevel` to `developers`. Matched apps are grouped by company and the developer's other marketplace apps are added, with total installs, reviews and rating across the portfolio.

**Can I compare niches without exporting every app?**
Yes. `marketReportOnly: true` returns one row per search term or category with install concentration, median installs, ratings, pricing mix, integrations, stale-listing share, top developers and weak incumbents, for $0.02 per row.

**Does the developer view include emails?**
No. Only company-level public data: developer name(s), website and domain, and the EU trader status flag. Trader addresses, emails and phone numbers are not exported.

### Scheduling a monitor

1. Set `outputMode` to `changed` (or `new`) and give the monitor a `stateKey`.
2. Run it once. The first run is the baseline and returns everything.
3. Create an Apify Schedule (e.g. daily). Later runs return only what changed. Connect a webhook, Slack or email integration to get alerts.

### More tools from the same developer

- [Microsoft Marketplace & AppSource Offers Tracker](https://apify.com/signalscope-data/microsoft-marketplace-tracker) — 28k Azure Marketplace & AppSource offers with plans, free trial / PAYG flags and new/changed/removed alerts.
- [Atlassian, Zoom & Zendesk Marketplace Apps Tracker](https://apify.com/signalscope-data/saas-marketplaces-tracker) — installs, ratings, versions and change alerts across three SaaS integration marketplaces.
- [Salesforce AppExchange Scraper & Listing Monitor](https://apify.com/signalscope-data/appexchange-tracker) — AppExchange apps & Agentforce agents with ratings, pricing, versions and change alerts.
- [Chrome, Firefox & VS Code Extensions Tracker](https://apify.com/signalscope-data/extension-marketplaces-tracker) — installs, ratings, versions and change alerts across three extension marketplaces.
- [App Store & Google Play Top Charts & App Rank Tracker](https://apify.com/signalscope-data/app-charts-tracker) — top free/paid/grossing charts in any country, with daily rank changes.
- [Company Jobs Scraper](https://apify.com/signalscope-data/ats-jobs-scraper) — every open job from Workday, Greenhouse, Lever, Ashby & more, with new-job alerts.

# Actor input Schema

## `searchTerms` (type: `array`):

Keywords to search on the marketplace, e.g. "crm", "email tracking", "mail merge", "ai". Each term is a separate ranked list (the marketplace shows up to 100 apps per search).

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

Marketplace categories and curated lists to scrape (up to 100 apps each, in marketplace order). Leave search terms, categories and app URLs empty to get the Popular apps list.

## `appUrls` (type: `array`):

Specific apps to track, e.g. "https://workspace.google.com/marketplace/app/insightly_crm/340379804296" or just the numeric id "340379804296". Useful to monitor your own and competitors' listings.

## `maxResultsPerQuery` (type: `integer`):

Max apps per search term or category (the marketplace itself shows at most 100).

## `worksWith` (type: `array`):

Keep only apps that integrate with at least one of these Google apps, e.g. only Gmail add-ons or only Sheets add-ons.

## `pricing` (type: `array`):

Keep only apps with one of these pricing models. Apps that don't state pricing are excluded when this filter is set.

## `developers` (type: `array`):

Keep only apps whose developer name or website contains one of these, e.g. "zoho", "hubspot.com".

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

Skip apps with fewer installs than this.

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

Skip apps rated below this (0-5).

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

Skip apps with fewer reviews than this.

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

Open each app page to add the OAuth scopes the app requests (oauthScopes, sensitiveAccess flags such as gmailFullAccess or driveFullAccess) and the full description. One extra request per app, charged as an extra app-details event.

## `outputLevel` (type: `string`):

"developers" groups the matched apps by developer and outputs one row per developer company with its whole app portfolio found on the marketplace (not just the matched apps): app count, total installs (exact), total reviews, weighted rating, top app, works-with products, pricing models, latest listing update, website + domain, EU trader status. Apps listed under several developer names or websites of the same company are merged. Monitor modes report new developers, new/removed apps, install and review growth and rating changes. Charged per developer row. No emails.

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

Also output the user reviews of every matched app as separate rows (recordType "review"): star rating, review text, date and the developer's reply with its date. Reviewer names are not collected. In "new" / "changed" modes only reviews posted since the last run are returned.

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

Stop after this many reviews per app (the marketplace serves 10 per page).

## `reviewSort` (type: `string`):

Same two sort options as the Reviews tab on the marketplace.

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

Language code of the reviews to get, e.g. "en", "de", "es", "fr", "pt-BR", "ja". The marketplace shows reviews per language, like the Language selector on the Reviews tab.

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

Only output reviews with at most this many stars, e.g. 2 = complaints only (1-2 stars). 5 = all reviews.

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

Only reviews posted after this date ("2026-09-01") or within this period ("30 days", "2 weeks", "6 months"). Empty = no date limit.

## `includeReviewInsights` (type: `boolean`):

Analyse the reviews of every matched app (the newest 'Max reviews per app', in 'Review language') and output one recordType "review-insights" row per app: rating distribution, negative share, rating trend (last 90 days vs older), top complaint themes in 1-3 star reviews (bugs, authorization, permissions, quota limits, pricing, Google integration, support...) with example quotes, feature requests, frequent phrases, developer reply rate and median reply time. With 2+ apps also one "review-comparison" row: complaint themes per 100 reviews for every app, relative weaknesses and strengths. Review rows themselves are output only when 'Include reviews' is on. Rule-based, no AI. Billed per insights row.

## `includeMarketReport` (type: `boolean`):

Add one recordType "market-report" row per search term / category: apps and developers count, total and median exact installs, installs distribution, install concentration (top app / top 3 / top 10 share), average and review-weighted rating, rating distribution, reviews per 1,000 installs, works-with mix, pricing mix, EU trader status, listing freshness, top developers by installs, top apps and weak incumbents (10K+ installs, rating under 3.8). With includeDetails: OAuth scope stats. With trackChanges / a monitor mode: sinceLastRun (new apps, installs growth, fastest growing apps). Also saved to the MARKET_REPORT record.

## `marketReportOnly` (type: `boolean`):

Output only the market report rows. Apps are analysed but not output or charged; reviews, details and outputMode are ignored. Turn on trackChanges with a stateKey to get the sinceLastRun section on scheduled runs.

## `outputMode` (type: `string`):

"new" and "changed" compare with the previous run that used the same stateKey. The first run is the baseline and returns everything.

## `trackChanges` (type: `boolean`):

Also compute installsChange, rankChange, changeTypes etc. when outputMode is "all" (saves a snapshot for the next run).

## `minInstallsChangePct` (type: `number`):

An installs-up / installs-down change is reported only when installs moved at least this many percent since the last run.

## `minRankChange` (type: `integer`):

A rank-up / rank-down change is reported only when the app moved at least this many positions in a search or category list.

## `stateKey` (type: `string`):

Name of the saved snapshot used by "new" / "changed" modes. Use a different name for each schedule or watchlist.

## Actor input object example

```json
{
  "searchTerms": [
    "crm"
  ],
  "maxResultsPerQuery": 100,
  "minInstalls": 0,
  "minRating": 0,
  "minReviews": 0,
  "includeDetails": false,
  "outputLevel": "apps",
  "includeReviews": false,
  "maxReviewsPerApp": 50,
  "reviewSort": "recent",
  "reviewLanguage": "en",
  "maxReviewRating": 5,
  "includeReviewInsights": false,
  "includeMarketReport": false,
  "marketReportOnly": false,
  "outputMode": "all",
  "trackChanges": false,
  "minInstallsChangePct": 2,
  "minRankChange": 5,
  "stateKey": "default"
}
```

# Actor output Schema

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

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchTerms": [
        "crm"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("signalscope-data/workspace-marketplace-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 = { "searchTerms": ["crm"] }

# Run the Actor and wait for it to finish
run = client.actor("signalscope-data/workspace-marketplace-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 '{
  "searchTerms": [
    "crm"
  ]
}' |
apify call signalscope-data/workspace-marketplace-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,signalscope-data/workspace-marketplace-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/VsKWGwTiGWRHe1bSP/builds/hXNEmbsyMi5hCCjZ3/openapi.json
