Skip to content

List property reviews

POST
/api/managing-entity/{managingEntityIdentifier}/extranet/review/grid
curl --request POST \
--url https://api.wink.travel/api/managing-entity/d5b8a3c2-9e6f-4a1b-8d34-7c2e1f0a5b69/extranet/review/grid \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Wink-Version: 2.0' \
--data '{ "filter": { "filters": [ { "field": "hotel.name", "ignoreCase": true, "operator": "startsWith", "value": "Happy Res" } ], "logic": "and" }, "group": [ { "aggregates": [ { "aggregate": "count", "field": "hotel.bookings" } ], "dir": "asc", "field": "createdDate" } ], "skip": 0, "sort": [ { "dir": "asc", "field": "hotel.name" } ], "take": 10 }'

Returns a paginated, filterable grid of guest reviews for the property, including filters by date, guest name, rating, and approval status. Results are wrapped in a standard Spring Page envelope.

managingEntityIdentifier
required
string

Managing entity identifier to show reviews for

Example
d5b8a3c2-9e6f-4a1b-8d34-7c2e1f0a5b69
Wink-Version
string
default: 2.0.0
Allowed values: 2.0

Pageable grid state including page number, page size, sort fields, and optional filters such as date range, guest name, rating, and approval status

Media typeapplication/json

Pagination, sorting, filtering, and grouping state used to query a paged result set.

object
filter

Descriptors used for filtering result set

object
filters

Descriptors used for filtering the result set

Array<object>

A single field-level filter criterion that specifies what to match and how to compare it.

object
field
required

Field name to filter on

string
>= 1 characters
Example
hotel.name
ignoreCase

Make filter comparison case insensitive. Default: Case sensitive

boolean
Example
true
operator
required

Filter operator to use on field

string
Allowed values: neq eq contains doesnotcontain isnull isnotnull isempty isnotempty startswith endswith gte lte gt lt in nin
Example
startsWith
value

Value to filter dataset against

Example
Happy Res
Example
{
"field": "hotel.name",
"ignoreCase": true,
"operator": "startsWith",
"value": "Happy Res"
}
logic

Whether to filter inclusively or exclusively

string
Allowed values: and or
Example
and
Example
{
"filters": [
{
"field": "hotel.name",
"ignoreCase": true,
"operator": "startsWith",
"value": "Happy Res"
}
],
"logic": "and"
}
group

Descriptors to group result sets by.

Array<object>

Descriptor that defines how a result set should be grouped, including sort direction and optional aggregate calculations.

object
aggregates

Primitive aggregate data points

Array<object>

Descriptor that defines an aggregate function to apply to a specific field in a grouped result set.

object
aggregate

Aggregate function

string
Allowed values: count sum average min max
Example
count
field

Field to run aggregate function on

string
Example
hotel.bookings
Example
{
"aggregate": "count",
"field": "hotel.bookings"
}
dir

Group sort direction

string
Allowed values: asc desc
Example
asc
field

Field to group data set on

string
Example
createdDate
Example
{
"aggregates": [
{
"aggregate": "count",
"field": "hotel.bookings"
}
],
"dir": "asc",
"field": "createdDate"
}
skip

Number of records to be skipped by the pager.

integer format: int32
0
Example
0
sort

Descriptors used for sorting result set.

Array<object>

Descriptor that defines the sort direction and field for ordering a result set.

object
dir

Descriptors used for sorting result set

string
Allowed values: asc desc
Example
asc
field

Data set field to sort on

string
Example
hotel.name
Example
{
"dir": "asc",
"field": "hotel.name"
}
take

Number of records to take.

integer format: int32
default: 30 >= 1 <= 180
Example
10
Example
{
"filter": {
"filters": [
{
"field": "hotel.name",
"ignoreCase": true,
"operator": "startsWith",
"value": "Happy Res"
}
],
"logic": "and"
},
"group": [
{
"aggregates": [
{
"aggregate": "count",
"field": "hotel.bookings"
}
],
"dir": "asc",
"field": "createdDate"
}
],
"skip": 0,
"sort": [
{
"dir": "asc",
"field": "hotel.name"
}
],
"take": 10
}

Paginated list of reviews retrieved successfully. Each page element is a ReviewLightweight object.

Media typeapplication/json

Owned pagination envelope: a page of content plus flat page metadata.

object
content

The elements on this page.

Array<object>

Lightweight projection of a guest review, containing all publicly visible review data and metadata.

object
answers

Guest’s answers to each review question with their scores.

Array<object>

A guest’s recorded answer to a single review question, including the score and question metadata.

object
category
required

Category of the question (e.g., COMFORT, SERVICE, VALUE).

string
Allowed values: COMFORT CONDITION SERVICE ENVIRONMENT FACILITIES LOCATION LIFESTYLE VALUE FOOD ROOM
questionIdentifier
required

Review question identifier that this answer responds to.

string format: uuid
>= 1 characters
sort
required

Display order of this answer within the review.

integer format: int32
value
required

Guest’s numeric rating for this question on a 0-10 scale.

integer format: int32
approvedImage

Hotel has approved the guest’s photo for public display on their profile.

boolean
approvedText

Hotel has approved this review text for public display on their profile.

boolean
averageScore

Average rating across all question answers (0-10 scale).

number format: double
bookingIdentifier

Booking identifier this review is associated with.

string format: uuid
createdDate

Datetime this record was first created

string | null format: date-time
hotelIdentifier

Property (hotel) identifier this review is for.

string format: uuid
id

Unique identifier for this record.

string format: uuid
imageIdentifier

Cloudinary image identifier for guest’s photo from their stay.

string
lastUpdate

Datetime this record was last updated

string | null format: date-time
likes

User identifiers who ‘liked’ this review.

Array<string>
messageFromGuest

Private feedback message from guest to hotel manager. Not publicly displayed.

string
responded

Hotel has submitted a response to this review.

boolean
responseFromHotel

Hotel’s public response to the guest review.

string
reviewDate

Date and time the review was submitted.

string format: date-time
roomNumber

Guest’s room number during their stay.

string
roomRating

Guest’s personal rating of their room on a 0-10 scale.

integer format: int32
text

Guest’s written review text.

string
user

Guest who submitted the review.

object
email

Guest’s email address.

string format: email
firstName

Guest’s first name.

string
fullName

Guest’s full name.

string
lastName

Guest’s last name.

string
telephone

Guest’s phone number.

string
/^\+?[1-9]\d{1,14}$/
userIdentifier

User identifier

string format: uuid
version

Optimistic-locking version. Echo this value back as an If-Match request header on a conditional update; the server responds 409 if the record changed in the meantime. Null when this projection has no backing versioned document, in which case no conditional update is possible.

integer | null format: int64
first

Whether this is the first page.

boolean
last

Whether this is the last page.

boolean
number

Zero-based index of this page.

integer format: int32
numberOfElements

Number of elements on this page.

integer format: int32
size

The requested page size.

integer format: int32
totalElements

Total number of elements across all pages.

integer format: int64
totalPages

Total number of pages for the current page size.

integer format: int32
Example
{
"content": [
{
"answers": [
{
"category": "SERVICE",
"questionIdentifier": "4d7c2a6b-9e3f-4b1a-8d0c-7f5e1a9b3c62",
"sort": 1,
"value": 7
}
],
"approvedImage": false,
"approvedText": true,
"averageScore": 8.7,
"bookingIdentifier": "f4d1c8e5-2b9a-4f3d-9e7c-1b6a5d3f8c92",
"createdDate": "2026-01-14T09:30:00",
"hotelIdentifier": "e2c7b4d3-1a8f-4e9c-b5d6-3a9f0e7c2b18",
"id": "b7e4c1a2-3f5d-4e8a-9c21-6f0b5d8e3a47",
"imageIdentifier": "wink/review/siam-residences-2026-01-14-xyz123abc",
"lastUpdate": "2026-02-03T16:45:12",
"messageFromGuest": "Dear GM, I would like to say thank you so much for taking the time to show my husband and me around the premises and the secret cave behind the property.",
"responded": false,
"responseFromHotel": "Thank you so much for taking the time to share such wonderful feedback about your stay at The Siam Residences. We're delighted that you and your husband had such a memorable experience. We look forward to welcoming you back soon!",
"reviewDate": "2026-01-14T09:30:00",
"roomNumber": "501",
"roomRating": 9,
"text": "Our stay was amazing! The staff made us feel truly welcomed, and the traditional Thai breakfast was exceptional. Can recommend highly to all. Felt like home.",
"user": {
"email": "[email protected]",
"firstName": "Alexandra",
"fullName": "Alexandra Beaumont",
"lastName": "Beaumont",
"telephone": "+66 2 126 8866",
"userIdentifier": "c3a9f2e1-8b4d-4c7a-a1e2-5f0b6d9e2c84"
},
"version": 3
}
],
"first": true,
"last": false,
"number": 0,
"numberOfElements": 20,
"size": 20,
"totalElements": 1234,
"totalPages": 62
}

Bad Request — missing or invalid request parameter or body

Media typeapplication/problem+json
object
detail
string
instance
string format: uri
properties
object
key
additional properties
status
integer format: int32
title
string
type
string format: uri
Examplegenerated
{
"detail": "example",
"instance": "https://example.com",
"properties": {
"additionalProperty": "example"
},
"status": 1,
"title": "example",
"type": "https://example.com"
}

Unauthorized — authentication is required or the session has expired

Media typeapplication/problem+json
object
detail
string
instance
string format: uri
properties
object
key
additional properties
status
integer format: int32
title
string
type
string format: uri
Examplegenerated
{
"detail": "example",
"instance": "https://example.com",
"properties": {
"additionalProperty": "example"
},
"status": 1,
"title": "example",
"type": "https://example.com"
}

Forbidden — authenticated but lacking the required permission or scope

Media typeapplication/problem+json
object
detail
string
instance
string format: uri
properties
object
key
additional properties
status
integer format: int32
title
string
type
string format: uri
Examplegenerated
{
"detail": "example",
"instance": "https://example.com",
"properties": {
"additionalProperty": "example"
},
"status": 1,
"title": "example",
"type": "https://example.com"
}

Not Found — the requested resource does not exist

Media typeapplication/problem+json
object
detail
string
instance
string format: uri
properties
object
key
additional properties
status
integer format: int32
title
string
type
string format: uri
Examplegenerated
{
"detail": "example",
"instance": "https://example.com",
"properties": {
"additionalProperty": "example"
},
"status": 1,
"title": "example",
"type": "https://example.com"
}

Method Not Allowed — the HTTP verb is not supported on this endpoint

Media typeapplication/problem+json
object
detail
string
instance
string format: uri
properties
object
key
additional properties
status
integer format: int32
title
string
type
string format: uri
Examplegenerated
{
"detail": "example",
"instance": "https://example.com",
"properties": {
"additionalProperty": "example"
},
"status": 1,
"title": "example",
"type": "https://example.com"
}

Conflict — the resource was modified by someone else since you read it; re-read it and retry with the new version

Media typeapplication/problem+json
object
detail
string
instance
string format: uri
properties
object
key
additional properties
status
integer format: int32
title
string
type
string format: uri
Examplegenerated
{
"detail": "example",
"instance": "https://example.com",
"properties": {
"additionalProperty": "example"
},
"status": 1,
"title": "example",
"type": "https://example.com"
}

Unsupported Media Type — use application/json

Media typeapplication/problem+json
object
detail
string
instance
string format: uri
properties
object
key
additional properties
status
integer format: int32
title
string
type
string format: uri
Examplegenerated
{
"detail": "example",
"instance": "https://example.com",
"properties": {
"additionalProperty": "example"
},
"status": 1,
"title": "example",
"type": "https://example.com"
}

Internal Server Error — an unexpected failure occurred on the server

Media typeapplication/problem+json
object
detail
string
instance
string format: uri
properties
object
key
additional properties
status
integer format: int32
title
string
type
string format: uri
Examplegenerated
{
"detail": "example",
"instance": "https://example.com",
"properties": {
"additionalProperty": "example"
},
"status": 1,
"title": "example",
"type": "https://example.com"
}

Service Unavailable — a downstream dependency is unreachable

Media typeapplication/problem+json
object
detail
string
instance
string format: uri
properties
object
key
additional properties
status
integer format: int32
title
string
type
string format: uri
Examplegenerated
{
"detail": "example",
"instance": "https://example.com",
"properties": {
"additionalProperty": "example"
},
"status": 1,
"title": "example",
"type": "https://example.com"
}