Microsoft Store API endpoint
Returns one page of written Microsoft Store reviews for a product id, each with rating, title, text, submission time, helpful-vote counts, and device/OS info. sort controls ordering (MostHelpful or MostRecent -- the only two values the upstream API itself accepts; any other value is rejected).
/microsoftstore/reviewsQuery parameters:
product_id (required) — Microsoft Store product id, e.g. 9NCBCSZSJRSB.sort (optional, default MostHelpful) — review sort order. One of MostHelpful, MostRecent. These are the only two values the upstream API itself accepts — any other value is rejected by the upstream with a request-validation error, surfaced here as 400.page (optional, default 1) — 1-based page number.page_size (optional, default 20, max 50) — reviews per page.country (optional, default US) — store country/region code (ISO-2).locale (optional, default en-US) — display locale (BCP-47).Returns product_id, sort, page, page_size, total_count (the true upstream review count), has_more_pages, next_page (present when a later page has more), reviews[], and source_url. Each review has id, reviewer_name, rating (1-5), title, text, market, locale, submitted_at_utc, helpful_positive, helpful_negative, os_version, device_family, is_revised, and url (a direct link to the review on Microsoft's ratings-edge content API).
A product with no written reviews returns 200 with total_count: 0 and an empty reviews[].
| Field | Filled in, of 20 checked | Values in the sample |
|---|---|---|
| id | 20 | |
| reviewer_name | 20 | |
| rating | 20 | 1 to 4, median 1 |
| title | 20 | |
| text | 20 | |
| market | 20 | |
| locale | 20 | |
| submitted_at_utc | 20 | 2026-04-30 to 2026-09-25 |
| helpful_positive | 20 | 4 to 181, median 21 |
| helpful_negative | 20 | 0 to 108, median 7 |
| os_version | 20 | |
| device_family | 20 | |
| url | 20 | ratingsedge.rnr.microsoft.com |
| is_revised | 6 | true in 6 of 6 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| product_id | string | Yes | Microsoft Store product id | 9NCBCSZSJRSB | |
| sort | string | No | Review sort order Allowed values: MostHelpful, MostRecent. | ||
| page | integer | No | 1-based page number | ||
| page_size | integer | No | Reviews per page (max 50) | ||
| country | string | No | Store country/region code (ISO-2) | ||
| locale | string | No | Display locale (BCP-47) | ||
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/microsoftstore/reviews?product_id=9NCBCSZSJRSB&sort=MostHelpful&page=1&country=us" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"product_id": "9ncbcszsjrsb",
"sort": "MostHelpful",
"page": 1,
"page_size": 20,
"total_count": 307,
"has_more_pages": true,
"next_page": 2,
"reviews": [
{
"id": "74a23681-6299-5cc4-5e83-a48d1c49ece6",
"reviewer_name": "constance",
"rating": 1,
"title": "spotify has fallen off. HARD.",
"text": "so, the app used to be great...",
"market": "US",
"locale": "EN-US",
"submitted_at_utc": "2026-07-12T21:41:45.0235229Z",
"helpful_positive": 74,
"helpful_negative": 30,
"os_version": "10.0.26200.8524",
"device_family": "Windows.Desktop"
}
],
"source_url": "https://apps.microsoft.com/api/products/getReviews/9NCBCSZSJRSB?orderBy=MostHelpful&pgNo=1&noItems=20&gl=US&hl=en-US"
}
}Request schema
No body schema
Response schema
#/definitions/microsoftstore.reviewsResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | microsoftstore.ReviewsResponse | No | ||||
| data.has_more_pages | boolean | No | true | |||
| data.next_page | integer | No | 2 | |||
| data.page | integer | No | 1 | |||
| data.page_size | integer | No | 20 | |||
| data.product_id | string | No | 9ncbcszsjrsb | |||
| data.reviews | array | No | ||||
| data.reviews[].device_family | string | No | Windows.Desktop | |||
| data.reviews[].helpful_negative | integer | No | 30 | |||
| data.reviews[].helpful_positive | integer | No | 74 | |||
| data.reviews[].id | string | No | 74a23681-6299-5cc4-5e83-a48d1c49ece6 | |||
| data.reviews[].is_revised | boolean | No | ||||
| data.reviews[].locale | string | No | EN-US | |||
| data.reviews[].market | string | No | US | |||
| data.reviews[].os_version | string | No | 10.0.26200.8524 | |||
| data.reviews[].rating | integer | No | 1 | |||
| data.reviews[].reviewer_name | string | No | constance | |||
| data.reviews[].submitted_at_utc | string | No | 2026-07-12T21:41:45Z | |||
| data.reviews[].text | string | No | so, the app used to be great... | |||
| data.reviews[].title | string | No | spotify has fallen off. HARD. | |||
| data.reviews[].url | string | No | ||||
| data.sort | string | No | MostHelpful | |||
| data.source_url | string | No | ||||
| data.total_count | integer | No | 307 | |||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/microsoftstore/reviews?product_id=9NCBCSZSJRSB&sort=MostHelpful&page=1&country=us" \
-H "x-api-key: $CRAWLORA_API_KEY"