Skip to content

Submit

POST
/api/booking/{bookingIdentifier}/review
curl --request POST \
--url https://api.wink.travel/api/booking/f4d1c8e5-2b9a-4f3d-9e7c-1b6a5d3f8c92/review \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Wink-Version: 2.0' \
--data '{ "answers": [ { "category": "SERVICE", "questionIdentifier": "4d7c2a6b-9e3f-4b1a-8d0c-7f5e1a9b3c62", "sort": 1, "value": 7 } ], "imageIdentifier": "wink/review/siam-residences-2026-01-14-xyz123abc", "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.", "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." }'

Submits the authenticated guest’s completed review for the given booking and returns the persisted review. Responds 201 on success.

bookingIdentifier
required
string

Booking identifier for which the review is being submitted

Example
f4d1c8e5-2b9a-4f3d-9e7c-1b6a5d3f8c92
Wink-Version
string
default: 2.0.0
Allowed values: 2.0

Completed review containing the guest’s answers to the questionnaire questions

Media typeapplication/json

Request payload submitted by a guest to record their review for a completed stay.

object
answers
required

List of user review answers.

Array<object>
>= 1 items <= 2147483647 items

A single answer submitted by a guest for one review question, carrying the question reference and numeric score.

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
Example
SERVICE
questionIdentifier
required

Review question identifier that this answer responds to.

string format: uuid
>= 1 characters
Example
4d7c2a6b-9e3f-4b1a-8d0c-7f5e1a9b3c62
sort
required

Display order of this answer within the review template.

integer format: int32
Example
1
value
required

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

integer format: int32
Example
7
Example
{
"category": "SERVICE",
"questionIdentifier": "4d7c2a6b-9e3f-4b1a-8d0c-7f5e1a9b3c62",
"sort": 1,
"value": 7
}
imageIdentifier

Cloudinary image identifier for guest’s photo from the property.

string
Example
wink/review/siam-residences-2026-01-14-xyz123abc
messageFromGuest

Private message from guest to the hotel manager. Not displayed on property’s public profile.

string
Example
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.
roomNumber

Room number where the guest stayed.

string
Example
501
roomRating

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

integer format: int32
Example
9
text

Guest’s written review text describing their stay.

string
Example
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.
Example
{
"answers": [
{
"category": "SERVICE",
"questionIdentifier": "4d7c2a6b-9e3f-4b1a-8d0c-7f5e1a9b3c62",
"sort": 1,
"value": 7
}
],
"imageIdentifier": "wink/review/siam-residences-2026-01-14-xyz123abc",
"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.",
"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."
}

Review submitted and persisted

Media typeapplication/json

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
Example
{
"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
}

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"
}