ListReviews
const url = 'https://example.com/wink.partner.v1.Content/ListReviews';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"propertyId":"example","page":1,"size":1,"knownVersion":"example","imageFormat":"example"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://example.com/wink.partner.v1.Content/ListReviews \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "propertyId": "example", "page": 1, "size": 1, "knownVersion": "example", "imageFormat": "example" }'List a property’s guest reviews, one page at a time
Only APPROVED reviews are returned, NEWEST FIRST. page is zero-based. size defaults to 25 when it is
zero or negative and may not exceed 100. A page past the end is not an error: it comes back
CONTENT_STATUS_OK with no reviews and the true total_reviews / total_pages.
Reviews are not restricted by your sales channel, like the rest of Content. An unknown property_id
comes back CONTENT_STATUS_NOT_FOUND on the response (the call itself succeeds).
Conditional fetch works as on GetProperty: send the cache_token of a previous response as
known_version and, if nothing on that page changed, the response is CONTENT_STATUS_NOT_MODIFIED carrying
the identity, paging inputs, totals and cache_token only, with no reviews. The token covers the page
(reviews, image URLs, totals, page, size and image_format), so it is only valid for the same page
and size it came from.
Billing is one unit per CALL, whatever comes back, NOT_MODIFIED included.
Returns INVALID_ARGUMENT when property_id is blank, page is negative, size exceeds 100, or
image_format is not a supported image media type.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”Request for ListReviews.
object
Property whose reviews to list. Identifier comes from a search result’s property_id.
Zero-based page index. Negative is rejected with INVALID_ARGUMENT.
Reviews per page. Zero or negative means the default of 25; more than 100 is rejected with INVALID_ARGUMENT.
Content you already hold: the cache_token the previous response for this same page and size
carried. A match returns CONTENT_STATUS_NOT_MODIFIED. Send the token, not anything derived from it, and
do not parse it. BILLING DOES NOT CHANGE: one unit per call whatever comes back.
IANA media type for review image delivery URLs: image/jpeg (the default), image/png, image/webp, or image/* to let the CDN negotiate per client from its Accept header. Empty means image/jpeg. An unrecognised value is rejected with INVALID_ARGUMENT.
Example generated
{ "propertyId": "example", "page": 1, "size": 1, "knownVersion": "example", "imageFormat": "example"}Responses
Section titled “Responses”The RPC completed with gRPC status OK.
Response for ListReviews.
object
The property identifier as requested.
CONTENT_STATUS_OK, CONTENT_STATUS_NOT_FOUND (unknown property) or CONTENT_STATUS_NOT_MODIFIED (your
known_version is current: keep what you stored, reviews is absent rather than empty).
The zero-based page index served, echoing the request.
The page size served: the request’s size, or 25 when it was zero or negative.
All approved reviews of the property, across every page.
Pages needed for total_reviews at this size.
The reviews on this page, newest first. Empty for a page past the end.
One approved guest review.
object
The reviewer’s display name.
When the review was submitted, ISO-8601 local date-time (e.g. 2026-10-17T09:30:00).
Average score across the answered questions.
The review text.
The per-question answers behind average_score.
One answered review question.
object
The question category, e.g. COMFORT, SERVICE or VALUE.
Display order of this answer within the review.
The guest’s rating for this question on a 0-10 scale.
The property’s reply to the review. Absent when there is none.
How many members liked the review.
The Cloudinary public id of the review’s image. Set only when an approved image exists, and then
together with urls. Stable across media reorganisations, unlike the URLs.
Delivery URLs of the review’s image in the requested image_format. Present only when an approved image
exists. URLs may rotate; key your storage on entity_id.
object
MULTIMEDIA_KIND_IMAGE only: unscaled, best-quality delivery URL.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_IMAGE only: large variant, max width 1920px.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_IMAGE only: medium variant, max width 1024px.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_IMAGE or MULTIMEDIA_KIND_VIDEO (Cloudinary): thumbnail variant, max width 320px. For video
this is a still frame extracted from the video, so its format is an image type and follows
image_format, not video_format.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (Cloudinary) only: streaming delivery URL, unscaled. Delivered as video_format,
which defaults to video/mp4.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (Cloudinary) only: preview variant, max width 1280px. Delivered as video_format.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (Cloudinary) only: poster frame at medium width. A still EXTRACTED from the video,
so like thumbnail it is an image and follows image_format.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (YouTube) only: pass-through to the YouTube watch URL. Wink generates no variants for externally-hosted media, so no format applies and every MediaUrlVariant field above is unset.
Opaque token over everything this page holds. Send it back as known_version on the next call for the
same page and size. Absent for CONTENT_STATUS_NOT_FOUND.
Example
{ "status": "CONTENT_STATUS_UNSPECIFIED"}