Review API v2
You will need an API key for authorizing your requests. You can request an API key from our Customer Care team.
The API key must be passed in an HTTP header named X-CA-AUTH when requesting any of the API endpoints.
The default endpoint is https://api.customer-alliance.com, if not stated differently.
Reviews
GET /reviews/v2/ca.json
The new version of the Review API is available here
API allows access to the data that was collected via Customer Alliance review questionnaires. This may include information such as:
Review content;
Average rating;
Information about the guest leaving the review.
Parameters
All parameters are optional.
Name | Default value | Description |
|---|
Name | Default value | Description |
|---|---|---|
| 1 | Integer greater than or equal to 1. |
| 180 days before the end date | Date in the YYYY-MM-DD format. |
| today | Date in the YYYY-MM-DD format. |
| 'average' | A valid review rating category, also known as a 'criteria'. |
| 0 | Integer between 0 and 100. |
| 100 | Integer between 0 and 100. |
| no value | Must be one of:
Filters reviews as to whether they have been commented, not commented or have had a comment drafted. |
| 0 | Either 1 or 0. |
| 0 | Either 1 or 0. |
| 20 | The number of reviews shown per page. |
Examples
Shell
curl --header "X-CA-AUTH: <YOUR_API_KEY_HERE>" https://api.customer-alliance.com/reviews/v2/ca.json?page=1&start=2021-01-01&end=2021-01-13&fromRating=0&toRating=100&categoryRatings=1&published=0&limit=20Response
{
"totalCount": 1,
"reviews": [
{
"hotel_name": "Restaurant The Eagle",
"review_id": "careview52326183",
"review_source": "customeralliance",
"average_rating_normalized": "90.0000",
"average_rating": "4.5000",
"reviewer_type": null,
"language": "en",
"published": false,
"reviewer_comment": "It was a nice experience, definitely worth coming again",
"reviewer_comment_positive": "",
"reviewer_comment_negative": "",
"arrival_date": "2021-01-09",
"departure_date": "2021-01-09",
"review_date": "2021-01-12 09:07:46",
"author": "Customer Alliance u.",
"category_ratings": {
"price": {
"rating": 80,
"label": "Price",
"comment": null
},
"service": {
"rating": 100,
"label": "Service",
"comment": null
},
"FoodQuality": {
"rating": 100,
"label": "Quality of Food",
"comment": null
},
"Atmosphere": {
"rating": 80,
"label": "Atmosphere",
"comment": null
}
},
"nps": 9,
"brand_nps": null,
"age": 30,
"hotelier_comment": null
}
]
}
GET /reviews/v2/all.json
Review data collected via Customer Alliance questionnaires and reviews from external portals (for example Booking, Google, Expedia, Tripadvisor, HolidayCheck).
Parameters
All parameters are optional.
Name | Default value | Description |
|---|
Name | Default value | Description |
|---|---|---|
| 1 | Integer greater than or equal to 1. |
| 180 days before the end date | Date in the YYYY-MM-DD format. |
| today | Date in the YYYY-MM-DD format. |
| 0 | Integer between 0 and 100. |
| 100 | Integer between 0 and 100. |
| no value | Must be one of:
Filters reviews as to whether they have been commented, not commented or have had a comment drafted. |
| 0 | Either 1 or 0. |
| 0 | Either 1 or 0. |
| 20 | The number of reviews shown per page. |
Examples
Shell
curl --header "X-CA-AUTH: <YOUR_API_KEY_HERE>" https://api.customer-alliance.com/reviews/v2/all.json?page=1&start=2025-01-01&end=2025-01-12&categoryRatings=1Response
{
"totalCount": 3,
"reviews": [
{
"hotel_name": "Some hotel",
"review_id": "careview102033000",
"review_source": "customeralliance",
"average_rating_normalized": "64",
"average_rating": "3.2",
"reviewer_type": "alone",
"language": "de",
"published": false,
"hotelier_comment": null,
"nps": 2,
"brand_nps": null,
"reviewer_comment": "Wäre schön gewesen, wenn alles dass bei der Buchung telefonisch vereinbart wurde",
"reviewer_comment_positive": null,
"reviewer_comment_negative": null,
"pms_guest_id": "4f9c8336-789c-4511-9844-20baac154d2e",
"arrival_date": "2025-01-03",
"departure_date": "2025-01-04",
"review_date": "2025-01-06 23:27:19",
"author": null,
"category_ratings": {
"price": {
"rating": 40,
"label": "Price",
"comment": null
},
"room": {
"rating": 80,
"label": "Room",
"comment": null
},
"location": {
"rating": 80,
"label": "Location",
"comment": null
},
"clean": {
"rating": 80,
"label": "Cleanliness",
"comment": null
},
"service": {
"rating": 40,
"label": "Service",
"comment": null
},
"Funktionalität": {
"rating": 80,
"label": "Functionality",
"comment": null
}
}
},
{
"hotel_name": "Some hotel",
"review_id": "booking12345_GR_geaK2WuV",
"review_source": "booking",
"average_rating_normalized": "90",
"average_rating": "9",
"reviewer_type": null,
"language": "en",
"published": true,
"hotelier_comment": null,
"reviewer_comment": null,
"reviewer_comment_positive": "transfer services",
"reviewer_comment_negative": "bar price",
"review_date": "2025-01-08 10:56:41",
"author": "John",
"category_ratings": {
"facilities": {
"rating": 100,
"comment": null,
"label": "Facilities"
},
"location": {
"rating": 100,
"comment": null,
"label": "Location"
},
"staff": {
"rating": 100,
"comment": null,
"label": "Staff"
},
"clean": {
"rating": 100,
"comment": null,
"label": "Cleanliness"
},
"comfort": {
"rating": 75,
"comment": null,
"label": "Comfort"
},
"price": {
"rating": 50,
"comment": null,
"label": "Price"
}
}
},
{
"hotel_name": "Some hotel",
"review_id": "expedia34521_6796510d21b7076af1b788b2",
"review_source": "expedia",
"average_rating_normalized": "100",
"average_rating": "10",
"reviewer_type": null,
"language": "en",
"published": true,
"hotelier_comment": "Dear Guest,\n\nThank you for taking the time to leave us a review.",
"reviewer_comment": "nice location",
"reviewer_comment_positive": null,
"reviewer_comment_negative": null,
"review_date": "2025-01-10 16:15:05",
"author": "Anna",
"category_ratings": {
"condition": {
"rating": 100,
"comment": null,
"label": "Hotel condition"
},
"room_clean": {
"rating": 100,
"comment": null,
"label": "Cleanliness & linen change"
},
"service": {
"rating": 100,
"comment": null,
"label": "Service"
},
"facilities": {
"rating": 100,
"comment": null,
"label": "Facilities"
}
}
},
]
}Please note that we have the latest version (V3) available here Review API v3Preview
Statistics
GET /statistics/v1/categories.json
Shows the rating categories currently used for aggregation on your API key.
The data refreshes every 2 hours.
Parameters
All parameters are optional.
Name | Default value | Description |
|---|
Name | Default value | Description |
|---|---|---|
| First created review subject | It refers to Review Config's hash value. By default access key has access to 100 review subjects, by using "review_subject" parameter you can specify for which subject you would like to retrieve data. |
Examples
Shell
curl --header "X-CA-AUTH: YOUR_API_KEY" https://api.customer-alliance.com/statistics/v1/categories.jsonResponse
The result here will vary depending on the categories configured for your business and the questions marked as 'Show in Statistics' or 'Public' in your questionnaire.
[
"Amenities",
"Apartment",
"Entertainment",
"Hospitality",
"Reception",
"bar",
"beach",
"break",
"childcare",
"clean",
"comfort",
"conference",
"food",
"location",
"pool",
"price",
"private_beach",
"restaurant",
"room",
"service",
"sport",
"value_for_money",
"vibe",
"wellness",
"wifi"
]
GET /statistics/v2/general/recent.json
Shows statistics for rating categories, including the overall category, for all reviews authored in the past 6 months.
Parameters
All parameters are optional.
Name | Default value | Description |
|---|
Name | Default value | Description |
|---|---|---|
| en | Changes the language used to show the category labels. Must be a valid ISO 3166-1 alpha-2 language code. For example: 'en' for English, 'fr' for French. |
| First created review subject | It refers to Review Config's hash value. By default access key has access to 100 review subjects, by using "review_subject" parameter you can specify for which subject you would like to retrieve data. |
| no value | Possible values: either 0 or 1. If set to 1 will return only data about published reviews (public reviews). |
Examples
Shell
curl --header "X-CA-AUTH: YOUR_API_KEY" https://api.customer-alliance.com/statistics/v2/general/recent.jsonResponse
{
"start_date": "2020-08-17",
"end_date": "2021-02-17",
"comment_rate": 30.798478707224334,
"category_statistics": {
"overall": {
"label": "Overall",
"average_rating": 90.51546391746737,
"review_count": 582,
"positive_review_count": 528,
"neutral_review_count": 49,
"negative_review_count": 5
},
"clean": {
"label": "Cleanliness",
"average_rating": 96.0,
"review_count": 5,
"positive_review_count": 5,
"neutral_review_count": 0,
"negative_review_count": 0
},
"comfort": {
"label": "Comfort",
"average_rating": 86.66666666666667,
"review_count": 3,
"positive_review_count": 3,
"neutral_review_count": 0,
"negative_review_count": 0
},
"food": {
"label": "Food",
"average_rating": 0.0,
"review_count": 0,
"positive_review_count": 0,
"neutral_review_count": 0,
"negative_review_count": 0
},
"location": {
"label": "Location",
"average_rating": 100.0,
"review_count": 3,
"positive_review_count": 3,
"neutral_review_count": 0,
"negative_review_count": 0
},
"price": {
"label": "Price",
"average_rating": 100.0,
"review_count": 4,
"positive_review_count": 4,
"neutral_review_count": 0,
"negative_review_count": 0
},
"restaurant": {
"label": "Restaurant",
"average_rating": 0.0,
"review_count": 0,
"positive_review_count": 0,
"neutral_review_count": 0,
"negative_review_count": 0
},
"room": {
"label": "Room",
"average_rating": 88.0,
"review_count": 5,
"positive_review_count": 4,
"neutral_review_count": 1,
"negative_review_count": 0
},
"service": {
"label": "Service",
"average_rating": 88.0,
"review_count": 5,
"positive_review_count": 4,
"neutral_review_count": 1,
"negative_review_count": 0
}
}
}
GET /statistics/v2/general/total.json
Shows statistics for rating categories, including the overall category, for all known reviews.
If the parameter 'review_subject' is not set, the statistics will be shown for the first created review subject of the api-key.
Parameters
All parameters are optional.
Name | Default value | Description |
|---|
Name | Default value | Description |
|---|---|---|
| en | Changes the language used to show the category labels. Must be a valid ISO 3166-1 alpha-2 language code. For example: 'en' for English, 'fr' for French. |
| first created review subject | It refers to Review Config's hash value. By default access key has access to 100 review subjects, by using "review_subject" parameter you can specify for which subject you would like to retrieve data. |
| no value | Possible values: either 0 or 1. If set to 1 will return only data about published reviews (public reviews). |
Examples
Shell
curl --header "X-CA-AUTH: YOUR_API_KEY" https://api.customer-alliance.com/statistics/v2/general/total.jsonResponse
{
"start_date": null,
"end_date": null,
"comment_rate": 11.12612972972973,
"category_statistics": {
"overall": {
"label": "Overall",
"average_rating": 88.03647184495651,
"review_count": 6553,
"positive_review_count": 6495,
"neutral_review_count": 839,
"negative_review_count": 64
},
"clean": {
"label": "Cleanliness",
"average_rating": 89.97303634044549,
"review_count": 5118,
"positive_review_count": 66,
"neutral_review_count": 3,
"negative_review_count": 0
},
"food": {
"label": "Food",
"average_rating": 0.0,
"review_count": 0,
"positive_review_count": 0,
"neutral_review_count": 0,
"negative_review_count": 0
},
"location": {
"label": "Location",
"average_rating": 83.19193706981318,
"review_count": 5085,
"positive_review_count": 46,
"neutral_review_count": 13,
"negative_review_count": 0
},
"price": {
"label": "Price",
"average_rating": 89.97183098591549,
"review_count": 4828,
"positive_review_count": 54,
"neutral_review_count": 3,
"negative_review_count": 0
},
"restaurant": {
"label": "Restaurant",
"average_rating": 90.0,
"review_count": 2,
"positive_review_count": 0,
"neutral_review_count": 0,
"negative_review_count": 0
},
"service": {
"label": "Service",
"average_rating": 89.07062144180792,
"review_count": 354,
"positive_review_count": 92,
"neutral_review_count": 11,
"negative_review_count": 3
}
}
}GET /statistics/v2/portal-overview.json
Statistics for all known reviews. Aggregated for overall and broken down by review portal (e.g. Booking.com, Google, Facebook, ...).
Parameters
All parameters are optional.
Name | Default value | Description |
|---|
Name | Default value | Description |
|---|---|---|
| 180 days before the end date | To select the earliest review you wish to see. A date of format yyyy-mm-dd, must be before the end date. |
| today | To select the latest review you wish to see. A date of format yyyy-mm-dd, must be after the start date. |
| average | To filter reviews by subcategory, e.g. price, service, etc. Must be an available category (to get all the available categories check out the api ' |
| first created review subject | It refers to Review Config's hash value. By default access key has access to 100 review subjects, by using "review_subject" parameter you can specify for which subject you would like to retrieve data. |
| no value | Possible values: either 0 or 1. If set to 1 will return only data about published reviews (public reviews). |
Examples
Shell
curl --header "X-CA-AUTH: YOUR_API_KEY" https://api.customer-alliance.com/statistics/v2/portal-overview.jsonResponse
{
"reviewCount": 491,
"averageRating": 90.32993890011609,
"commentRate": 29.14798206278027,
"reviewCountPositive": 441,
"reviewCountNeutral": 44,
"reviewCountNegative": 6,
"portalStats": {
"customeralliance": {
"reviewCount": 2,
"reviewCountPositive": 2,
"reviewCountNeutral": 0,
"reviewCountNegative": 0,
"averageRating": 80,
"commentRate": null
},
"booking": {
"reviewCount": 414,
"reviewCountPositive": 373,
"reviewCountNeutral": 37,
"reviewCountNegative": 4,
"averageRating": 90.56038647332849,
"commentRate": 32.432432432432435
},
"google": {
"reviewCount": 61,
"reviewCountPositive": 55,
"reviewCountNeutral": 4,
"reviewCountNegative": 2,
"averageRating": 90.49180327867212,
"commentRate": 11.475409836065573
},
"hotelscom": {
"reviewCount": 3,
"reviewCountPositive": 3,
"reviewCountNeutral": 0,
"reviewCountNegative": 0,
"averageRating": 80,
"commentRate": 100
},
"hrs": {
"reviewCount": 0,
"reviewCountPositive": 0,
"reviewCountNeutral": 0,
"reviewCountNegative": 0,
"averageRating": 0,
"commentRate": null
},
"tripadvisor": {
"reviewCount": 11,
"reviewCountPositive": 8,
"reviewCountNeutral": 3,
"reviewCountNegative": 0,
"averageRating": 85.45454545454545,
"commentRate": 63.63636363636363
},
"tui": {
"reviewCount": 0,
"reviewCountPositive": 0,
"reviewCountNeutral": 0,
"reviewCountNegative": 0,
"averageRating": 0,
"commentRate": null
}
}
}GET /statistics/v1/reviews-over-time.json
Statistics for all known reviews. Aggregated weekly.
Parameters
All parameters are optional.
Name | Default value | Description |
|---|
Name | Default value | Description |
|---|---|---|
| 180 days before the end date | To select the earliest review you wish to see. A date of format yyyy-mm-dd, must be before the end date. |
| today | To select the latest review you wish to see. A date of format yyyy-mm-dd, must be after the start date. |
| average | To filter reviews by subcategory, e.g. price, service, etc. Must be an available category (to get all the available categories check out the api ' |
| first created review subject | It refers to Review Config's hash value. By default access key has access to 100 review subjects, by using "review_subject" parameter you can specify for which subject you would like to retrieve data. |
| depending on time range | Possible value: To force the statistics to be grouped by months. If parameter is not given, then certain rules are applied depending on the time range (see table below). |
The time intervals used for grouping are determined by these rules:
Δ = difference in days between start & end | Interval | Description |
|---|
Δ = difference in days between start & end | Interval | Description |
|---|---|---|
31 days < Δ <= 182 days | weekly | If parameter |
182 days < Δ <= 720 days | monthly | Values will be always grouped monthly. |
Δ <= 31 days | daily | If parameter |
Δ > 720 days | yearly | If parameter |
Examples
Shell
curl --header "X-CA-AUTH: YOUR_API_KEY" https://api.customer-alliance.com/statistics/v1/reviews-over-time.jsonResponse
{
"Hotel XYZ": {
"8 / 2020": {
"review_count": 54,
"positive_reviews": 49,
"neutral_reviews": 5,
"negative_reviews": 0
},
"9 / 2020": {
"review_count": 144,
"positive_reviews": 129,
"neutral_reviews": 13,
"negative_reviews": 2
},
"10 / 2020": {
"review_count": 88,
"positive_reviews": 83,
"neutral_reviews": 4,
"negative_reviews": 1
},
"11 / 2020": {
"review_count": 77,
"positive_reviews": 70,
"neutral_reviews": 7,
"negative_reviews": 0
},
"12 / 2020": {
"review_count": 69,
"positive_reviews": 63,
"neutral_reviews": 5,
"negative_reviews": 1
},
"1 / 2021": {
"review_count": 64,
"positive_reviews": 52,
"neutral_reviews": 12,
"negative_reviews": 0
},
"2 / 2021": {
"review_count": 55,
"positive_reviews": 51,
"neutral_reviews": 3,
"negative_reviews": 1
}
}
}Feedbacks
GET /feedback/v2/questionnaires.json
Allows access feedback questionnaires (receive list of feedback questionnaires).
Parameters
This endpoint has no parameters.
Examples
Shell
$ curl --header "X-CA-AUTH: <YOUR_API_KEY_HERE>" https://api.customer-alliance.com/feedback/v2/questionnaires.jsonResponse
[
{
"id": 699083,
"name": "Breakfast Survey"
},
{
"id": 699093,
"name": "During Stay Feedback"
}
]GET /feedback/v2/stream.json
Allows access to all of the feedbacks that were gathered.
Parameters
Name | Default value | Description |
|---|
Name | Default value | Description |
|---|---|---|
| no value | A required parameter with Interger value. Note: this parameter may be included multiple times, e.g. |
| 1 | Integer greater than or equal to 1. |
| 180 days before the end date | Date in the YYYY-MM-DD format. |
| today | Date in the YYYY-MM-DD format. |
| 20 | Integer between 1 and 50. Used to limit the number of results per page. |
| no value | Must be one of:
Filters feedbacks as to whether they have been commented, not commented or have had a comment drafted. |
| no value | To show the feedbacks submitted for the selected language. Values can be one of these language codes: de, en, es, fr, nl, cs, da, hu, it, pl, pt, ru, sr, sv, ar, zh, ja, fi, no |
| en | Changes the language used to show the question labels. Must be a valid ISO 3166-1 alpha-2 language code. For example: 'en' for English, 'fr' for French. |
Examples
Shell
$ curl --header "X-CA-AUTH: <YOUR_API_KEY_HERE>" https://api.customer-alliance.com/feedback/v2/stream.json?questionnaireIds=699083Response
{
"pagination": {
"current_page": 1,
"total_pages": 1,
"total_items": 1
},
"items": [
{
"id": 52749453,
"language": "en",
"created_date": "2021-02-18 12:25:52",
"author": {
"name": "John",
"email": "john@email.com",
"age": null
},
"meta": {
"traveller_type": null,
"room_number": null,
"arrival_date": "2021-02-01",
"departure_date": "2021-02-28"
},
"questionnaire": {
"id": 699083,
"name": "Breakfast Survey"
},
"question_answers": [
{
"question": {
"id": 11918603,
"type": "rating",
"label": "Service"
},
"answer": {
"rating": 5,
"text": null
},
"sub_question_answers": []
},
{
"question": {
"id": 11918613,
"type": "rating",
"label": "Buffet / Menu selection"
},
"answer": {
"rating": 4,
"text": null
},
"sub_question_answers": []
},
{
"question": {
"id": 11918623,
"type": "rating",
"label": "Quality of food"
},
"answer": {
"rating": 5,
"text": null
},
"sub_question_answers": []
},
{
"question": {
"id": 11918633,
"type": "rating",
"label": "Selection of beverages"
},
"answer": {
"rating": 3,
"text": null
},
"sub_question_answers": []
},
{
"question": {
"id": 11918643,
"type": "text",
"label": "How would you describe your overall experience?"
},
"answer": {
"text": "All in all it was almost perfect, except there were no apple juice."
},
"sub_question_answers": []
},
{
"question": {
"id": 11918653,
"type": "choice",
"label": "Are you a guest of the hotel?"
},
"answer": {
"choices": [
{
"label": "Yes"
}
]
},
"sub_question_answers": [
{
"question": {
"id": 11918663,
"type": "text",
"label": "Your room number"
},
"answer": {
"text": "119"
},
"sub_question_answers": []
}
]
},
{
"question": {
"id": 11918673,
"type": "text",
"label": "Your email address"
},
"answer": {
"text": "john@email.com"
},
"sub_question_answers": []
}
],
"comment": null,
"rating_scale": {
"min": 1,
"max": 5
}
}
]
}Monitoring
POST /account/{googlePlaceId}
This API is to be used by a partner to create a monitoring account for one of its customers. A monitoring account is a Customer Alliance account created for the purpose of monitoring a customer's online reviews on the public review portals.
When a monitoring account is created via this API the partner can retrieve an API Key to get access to the customer data of the created monitoring account. Access to the customer data is granted via one of our APIs (JSON or iFrame APIs).
There is a limit on creating monitoring accounts using this API: 50 per day per partner. Reaching the mentioned limit returns a 429 HTTP error in the API request.
Parameters
Name | Default value | Description |
|---|
Name | Default value | Description |
|---|---|---|
| no value | Google place id. This is the link to the Google Places API documentation, where Google Places ID can be retrieved: https://developers.google.com/maps/documentation/javascript/examples/places-placeid-finder |
Examples
Shell
curl --location --request POST 'https://api.customer-alliance.com/account/{googlePlaceId}' \
--header 'X-CA-AUTH: <YOUR_API_KEY_HERE>' Below is the JSON structure you can expect from the POST endpoint:
https://api.customer-alliance.com/account/{googlePlaceId}
Response
{
'result': 'ok',
'account': {
'id': 1,
'name': 'TEST HOTEL BERLIN',
'address': '118 Ullsteinstr, 10719 Berlin, DE',
'website': 'http://www.test-hotel.de/',
'type': 'Hotel',
'api_key': '9891229a2ef309a123456de0e846ce8c30f8'
}
}