# Microsoft Marketplace Reviews Scraper (`pnhd/microsoft-marketplace-reviews-scraper`) Actor

Unofficial exporter for public Microsoft Marketplace and AppSource reviews, ratings, dates, sources, and product metadata as structured JSON.

- **URL**: https://apify.com/pnhd/microsoft-marketplace-reviews-scraper.md
- **Developed by:** [Đăng Phạm](https://apify.com/pnhd) (community)
- **Categories:** Automation, Developer tools, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 saved reviews

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Microsoft Marketplace Reviews Scraper

Export public Microsoft Marketplace and AppSource ratings and review text into clean, structured records for competitor research, product-feedback analysis, vendor monitoring, voice-of-customer workflows, and downstream API or agent automation.

This independent community Actor is not affiliated with, endorsed by, or sponsored by Microsoft. It uses public Marketplace storefront data and does not require a Microsoft login.

### Supported product URLs

- `https://marketplace.microsoft.com/.../product/...`
- `https://appsource.microsoft.com/.../product/...`
- `https://azuremarketplace.microsoft.com/.../marketplace/apps/...`

Only HTTPS product pages on those exact domains are accepted. Arbitrary crawl URLs, private hosts, reviewer profiles, and credentialed endpoints are rejected.

### Input

| Field | Type | Default | Description |
|---|---|---:|---|
| `productUrls` | string\[] | required | 1–20 supported product URLs |
| `maxReviewsPerProduct` | integer | 100 | 1–1,000 review rows per product |
| `ratingFilter` | integer\[] | all | Any combination of 1–5 stars |
| `sortOrder` | string | `newest` | `newest`, `oldest`, `highest_rating`, `lowest_rating`, or `most_helpful` |
| `locale` | string | `en-us` | Optional language-region override |
| `includeProductSummary` | boolean | true | Emit a summary row for each product; empty results always receive one |

Example:

```json
{
  "productUrls": [
    "https://marketplace.microsoft.com/en-us/product/office/WA200004820"
  ],
  "maxReviewsPerProduct": 25,
  "ratingFilter": [1, 2, 3],
  "sortOrder": "most_helpful",
  "locale": "en-us",
  "includeProductSummary": true
}
```

### Output

The default dataset contains flat `review` rows and deterministic `product_summary` rows. Fields are emitted only when the public source exposes them.

```json
{
  "recordType": "review",
  "productId": "WA200000001",
  "productName": "Example product",
  "publisherName": "Example publisher",
  "productUrl": "https://marketplace.microsoft.com/en-us/product/office/WA200000001",
  "aggregateRating": 4.125,
  "aggregateRatingCount": 48,
  "reviewId": "public-review-id",
  "reviewSource": "microsoft_marketplace",
  "reviewRating": 5,
  "reviewTitle": "Useful integration",
  "reviewText": "Public review text appears here.",
  "reviewDate": "2026-08-01T12:00:00Z",
  "helpfulCount": 3,
  "locale": "en-us",
  "scrapedAt": "2026-08-24T12:00:00.000Z"
}
```

`reviewSource` is one of `microsoft_marketplace`, `g2`, or `other_public_source`. AppSource, Teams, Marketplace, and Ibiza storefront sources are grouped as `microsoft_marketplace`; G2 remains distinct. Unknown public source labels are not guessed and map to `other_public_source`.

For a product with no matching review text, the Actor saves a `product_summary` row with `aggregateRatingCount` and `reviewRecordCount` rather than failing the run.

### API and MCP

Run through the Apify API after deployment:

```bash
curl -X POST "https://api.apify.com/v2/acts/USERNAME~microsoft-marketplace-reviews-scraper/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d @sample-input.json
```

Never commit or share the token. Once the Actor is public, the standard Apify API integrations and Apify MCP Server can expose the Actor to compatible automation and agent clients; no custom MCP server or Microsoft credential is required.

### Pricing

The live Store model is pay per event with platform usage included:

- `start`: USD 0.005 once, charged only after the first review is successfully saved.
- `review-result`: approximately USD 0.0005 per successfully saved review (about USD 0.50 per 1,000 reviews), charged after storage succeeds.

Product summaries, empty products, failed requests, retries, duplicate rows, skipped rows, and parser errors are not billable events. The Store page displays USD 0.005 for the one-time `start` event and USD 0.50 per 1,000 `review-result` events.

### Public data and privacy

The Actor collects only public Marketplace product and review fields. It does not enrich reviewers, crawl reviewer profiles, collect email/phone/address data, attempt de-anonymization, or combine reviews with external identity sources. Anonymous reviews remain anonymous.

### Reliability and limitations

- Microsoft documents Marketplace ratings/reviews and G2 content, but the unauthenticated review host used by the storefront is an undocumented public dependency. It is not presented as an official supported Microsoft API and can change without notice.
- Schema validation, request timeouts, bounded exponential retry, source-host allowlists, response limits, duplicate suppression, and partial-product isolation reduce failure impact.
- The public storefront currently returns a bounded review array and can cap large products. The Actor does not guarantee complete review history.
- Ratings without title or text contribute to the aggregate but do not become review rows.
- Availability, regional differences, removed reviews, and storefront changes can affect results.
- This is a data export tool, not legal advice. Users are responsible for lawful use and applicable terms.

Microsoft's public documentation: [Ratings and reviews](https://learn.microsoft.com/en-us/marketplace/ratings-reviews). Apify conventions used by this Actor: [Actor definition](https://docs.apify.com/actors/development/actor-definition/actor-json), [dataset schema](https://docs.apify.com/storage/dataset-schema), and [pay-per-event charging](https://docs.apify.com/sdk/js/docs/concepts/pay-per-event).

### Troubleshooting

- **Unsupported URL:** pass a product detail URL on one of the three exact supported domains.
- **Product metadata schema error:** the public catalog response changed or the listing is unavailable; retry later and report the product URL.
- **Review schema error:** Microsoft changed its storefront response. Other products still complete; inspect the run log for the failed URL.
- **No reviews:** a product summary is expected and is not an error.
- **Partial run:** one broken product is isolated so successful products remain in the dataset.

### Support

Open an Actor issue with the product URL, run ID, timestamp, and sanitized error message. Do not include Apify tokens, Microsoft credentials, private browser data, or complete third-party review bodies.

# Actor input Schema

## `productUrls` (type: `array`):

Microsoft Marketplace, AppSource, or Azure Marketplace product URLs. At least one and at most 20.

## `maxReviewsPerProduct` (type: `integer`):

Maximum number of review rows saved for each product. Product summary rows do not count against this limit.

## `ratingFilter` (type: `array`):

Optional star ratings to include. Leave empty for all ratings.

## `sortOrder` (type: `string`):

Client-side ordering applied before the review limit.

## `locale` (type: `string`):

Optional language-region override such as en-us. Otherwise the locale is taken from each URL.

## `includeProductSummary` (type: `boolean`):

Save one product\_summary row for each product. A summary is always saved when no review rows match.

## Actor input object example

```json
{
  "productUrls": [
    "https://marketplace.microsoft.com/en-us/product/office/WA200004820"
  ],
  "maxReviewsPerProduct": 100,
  "ratingFilter": [],
  "sortOrder": "newest",
  "locale": "en-us",
  "includeProductSummary": true
}
```

# Actor output Schema

## `records` (type: `string`):

No description

## `runSummary` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("pnhd/microsoft-marketplace-reviews-scraper").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("pnhd/microsoft-marketplace-reviews-scraper").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 '{}' |
apify call pnhd/microsoft-marketplace-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,pnhd/microsoft-marketplace-reviews-scraper"
        }
    }
}

```

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/HIt7haX8agOtvTGKY/builds/hc0l8VJtcb8xSalVH/openapi.json
