{
"productId": "Product Id",
"rating": {
"average": 4.5,
"count": 12,
"distribution": {
"oneStar": 0,
"twoStars": 1,
"threeStars": 1,
"fourStars": 2,
"fiveStars": 8
}
},
"reviews": {
"items": [
{
"id": "Review Id",
"authorName": "Sample name",
"rating": 5,
"comment": "Sample text",
"createdAt": "2026-01-01T00:00:00.0000000+00:00",
"purchasedVariantIds": ["Variant Id"]
},
"..."
],
"page": 1,
"pageSize": 10,
"totalCount": 12,
"totalPages": 2
},
"name": "ProductReviews",
"view": "Default",
"section": "SectionA",
"settings": {
"id": "Component Id",
"section": "SectionA",
"type": "NoirProductReviews",
"name": "ProductReviews",
"view": "Default",
"cssClass": "",
"header": "Sample text"
},
"translations": {
"title": "Reviews",
"reviewsCount": "reviews",
"anonymous": "Customer",
"previous": "Previous",
"next": "Next"
}
}settings.idproductId: the product of the page, for reading the next pages.ratingaverage has two decimals; distribution counts the published reviews per star.rating is still null. Decide on the summary and on the list separately.reviewsitems empty, totalCount 0) while the product has no published review.authorName is the customer's name from the order, and may be null.rating and reviews are both null while the store does not collect reviews, the company lacks thesettings.header, translations.*model.Settings.Idmodel.Settings.CssClassmodel.Settings.HeaderComponents/ProductReviews/Default.js exposes:<section x-data='productreviewsdefault.initComponent({{ model.ProductId | serialize | escape }}, {{ model.Reviews | serialize | escape }}, {{ model.Translations.Anonymous | serialize | escape }})'>items, page, pageSize, totalPages: the page shown;isLoading: true while a page is being read;anonymousName: shown when a review has no authorName.page with servicesreusabledefault.getProductReviews(productId, page, pageSize) and shows it. Doespage is out of range or already shown.createdAt as a date in the page's language.servicesreusabledefault.getProductReviews(productId, page, pageSize): GET/api/product-reviews?productId=&page=&pageSize= (anonymous, pageSize at most 50). It returns the samereviews, and an empty page while the store does not show reviews. Seeservicesreusabledefault (Reusables/Services/Default.js)x-text or | escape, never asShowRatingOn… flags inrating is present, and the list only while it has items.--loading modifier class is applied.