# Microsoft Store Scraper: Apps, Games & Reviews (`scrapingmonkey/microsoft-store-scraper`) Actor

Search Microsoft Store apps and games, extract 106-field product details with localized prices, rating trends, system requirements and media, or collect filtered reviews across multiple countries. No API key.

- **URL**: https://apify.com/scrapingmonkey/microsoft-store-scraper.md
- **Developed by:** [ScrapingMonkey](https://apify.com/scrapingmonkey) (community)
- **Categories:** Automation, Developer tools, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 search results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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 Store Scraper - Search, Complete Product Details and Reviews

Search Microsoft Store apps and games, extract complete product metadata, compare prices and system requirements, or collect public customer reviews. This all-in-one Apify Actor uses structured JSON responses and requires no Microsoft account, API key, browser, or proxy configuration.

- Three modes in one Actor: `search`, `details`, and `reviews`
- Batch input for multiple keywords, Product IDs, Microsoft Store URLs, or up to 50 markets
- Stable 64-field Search, 106-field Details, and 35-field Review records
- Prices, SKU offers, ratings, permissions, installation data, media, and requirements
- Cursor-based Search pagination and page-based Reviews pagination
- Four review sorting options plus score, date, and keyword filters
- Single-market or multi-country collection through Microsoft Store `gl` and `hl`
- Controlled concurrent processing for faster multi-input runs
- Mandatory built-in Apify Proxy, retries, deduplication, and partial-failure handling

### What can you do with this Actor?

| Mode | Input | Dataset output | Typical use |
| --- | --- | --- | --- |
| `search` | One or more keywords | Ranked 64-field product records | Product discovery, keyword monitoring, app and game research |
| `details` | Product IDs or URLs | One 106-field record per available product | Catalog, pricing, rating momentum, requirements, installer, and SKU research |
| `reviews` | Product IDs or URLs | One 35-field row per matching public review | Sentiment analysis, issue discovery, review monitoring |

One mode runs per execution. Use Search to discover `productId` values, pass them to Details for complete profiles, and use Reviews when each review should be a separate dataset item.

### Quick start

1. Open the Actor and choose **Try for free**.
2. Select `search`, `details`, or `reviews`.
3. Enter search terms or Microsoft Store Product IDs/URLs.
4. Choose the limit, market, locale, filters, and review ordering.
5. Start the run, then preview or download the default dataset.

### Input examples

#### Search for apps

```json
{
  "mode": "search",
  "searchTerms": ["video editor", "photo viewer"],
  "maxResults": 20,
  "countries": ["US", "DE"],
  "language": "en-US",
  "maxConcurrency": 5,
  "mediaType": "apps",
  "age": "all",
  "price": "all"
}
```

`maxResults` applies independently to each search term. Every row includes its `searchTerm`, global `searchRank`, source page, source-page position, and requested filters.

#### Get complete product details

```json
{
  "mode": "details",
  "appIds": ["9NLVZ8WTBGW1", "https://apps.microsoft.com/detail/vlc/xpdm1zw6815mqm"],
  "country": "US",
  "language": "en-US",
  "includeReviews": false
}
```

Product IDs are normalized to uppercase and duplicate IDs are removed before requests.

#### Collect recent reviews

```json
{
  "mode": "reviews",
  "appIds": ["9PMF91N3LZ3M"],
  "maxResults": 100,
  "country": "US",
  "language": "en-US",
  "reviewSort": "mostRecent",
  "reviewScores": ["1", "2"],
  "reviewsFrom": "2026-01-01",
  "reviewsTo": "2026-12-31",
  "reviewKeywords": ["crash", "support"]
}
```

Review filters are optional. `maxResults` is the maximum number of reviews that match all score and date filters and at least one requested keyword.

#### Get details with embedded reviews

```json
{
  "mode": "details",
  "appIds": ["9NLVZ8WTBGW1"],
  "includeReviews": true,
  "maxResults": 50,
  "reviewSort": "mostHelpful",
  "country": "US",
  "language": "en-US"
}
```

### Complete output examples

Live titles, prices, ratings, availability, versions, reviews, and regional values change over time. Values below are representative, while the field sets are complete.

#### Search result - all 64 top-level fields

```json
{
  "productId": "9NLVZ8WTBGW1",
  "title": "Beauty Video Player",
  "description": "Play and organize videos.",
  "categories": [
    "Photo & video"
  ],
  "publisherName": "Example Publisher",
  "images": [
    {
      "imageType": "logo",
      "backgroundColor": null,
      "foregroundColor": null,
      "caption": null,
      "imagePositionInfo": null,
      "url": "https://example.com/icon.png",
      "height": 300,
      "width": 300
    }
  ],
  "averageRating": 4.5,
  "price": 45,
  "displayPrice": "PHP 45.00",
  "strikethroughPrice": "PHP 60.00",
  "productFamilyName": "Apps",
  "packageFamilyNames": [
    "Example.Package_abc"
  ],
  "isGamingAppOnly": false,
  "installer": {
    "type": "WindowsUpdate",
    "id": "9NLVZ8WTBGW1",
    "productCode": null,
    "architectures": {}
  },
  "previews": [
    {
      "$type": "ImageItem",
      "imageType": "Screenshot",
      "backgroundColor": null,
      "foregroundColor": null,
      "caption": null,
      "title": null,
      "imagePositionInfo": null,
      "url": "https://example.com/screen.png",
      "height": 1080,
      "width": 1920,
      "videoPurpose": null,
      "audioEncoding": null,
      "videoEncoding": null,
      "image": {
        "imageType": "thumbnail",
        "caption": "Preview thumbnail",
        "url": "https://example.com/preview.jpg",
        "height": 720,
        "width": 1280
      },
      "bitrate": null,
      "videoPositionInfo": null,
      "sortOrder": null
    }
  ],
  "typeTag": "app",
  "ratingCountFormatted": "128",
  "iconUrl": "https://example.com/icon.png",
  "posterArtUrl": "https://example.com/poster.png",
  "boxArtUrl": "https://example.com/box.png",
  "iconUrlBackground": "transparent",
  "screenshots": [],
  "encodedTitle": "beauty-video-player",
  "isApplication": true,
  "isGame": false,
  "isTvSeries": false,
  "isMovie": false,
  "isMoviesOrTVs": false,
  "isPwa": false,
  "isTheme": false,
  "isCoreGame": false,
  "isAllowed": true,
  "isBrowsable": true,
  "isPurchaseEnabled": true,
  "isAd": false,
  "isSparkProduct": false,
  "isAndroid": false,
  "isHardware": false,
  "isSubscription": false,
  "isTencent": false,
  "isTencentMini": false,
  "pageTitleLocalization": "Common.PageAppsTitle",
  "disableDownload": false,
  "cardActions": [
    "Install",
    "Purchase"
  ],
  "productRatings": [
    {
      "ratingSystem": "IARC",
      "ratingSystemShortName": "IARC",
      "ratingSystemId": "IARC",
      "ratingSystemUrl": "https://www.globalratings.com/",
      "ratingValue": "3+",
      "ratingId": "IARC:3",
      "ratingValueLogoUrl": "https://example.com/iarc-3.png",
      "ratingAge": 0,
      "restrictMetadata": false,
      "restrictPurchase": false,
      "ratingDescriptors": [],
      "ratingDescriptorLogoUrls": [],
      "ratingDisclaimers": [],
      "interactiveElements": [
        "In-App Purchases"
      ],
      "longName": "3+",
      "shortName": "3+",
      "description": "For ages 3 and up",
      "hasInAppPurchases": true
    }
  ],
  "skusSummary": [
    {
      "msrp": 45,
      "displayMSRP": "PHP 45.00",
      "salePrices": [
        {
          "price": 45,
          "displayPrice": "PHP 45.00",
          "badgeId": "default"
        }
      ]
    }
  ],
  "releaseDateUtc": "2026-08-07T07:40:25Z",
  "appExtCategoryNames": [],
  "priceInfo": {
    "msrp": 45,
    "price": 45,
    "badgeText": "On sale",
    "displayPrice": "PHP 45.00",
    "forceToDisplayPrice": false,
    "narratorText": "PHP 45.00",
    "ownership": 0
  },
  "redirectUrl": null,
  "url": "https://apps.microsoft.com/detail/9nlvz8wtbgw1?hl=en-US&gl=US",
  "searchPage": 1,
  "searchPosition": 1,
  "country": "US",
  "language": "en-US",
  "requestedMediaType": "apps",
  "requestedAge": "all",
  "requestedPrice": "all",
  "searchRank": 1,
  "recordType": "search",
  "searchTerm": "video editor",
  "source": "microsoft-store",
  "schemaVersion": "2.0",
  "scrapedAt": "2026-08-10T10:00:00Z"
}
```

Every Search top-level field and every known nested field for images, previews, preview thumbnails, ratings, installer information, SKU summaries, sale prices, and price information is shown.

#### Product details result - all 106 top-level fields

```json
{
  "shortDescription": "A lightweight video player.",
  "categoryId": "Photo & video",
  "developerName": "Example Publisher",
  "durationInSeconds": 0,
  "hasAddOns": true,
  "hasThirdPartyIAPs": false,
  "language": "en-us",
  "mediaType": "Apps",
  "publisherId": "72169360",
  "ratingCount": 0,
  "additionalLicenseTerms": "Standard publisher license terms.",
  "appWebsiteUrl": "https://example.com/",
  "disclaimerText": "Seller compliance information.",
  "features": [
    "Video playback"
  ],
  "gamingOptionsXboxLive": false,
  "isMsixvc": false,
  "lastUpdateDateUtc": "2026-08-07T07:40:25Z",
  "notes": [
    "Added trial and performance improvements."
  ],
  "permissionsRequired": [
    "Access your Internet connection"
  ],
  "platforms": [
    "x64"
  ],
  "privacyUrl": "https://example.com/privacy",
  "productRatings": [
    {
      "ratingSystem": "IARC",
      "ratingSystemShortName": "IARC",
      "ratingSystemId": "IARC",
      "ratingSystemUrl": "https://www.globalratings.com/",
      "ratingValue": "3+",
      "ratingId": "IARC:3",
      "ratingValueLogoUrl": "https://example.com/iarc-3.png",
      "ratingAge": 0,
      "restrictMetadata": false,
      "restrictPurchase": false,
      "ratingDescriptors": [],
      "ratingDescriptorLogoUrls": [],
      "ratingDisclaimers": [],
      "interactiveElements": [
        "In-App Purchases"
      ],
      "longName": "3+",
      "shortName": "3+",
      "description": "For ages 3 and up",
      "hasInAppPurchases": true
    }
  ],
  "publisherCopyrightInformation": "Copyright Example Publisher",
  "packageLastUpdateDateUtc": "2026-08-07T07:40:25Z",
  "supportedLanguages": [
    "English"
  ],
  "supportUris": [
    {
      "uri": "https://example.com/support"
    }
  ],
  "systemRequirements": {
    "minimum": {
      "title": "Minimum",
      "items": [
        {
          "level": "HardBlock",
          "itemCode": "ops",
          "name": "OS",
          "description": "Windows 10",
          "validationHint": "required",
          "helpLink": "https://example.com/windows",
          "helpTitle": "Supported Windows versions",
          "isValidationPassed": true,
          "priority": "Default"
        }
      ]
    },
    "recommended": {
      "title": "Recommended",
      "items": [
        {
          "level": "SoftBlock",
          "itemCode": "mem",
          "name": "Memory",
          "description": "8 GB",
          "validationHint": "recommended",
          "helpLink": "https://example.com/requirements",
          "helpTitle": "Requirements help",
          "isValidationPassed": true,
          "priority": "Default"
        }
      ]
    }
  },
  "warningMessages": [
    {
      "header": "Seizure warning",
      "text": "Photosensitive seizure warning",
      "target": "https://support.xbox.com/help"
    }
  ],
  "pdpImageUrl": "https://example.com/pdp.png",
  "productId": "9NLVZ8WTBGW1",
  "title": "Beauty Video Player",
  "description": "Play and organize videos.",
  "categories": [
    "Photo & video"
  ],
  "publisherName": "Example Publisher",
  "images": [
    {
      "imageType": "logo",
      "backgroundColor": null,
      "foregroundColor": null,
      "caption": null,
      "imagePositionInfo": null,
      "url": "https://example.com/icon.png",
      "height": 300,
      "width": 300
    }
  ],
  "averageRating": 4.5,
  "price": 45,
  "displayPrice": "PHP 45.00",
  "strikethroughPrice": null,
  "productFamilyName": null,
  "packageFamilyNames": [
    "Example.Package_abc"
  ],
  "installer": {
    "type": "WPM",
    "id": "9NLVZ8WTBGW1",
    "productCode": "example",
    "architectures": {
      "x64": {
        "version": "1.0",
        "sourceUri": "https://example.com/app.exe",
        "cdnUri": "https://cdn.example.com/app.exe",
        "args": "/S",
        "hash": "abc"
      }
    }
  },
  "eventsInfo": [],
  "previews": [
    {
      "$type": "ImageItem",
      "imageType": "Screenshot",
      "backgroundColor": null,
      "foregroundColor": null,
      "caption": null,
      "title": null,
      "imagePositionInfo": null,
      "url": "https://example.com/screen.png",
      "height": 1080,
      "width": 1920,
      "videoPurpose": null,
      "audioEncoding": null,
      "videoEncoding": null,
      "image": {
        "imageType": "thumbnail",
        "caption": "Preview thumbnail",
        "url": "https://example.com/preview.jpg",
        "height": 720,
        "width": 1280
      },
      "bitrate": null,
      "videoPositionInfo": null,
      "sortOrder": null
    }
  ],
  "ratingCountFormatted": "128",
  "productType": "Application",
  "skus": [
    {
      "skuId": "0010",
      "actions": [
        "Purchase"
      ],
      "availabilityId": "ABC",
      "price": 45,
      "displayPrice": "PHP 45.00",
      "fulfillmentData": "{}",
      "skuType": "full",
      "msrp": 45,
      "displayMSRP": "PHP 45.00",
      "salePrices": [
        {
          "price": 45,
          "displayPrice": "PHP 45.00",
          "badgeId": "default"
        }
      ]
    }
  ],
  "catalogSource": "BigCat",
  "iconUrl": "https://example.com/icon.png",
  "posterArtUrl": "https://example.com/poster.png",
  "boxArtUrl": "https://example.com/box.png",
  "iconUrlBackground": "transparent",
  "screenshots": [
    {
      "imageType": "Screenshot",
      "backgroundColor": null,
      "foregroundColor": null,
      "caption": null,
      "imagePositionInfo": null,
      "url": "https://example.com/screen.png",
      "height": 1080,
      "width": 1920
    }
  ],
  "encodedTitle": "beauty-video-player",
  "isApplication": true,
  "isGame": false,
  "isTvSeries": false,
  "isMovie": false,
  "isMoviesOrTVs": false,
  "isPwa": false,
  "isTheme": false,
  "isCoreGame": false,
  "isAllowed": true,
  "isBrowsable": true,
  "isPurchaseEnabled": true,
  "isAd": false,
  "isSparkProduct": false,
  "isAndroid": false,
  "isHardware": false,
  "isSubscription": false,
  "isTencent": false,
  "isTencentMini": false,
  "pageTitleLocalization": "Common.PageAppsTitle",
  "disableDownload": false,
  "cardActions": [
    "Details",
    "Purchase"
  ],
  "shortTitle": "Beauty Player",
  "categoryIds": [
    "Photo & video"
  ],
  "subcategoryName": "Video players",
  "approximateSizeInBytes": 66790402,
  "capabilities": [
    "internetClient"
  ],
  "maxInstallSizeInBytes": 136364032,
  "installationTerms": "Install on up to ten Windows devices.",
  "isMicrosoftProduct": false,
  "version": "1.0.0",
  "isGamingAppOnly": false,
  "skusSummary": [
    {
      "msrp": 45,
      "displayMSRP": "PHP 45.00",
      "salePrices": [
        {
          "price": 45,
          "displayPrice": "PHP 45.00",
          "badgeId": "default"
        }
      ]
    }
  ],
  "releaseDateUtc": "2026-08-01T07:40:25Z",
  "priceInfo": {
    "msrp": 45,
    "price": 45,
    "badgeText": "On sale",
    "displayPrice": "PHP 45.00",
    "forceToDisplayPrice": false,
    "narratorText": "PHP 45.00",
    "ownership": 0
  },
  "allowedPlatforms": [
    "Windows.Desktop"
  ],
  "trailers": [],
  "ratingAllTimeAverage": 4.5,
  "ratingAllTimeCount": 128,
  "rating7DaysAverage": 4.6,
  "rating7DaysCount": 7,
  "rating30DaysAverage": 4.5,
  "rating30DaysCount": 32,
  "ratingWindows": [
    {
      "aggregateTimeSpan": "7Days",
      "averageRating": 4.6,
      "playCount": 0,
      "ratingCount": 7,
      "rentalCount": 0,
      "trialCount": 0,
      "purchaseCount": 0
    },
    {
      "aggregateTimeSpan": "30Days",
      "averageRating": 4.5,
      "playCount": 0,
      "ratingCount": 32,
      "rentalCount": 0,
      "trialCount": 0,
      "purchaseCount": 0
    },
    {
      "aggregateTimeSpan": "AllTime",
      "averageRating": 4.5,
      "playCount": 0,
      "ratingCount": 128,
      "rentalCount": 0,
      "trialCount": 0,
      "purchaseCount": 0
    }
  ],
  "url": "https://apps.microsoft.com/detail/9nlvz8wtbgw1?hl=en-US&gl=US",
  "country": "US",
  "requestedLanguage": "en-US",
  "available": true,
  "includedReviews": [
    {
      "productId": "9NLVZ8WTBGW1",
      "reviewerName": "Example User",
      "rating": 4,
      "market": "PH",
      "locale": "EN-US",
      "helpfulPositive": 15,
      "helpfulNegative": 1,
      "osVersion": "10.0.26200.8894",
      "reviewId": "review-id",
      "reviewText": "Useful app.",
      "title": "Works well",
      "submittedDateTimeUtc": "2026-07-23T22:31:52.005323Z",
      "isProductTrial": false,
      "isTakenDown": false,
      "violationsFound": false,
      "isPublished": true,
      "isRevised": true,
      "updatedSinceResponse": false,
      "isAppInstalled": true,
      "packageFullName": "Example.Package_1.0.0.0_x64__abc",
      "deviceFamily": "Windows.Desktop",
      "reviewUrl": "https://ratingsedge.rnr.microsoft.com/example/review-id",
      "reviewRank": 1,
      "reviewSort": "mostRecent",
      "totalReviews": 25,
      "requestedCountry": "US",
      "requestedLanguage": "en-US",
      "requestedScores": [],
      "requestedFrom": null,
      "requestedTo": null,
      "requestedKeywords": []
    }
  ],
  "recordType": "details",
  "source": "microsoft-store",
  "schemaVersion": "2.0",
  "scrapedAt": "2026-08-10T10:00:00Z"
}
```

Every Details top-level field and every known nested field for ratings, support links, requirements, warnings, images, previews, installer architectures, SKUs, sale prices, screenshots, pricing, and embedded reviews is shown. Real arrays can contain more items; the Actor returns all received items and does not truncate individual objects.

`eventsInfo` and `trailers` are empty in the captured Microsoft responses. If Microsoft publishes source-defined objects in those arrays, the Actor preserves them without inventing undocumented meanings.

#### Review result - all 35 top-level fields

```json
{
  "productId": "9NLVZ8WTBGW1",
  "reviewerName": "Example User",
  "rating": 4,
  "market": "PH",
  "locale": "EN-US",
  "helpfulPositive": 15,
  "helpfulNegative": 1,
  "osVersion": "10.0.26200.8894",
  "reviewId": "review-id",
  "reviewText": "Useful app.",
  "title": "Works well",
  "submittedDateTimeUtc": "2026-07-23T22:31:52.005323Z",
  "isProductTrial": false,
  "isTakenDown": false,
  "violationsFound": false,
  "isPublished": true,
  "isRevised": true,
  "updatedSinceResponse": false,
  "isAppInstalled": true,
  "packageFullName": "Example.Package_1.0.0.0_x64__abc",
  "deviceFamily": "Windows.Desktop",
  "reviewUrl": "https://ratingsedge.rnr.microsoft.com/example/review-id",
  "reviewRank": 1,
  "reviewSort": "mostRecent",
  "totalReviews": 25,
  "requestedCountry": "US",
  "requestedLanguage": "en-US",
  "requestedScores": [1, 2],
  "requestedFrom": "2026-01-01",
  "requestedTo": "2026-12-31",
  "requestedKeywords": ["crash", "support"],
  "recordType": "review",
  "source": "microsoft-store",
  "schemaVersion": "2.0",
  "scrapedAt": "2026-08-10T10:00:00Z"
}
```

The captured review API does not expose reviewer profile images or developer replies. The Actor does not fabricate those fields.

Missing products do not abort a batch. They are reported in the run log and are never charged as successful result events.

### What data can you extract?

#### Complete Search fields

All 64 top-level fields are: `recordType`, `source`, `schemaVersion`, `scrapedAt`, `searchTerm`, `searchRank`, `productId`, `title`, `description`, `categories`, `publisherName`, `images`, `averageRating`, `price`, `displayPrice`, `strikethroughPrice`, `productFamilyName`, `packageFamilyNames`, `isGamingAppOnly`, `installer`, `previews`, `typeTag`, `ratingCountFormatted`, `iconUrl`, `posterArtUrl`, `boxArtUrl`, `iconUrlBackground`, `screenshots`, `encodedTitle`, `isApplication`, `isGame`, `isTvSeries`, `isMovie`, `isMoviesOrTVs`, `isPwa`, `isTheme`, `isCoreGame`, `isAllowed`, `isBrowsable`, `isPurchaseEnabled`, `isAd`, `isSparkProduct`, `isAndroid`, `isHardware`, `isSubscription`, `isTencent`, `isTencentMini`, `pageTitleLocalization`, `disableDownload`, `cardActions`, `productRatings`, `skusSummary`, `releaseDateUtc`, `appExtCategoryNames`, `priceInfo`, `redirectUrl`, `url`, `searchPage`, `searchPosition`, `country`, `language`, `requestedMediaType`, `requestedAge`, `requestedPrice`.

#### Complete Details fields

All 106 top-level fields are: `recordType`, `source`, `schemaVersion`, `scrapedAt`, `shortDescription`, `categoryId`, `developerName`, `durationInSeconds`, `hasAddOns`, `hasThirdPartyIAPs`, `language`, `mediaType`, `publisherId`, `ratingCount`, `additionalLicenseTerms`, `appWebsiteUrl`, `disclaimerText`, `features`, `gamingOptionsXboxLive`, `isMsixvc`, `lastUpdateDateUtc`, `notes`, `permissionsRequired`, `platforms`, `privacyUrl`, `productRatings`, `publisherCopyrightInformation`, `packageLastUpdateDateUtc`, `supportedLanguages`, `supportUris`, `systemRequirements`, `warningMessages`, `pdpImageUrl`, `productId`, `title`, `description`, `categories`, `publisherName`, `images`, `averageRating`, `price`, `displayPrice`, `strikethroughPrice`, `productFamilyName`, `packageFamilyNames`, `installer`, `eventsInfo`, `previews`, `ratingCountFormatted`, `productType`, `skus`, `catalogSource`, `iconUrl`, `posterArtUrl`, `boxArtUrl`, `iconUrlBackground`, `screenshots`, `encodedTitle`, `isApplication`, `isGame`, `isTvSeries`, `isMovie`, `isMoviesOrTVs`, `isPwa`, `isTheme`, `isCoreGame`, `isAllowed`, `isBrowsable`, `isPurchaseEnabled`, `isAd`, `isSparkProduct`, `isAndroid`, `isHardware`, `isSubscription`, `isTencent`, `isTencentMini`, `pageTitleLocalization`, `disableDownload`, `cardActions`, `shortTitle`, `categoryIds`, `subcategoryName`, `approximateSizeInBytes`, `capabilities`, `maxInstallSizeInBytes`, `installationTerms`, `isMicrosoftProduct`, `version`, `isGamingAppOnly`, `skusSummary`, `releaseDateUtc`, `priceInfo`, `allowedPlatforms`, `trailers`, `ratingAllTimeAverage`, `ratingAllTimeCount`, `rating7DaysAverage`, `rating7DaysCount`, `rating30DaysAverage`, `rating30DaysCount`, `ratingWindows`, `url`, `country`, `requestedLanguage`, `available`, `includedReviews`.

#### Complete Review fields

All 35 top-level fields are: `recordType`, `source`, `schemaVersion`, `scrapedAt`, `productId`, `reviewerName`, `rating`, `market`, `locale`, `helpfulPositive`, `helpfulNegative`, `osVersion`, `reviewId`, `reviewText`, `title`, `submittedDateTimeUtc`, `isProductTrial`, `isTakenDown`, `violationsFound`, `isPublished`, `isRevised`, `updatedSinceResponse`, `isAppInstalled`, `packageFullName`, `deviceFamily`, `reviewUrl`, `reviewRank`, `reviewSort`, `totalReviews`, `requestedCountry`, `requestedLanguage`, `requestedScores`, `requestedFrom`, `requestedTo`, `requestedKeywords`.

#### Complete nested object schemas

| Nested value | Complete fields |
| --- | --- |
| Images and screenshots | `imageType`, `backgroundColor`, `foregroundColor`, `caption`, `imagePositionInfo`, `url`, `height`, `width` |
| Previews | `$type`, `imageType`, `backgroundColor`, `foregroundColor`, `caption`, `title`, `imagePositionInfo`, `url`, `height`, `width`, `videoPurpose`, `audioEncoding`, `videoEncoding`, `image`, `bitrate`, `videoPositionInfo`, `sortOrder` |
| Preview thumbnail | `imageType`, `caption`, `url`, `height`, `width` |
| Content rating | `ratingSystem`, `ratingSystemShortName`, `ratingSystemId`, `ratingSystemUrl`, `ratingValue`, `ratingId`, `ratingValueLogoUrl`, `ratingAge`, `restrictMetadata`, `restrictPurchase`, `ratingDescriptors`, `ratingDescriptorLogoUrls`, `ratingDisclaimers`, `interactiveElements`, `longName`, `shortName`, `description`, `hasInAppPurchases` |
| Installer | `type`, `id`, `productCode`, `architectures` |
| Installer architecture | `version`, `sourceUri`, `cdnUri`, `args`, `hash` |
| SKU summary | `msrp`, `displayMSRP`, `salePrices` |
| SKU | `skuId`, `actions`, `availabilityId`, `price`, `displayPrice`, `fulfillmentData`, `skuType`, `msrp`, `displayMSRP`, `salePrices` |
| Sale price | `price`, `displayPrice`, `badgeId` |
| Price information | `msrp`, `price`, `badgeText`, `displayPrice`, `forceToDisplayPrice`, `narratorText`, `ownership` |
| Requirement item | `level`, `itemCode`, `name`, `description`, `validationHint`, `helpLink`, `helpTitle`, `isValidationPassed`, `priority` |
| Warning | `header`, `text`, `target` |
| Support URI | `uri` |
| Rating window | `aggregateTimeSpan`, `averageRating`, `playCount`, `ratingCount`, `rentalCount`, `trialCount`, `purchaseCount` |
| Embedded review | `productId`, `reviewerName`, `rating`, `market`, `locale`, `helpfulPositive`, `helpfulNegative`, `osVersion`, `reviewId`, `reviewText`, `title`, `submittedDateTimeUtc`, `isProductTrial`, `isTakenDown`, `violationsFound`, `isPublished`, `isRevised`, `updatedSinceResponse`, `isAppInstalled`, `packageFullName`, `deviceFamily`, `reviewUrl`, `reviewRank`, `reviewSort`, `totalReviews`, `requestedCountry`, `requestedLanguage`, `requestedScores`, `requestedFrom`, `requestedTo`, `requestedKeywords` |

Architecture names inside `installer.architectures`, such as `x64` or `ARM64`, are dynamic Microsoft keys. Their value schema is fully listed.

### Input parameters

| Parameter | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `mode` | string | Yes | `search` | `search`, `details`, or `reviews` |
| `searchTerms` | string\[] | Search mode | `["video editor"]` | One or more Microsoft Store keywords |
| `appIds` | string\[] | Details/reviews | - | Product IDs or full Microsoft Store URLs |
| `maxResults` | integer | No | `50` | Maximum Search results per term or Reviews per product, 1-500 |
| `country` | string | No | `US` | Two-letter market passed as `gl` |
| `countries` | string\[] | No | `[]` | Up to 50 markets; overrides `country` when non-empty |
| `language` | string | No | `en-US` | Locale passed as `hl` |
| `maxConcurrency` | integer | No | `5` | Simultaneous country, keyword, or product jobs, 1-20 |
| `includeReviews` | boolean | No | `false` | Populate `includedReviews` in Details |
| `reviewSort` | string | No | `mostHelpful` | `mostHelpful`, `mostRecent`, `highestRating`, or `lowestRating` |
| `reviewScores` | string\[] | No | `[]` | Star filters from `"1"` through `"5"`; empty means all |
| `reviewsFrom` | string | No | `""` | Inclusive review start date in `YYYY-MM-DD` format |
| `reviewsTo` | string | No | `""` | Inclusive review end date in `YYYY-MM-DD` format |
| `reviewKeywords` | string\[] | No | `[]` | Keep reviews whose title or text contains any keyword |
| `mediaType` | string | No | `all` | Search filter: `all`, `apps`, or `games` |
| `age` | string | No | `all` | Search filter: `all` or `TO3` through `TO17` |
| `price` | string | No | `all` | Search filter: `all`, `Free`, `Paid`, or `Sale` |

Search filters are ignored by Details and Reviews. Review filters apply to Reviews and embedded Details reviews. In Details, `maxResults` applies only when `includeReviews` is enabled. Every keyword or Product ID is processed once for every selected country.

### Use cases

#### Microsoft Store market research

- Discover products ranking for target keywords
- Compare apps and games by publisher, category, rating, price, and product type
- Detect rating momentum with all-time, 7-day, and 30-day averages and counts
- Build recurring catalogs across countries and locales

#### Pricing and technical intelligence

- Track regular, sale, display, and strikethrough prices
- Compare SKUs, trials, versions, package families, sizes, architectures, and platforms
- Review permissions, capabilities, requirements, content ratings, and update dates

#### Review monitoring

- Collect newest, most helpful, highest-rated, or lowest-rated reviews
- Analyze text, helpful votes, Windows version, package version, and device family
- Track revised reviews and installation or trial indicators

### Performance and cost

The Actor uses lightweight JSON requests instead of launching a browser. Independent country, keyword, and product jobs run concurrently up to `maxConcurrency`. Details makes one additional lightweight DisplayCatalog request for rating windows. Search and Reviews use more requests as `maxResults` grows; restrictive Review filters can require scanning additional pages, and `includeReviews` adds review pagination to every Details record.

The repository does not define a public Actor price or repeatable production benchmarks, so this README does not claim fixed runtime or cost. Check the Actor's **Pricing** tab before a large run. Usage depends on pages, product count, response size, retries, and proxy traffic.

#### Pay-per-event billing

- `search-result` is charged once for every saved Search row.
- `app-details` is charged once for every saved Details row.
- `review` is charged once for every saved standalone review and every review visible inside `includedReviews`.
- Missing products and failed requests are logged and do not call a custom billing event.
- Remove the synthetic `apify-default-dataset-item` event from the Actor pricing configuration to avoid charging every Dataset row a second time.

#### Retries and proxy behavior

- Every Microsoft Store request is routed through Apify Proxy.
- The input schema has no proxy field; users do not configure networking.
- Direct Microsoft Store traffic is disabled.
- No sticky proxy session ID is supplied.
- Temporary HTTP failures, timeouts, proxy failures, and invalid JSON structures are retried with exponential backoff.
- Products and reviews are deduplicated by stable IDs.
- One failed Product ID does not discard successful batch records or create a paid error row.
- `x-api-ref` is calculated for each exact request URL with SHA-256; saved browser tokens are not reused.

### API usage

Replace `YOUR_ACTOR_ID` and `YOUR_APIFY_TOKEN` with values from the Actor's API page:

```bash
curl "https://api.apify.com/v2/acts/YOUR_ACTOR_ID/runs?token=YOUR_APIFY_TOKEN" \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{"mode":"search","searchTerms":["password manager"],"maxResults":20,"country":"US","language":"en-US"}'
```

Results are available in the default dataset. Export JSON, CSV, Excel, XML, RSS, or JSONL, or connect Make, Zapier, n8n, Google Sheets, webhooks, schedules, and warehouses.

The Output tab contains one unified **Results** view instead of separate mode tabs. It exposes the complete 144-field union of Search, Details, and Review outputs. Columns that do not apply to a particular `recordType` remain empty, while every available field stays accessible in the same table without switching views or opening the automatic All fields view.

### Best for / not for

**Best for:** public Microsoft Store discovery, product catalogs, regional prices, compatibility research, SKU analysis, and public review monitoring.

**Not for:** Partner Center data, authenticated account information, purchasing or installing products, executing installer URLs, licensing operations, or guaranteeing every historical review.

### Limits and good to know

- One mode runs per execution.
- `maxResults` is an upper limit of 500 per term, product, and selected country; Microsoft can expose fewer records.
- Search processes the final page before stopping when `hasMorePages` becomes `false`, including a page without `cursor`.
- Reviews are returned in pages of 10.
- The Reviews endpoint uses the same empty envelope for an unknown product and a valid product with no reviews. Standalone Reviews verifies empty results through Details.
- Details differs between WindowsUpdate/MSIX, WPM, apps, and games. Stable fields use `null`, `[]`, or `{}` when unpublished.
- Prices, ratings, languages, availability, and totals can differ by country and locale.
- Rating-window enrichment is non-fatal: if DisplayCatalog is unavailable, its six summary fields are `null` and `ratingWindows` is empty while the main Details record is still saved.
- `language` in Details is Microsoft's product value; `requestedLanguage` is the requested locale.
- Review score, date, and keyword filters are applied while paginating the public review response.
- Missing products are recorded in logs rather than the Dataset and do not stop other jobs.
- Public response structures can change. The Actor validates them and fails visibly.
- The Actor does not download packages or execute installer links.

### Frequently asked questions

#### Do I need a Microsoft account, API key, or proxy?

No. The Actor uses public responses and configures Apify Proxy automatically.

#### Can I pass full Microsoft Store URLs?

Yes. Product IDs and URLs from `apps.microsoft.com` or `www.microsoft.com` can be mixed in `appIds`.

#### Can I process several keywords or products?

Yes. Add multiple values to `searchTerms` or `appIds`. `maxResults` applies independently.

#### Why are some fields null or empty?

Microsoft publishes different metadata for different product, installer, catalog, and regional variants. The Actor keeps stable keys.

#### Does language translate reviews?

No. It selects the Store interface locale. Review text remains as published; `locale` and `market` contain Microsoft's review metadata.

#### Why can Reviews perform an extra Details request?

An empty Reviews response does not reveal whether the product exists. Details is checked only for that edge case.

#### Can I schedule recurring runs?

Yes. Use Apify schedules and webhooks for recurring searches, snapshots, and review collection.

### Responsible use

Use the Actor in accordance with applicable laws and Microsoft Store terms. Do not use reviewer or publisher information for spam, harassment, deception, or unlawful profiling.

This independent Actor is not affiliated with, endorsed by, or sponsored by Microsoft Corporation. Microsoft, Windows, Xbox, and Microsoft Store are trademarks of their respective owners.

### Support

For a missing field, changed response, or unexpected empty result, create an issue in the Actor's **Issues** tab. Include the run ID, mode, country, locale, and a non-sensitive reproducible input.

### Local development

Use Python 3.11 or newer:

```powershell
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
.\.venv\Scripts\python.exe -m unittest discover -s tests -v
```

The production image uses Python 3.13 and starts with `python -m my_actor`.

# Actor input Schema

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

Scraping mode: search, details, or reviews.

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

Keywords to search for. Required in search mode; the result limit applies to each term.

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

Microsoft Store Product IDs or full apps.microsoft.com URLs. Required in details and reviews modes.

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

Maximum search results per term or reviews per product. In details mode, it applies to included reviews.

## `country` (type: `string`):

Two-letter Microsoft Store market code used as gl, such as US, DE, or PH.

## `countries` (type: `array`):

Optional Microsoft Store markets to process in one run. When provided, this list overrides country. Maximum 50.

## `language` (type: `string`):

Microsoft Store locale used as hl, such as en-US, de-DE, or pt-BR.

## `maxConcurrency` (type: `integer`):

Maximum country, keyword, or product jobs processed at the same time.

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

Also collect reviews into includedReviews for each details record.

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

Review order used in reviews mode and details review enrichment.

## `reviewScores` (type: `array`):

Optional star-rating filter used in Reviews and embedded Details reviews. Leave empty for all scores.

## `reviewsFrom` (type: `string`):

Optional inclusive start date in YYYY-MM-DD format.

## `reviewsTo` (type: `string`):

Optional inclusive end date in YYYY-MM-DD format.

## `reviewKeywords` (type: `array`):

Optional case-insensitive keywords. A review is kept when its title or text contains any keyword.

## `mediaType` (type: `string`):

Department filter used only in search mode.

## `age` (type: `string`):

Age filter used only in search mode.

## `price` (type: `string`):

Price filter used only in search mode.

## Actor input object example

```json
{
  "mode": "search",
  "searchTerms": [
    "video editor"
  ],
  "appIds": [],
  "maxResults": 50,
  "country": "US",
  "countries": [],
  "language": "en-US",
  "maxConcurrency": 5,
  "includeReviews": false,
  "reviewSort": "mostHelpful",
  "reviewScores": [],
  "reviewsFrom": "",
  "reviewsTo": "",
  "reviewKeywords": [],
  "mediaType": "all",
  "age": "all",
  "price": "all"
}
```

# Actor output Schema

## `dataset` (type: `string`):

Search results, complete product details, or public customer 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapingmonkey/microsoft-store-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("scrapingmonkey/microsoft-store-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 scrapingmonkey/microsoft-store-scraper --silent --output-dataset

```

## MCP server setup

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