# Microsoft Marketplace & AppSource Offers Tracker (`signalscope-data/microsoft-marketplace-tracker`) Actor

Scrape & monitor Azure Marketplace + AppSource: 28k offers, ratings, plans, publishers, G2 reviews (likes, dislikes, company size) with review insights, market reports. $2 / 1,000 offers.

- **URL**: https://apify.com/signalscope-data/microsoft-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, 91.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 offer 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

## Microsoft Marketplace & AppSource Offers Tracker

Scrape and **monitor the Microsoft commercial marketplace**: every public offer on **Azure Marketplace and AppSource**, including SaaS apps, virtual machine images, Azure applications, containers (AKS), consulting services and managed services. That's about 28,000 offers. Each offer comes with its publisher, offer type, categories, industries, **ratings (Microsoft marketplace + G2 reviews, star distribution)**, popularity scores, **plans**, pricing options (free plan, free trial, pay-as-you-go / transactable, BYOL), preview and stop-sell status, storefronts, creation and last-updated dates, and links.

Need **vendors instead of listings**? Set `outputLevel: "publishers"` and get one row per publisher with its **whole portfolio across all offer types**: offer count, website domain, Microsoft partner ID, total ratings and weighted average rating, top offer, categories, industries, transactable / free-trial / Azure-benefit-eligible offer counts and the newest launch, plus alerts when a publisher lists a new offer, removes one or collects new reviews.

Sizing a niche before you build or list? Add `includeMarketReport: true` (or `marketReportOnly: true`) and get a **market report per search term**: how many offers and publishers compete, how concentrated it is, the pricing mix (transactable, free trial, contact-only), how many offers launched in the last 90 / 365 days, how many are rated, who holds the ratings, the most-rated offers and **weak incumbents** (many ratings, low score).

Need **what customers say**? Add `includeReviews: true` and get the **reviews shown on each listing as rows: G2 reviews (newest up to 200 per product) with the "like best", "dislike" and "problems solved" answers as separate fields and the reviewer's company size, plus reviews written on AppSource / the Azure portal**. No proxy and no login: Microsoft serves them from a public endpoint. `includeReviewInsights: true` turns them into **one insights row per product** (complaint themes from the "dislike" answers, praise, use cases, ratings by company size) and a **competitor comparison**.

In monitor mode every run is compared with the previous one. You get **new offers, new ratings, removed offers, plans added or removed, free trial or PAYG added, preview → GA, stop-sell, renames, category changes and listing updates**, so a daily schedule becomes an alert feed for your market.

No login, no API key, no browser. It reads Microsoft's public catalog API, so it's fast and reliable.

### Why this one?

- **The whole catalog, not one storefront.** Azure Marketplace and AppSource, all offer types, in one schema. Filter by offer type, category, industry, publisher, storefront, pricing option or keyword.
- **Monitor mode built in.** `outputMode: "new"` returns only offers never seen before. `"changed"` adds `plan-added`, `plan-removed`, `free-trial-added`, `free-plan-added`, `payg-added` (became transactable), `preview-to-ga`, `stop-sell`, `back-on-sale`, `renamed`, `categories-changed`, `listing-updated`, `new-ratings` and `removed`.
- **Ratings & reviews count (new).** `rating` and `ratingCount` exactly as the listing shows them, split into `marketplaceRating` / `marketplaceRatingCount` (reviews left on Microsoft's marketplace) and `g2Rating` / `g2RatingCount` (G2 reviews Microsoft displays), plus a 1–5 star `ratingDistribution` and catalog `popularity` scores. Filter with `minRating` / `minRatingCount`, rank with `sortBy: "most-rated"` or `"top-rated"`, and get a `new-ratings` alert (with `ratingsAdded` and `previousRating`) when a competitor collects reviews.
- **Publisher (vendor) level (new).** `outputLevel: "publishers"` groups matching offers by publisher and loads each publisher's full catalog (server-side, every offer type), so "who sells security SaaS on Azure" becomes a vendor list with `offerCount`, `websiteDomain`, `partnerId`, `totalRatings`, `averageRating`, `topOffer`, `transactableOffers`, `azureBenefitEligibleOffers`, `offersCreatedLast90Days` and the `offers[]` list. Monitor alerts: `new`, `new-offer` (with `newOffers`), `offer-removed`, `new-ratings`, `rating-up` / `rating-down`.
- **Niche market reports (new).** `includeMarketReport` / `marketReportOnly` turn a keyword into one `market-report` row: `offersMatched`, `publishers`, `top10PublishersOfferSharePct`, offer-type and pricing mix, `transactablePct`, `contactOnlyPct`, AppSource vs Azure storefronts, `newOffersLast90Days` / `365Days`, top categories and industries, `ratedOffersPct`, `ratingWeightedAverage`, rating distribution, `top3PublishersRatingSharePct`, `mostRatedOffers` and `weakIncumbents`. With `trackChanges` it adds `sinceLastRun` (new offers, ratings added and who got them). No other Microsoft marketplace scraper gives you the market, only the list.
- **G2 reviews without fighting G2 (new).** `includeReviews` returns the G2 reviews Microsoft mirrors on the listing (the newest up to 200 per product), split into `likeBest`, `dislike`, `problemsSolved` and `recommendations`, with `rating`, `title`, `companySize` (Enterprise / Mid-Market / Small-Business), date and `g2ReviewUrl`, plus AppSource / Azure portal reviews with the vendor's reply. Works for any product listed on Azure Marketplace or AppSource (thousands of B2B tools), no proxy needed. `onlyNewReviews` turns it into a review monitor. Reviewer names and job titles are not collected.
- **Review insights & competitor comparison (new).** `includeReviewInsights` reads the "What do you dislike?" answer of every review (G2 ratings are mostly 4-5 stars, so counting only low-star reviews misses most complaints) and returns `topIssues` across 14 B2B themes (pricing & licensing, learning curve, usability, performance, bugs, setup, integrations, reporting, customization, support, documentation, alerts & noise, mobile, security) with quotes, `topPraise`, `featureRequests`, `topComplaintPhrases`, **`topUseCasePhrases`** (from "What problems is the product solving?"), `noDislikeSharePct`, **`byCompanySize` + `weakCompanySize`**, rating trend and `lastReviewAt`. With 2+ products a `review-comparison` row shows each one's relative weaknesses and strengths per 100 reviews.
- **Plans per offer.** Plan ids and names with free / pay-as-you-go / free trial / BYOL flags, so you can see how competitors package their offer.
- **"What just launched" in one click.** Sort by `newest` (listing creation date) to see the offers published this week.
- **Watchlist.** Paste offer URLs or ids to track your own listing and your competitors'.
- **No contact harvesting.** Only company-level data: publisher name, website, support and privacy links.

### Use cases

- **ISVs selling through Microsoft:** watch competitors' listings, plans and pricing options, and get alerted when a new competitor lists in your category.
- **Microsoft partners, CSP resellers & distributors:** build and refresh lists of transactable SaaS offers by category or industry.
- **B2B sales & partnerships teams:** find companies that just launched on Azure Marketplace or AppSource. A new listing means a company is investing in the Microsoft channel.
- **Partner, alliance & channel sales teams:** build account lists of software vendors active on Azure (one row per company, with website domain and portfolio size) and see who is expanding: new offers in the last 90 days, transactable offers, Azure-benefit eligibility.
- **Market research & investors:** size categories (AI apps and agents, security, data), track how many offers go transactable, and follow launches over time.
- **"Should we list on Azure Marketplace?"** Run one report per candidate keyword (`marketReportOnly`) and compare: few rated offers + high transactable share + weak incumbents = an open niche with buyers who purchase through Microsoft.
- **Product marketing & competitive intelligence:** pull competitors' G2 reviews (likes / dislikes / use cases) for a battlecard in one run, see which complaint each competitor gets more than the rest of the niche, and which company sizes are least happy.
- **Cloud marketplace consultants:** monitor clients' listings for unwanted changes (stop-sell, removed plans).

### Input

| Field | Description |
|---|---|
| `outputLevel` | `offers` (one row per offer, default) or `publishers` (one row per publisher with its full portfolio) |
| `searchTerms` | Whole-word match on name, summary, publisher and keywords (all words of a term must appear; plurals count, so `"siem"` finds "SIEMs" but not "Siemens"), e.g. `"copilot"`, `"data security"` |
| `offerTypes` | `saas`, `virtual-machine`, `azure-application`, `container`, `consulting-services`, `managed-services`, `other` |
| `categories` | Catalog category ids, e.g. `security`, `ai-apps-and-agents`, `it-and-management-tools`, `analytics` |
| `industries` | e.g. `Healthcare`, `Financial`, `Government`, `Manufacturing` |
| `publishers` | Publisher name contains, or exact publisherId |
| `includeMarketReport` | Also output one `market-report` row per search term (or one for the whole filter set) |
| `marketReportOnly` | Only the market report rows, no offer rows (pay for the reports only) |
| `offerUrls` | Watchlist: offer URLs or ids such as `dynatrace.dynatrace-apm` |
| `storefront` | `any`, `appsource`, `azure-marketplace` |
| `pricing` | `free`, `free-trial`, `payg`, `byol` |
| `includePreview`, `includeStopSell` | Include preview / stop-sell offers |
| `sortBy` | `newest`, `last-modified`, `name`, `most-rated`, `top-rated` (offers with 5+ ratings first) |
| `includeRatings` | Add ratings, star distribution and popularity (default on, no extra charge) |
| `minRating`, `minRatingCount` | e.g. `"4.5"` and `20`: only well-reviewed offers |
| `maxResults` | Max offers (or publishers) to output (0 = no limit) |
| `maxOffersPerPublisher` | Publishers mode: offers loaded per publisher (default 100, matching offers first) |
| `includePlans` | Add plans, website and links (default on) |
| `includeDescription` | Add the full description as plain text |
| `includeReviews` | Add `review` rows: G2 reviews shown on the listing (likes / dislikes / problems solved, company size, link) + AppSource / Azure portal reviews |
| `maxReviewsPerOffer` | Review rows per offer, newest first (default 50; up to 200 G2 + all marketplace reviews exist) |
| `maxReviewRating` | Only reviews with at most N stars, e.g. `3` (0 = all) |
| `onlyNewReviews` | Review monitor: only reviews not seen in the previous run (same `stateKey`) |
| `includeReviewInsights` | One `review-insights` row per offer + a `review-comparison` row (2+ offers with 10+ reviews) |
| `outputMode` | `all`, `new` (never seen before) or `changed` (new + changed + removed) |
| `trackChanges` | Add change fields in `all` mode too |
| `reportRemoved` | Report offers that disappeared (monitor mode) |
| `stateKey` | Monitor name: use one per schedule |

Example: newest Copilot-related SaaS offers:

```json
{
  "searchTerms": ["copilot"],
  "offerTypes": ["saas"],
  "sortBy": "newest",
  "maxResults": 100
}
```

Example: the best-reviewed security SaaS apps (ranked like a "top 50" list):

```json
{
  "offerTypes": ["saas"],
  "categories": ["security"],
  "sortBy": "top-rated",
  "minRatingCount": 20,
  "maxResults": 50
}
```

In October 2026 this kept 60 of 1,169 security SaaS offers (only ~5% have 20+ ratings); the scan with ratings took about 15 seconds. Top results: FileWall for Microsoft 365 (5.0, 38 marketplace ratings), Huntress Managed EDR (4.92, 892 G2 ratings), Red Sift OnDMARC (4.92, 110 marketplace + G2).

Example: daily alert for new or changed security SaaS offers:

```json
{
  "offerTypes": ["saas"],
  "categories": ["security"],
  "maxResults": 0,
  "outputMode": "changed",
  "stateKey": "security-saas"
}
```

Example: the 25 security SaaS vendors with the most reviews, with their whole Azure portfolio:

```json
{
  "outputLevel": "publishers",
  "offerTypes": ["saas"],
  "categories": ["security"],
  "sortBy": "most-rated",
  "maxResults": 25
}
```

Example: G2 review insights + comparison for the 5 most-reviewed observability products (no review rows, so you pay only for 5 offers and 6 insight rows):

```json
{
  "searchTerms": ["observability"],
  "offerTypes": ["saas"],
  "sortBy": "most-rated",
  "maxResults": 5,
  "includeReviewInsights": true
}
```

Example: weekly feed of new reviews of your product and a competitor:

```json
{
  "offerUrls": ["dynatrace.dynatrace-apm", "autopilotworkflowsolutions.autopilot"],
  "includeReviews": true,
  "onlyNewReviews": true,
  "maxReviewsPerOffer": 200,
  "stateKey": "review-feed"
}
```

Example: watch your listing and two competitors:

```json
{
  "offerUrls": [
    "https://marketplace.microsoft.com/en-us/marketplace/apps/dynatrace.dynatrace-apm",
    "datadog1591740804488.dd_liftr_v2"
  ],
  "outputMode": "changed",
  "stateKey": "competitors"
}
```

### Output

```json
{
  "offerId": "clockworksdatainnovationbv.blicker-saas-transact-v2",
  "name": "Blicker - utility meter readout assistant",
  "publisher": "Clockworks Data Innovation B.V.",
  "publisherId": "clockworksdatainnovationbv",
  "offerType": "saas",
  "summary": "Blicker delivers instant AI-powered utility meter readings from photos with super-human accuracy.",
  "categories": ["ai-for-business", "business-robotic-process-automation", "business-applications", "ai-apps-and-agents", "it-and-management-tools"],
  "industries": [],
  "keywords": ["Blicker - utility meter readout assistant"],
  "pricing": ["free", "payg"],
  "hasFreePlan": true,
  "hasFreeTrial": false,
  "hasPayg": true,
  "isByol": false,
  "isPreview": false,
  "isStopSell": false,
  "onAppSource": false,
  "onAzureMarketplace": true,
  "storefronts": ["AMP", "Ibiza", "Cosell"],
  "createdAt": "2023-03-14T20:12:41.893Z",
  "lastModifiedAt": "2026-08-20T14:13:21.034Z",
  "version": "c6a47be5-2b94-474a-84bc-21416ecf02cf",
  "url": "https://marketplace.microsoft.com/en-us/marketplace/apps/clockworksdatainnovationbv.blicker-saas-transact-v2",
  "planCount": 7,
  "plans": [
    { "planId": "pay-as-you-go", "name": "Pay-as-you-go plan", "isFree": true, "isPayg": false, "hasFreeTrial": false, "isByol": false, "isStopSell": false, "pricingTypes": ["Payg", "Free"] },
    { "planId": "starter-3k", "name": "Starter-3K plan", "isFree": false, "isPayg": true, "hasFreeTrial": false, "isByol": false, "isStopSell": false, "pricingTypes": ["Payg"] }
  ],
  "website": "https://www.blicker.ai/",
  "privacyPolicyUrl": "https://www.blicker.ai/privacy",
  "supportUrl": "https://www.blicker.ai/support/microsoft",
  "iconUrl": "https://catalogartifact.azureedge.net/publicartifacts/.../Large.png",
  "rating": null,
  "ratingCount": 0,
  "ratingSource": null,
  "marketplaceRating": null,
  "marketplaceRatingCount": 0,
  "g2Rating": null,
  "g2RatingCount": 0,
  "ratingDistribution": null,
  "popularity": { "appSource": null, "azureMarketplace": 0.56, "azurePortal": 0.56 },
  "isNew": false,
  "firstSeenAt": "2026-10-05T15:02:28.287Z",
  "changeTypes": ["plan-added"],
  "plansAdded": ["starter-3k"],
  "plansRemoved": [],
  "scrapedAt": "2026-10-06T08:00:12.118Z"
}
```

`storefronts` are Microsoft's internal codes: `AMP` = Azure Marketplace, `Appsource` = AppSource, `Ibiza` = Azure portal, `Cosell` = co-sell catalog. Change fields appear when `outputMode` is `new` / `changed` or `trackChanges` is on. Rating fields of a reviewed offer (Red Sift OnDMARC, October 2026):

```json
{
  "rating": 4.92,
  "ratingCount": 110,
  "ratingSource": "marketplace+g2",
  "marketplaceRating": 5,
  "marketplaceRatingCount": 6,
  "g2Rating": 4.92,
  "g2RatingCount": 107,
  "ratingDistribution": { "5": 101, "4": 9, "3": 0, "2": 0, "1": 0 }
}
```

A publisher row (`outputLevel: "publishers"`, ESET, October 2026, `offers[]` shortened):

```json
{
  "publisher": "ESET",
  "publisherId": "esetspolsro1740646566580",
  "partnerId": "6156044",
  "website": "https://www.eset.com",
  "websiteDomain": "eset.com",
  "offerCount": 9,
  "portfolioComplete": true,
  "offerTypes": { "saas": 9 },
  "appSourceOffers": 8,
  "azureMarketplaceOffers": 9,
  "totalRatings": 994,
  "averageRating": 4.72,
  "marketplaceRatingCount": 0,
  "g2RatingCount": 994,
  "topOffer": { "name": "ESET PROTECT Core", "offerType": "saas", "rating": 4.72, "ratingCount": 994 },
  "categories": ["security", "compliance", "threat-protection", "information-protection", "identity-and-access-management"],
  "offersWithFreeTrial": 1,
  "transactableOffers": 9,
  "azureBenefitEligibleOffers": 9,
  "firstOfferAt": "2025-04-01T06:40:51.979Z",
  "newestOfferAt": "2026-09-16T04:08:59.657Z",
  "offersCreatedLast90Days": 1,
  "matchedOffers": ["ESET PROTECT Core Plus", "ESET PROTECT Core", "ESET PROTECT MDR"],
  "offers": [{ "offerId": "esetspolsro1740646566580.ap-2015-us-0325", "name": "ESET PROTECT Core", "offerType": "saas", "rating": 4.72, "ratingCount": 994, "pricing": ["payg"] }]
}
```

Publisher totals count each G2 rating set once (several offers of one vendor often show the same G2 product). In monitor mode a publisher row adds `changeTypes` (`new`, `new-offer`, `offer-removed`, `new-ratings`, `rating-up`, `rating-down`), `newOffers`, `removedOffers`, `ratingsAdded`, `previousOfferCount` and `previousAverageRating`. Offer rows also carry `partnerId` and `azureBenefitEligible` (counts toward an Azure consumption commitment).

`rating`, `ratingCount` and `ratingDistribution` are the combined values Microsoft shows on the listing; they don't always equal the sum of the two sources. `rating` is `null` and `ratingCount` is `0` when an offer has no ratings (most offers have none). `popularity` values are Microsoft's relative catalog scores (0–1) per storefront, `null` when not listed there. With `new-ratings`, `ratingsAdded`, `previousRating` and `previousRatingCount` show what changed; the first run after upgrading only records the counts. A removed offer is output as `{ "offerId", "name", "url", "changeTypes": ["removed"] }`. A run summary is saved to the `SUMMARY` record in the key-value store.

#### Market report example

Input `{"searchTerms": ["contract management"], "offerTypes": ["saas"], "marketReportOnly": true}` returned (October 2026, shortened):

```json
{
  "recordType": "market-report",
  "segment": "contract management",
  "offersMatched": 57,
  "publishers": 40,
  "top10PublishersOfferSharePct": 47.4,
  "transactablePct": 87.7,
  "freeTrialPct": 17.5,
  "freePlanPct": 33.3,
  "storefronts": { "appSourceOnly": 3, "azureMarketplaceOnly": 20, "both": 34 },
  "newOffersLast90Days": 3,
  "newOffersLast365Days": 16,
  "topCategories": [{ "value": "it-and-management-tools", "count": 29, "pct": 50.9 }, { "value": "business-applications", "count": 22, "pct": 38.6 }],
  "ratedOffersPct": 12.3,
  "ratingWeightedAverage": 4.53,
  "top3PublishersRatingSharePct": 94.8,
  "topPublishersByRatings": [
    { "publisher": "Conga Corporation", "ratings": 617, "ratingSharePct": 77.8 },
    { "publisher": "Glaass Pty Ltd", "ratings": 70, "ratingSharePct": 8.8 },
    { "publisher": "SIRIONLABS, INC.", "ratings": 65, "ratingSharePct": 8.2 }
  ],
  "mostRatedOffers": [{ "name": "Conga CLM", "publisher": "Conga Corporation", "rating": 4.46, "ratingCount": 617 }],
  "weakIncumbents": [],
  "sinceLastRun": { "newOffers": 1, "ratingsAdded": 5, "mostNewRatings": [{ "name": "Conga CLM", "ratingsAdded": 5 }] }
}
```

Read it as: 40 vendors, almost all transactable, but only 12% of offers have any rating and one vendor holds 78% of them, so buyer attention is concentrated and most listings are invisible. With several `searchTerms` you get one report per term. Reports cover every matched offer (not limited by `maxResults`); ratings are loaded for up to 5,000 offers per run. Also saved to the `MARKET_REPORT` record.

#### Review example

A `review` row (G2 review shown on the Dynatrace listing, September 2026, shortened):

```json
{
  "recordType": "review",
  "reviewId": "c646902e-bbc1-fb5f-5e3e-ba680104f21d",
  "offerId": "dynatrace.dynatrace-apm",
  "offerName": "Dynatrace Software Intelligence Platform",
  "source": "G2",
  "rating": 5,
  "title": "Cutting-Edge Tech and Support That Drives Success",
  "likeBest": "First and foremost, they strive to stay on the cutting edge of technology...",
  "dislike": "I can honestly say I don't have any dislikes, like any software products there are quirks...",
  "problemsSolved": "Quick fault resolution, fixing legacy issues and being able to show true value to the business...",
  "companySize": "Enterprise",
  "reviewedAt": "2026-09-13T18:10:04.010Z",
  "hasVendorReply": false,
  "g2Product": "dynatrace",
  "g2ReviewUrl": "https://www.g2.com/products/dynatrace/reviews/dynatrace-review-13457338"
}
```

G2 reviews carry the answers as separate fields (`text` is `null`); AppSource / Azure portal reviews have `text` and, when the vendor answered, `vendorReply`. In monitor runs each row gets `isNewReview`.

#### Review insights example

The observability input above (October 2026, 885 reviews of 5 products) gave, among others:

- **Monte Carlo Data Observability:** 4.47 stars; **alerts & noise in 40.5% of reviews** (peer median 4.5 per 100), customization limits 14.5 per 100; use cases "quality issues", "schema changes", "anomaly detection"; only 0.5% of reviewers have nothing to dislike; 111 reviews in the last 365 days, the most active of the five.
- **Dynatrace:** 4.71 stars, pricing & licensing in 21% of reviews (peers 12.6), 30% of reviewers from enterprises; praised more than peers for AI capabilities.
- **Elastic Observability:** reporting & dashboards (31 per 100 vs 11.7) and learning curve (23 vs 11.8) are its relative weaknesses.
- **AppDynamics:** newest G2 review on the listing from January 2025, none in the last 365 days; small businesses rate it 0.38 stars below larger companies (`weakCompanySize`).

```json
{
  "recordType": "review-insights",
  "offerName": "Monte Carlo Data Observability Platform",
  "reviewsAnalyzed": 200,
  "reviewSources": { "G2": 200 },
  "averageRating": 4.47,
  "noDislikeSharePct": 0.5,
  "topIssues": [
    { "theme": "alerts & noise", "mentions": 81, "sharePct": 40.5, "examples": [{ "rating": 4, "date": "2026-07-02", "source": "G2", "text": "Noisiness is the biggest challenge. Tuning old alerts so we only get alerted about things that are truly noteworthy..." }] },
    { "theme": "setup & implementation", "mentions": 37, "sharePct": 18.5 }
  ],
  "topUseCasePhrases": [{ "phrase": "quality issues", "reviews": 18 }, { "phrase": "schema changes", "reviews": 15 }],
  "byCompanySize": [{ "companySize": "Enterprise", "reviews": 42, "averageRating": 4.74 }, { "companySize": "Mid-Market", "reviews": 29, "averageRating": 4.55 }],
  "weakCompanySize": [],
  "lastReviewAt": "2026-09-24T01:40:01.446Z"
}
```

Insights cover every review the listing serves (not limited by `maxReviewsPerOffer`). Offers that show the same G2 product get one row (`alsoListedAs`). The comparison is also saved to the `REVIEW_COMPARISON` record.

### Pricing

Pay per result, no subscription: **$2 per 1,000 offers** returned. Publisher rows (`outputLevel: "publishers"`, full portfolio included) cost **$5 per 1,000 publishers**. Market reports cost **$0.02 per report** (report-only runs charge no offer rows). Review rows cost **$1 per 1,000 reviews**; review insights **$0.01 per product** (the comparison row counts as one).

100 offers cost $0.20. In `new` / `changed` mode you pay only for offers that are new, changed or removed, so a daily monitor of a whole category usually costs cents per month.

### FAQ

**Where do the ratings come from?** From the same public catalog that powers the marketplace pages: the combined score shown on the listing, Microsoft marketplace reviews and the G2 reviews Microsoft displays next to them.

**Where do the reviews come from, and how many do I get?** From Microsoft's public reviews service that the listing page itself calls. It serves the newest G2 reviews of the product (up to 200 per listing) and every review written on AppSource or the Azure portal. Products with more G2 reviews than that show only the newest 200 there. Reviewer names and job titles are never collected, only the company size segment.

**Why read complaints from "What do you dislike?" instead of 1-star reviews?** Most G2 reviews are 4 or 5 stars, but every G2 reviewer answers what they dislike. Counting themes in those answers finds the real complaints (pricing, alert noise, learning curve) even in happy reviews. Answers such as "nothing" are skipped and reported as `noDislikeSharePct`.

**Do ratings cost extra?** No. They come with the offer details. Rating filters and rating sorts load details for every matched offer first, so narrow the search (offer type, category, keywords) for the fastest runs.

**Can I get an alert when a competitor gets new reviews?** Yes: put their listing in `offerUrls`, set `outputMode: "changed"` and schedule the run daily. You get a row with `changeTypes: ["new-ratings"]`, `ratingsAdded` and the old and new rating.

**What does the publisher level add over the offer list?** The offer list only has offers that match your filters. The publisher row loads the publisher's complete catalog (all offer types, up to `maxOffersPerPublisher`), so `offerCount`, totals and `topOffer` describe the whole company. `portfolioComplete` is `false` when the cap cut it short; `offerCount` still shows the full size.

**Which website does a publisher row show?** The most common registrable domain across the publisher's offer links, support and privacy URLs (GitHub, YouTube, help-desk and Microsoft hosts are skipped). No emails or phone numbers are collected.

**What is `partnerId`?** The Microsoft partner (MPN / AI Cloud Partner Program) ID shown in the catalog for that publisher, useful for matching vendors to your CRM or partner records.

**How reliable is "new offers in the last 90 days"?** It uses the catalog's record date. Microsoft's catalog starts at its February 2023 migration and an offer re-published by its vendor can get a newer date, so treat `newOffersLast90Days` / `365Days` as upper bounds. For exact launches use `trackChanges: true` on a schedule: `sinceLastRun.newOffers` counts only offers that were not there on the previous run.

**What is a weak incumbent?** An offer with at least 20 ratings and an average below 3.8 stars: customers are buying, but they are not happy. That is usually the best opening for a new product.

### Scheduling a monitor

1. Set `outputMode` to `changed` (or `new`), set `maxResults` to `0` 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. Keep the same filters for the same `stateKey`.

### More tools from the same developer

- [Salesforce AppExchange Scraper & Listing Monitor](https://apify.com/signalscope-data/appexchange-tracker): AppExchange apps & Agentforce agents with ratings, pricing, versions and change alerts.
- [Google Workspace Marketplace Scraper & App Tracker](https://apify.com/signalscope-data/workspace-marketplace-tracker): exact installs, ratings, OAuth permissions and change alerts for Gmail, Docs and Sheets add-ons.
- [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.
- [Chrome, Firefox & VS Code Extensions Tracker](https://apify.com/signalscope-data/extension-marketplaces-tracker): installs, ratings, versions and change alerts across three extension marketplaces.
- [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

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

"publishers" groups the matching offers by publisher and loads each publisher's FULL portfolio across all offer types (SaaS, VM, containers, consulting…): offer count, website domain, Microsoft partner ID, total ratings, weighted average rating, top offer, categories, industries, transactable / free-trial / Azure-benefit-eligible offer counts, newest offer, and the offers list. In monitor modes alerts on new publishers, new offers, removed offers and new ratings. Charged per publisher row.

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

Also output one `market-report` row per search term (or one for the whole filter set): offers and publishers in the niche, publisher concentration, offer-type and pricing mix (transactable / free trial / contact-only), AppSource vs Azure storefronts, new offers in the last 90/365 days and by year, listing age, top categories and industries, ratings (rated share, weighted average, distribution, top publishers' share of ratings), most-rated offers and weak incumbents (20+ ratings, below 3.8 stars). With trackChanges: sinceLastRun (new offers, ratings added). Charged per report row.

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

Output only the market report rows, no offer rows (you pay for the reports only). Good for sizing a niche: e.g. searchTerms \["contract management"] + offerTypes \["saas"].

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

Keep offers whose name, summary, publisher or keywords contain the term as whole words (all words of a term must match, case-insensitive; plurals count, so "siem" matches "SIEMs" but not "Siemens"), e.g. "copilot", "data security", "sap". Leave empty to get every offer that matches the other filters.

## `offerTypes` (type: `array`):

Only scan these offer types. Leave empty for all types (about 28,000 offers; a full scan takes 1-2 minutes).

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

Only offers in at least one of these catalog categories, e.g. "security", "ai-apps-and-agents", "ai-for-business", "it-and-management-tools", "business-applications", "developer-tools", "analytics", "databases", "devops", "productivity", "identity-and-access-management". Every output item lists its categories, so run once without this filter to discover ids.

## `industries` (type: `array`):

Only offers tagged with an industry containing one of these, e.g. "Healthcare", "Financial", "Government", "Manufacturing", "Retail", "Education".

## `publishers` (type: `array`):

Only offers whose publisher name contains one of these, or whose publisherId equals one, e.g. "dynatrace", "Palo Alto", "canonical".

## `offerUrls` (type: `array`):

Specific offers to track, as marketplace / AppSource URLs (e.g. "https://marketplace.microsoft.com/en-us/marketplace/apps/dynatrace.dynatrace-apm") or offer ids ("publisher.offer", e.g. "dynatrace.dynatrace-apm"). Watchlist offers are always output, regardless of filters. If you set only a watchlist, no catalog scan is done.

## `storefront` (type: `string`):

Keep only offers listed on this storefront.

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

Keep only offers with at least one of these pricing options.

## `includePreview` (type: `boolean`):

Include offers marked as preview.

## `includeStopSell` (type: `boolean`):

Include offers that are no longer sold (stop-sell).

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

Order of the output. "newest" uses the listing creation date, so it is the easiest way to see what just launched. "most-rated" / "top-rated" rank by ratings (marketplace + G2 reviews shown on the listing); they load ratings for every matched offer, so narrow the search for speed.

## `maxResults` (type: `integer`):

Max offers to output (after filters and sorting). With outputLevel "publishers" this is the max number of publisher rows (start with 10–50: each publisher loads its whole portfolio). 0 = no limit.

## `maxOffersPerPublisher` (type: `integer`):

Publishers mode only: load at most this many offers per publisher (matching offers first, then newest). offerCount always shows the full portfolio size; portfolioComplete is false when capped. 0 = no limit.

## `includePlans` (type: `boolean`):

Add the public plans of each offer (plan id, name, free / pay-as-you-go / free trial / BYOL flags), website and links. Needed for plan-added / plan-removed alerts.

## `includeDescription` (type: `boolean`):

Add the full listing description as plain text (up to 5,000 characters).

## `includeRatings` (type: `boolean`):

Add rating (as shown on the listing), ratingCount, ratingSource, separate Microsoft marketplace and G2 ratings, 1–5 star distribution and the catalog popularity scores. Offers without ratings get rating null and ratingCount 0. In monitor modes adds the "new-ratings" change type (with ratingsAdded and previousRating). No extra charge.

## `minRating` (type: `string`):

Only offers rated at least this (0–5), e.g. "4.5". Offers without ratings are excluded when set. Watchlist offers (offerUrls) are always kept.

## `minRatingCount` (type: `integer`):

Only offers with at least this many ratings (Microsoft marketplace + G2 combined). 0 = no filter.

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

Also output the reviews shown on each output offer's listing as `review` rows: G2 reviews mirrored on the listing (the newest up to 200 per listing, with the G2 answers "What do you like best?", "What do you dislike?" and "What problems is the product solving?" as separate fields, company size and the G2 review link) plus reviews written on AppSource / the Azure portal, with rating, title, date and vendor reply. No proxy, no login. Reviewer names and job titles are not collected. In monitor modes ("new" / "changed") only reviews not seen in the previous run are output. Charged per review row.

## `maxReviewsPerOffer` (type: `integer`):

Max `review` rows per offer, newest first (up to 200 G2 reviews + all AppSource / Azure portal reviews are available per listing). Review insights always analyse every review served, whatever this limit.

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

Review rows only: keep reviews rated at most this many stars, e.g. 3 for critical reviews. 0 = all ratings.

## `onlyNewReviews` (type: `boolean`):

Review rows only: output only reviews not seen in the previous run with the same stateKey (a review monitor; schedule it with offerUrls). The first run is the baseline and outputs all reviews. Monitor modes ("new" / "changed") always behave like this.

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

One `review-insights` row per output offer with reviews: rating distribution and trend, complaint themes read from the G2 "What do you dislike?" answers (pricing & licensing, learning curve, usability, performance, bugs, setup, integrations, reporting, customization, support, documentation, alerts, mobile, security) with quotes, praise themes, feature requests, top complaint phrases, use-case phrases from "What problems is the product solving?", share of reviewers with nothing to dislike, ratings by company size (Enterprise / Mid-Market / Small-Business) with weak sizes, and vendor reply rate. With 2+ offers of 10+ reviews also one `review-comparison` row (complaint / praise themes per 100 reviews, relative weaknesses and strengths, rankings). Offers that show the same G2 product get one row. Charged per insights row.

## `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 isNew, changeTypes etc. when outputMode is "all" (saves a snapshot for the next run).

## `reportRemoved` (type: `boolean`):

In monitor mode, output offers that were in the previous snapshot but are gone from the catalog (changeTypes: \["removed"]). Only reported after a complete scan; keep the same filters for the same stateKey.

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

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

## Actor input object example

```json
{
  "outputLevel": "offers",
  "includeMarketReport": false,
  "marketReportOnly": false,
  "searchTerms": [
    "copilot"
  ],
  "offerTypes": [
    "saas"
  ],
  "storefront": "any",
  "includePreview": true,
  "includeStopSell": false,
  "sortBy": "newest",
  "maxResults": 500,
  "maxOffersPerPublisher": 100,
  "includePlans": true,
  "includeDescription": false,
  "includeRatings": true,
  "minRatingCount": 0,
  "includeReviews": false,
  "maxReviewsPerOffer": 50,
  "maxReviewRating": 0,
  "onlyNewReviews": false,
  "includeReviewInsights": false,
  "outputMode": "all",
  "trackChanges": false,
  "reportRemoved": true,
  "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": [
        "copilot"
    ],
    "offerTypes": [
        "saas"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("signalscope-data/microsoft-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": ["copilot"],
    "offerTypes": ["saas"],
}

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

```

## MCP server setup

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