# Introduction

The RateParity API is organized around [REST](http://en.wikipedia.org/wiki/Representational_State_Transfer). Our API has predictable resource-oriented URLs, accepts [form-encoded](https://en.wikipedia.org/wiki/POST_\(HTTP\)#Use_for_submitting_web_forms) request bodies, returns [JSON-encoded](http://www.json.org/) responses, and uses standard HTTP response codes, authentication, and verbs.

If you have a question or any other other request, please contact us at <info@rateparity.com>.


# Authentication

The RateParity API uses API keys to authenticate requests. You can request an API key by contacting us at <info@rateparity.com>.

Your API key carry many privileges, so be sure to keep them secure! Do not share your API key in publicly accessible areas such as GitHub, client-side code, and so forth.

Authentication to the API is performed via [Bearer Token](https://oauth.net/2/bearer-tokens/). Provide your API key as the Bearer Token value.

All API requests must be made over [HTTPS](http://en.wikipedia.org/wiki/HTTP_Secure). Calls made over plain HTTP will fail. API requests without authentication will also fail.


# Internationalization

All the methods can return translated data in a language of your choice. If the language requested is not supported by our system or the data is not translated yet, the system will always fallback to English. To select a language you must send an [Accept-Language](https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4) header with the language code or/and locale combination you want.

`Accept-Language: el, en-gb`


# Model Description

The Model Description section defines the standardized structure of API responses. It includes essential attributes that encapsulate core data, summaries, metadata, and error handling. This ensures consistency and clarity when integrating with the API.

| Field      | Type                   | Description                                                                                                 |
| ---------- | ---------------------- | ----------------------------------------------------------------------------------------------------------- |
| `data`     | Data object            | Represents the core response payload                                                                        |
| `summary`  | Map\<string, object>   | Contains a summary of the core response data                                                                |
| `metadata` | Metadata object        | Provides additional context about the response, such as pagination details, versioning, and extra metadata. |
| `error`    | Error object, nullable | Detailed information if the request encounters an error, including error codes and descriptive messages.    |


# Data Types

The Data Types section defines key enumerations used in the API. Enumerations represent predefined sets of values that ensure consistency and clarity in the API responses.

## Channel Type

| Name        | Description   |
| ----------- | ------------- |
| `BOOKING`   | booking.com   |
| `EXPEDIA`   | expedia.com   |
| `AGODA`     | agoda.com     |
| `AIRBNB`    | airbnb.com    |
| `HOTELS`    | hotels.com    |
| `HRS`       | hrs.com       |
| `TRIP`      | trip.com      |
| `PRICELINE` | priceline.com |
| `MARRIOTT`  | marriot CRS   |
| `SYNXIS`    | synxis CRS    |
| `BEDS24`    | beds24 CRS    |

## Season Type

| Name     | Description   |
| -------- | ------------- |
| `AUTUMN` | Autumn Season |
| `SPRING` | Spring Season |
| `SUMMER` | Summer Season |
| `WINTER` | Winter Season |

## Review Score Type

| Name       | Description             |
| ---------- | ----------------------- |
| `SUPERB`   | Reviews with score 9-10 |
| `GOOD`     | Reviews with score 7-8  |
| `PASSABLE` | Reviews with score 5-6  |
| `POOR`     | Reviews with score 3-4  |
| `VERYPOOR` | Reviews with score 1-2  |

## Reviewer Category Type

| Name      | Description     |
| --------- | --------------- |
| `FAMILY`  | Families        |
| `COUPLE`  | Couples         |
| `GROUP`   | Groups          |
| `SOLO`    | Solo travellers |
| `UNKNOWN` | Unknown         |


# Pagination

Pagination is supported through the `limit` and `page` query parameters, allowing control over the number of results retrieved per page.

| Parameter | Type    | Default value | Description                                                         |
| --------- | ------- | ------------- | ------------------------------------------------------------------- |
| `limit`   | integer | 10            | The maximum number of results to return per page.                   |
| `page`    | integer | 1             | The page number to retrieve, used for pagination.                   |
| `sort`    | string  | date          | Defines the sorting field (default: `date`).                        |
| `asc`     | boolean | false         | To determine ascending (`true`) or descending (`false`) sort order. |


# Errors

RateParity uses conventional HTTP response codes to indicate the success or failure of an API request. In general: Codes in the 2xx range indicate success. Codes in the 4xx range indicate an error that failed given the information provided (e.g., a required parameter was omitted, etc.). Codes in the 5xx range indicate an error with RateParity's servers.

| 200 - OK                           | Everything worked as expected.                                                                   |
| ---------------------------------- | ------------------------------------------------------------------------------------------------ |
| 400 - Bad Request                  | The request was unacceptable, often due to missing a required parameter.                         |
| 401 - Unauthorized                 | No valid API key provided.                                                                       |
| 402 - Request Failed               | The parameters were valid but the request failed.                                                |
| 403 - Forbidden                    | The API key doesn't have permissions to perform the request.                                     |
| 404 - Not Found                    | The requested resource doesn't exist.                                                            |
| 409 - Conflict                     | The request conflicts with another request (perhaps due to using the same idempotent key).       |
| 429 - Too Many Requests            | Too many requests hit the API too quickly. We recommend an exponential backoff of your requests. |
| 500, 502, 503, 504 - Server Errors | Something went wrong on RateParity's end.                                                        |


# Client API

The client API is a set of predefined commands to control some aspects of the Rateparity widgets.

More information can be found under <https://code.rateparity.com/docs/>


# MCP Server

MCP server for AI clients and tool-based integrations

The RateParity API exposes a stateless MCP server over HTTP. MCP clients can use this endpoint to list and call tools for property information, rooms, reviews, rates, shopper results, and availability.

`POST` `https://api.rateparity.com/mcp`

The MCP endpoint uses JSON-RPC 2.0 payloads following the MCP HTTP transport.

## Authentication

The MCP server uses the same Bearer token authentication as the public REST API. See [Authentication](/authentication) for the standard authentication flow.

Required headers:

| Name            | Required | Value                                 |
| --------------- | -------- | ------------------------------------- |
| `Authorization` | Yes      | `Bearer YOUR_API_KEY`                 |
| `Content-Type`  | Yes      | `application/json`                    |
| `Accept`        | Yes      | `application/json, text/event-stream` |

Example:

```bash
curl --location 'https://api.rateparity.com/mcp' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json, text/event-stream' \
--data '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/list",
  "params": {}
}'
```

MCP tools also check that the authenticated user is authorized for the requested property code.

## Response Data

MCP tool responses include a short text summary and machine-readable data.

MCP clients should use:

```
result.structuredContent
```

The `content` array is intended for clients that display a short textual response.

## List Tools

Use the `tools/list` JSON-RPC method to retrieve the available MCP tools.

```bash
curl --location 'https://api.rateparity.com/mcp' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json, text/event-stream' \
--data '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/list",
  "params": {}
}'
```

Expected response shape:

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "tools": [
      {
        "name": "get_property_info",
        "description": "Fetch the complete external property information for a RateParity hotel code."
      },
      {
        "name": "get_property_rooms",
        "description": "Fetch the complete external room information for a RateParity hotel code."
      },
      {
        "name": "get_property_reviews",
        "description": "Fetch external review details for a RateParity hotel code."
      },
      {
        "name": "get_property_lowest_monthly_rates",
        "description": "Fetch the lowest monthly rates for a RateParity hotel code."
      },
      {
        "name": "shop_property_rate",
        "description": "Shop rates for a RateParity hotel code and stay dates."
      },
      {
        "name": "get_property_availability_single",
        "description": "Fetch single-property availability rates for a RateParity hotel code."
      }
    ]
  }
}
```

## Call a Tool

Use the `tools/call` JSON-RPC method. The `name` field is the MCP tool name, and `arguments` contains the tool input.

```json
{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": {
    "name": "get_property_info",
    "arguments": {
      "hotelCode": "MASTERPLAK"
    }
  }
}
```

## Tool Reference

### get\_property\_info

Fetches complete external property information for a RateParity hotel code.

**Input**

| Name        | Type   | Required | Description       |
| ----------- | ------ | -------- | ----------------- |
| `hotelCode` | string | Yes      | The property code |

Example request:

```bash
curl --location 'https://api.rateparity.com/mcp' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json, text/event-stream' \
--data '{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": {
    "name": "get_property_info",
    "arguments": {
      "hotelCode": "MASTERPLAK"
    }
  }
}'
```

Expected response shape:

```json
{
  "jsonrpc": "2.0",
  "id": 2,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "Property information for MASTERPLAK"
      }
    ],
    "isError": false,
    "structuredContent": {
      "data": {
        "code": "MASTERPLAK",
        "name": "master Plaka Athens",
        "bookurl": "https://masterplakaathens.reserve-online.net/?src=606"
      }
    }
  }
}
```

### get\_property\_rooms

Fetches complete external room information for a RateParity hotel code.

**Input**

| Name        | Type   | Required | Description       |
| ----------- | ------ | -------- | ----------------- |
| `hotelCode` | string | Yes      | The property code |

Example request:

```bash
curl --location 'https://api.rateparity.com/mcp' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json, text/event-stream' \
--data '{
  "jsonrpc": "2.0",
  "id": 3,
  "method": "tools/call",
  "params": {
    "name": "get_property_rooms",
    "arguments": {
      "hotelCode": "MASTERPLAK"
    }
  }
}'
```

Expected response shape:

```json
{
  "jsonrpc": "2.0",
  "id": 3,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "Room information for MASTERPLAK"
      }
    ],
    "isError": false,
    "structuredContent": {
      "data": {
        "rooms": [
          {
            "code": "ROOM_CODE",
            "name": "Room name",
            "active": true
          }
        ]
      }
    }
  }
}
```

### get\_property\_reviews

Fetches review details for a RateParity hotel code.

**Input**

| Name                | Type             | Required | Description                                                     |
| ------------------- | ---------------- | -------- | --------------------------------------------------------------- |
| `hotelCode`         | string           | Yes      | The property code                                               |
| `page`              | integer          | No       | Page number. Default `1`                                        |
| `limit`             | integer          | No       | Page size. Default `10`                                         |
| `sort`              | string           | No       | Sort field. Default `dateReviewed`                              |
| `asc`               | boolean          | No       | Sort ascending. Default `false`                                 |
| `verbose`           | boolean          | No       | Return verbose review details. Default `true`                   |
| `category`          | ReviewerCategory | No       | See [Reviewer Category Type](/datatypes#reviewer-category-type) |
| `score`             | ReviewScore      | No       | See [Review Score Type](/datatypes#review-score-type)           |
| `country`           | string           | No       | Reviewer country filter                                         |
| `reviewerLanguages` | list             | No       | Reviewer language filters                                       |
| `season`            | Season           | No       | See [Season Type](/datatypes#season-type)                       |

Example request:

```bash
curl --location 'https://api.rateparity.com/mcp' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json, text/event-stream' \
--data '{
  "jsonrpc": "2.0",
  "id": 4,
  "method": "tools/call",
  "params": {
    "name": "get_property_reviews",
    "arguments": {
      "hotelCode": "MASTERPLAK",
      "page": 1,
      "limit": 3,
      "sort": "dateReviewed",
      "asc": false,
      "verbose": true
    }
  }
}'
```

Expected response shape:

```json
{
  "jsonrpc": "2.0",
  "id": 4,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "Review information for MASTERPLAK"
      }
    ],
    "isError": false,
    "structuredContent": {
      "data": {
        "score": 9.47,
        "reviews": 652,
        "userReviews": [
          {
            "id": 1953335,
            "title": "Excellent",
            "score": 10.0,
            "channel": "Google.com"
          }
        ],
        "totalFound": 439,
        "totalPages": 147
      }
    }
  }
}
```

### get\_property\_lowest\_monthly\_rates

Fetches the lowest monthly rates for a RateParity hotel code.

**Input**

| Name        | Type   | Required | Description       |
| ----------- | ------ | -------- | ----------------- |
| `hotelCode` | string | Yes      | The property code |

Example request:

```bash
curl --location 'https://api.rateparity.com/mcp' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json, text/event-stream' \
--data '{
  "jsonrpc": "2.0",
  "id": 5,
  "method": "tools/call",
  "params": {
    "name": "get_property_lowest_monthly_rates",
    "arguments": {
      "hotelCode": "MASTERPLAK"
    }
  }
}'
```

Expected response shape:

```json
{
  "jsonrpc": "2.0",
  "id": 5,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "Lowest monthly rates for MASTERPLAK"
      }
    ],
    "isError": false,
    "structuredContent": {
      "data": {
        "hotelCode": "MASTERPLAK",
        "currency": "EUR",
        "lowestMonthlyRates": [
          {
            "month": 10,
            "year": 2026,
            "rate": 120.5,
            "day": "2026-10-26",
            "minStay": 2
          }
        ]
      }
    }
  }
}
```

### shop\_property\_rate

Shops rates for a RateParity hotel code and stay dates.

**Input**

| Name        | Type    | Required | Description                                 |
| ----------- | ------- | -------- | ------------------------------------------- |
| `hotelCode` | string  | Yes      | The property code                           |
| `checkIn`   | date    | Yes      | Check-in date in `yyyy-MM-dd` format        |
| `checkOut`  | date    | Yes      | Check-out date in `yyyy-MM-dd` format       |
| `adults`    | integer | No       | Number of adults. Default `2`               |
| `children`  | integer | No       | Number of children. Default `0`             |
| `rateId`    | string  | No       | Rate identifier                             |
| `channel`   | Channel | No       | See [Channel Type](/datatypes#channel-type) |

Example request:

```bash
curl --location 'https://api.rateparity.com/mcp' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json, text/event-stream' \
--data '{
  "jsonrpc": "2.0",
  "id": 6,
  "method": "tools/call",
  "params": {
    "name": "shop_property_rate",
    "arguments": {
      "hotelCode": "MASTERPLAK",
      "checkIn": "2026-10-26",
      "checkOut": "2026-10-28",
      "adults": 2,
      "children": 0
    }
  }
}'
```

Expected response shape:

```json
{
  "jsonrpc": "2.0",
  "id": 6,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "Shopper rates for MASTERPLAK"
      }
    ],
    "isError": false,
    "structuredContent": {
      "data": {
        "currency": "EUR",
        "rates": [
          {
            "price": 120.5,
            "roomId": "ROOM_CODE",
            "rateId": "RATE_CODE",
            "roomName": "Room name",
            "lowestRate": true
          }
        ]
      }
    }
  }
}
```

### get\_property\_availability\_single

Fetches single-property availability rates for a RateParity hotel code.

**Input**

| Name            | Type    | Required | Description                           |
| --------------- | ------- | -------- | ------------------------------------- |
| `hotelCode`     | string  | Yes      | The property code                     |
| `checkIn`       | date    | Yes      | Check-in date in `yyyy-MM-dd` format  |
| `checkOut`      | date    | Yes      | Check-out date in `yyyy-MM-dd` format |
| `adults`        | integer | Yes      | Number of adults                      |
| `currency`      | string  | Yes      | Currency code, for example `EUR`      |
| `children`      | integer | No       | Number of children                    |
| `infants`       | integer | No       | Number of infants                     |
| `rooms`         | integer | No       | Number of rooms                       |
| `device`        | string  | No       | `DESKTOP` or `MOBILE`                 |
| `lang`          | string  | No       | Language code, for example `en`       |
| `timezone`      | string  | No       | Timezone, for example `Europe/Athens` |
| `remoteCountry` | string  | No       | Remote country code, for example `GR` |

Example request:

```bash
curl --location 'https://api.rateparity.com/mcp' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json, text/event-stream' \
--data '{
  "jsonrpc": "2.0",
  "id": 7,
  "method": "tools/call",
  "params": {
    "name": "get_property_availability_single",
    "arguments": {
      "hotelCode": "MASTERPLAK",
      "checkIn": "2026-10-26",
      "checkOut": "2026-10-28",
      "adults": 2,
      "currency": "EUR"
    }
  }
}'
```

Expected response shape:

```json
{
  "jsonrpc": "2.0",
  "id": 7,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "Availability rates for MASTERPLAK"
      }
    ],
    "isError": false,
    "structuredContent": {
      "data": {
        "hotelCode": "MASTERPLAK",
        "checkIn": "2026-10-26",
        "checkOut": "2026-10-28",
        "adults": 2,
        "currency": "EUR",
        "rates": [
          {
            "id": "RATE_ID",
            "room": "ROOM_CODE",
            "roomDesc": "Room name",
            "rate": "RATE_CODE",
            "rateDesc": "Rate name",
            "board": 3,
            "boardDesc": "Bed & breakfast",
            "minStay": 2,
            "remaining": 2,
            "status": "AVL",
            "statusDesc": "Available",
            "pricing": {
              "price": 120.5,
              "memberPrice": 110.0,
              "excludedCharges": 0.0,
              "discount": 10.0
            },
            "bookingUrl": "https://example.reserve-online.net/"
          }
        ]
      }
    }
  }
}
```

## Input Format

Tool arguments must use plain JSON values. For example, `hotelCode` must be a string.

Correct:

```json
{
  "hotelCode": "MASTERPLAK"
}
```

Incorrect:

```json
{
  "hotelCode": {
    "value": "MASTERPLAK"
  }
}
```

## Error Behavior

### Missing or invalid token

Requests without a valid Bearer token return:

```
HTTP 401 Unauthorized
```

### Unauthorized property

If the authenticated user is not authorized for the requested property code, the tool call fails before fetching property data.

### Invalid request body

Invalid JSON-RPC payloads, missing required headers, malformed arguments, or invalid argument types return either an HTTP transport error or an MCP error response.


# Shop Rates

The Shop Rates endpoint retrieves OTA and CRS rates for a specific hotel, with the option to filter by a specific rate.

`GET` `https://api.rateparity.com/v1/shopper/{code}`

**Path Parameters**

| Name     | Type   | Required | Description       |
| -------- | ------ | -------- | ----------------- |
| **code** | String | Yes      | The property code |

**Query Parameters**

| Name         | Type                                    | Required | Description                                                         |
| ------------ | --------------------------------------- | -------- | ------------------------------------------------------------------- |
| **checkIn**  | date                                    | Yes      | The check-in date in format yyyy-MM-dd                              |
| **checkOut** | date                                    | Yes      | The check-out date in format yyyy-MM-dd                             |
| **adults**   | integer                                 | No       | The number of adults, default 2                                     |
| **children** | integer                                 | No       | The number of children, default 0                                   |
| **channel**  | [Channel Type](/datatypes#channel-type) | No       | If not provided, rates for **all configured channels** are returned |
| **currency** | string                                  | No       | The currency, default value EUR                                     |
| **rateId**   | string                                  | No       | If not provided, the **cheapest rate** is returned.                 |

## Model Description

See [Model Description](/model) for the base structure of responses.

### Data Object Fields

| Field      | Type                                    | Description                                                   |
| ---------- | --------------------------------------- | ------------------------------------------------------------- |
| `currency` | String                                  | The currency code (e.g., USD, EUR) for the returned rates.    |
| `channels` | List<[Channel](#channel-object-fields)> | A list of available channels with rate details.               |
| `rates`    | List<[Rate](#rate-object-fields)>       | A list of rates applicable to the hotel and filters provided. |

### Channel Object Fields

| Field        | Type   | JSON Key      | Description                                                  |
| ------------ | ------ | ------------- | ------------------------------------------------------------ |
| `sourceId`   | string | `source_id`   | The unique identifier for the source channel.                |
| `sourceName` | string | `source_name` | The name of the source channel (e.g., Booking.com, Expedia). |
| `price`      | double | `price`       | The price returned for the hotel in the specified channel.   |

### Rate Object Fields

| Field                | Type          | Description                                                           |
| -------------------- | ------------- | --------------------------------------------------------------------- |
| `price`              | double        | The price for the specified rate.                                     |
| `roomId`             | string        | The unique identifier for the room.                                   |
| `rateId`             | string        | The unique identifier for the rate.                                   |
| `beRateId`           | List\<string> | The unique booking engine identifier for the rate.                    |
| `roomName`           | string        | The name of the room.                                                 |
| `cancellationPolicy` | string        | Details about the cancellation policy for the rate.                   |
| `board`              | string        | The board type (e.g., Bed & Breakfast, Half Board, Full Board).       |
| `extras`             | List\<string> | List of additional services or extras included in the rate.           |
| `partnerRate`        | boolean       | Indicates if the rate is a partner-specific rate (`true` or `false`). |
| `lowestRate`         | boolean       | Indicates if this is the lowest available rate (`true` or `false`).   |

## Request Example

```bash
curl --location 'https://api.rateparity.com/v1/shopper/{code}?rateId={rateId}&channel={channel}&checkIn={checkIn}&checkOut={checkOut}&adults={adults}&children={children}&currency={currency}' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {JWT_TOKEN}'
```

## Response Example

```
{
    "data": {
        "currency": "EUR",
        "channels": [
            {
                "source_id": "23",
                "source_name": "EXPEDIA",
                "price": 89
            },
            {
                "source_id": "25",
                "source_name": "AGODA",
                "price": 304
            },
            {
                "source_id": "22",
                "source_name": "BOOKING",
                "price": 313
            }
        ]
    }
}
```


# Fetch Reviews

The Reviews endpoint retrieves reviews for a specific hotel.

`GET` `https://api.rateparity.com/v1/reviews/{code}`

**Query Parameters**

Filtering is supported to refine the results based on the below criteria.

| Name                | Type                                               | Description                                                                                                           |
| ------------------- | -------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
| `category`          | [Category Type](/datatypes#reviewer-category-type) | Filters reviews based on the review category                                                                          |
| `score`             | [Score Type](/datatypes#review-score-type)         | Filters reviews by review score: `SUPERB` (9-10), `GOOD` (7-8), `PASSABLE` (5-6), `POOR` (3-4), and `VERYPOOR` (1-2). |
| `country`           | string                                             | Filters reviews based on the reviewer's country.                                                                      |
| `reviewerLanguages` | List                                               | Filters reviews based on the language of the review content.                                                          |
| `season`            | [Season Type](/datatypes#season-type)              | Filters reviews according to the season or time of year.                                                              |
| `verbose`           | boolean                                            | To include additional information when set to `true` (default: `false`).                                              |

**Pagination**

See [Pagination](/pagination) for more details. Sorting options are `dateReviewed`, `mostRelevant` and `score`.

## Model Description

See [Model Description](/model) for the base structure of responses.

### Data Object Fields

The `data` object contains the primary response information returned by the API:

| Name          | Type                                                                     | Description                                                                                                                                             |
| ------------- | ------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `channels`    | List of [ReviewScore](#reviewscore-object-fields) objects                | Review scores and details from Airbnb.                                                                                                                  |
| `score`       | double                                                                   | The overall average score calculated from all available sources.                                                                                        |
| `reviews`     | integer                                                                  | Total number of reviews aggregated across all sources.                                                                                                  |
| `timeUpdated` | Instant                                                                  | The timestamp of the last update.                                                                                                                       |
| `userReviews` | List of [ReviewDetails](#reviewdetails-object-fields) objects            | A list of individual user reviews with details such as reviewer name, score, title, description, and review date.                                       |
| `facilities`  | List of [ReviewFacility](#reviewfacility-object-fields) objects          | A list of facilities mentioned in reviews. If null, no facilities data is available.                                                                    |
| `tripTypes`   | Map of `String` to [TripTypeScore](#triptypescore-object-fields) objects | Trip-type review score breakdown keyed by trip type, including the aggregated `all` bucket when available. Omitted when no trip type data is available. |

### ReviewScore Object Fields

The `ReviewScore` object represents the scoring details for each review source:

| Name         | Type    | Description                                                |
| ------------ | ------- | ---------------------------------------------------------- |
| `title`      | String  | The channel name.                                          |
| `score`      | double  | The average review score from the source.                  |
| `outOfScore` | integer | The maximum possible score for the source (e.g., 10 or 6). |
| `total`      | integer | The total number of reviews counted for this source.       |

### ReviewDetails Object Fields

| Name           | Type    | Description                                                           |
| -------------- | ------- | --------------------------------------------------------------------- |
| `name`         | string  | Name of the reviewer.                                                 |
| `category`     | string  | Category of the reviewer (e.g., Solo traveller, Family, etc.).        |
| `dateReviewed` | Date    | The date the review was submitted.                                    |
| `score`        | double  | The review score provided by the user.                                |
| `title`        | string  | Title of the review.                                                  |
| `description`  | string  | Detailed text of the review.                                          |
| `country`      | string  | Country of the reviewer.                                              |
| `language`     | string  | Language of the review.                                               |
| `photoUrl`     | string  | URL to the reviewer's photo, if available.                            |
| `channel`      | string  | The source channel of the review (e.g. Booking.com, Tripadvisor.com). |
| `hidden`       | boolean | Indicates if the review is hidden (`true`) or visible (`false`).      |

### ReviewFacility Object Fields

| Name        | Type   | Description                                                            |
| ----------- | ------ | ---------------------------------------------------------------------- |
| `channel`   | string | The source channel of the review (e.g., Booking.com, Tripadvisor.com). |
| `facility`  | string | The name of the facility mentioned in the review.                      |
| `score`     | double | The review score related to the facility.                              |
| `timestamp` | Date   | The date and time when the facility was reviewed.                      |

### TripTypeScore Object Fields

| Name             | Type                                                                     | Description                                                                                                  |
| ---------------- | ------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------ |
| `reviewsPercent` | int                                                                      | Percentage of reviews for the trip type.                                                                     |
| `score`          | int                                                                      | The score for the trip type.                                                                                 |
| `categories`     | List of [CategoryScore](#categoryscore-object-fields) objects            | Category scores associated with this trip type.                                                              |
| `byLanguage`     | Map of `String` to [TripTypeScore](#triptypescore-object-fields) objects | Optional language-level breakdown returned for the aggregated `all` bucket and omitted for other trip types. |

### CategoryScore Object Fields

| Name           | Type     | Description                                      |
| -------------- | -------- | ------------------------------------------------ |
| `categoryName` | `String` | Name of the review category.                     |
| `text`         | `String` | Full descriptive text for the category.          |
| `shortText`    | `String` | Short descriptive text for the category.         |
| `score`        | `int`    | Score assigned to the category.                  |
| `count`        | `int`    | Number of reviews contributing to this category. |

### MetaData Object Fields

| Name             | Type                                               | Description                            |
| ---------------- | -------------------------------------------------- | -------------------------------------- |
| `countries`      | Map\<String, String>                               | The countries available for filtering. |
| `filterTotals`   | [FilterTotals](#filtertotals-object-fields) object | The filtering options totals.          |
| `sortingOptions` | List                                               | Available options for sorting.         |

### FilterTotals Object Fields

| Name         | Type                    | Description                                                    |
| ------------ | ----------------------- | -------------------------------------------------------------- |
| `categories` | Map\<Category, Integer> | The [Category Type](/datatypes#reviewer-category-type) totals. |
| `scores`     | Map\<Score, Integer>    | The [Score Type](/datatypes#review-score-type) totals.         |
| `seasons`    | Map\<Season, Integer>   | The [Season Type](/datatypes#season-type) totals.              |

## Request Example

```bash
curl --location 'https://api.rateparity.com/v1/review/{code}?limit=10&page=1&sort=dateReviewed&asc=false&country=Italy&reviewerLanguages=en,it' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {JWT_TOKEN}'
```

## 200 OK - Success

```json
{
  "data": {
    "channels": [
      {
        "title": "airbnb",
        "score": 10.0,
        "outOfScore": 10,
        "total": 16
      },
      {
        "title": "booking",
        "score": 9.0,
        "outOfScore": 10,
        "total": 367
      },
      {
        "title": "expedia",
        "score": 0.0,
        "outOfScore": 10,
        "total": 0
      },
      {
        "title": "google",
        "score": 9.6,
        "outOfScore": 10,
        "total": 85
      },
      {
        "title": "holidayCheck",
        "score": 0.0,
        "outOfScore": 6,
        "total": 0
      },
      {
        "title": "hotels",
        "score": 0.0,
        "outOfScore": 10,
        "total": 0
      },
      {
        "title": "tripadvisor",
        "score": 0.0,
        "outOfScore": 10,
        "total": 0
      }
    ],
    "score": 9.53,
    "reviews": 468,
    "timeUpdated": "2025-04-01T00:44:37Z",
    "userReviews": [
      {
        "id": 550942,
        "name": "Wifak",
        "category": "Couple",
        "dateReviewed": "2025-03-21T00:00:00.000+00:00",
        "score": 10.0,
        "title": "Exceptional",
        "description": "There are no comments available for this review",
        "country": "Italy",
        "language": "en",
        "photoUrl": "",
        "channel": "Booking.com",
        "hidden": false
      },
      {
        "id": 537153,
        "name": "Schenatti",
        "category": "Group",
        "dateReviewed": "2025-02-24T00:00:00.000+00:00",
        "score": 9.0,
        "title": "Superb",
        "description": "There are no comments available for this review",
        "country": "Italy",
        "language": "en",
        "photoUrl": "",
        "channel": "Booking.com",
        "hidden": false
      },
      {
        "id": 510078,
        "name": "Cinzia",
        "category": "Couple",
        "dateReviewed": "2025-01-06T00:00:00.000+00:00",
        "score": 9.0,
        "title": "Superb",
        "description": "Colazione esterna in un bel locale a pochi minuti a piedi, possibilità di scelta di 4 menu per tutti i gusti, buono tutto e abbondante. Il proprietario super ospitale e disponibile per ogni evenienza e consiglio. Nella camera c'è anche una cucina che noi non abbiamo usato ma super utile. Posizione strategica per raggiungere a piedi il tutto!",
        "language": "it",
        "country": "Italy",
        "photoUrl": "",
        "channel": "Booking.com",
        "hidden": false
      },
      {
        "id": 460086,
        "name": "Fabysmile",
        "category": "Couple",
        "dateReviewed": "2024-09-24T00:00:00.000+00:00",
        "score": 10.0,
        "title": "Posizione buonissima",
        "description": "Posizione ottima, stanza pulita e disponibilità dell'host. Spiegazioni accurate per entrare in struttura e per fare il check-in.",
        "language": "it",
        "country": "Italy",
        "photoUrl": "",
        "channel": "Booking.com",
        "hidden": false
      },
      {
        "id": 440578,
        "name": "Alessandro",
        "category": "Solo traveller",
        "dateReviewed": "2024-08-29T00:00:00.000+00:00",
        "score": 9.0,
        "title": "Superb",
        "description": "Struttura nuova accogliente che nel suo iinterno richiama li stile del quartiere in cui si trova ...vengono riprodotte le più belle opere di strettamente art presenti in zona .. stanza pulita ...cucina nuova e pulita ,..staff presente e disponibile ... posizione ottima ...",
        "language": "it",
        "country": "Italy",
        "photoUrl": "",
        "channel": "Booking.com",
        "hidden": false
      }
    ],
    "facilities": [
      {
        "channel": "Booking.com",
        "facility": "staff",
        "score": 9.5
      },
      {
        "channel": "Booking.com",
        "facility": "facilities",
        "score": 9.0
      },
      {
        "channel": "Booking.com",
        "facility": "cleanliness",
        "score": 9.2
      },
      {
        "channel": "Booking.com",
        "facility": "comfort",
        "score": 9.1
      },
      {
        "channel": "Booking.com",
        "facility": "valueformoney",
        "score": 8.9
      },
      {
        "channel": "Booking.com",
        "facility": "location",
        "score": 9.4
      },
      {
        "channel": "Booking.com",
        "facility": "freewifi",
        "score": 9.4
      }
    ],
    "tripTypes": {
      "couple": {
        "reviewsPercent": 41,
        "score": 84,
        "categories": [
          {
            "categoryName": "Location",
            "text": "Terrific location.",
            "shortText": "Excellent location",
            "score": 91,
            "count": 287
          },
          {
            "categoryName": "Service",
            "text": "Fantastic service.",
            "shortText": "Very friendly service",
            "score": 88,
            "count": 214
          },
          {
            "categoryName": "Room",
            "text": "Comfortable and well-appointed room.",
            "shortText": "Comfortable room",
            "score": 74,
            "count": 198
          }
        ]
      },
      "family": {
        "reviewsPercent": 27,
        "score": 81,
        "categories": [
          {
            "categoryName": "Location",
            "text": "Great area for families with children.",
            "shortText": "Great for families",
            "score": 89,
            "count": 143
          },
          {
            "categoryName": "Breakfast",
            "text": "Wide selection for all tastes.",
            "shortText": "Good breakfast selection",
            "score": 80,
            "count": 96
          },
          {
            "categoryName": "Comfort",
            "text": "Decent comfort for a family stay.",
            "shortText": "Reasonably comfortable",
            "score": 69,
            "count": 88
          }
        ]
      },
      "business": {
        "reviewsPercent": 19,
        "score": 78,
        "categories": [
          {
            "categoryName": "WiFi",
            "text": "Consistently reliable and fast internet.",
            "shortText": "Reliable internet",
            "score": 82,
            "count": 67
          },
          {
            "categoryName": "Service",
            "text": "Professional and prompt staff.",
            "shortText": "Efficient staff",
            "score": 79,
            "count": 58
          },
          {
            "categoryName": "Room",
            "text": "Good desk space for working.",
            "shortText": "Adequate workspace",
            "score": 72,
            "count": 61
          }
        ]
      },
      "solo": {
        "reviewsPercent": 13,
        "score": 86,
        "categories": [
          {
            "categoryName": "Location",
            "text": "Perfectly situated for exploring the city solo.",
            "shortText": "Easy to get around",
            "score": 94,
            "count": 52
          },
          {
            "categoryName": "Cleanliness",
            "text": "Spotless rooms and common areas.",
            "shortText": "Very clean",
            "score": 87,
            "count": 49
          },
          {
            "categoryName": "Amenities",
            "text": "Everything you need for a comfortable stay.",
            "shortText": "Useful amenities",
            "score": 73,
            "count": 31
          }
        ]
      },
      "all": {
        "reviewsPercent": 100,
        "score": 84,
        "categories": [
          {
            "categoryName": "Location",
            "text": "Terrific location.",
            "shortText": "Great location",
            "score": 97,
            "count": 4770
          },
          {
            "categoryName": "Service",
            "text": "World class service.",
            "shortText": "Fantastic service",
            "score": 91,
            "count": 2958
          },
          {
            "categoryName": "Breakfast",
            "text": "Breakfast is good.",
            "shortText": "Tasty breakfast",
            "score": 85,
            "count": 2050
          },
          {
            "categoryName": "Cleanliness",
            "text": "Generally very clean.",
            "shortText": "Clean",
            "score": 82,
            "count": 1408
          },
          {
            "categoryName": "Room",
            "text": "Rooms are ok.",
            "shortText": "Room is all right",
            "score": 63,
            "count": 4185
          },
          {
            "categoryName": "WiFi",
            "text": "Internet is average.",
            "shortText": "Regular internet service",
            "score": 60,
            "count": 95
          },
          {
            "categoryName": "Comfort",
            "text": "Not very comfortable.",
            "shortText": "More comfort would be nice",
            "score": 45,
            "count": 2658
          },
          {
            "categoryName": "Amenities",
            "text": "Bad amenities.",
            "shortText": "Amenities are not the best",
            "score": 39,
            "count": 982
          },
          {
            "categoryName": "Value",
            "text": "Average value.",
            "shortText": "Fairly good value for money",
            "score": 66,
            "count": 54
          },
          {
            "categoryName": "Food",
            "text": "Tasty food.",
            "shortText": "Delicious food",
            "score": 73,
            "count": 30
          }
        ],
        "byLanguage": {
          "de": {
            "reviewsPercent": 39,
            "score": 83,
            "categories": [
              {
                "categoryName": "Location",
                "text": "Terrific location.",
                "shortText": "Great location",
                "score": 96,
                "count": 1265
              },
              {
                "categoryName": "Service",
                "text": "World class service.",
                "shortText": "Fantastic service",
                "score": 92,
                "count": 813
              },
              {
                "categoryName": "Breakfast",
                "text": "Breakfast is good.",
                "shortText": "Tasty breakfast",
                "score": 86,
                "count": 616
              },
              {
                "categoryName": "Cleanliness",
                "text": "Generally very clean.",
                "shortText": "Clean",
                "score": 81,
                "count": 341
              },
              {
                "categoryName": "Room",
                "text": "Rooms are ok.",
                "shortText": "Room is all right",
                "score": 63,
                "count": 1147
              },
              {
                "categoryName": "WiFi",
                "text": "Internet is average.",
                "shortText": "Regular internet service",
                "score": 57,
                "count": 24
              },
              {
                "categoryName": "Comfort",
                "text": "Not very comfortable.",
                "shortText": "More comfort would be nice",
                "score": 46,
                "count": 735
              },
              {
                "categoryName": "Amenities",
                "text": "Bad amenities.",
                "shortText": "Amenities are not the best",
                "score": 39,
                "count": 252
              }
            ]
          },
          "en": {
            "reviewsPercent": 30,
            "score": 85,
            "categories": [
              {
                "categoryName": "Location",
                "text": "Terrific location.",
                "shortText": "Great location",
                "score": 99,
                "count": 1152
              },
              {
                "categoryName": "Service",
                "text": "Great service.",
                "shortText": "Fantastic service",
                "score": 89,
                "count": 763
              },
              {
                "categoryName": "Cleanliness",
                "text": "Generally very clean.",
                "shortText": "Clean",
                "score": 85,
                "count": 413
              },
              {
                "categoryName": "Breakfast",
                "text": "Breakfast is good.",
                "shortText": "Tasty breakfast",
                "score": 83,
                "count": 337
              },
              {
                "categoryName": "Room",
                "text": "Rooms are ok.",
                "shortText": "Room is all right",
                "score": 66,
                "count": 975
              },
              {
                "categoryName": "WiFi",
                "text": "Internet is average.",
                "shortText": "Regular internet service",
                "score": 65,
                "count": 40
              },
              {
                "categoryName": "Comfort",
                "text": "Not very comfortable.",
                "shortText": "More comfort would be nice",
                "score": 45,
                "count": 572
              },
              {
                "categoryName": "Amenities",
                "text": "Bad amenities.",
                "shortText": "Amenities are not the best",
                "score": 38,
                "count": 277
              }
            ]
          },
          "es": {
            "reviewsPercent": 6,
            "score": 86,
            "categories": [
              {
                "categoryName": "Location",
                "text": "Terrific location.",
                "shortText": "Great location",
                "score": 98,
                "count": 237
              },
              {
                "categoryName": "Service",
                "text": "World class service.",
                "shortText": "Fantastic service",
                "score": 91,
                "count": 140
              },
              {
                "categoryName": "Breakfast",
                "text": "Good breakfast.",
                "shortText": "Tasty breakfast",
                "score": 79,
                "count": 75
              },
              {
                "categoryName": "Cleanliness",
                "text": "Good cleanliness.",
                "shortText": "Clean",
                "score": 72,
                "count": 66
              },
              {
                "categoryName": "Room",
                "text": "Rooms are ok.",
                "shortText": "Room is all right",
                "score": 55,
                "count": 183
              },
              {
                "categoryName": "Amenities",
                "text": "Bad amenities.",
                "shortText": "Amenities are not the best",
                "score": 49,
                "count": 45
              },
              {
                "categoryName": "Comfort",
                "text": "Not very comfortable.",
                "shortText": "More comfort would be nice",
                "score": 34,
                "count": 123
              }
            ]
          },
          "fi": {
            "reviewsPercent": 1,
            "score": 85,
            "categories": [
              {
                "categoryName": "Location",
                "text": "Terrific location.",
                "shortText": "Great location",
                "score": 98,
                "count": 16
              },
              {
                "categoryName": "Service",
                "text": "World class service.",
                "shortText": "Fantastic service",
                "score": 90,
                "count": 11
              },
              {
                "categoryName": "Cleanliness",
                "text": "Generally very clean.",
                "shortText": "Clean",
                "score": 85,
                "count": 8
              },
              {
                "categoryName": "Breakfast",
                "text": "Breakfast is good.",
                "shortText": "Tasty breakfast",
                "score": 85,
                "count": 12
              },
              {
                "categoryName": "Room",
                "text": "Rooms are ok.",
                "shortText": "Room is all right",
                "score": 60,
                "count": 12
              },
              {
                "categoryName": "Comfort",
                "text": "Not very comfortable.",
                "shortText": "More comfort would be nice",
                "score": 48,
                "count": 11
              },
              {
                "categoryName": "Amenities",
                "text": "Bad amenities.",
                "shortText": "Amenities are not the best",
                "score": 37,
                "count": 5
              }
            ]
          },
          "fr": {
            "reviewsPercent": 4,
            "score": 87,
            "categories": [
              {
                "categoryName": "Location",
                "text": "Terrific location.",
                "shortText": "Great location",
                "score": 98,
                "count": 118
              },
              {
                "categoryName": "Service",
                "text": "World class service.",
                "shortText": "Fantastic service",
                "score": 90,
                "count": 63
              },
              {
                "categoryName": "Cleanliness",
                "text": "Generally very clean.",
                "shortText": "Clean",
                "score": 84,
                "count": 25
              },
              {
                "categoryName": "Breakfast",
                "text": "Breakfast is good.",
                "shortText": "Tasty breakfast",
                "score": 84,
                "count": 61
              },
              {
                "categoryName": "Value",
                "text": "Average value.",
                "shortText": "Fairly good value for money",
                "score": 66,
                "count": 27
              },
              {
                "categoryName": "Room",
                "text": "Rooms are ok.",
                "shortText": "Room is all right",
                "score": 66,
                "count": 102
              },
              {
                "categoryName": "Comfort",
                "text": "Average comfort.",
                "shortText": "Comfortable",
                "score": 50,
                "count": 76
              },
              {
                "categoryName": "Amenities",
                "text": "Bad amenities.",
                "shortText": "Amenities are not the best",
                "score": 41,
                "count": 32
              }
            ]
          },
          "he": {
            "reviewsPercent": 2,
            "score": 87,
            "categories": [
              {
                "categoryName": "Location",
                "text": "Terrific location.",
                "shortText": "Great location",
                "score": 97,
                "count": 49
              },
              {
                "categoryName": "Service",
                "text": "World class service.",
                "shortText": "Fantastic service",
                "score": 93,
                "count": 28
              },
              {
                "categoryName": "Cleanliness",
                "text": "Generally very clean.",
                "shortText": "Clean",
                "score": 85,
                "count": 14
              },
              {
                "categoryName": "Breakfast",
                "text": "Breakfast is good.",
                "shortText": "Tasty breakfast",
                "score": 82,
                "count": 24
              },
              {
                "categoryName": "Room",
                "text": "Rooms are ok.",
                "shortText": "Room is all right",
                "score": 57,
                "count": 47
              },
              {
                "categoryName": "Comfort",
                "text": "Not very comfortable.",
                "shortText": "More comfort would be nice",
                "score": 43,
                "count": 35
              },
              {
                "categoryName": "Amenities",
                "text": "Bad amenities.",
                "shortText": "Amenities are not the best",
                "score": 35,
                "count": 5
              }
            ]
          },
          "it": {
            "reviewsPercent": 6,
            "score": 84,
            "categories": [
              {
                "categoryName": "Location",
                "text": "Terrific location.",
                "shortText": "Great location",
                "score": 99,
                "count": 221
              },
              {
                "categoryName": "Service",
                "text": "World class service.",
                "shortText": "Fantastic service",
                "score": 91,
                "count": 110
              },
              {
                "categoryName": "Cleanliness",
                "text": "Generally very clean.",
                "shortText": "Clean",
                "score": 83,
                "count": 71
              },
              {
                "categoryName": "Breakfast",
                "text": "Breakfast is good.",
                "shortText": "Tasty breakfast",
                "score": 82,
                "count": 96
              },
              {
                "categoryName": "Room",
                "text": "Rooms are ok.",
                "shortText": "Room is all right",
                "score": 69,
                "count": 175
              },
              {
                "categoryName": "Comfort",
                "text": "Average comfort.",
                "shortText": "Comfortable",
                "score": 52,
                "count": 117
              },
              {
                "categoryName": "Amenities",
                "text": "Bad amenities.",
                "shortText": "Amenities are not the best",
                "score": 42,
                "count": 31
              }
            ]
          },
          "nl": {
            "reviewsPercent": 4,
            "score": 83,
            "categories": [
              {
                "categoryName": "Location",
                "text": "Terrific location.",
                "shortText": "Great location",
                "score": 97,
                "count": 162
              },
              {
                "categoryName": "Breakfast",
                "text": "Breakfast is good.",
                "shortText": "Tasty breakfast",
                "score": 86,
                "count": 90
              },
              {
                "categoryName": "Service",
                "text": "Great service.",
                "shortText": "Fantastic service",
                "score": 86,
                "count": 70
              },
              {
                "categoryName": "Cleanliness",
                "text": "Generally very clean.",
                "shortText": "Clean",
                "score": 85,
                "count": 55
              },
              {
                "categoryName": "Room",
                "text": "Rooms are ok.",
                "shortText": "Room is all right",
                "score": 64,
                "count": 163
              },
              {
                "categoryName": "WiFi",
                "text": "Internet is average.",
                "shortText": "Regular internet service",
                "score": 52,
                "count": 7
              },
              {
                "categoryName": "Comfort",
                "text": "Not very comfortable.",
                "shortText": "More comfort would be nice",
                "score": 44,
                "count": 109
              },
              {
                "categoryName": "Amenities",
                "text": "Bad amenities.",
                "shortText": "Amenities are not the best",
                "score": 36,
                "count": 41
              }
            ]
          },
          "no": {
            "reviewsPercent": 1,
            "score": 88,
            "categories": [
              {
                "categoryName": "Location",
                "text": "Terrific location.",
                "shortText": "Great location",
                "score": 98,
                "count": 18
              },
              {
                "categoryName": "Service",
                "text": "World class service.",
                "shortText": "Fantastic service",
                "score": 92,
                "count": 9
              },
              {
                "categoryName": "Breakfast",
                "text": "Breakfast is good.",
                "shortText": "Tasty breakfast",
                "score": 87,
                "count": 7
              },
              {
                "categoryName": "Room",
                "text": "Rooms are ok.",
                "shortText": "Room is all right",
                "score": 56,
                "count": 15
              },
              {
                "categoryName": "Comfort",
                "text": "Not very comfortable.",
                "shortText": "More comfort would be nice",
                "score": 40,
                "count": 8
              }
            ]
          },
          "pl": {
            "reviewsPercent": 1,
            "score": 91,
            "categories": [
              {
                "categoryName": "Location",
                "text": "Terrific location.",
                "shortText": "Great location",
                "score": 94,
                "count": 35
              },
              {
                "categoryName": "Service",
                "text": "World class service.",
                "shortText": "Fantastic service",
                "score": 93,
                "count": 15
              },
              {
                "categoryName": "Breakfast",
                "text": "Breakfast is good.",
                "shortText": "Tasty breakfast",
                "score": 87,
                "count": 10
              },
              {
                "categoryName": "Food",
                "text": "Tasty food.",
                "shortText": "Delicious food",
                "score": 73,
                "count": 15
              },
              {
                "categoryName": "Room",
                "text": "Rooms are ok.",
                "shortText": "Room is all right",
                "score": 58,
                "count": 19
              },
              {
                "categoryName": "Comfort",
                "text": "Average comfort.",
                "shortText": "Comfortable",
                "score": 50,
                "count": 7
              }
            ]
          },
          "pt": {
            "reviewsPercent": 2,
            "score": 87,
            "categories": [
              {
                "categoryName": "Location",
                "text": "Terrific location.",
                "shortText": "Great location",
                "score": 98,
                "count": 65
              },
              {
                "categoryName": "Service",
                "text": "World class service.",
                "shortText": "Fantastic service",
                "score": 92,
                "count": 35
              },
              {
                "categoryName": "Breakfast",
                "text": "Breakfast is good.",
                "shortText": "Tasty breakfast",
                "score": 84,
                "count": 30
              },
              {
                "categoryName": "Cleanliness",
                "text": "Generally very clean.",
                "shortText": "Clean",
                "score": 80,
                "count": 11
              },
              {
                "categoryName": "Room",
                "text": "Rooms are ok.",
                "shortText": "Room is all right",
                "score": 62,
                "count": 52
              },
              {
                "categoryName": "Comfort",
                "text": "Not very comfortable.",
                "shortText": "More comfort would be nice",
                "score": 46,
                "count": 25
              },
              {
                "categoryName": "Amenities",
                "text": "Bad amenities.",
                "shortText": "Amenities are not the best",
                "score": 44,
                "count": 13
              }
            ]
          },
          "ru": {
            "reviewsPercent": 1,
            "score": 88,
            "categories": [
              {
                "categoryName": "Location",
                "text": "Terrific location.",
                "shortText": "Great location",
                "score": 98,
                "count": 32
              },
              {
                "categoryName": "Service",
                "text": "World class service.",
                "shortText": "Fantastic service",
                "score": 91,
                "count": 24
              },
              {
                "categoryName": "Cleanliness",
                "text": "Generally very clean.",
                "shortText": "Clean",
                "score": 82,
                "count": 7
              },
              {
                "categoryName": "Breakfast",
                "text": "Breakfast is good.",
                "shortText": "Tasty breakfast",
                "score": 82,
                "count": 17
              },
              {
                "categoryName": "Room",
                "text": "Rooms are ok.",
                "shortText": "Room is all right",
                "score": 66,
                "count": 41
              },
              {
                "categoryName": "Comfort",
                "text": "Average comfort.",
                "shortText": "Comfortable",
                "score": 50,
                "count": 30
              },
              {
                "categoryName": "Amenities",
                "text": "Bad amenities.",
                "shortText": "Amenities are not the best",
                "score": 40,
                "count": 7
              }
            ]
          },
          "sv": {
            "reviewsPercent": 1,
            "score": 81,
            "categories": [
              {
                "categoryName": "Location",
                "text": "Terrific location.",
                "shortText": "Great location",
                "score": 99,
                "count": 45
              },
              {
                "categoryName": "Breakfast",
                "text": "Breakfast is good.",
                "shortText": "Tasty breakfast",
                "score": 84,
                "count": 31
              },
              {
                "categoryName": "Service",
                "text": "Great service.",
                "shortText": "Fantastic service",
                "score": 84,
                "count": 17
              },
              {
                "categoryName": "Cleanliness",
                "text": "Generally very clean.",
                "shortText": "Clean",
                "score": 80,
                "count": 14
              },
              {
                "categoryName": "Room",
                "text": "Rooms are ok.",
                "shortText": "Room is all right",
                "score": 64,
                "count": 38
              },
              {
                "categoryName": "Comfort",
                "text": "Not very comfortable.",
                "shortText": "More comfort would be nice",
                "score": 45,
                "count": 29
              },
              {
                "categoryName": "Amenities",
                "text": "Bad amenities.",
                "shortText": "Amenities are not the best",
                "score": 35,
                "count": 13
              }
            ]
          },
          "tr": {
            "reviewsPercent": 2,
            "score": 85,
            "categories": [
              {
                "categoryName": "Location",
                "text": "Terrific location.",
                "shortText": "Great location",
                "score": 98,
                "count": 90
              },
              {
                "categoryName": "Service",
                "text": "World class service.",
                "shortText": "Fantastic service",
                "score": 93,
                "count": 47
              },
              {
                "categoryName": "Breakfast",
                "text": "Breakfast is good.",
                "shortText": "Tasty breakfast",
                "score": 84,
                "count": 28
              },
              {
                "categoryName": "Cleanliness",
                "text": "Generally very clean.",
                "shortText": "Clean",
                "score": 84,
                "count": 42
              },
              {
                "categoryName": "Room",
                "text": "Rooms are ok.",
                "shortText": "Room is all right",
                "score": 54,
                "count": 69
              },
              {
                "categoryName": "Comfort",
                "text": "Not very comfortable.",
                "shortText": "More comfort would be nice",
                "score": 42,
                "count": 46
              },
              {
                "categoryName": "Amenities",
                "text": "Bad amenities.",
                "shortText": "Amenities are not the best",
                "score": 38,
                "count": 9
              }
            ]
          }
        }
      }
    }
  }
}

```

## 400 Bad Request

## 401 Unauthorized

```json
{
  "metadata": {
    "timestamp": "2025-02-27T10:54:03.474744"
  },
  "error": {
    "message": "Unauthorized user"
  }
}
```


# Availability Multi

Multi-property availability results using chain credentials

<mark style="color:blue;">`GET`</mark> `https://api.rateparity.com/v1/availability/multi`

Returns multi-property availability for a chain code. Results include hotel metadata, lowest available rates, and filter metadata used for UI facets.

#### Query Parameters

| Name                                        | Type    | Description                                                            |
| ------------------------------------------- | ------- | ---------------------------------------------------------------------- |
| chainCode<mark style="color:red;">\*</mark> | String  | Chain code used to resolve availability credentials and property list. |
| checkin<mark style="color:red;">\*</mark>   | Date    | Check-in date in `YYYY-MM-DD` format.                                  |
| checkout<mark style="color:red;">\*</mark>  | Date    | Check-out date in `YYYY-MM-DD` format.                                 |
| adults                                      | Integer | Number of adults (must be greater than zero).                          |
| children                                    | Integer | Number of children.                                                    |
| infants                                     | Integer | Number of infants.                                                     |
| rooms                                       | Integer | Number of rooms.                                                       |
| currency<mark style="color:red;">\*</mark>  | String  | Target currency code for prices.                                       |
| device                                      | String  | Visitor device; `DESKTOP` (default) or `MOBILE`.                       |
| lang                                        | String  | Language code passed to the availability engine.                       |
| sortBy                                      | String  | Sort field; one of `PRICE`, `POPULARITY`, `NAME`, or `DISTANCE`.       |
| sortOrder                                   | String  | Sort order; `ASC` or `DESC`.                                           |
| minPrice                                    | Double  | Minimum price filter.                                                  |
| maxPrice                                    | Double  | Maximum price filter.                                                  |
| destination                                 | String  | Destination name filter.                                               |
| rating                                      | Array   | Hotel rating filter; can be repeated for multiple ratings.             |
| boards                                      | Array   | Hotel boards filter; can be repeated for multiple boards.              |
| propertyName                                | String  | Property name search substring.                                        |

{% tabs %}
{% tab title="200: OK Availability returned" %}
{% code lineNumbers="true" %}

```json
{
  "hotels": [
    {
      "code": "WOLAWARSAW",
      "name": "White Olive Elite Warsaw",
      "description": "City center hotel with rooftop pool",
      "url": "https://hotel.example.com/WOLAWARSAW",
      "targetUrl": "https://hotel.example.com/WOLAWARSAW/book",
      "includeInWidgetSearch": true,
      "rating": 5,
      "minprice": 210.0,
      "nightsMin": 1,
      "nightsMax": 14,
      "symbol": "€",
      "photo": "https://images.example.com/WOLAWARSAW/main.jpg",
      "photoM": "https://images.example.com/WOLAWARSAW/main_m.jpg",
      "photoL": "https://images.example.com/WOLAWARSAW/main_l.jpg",
      "location": {
        "name": "Warsaw",
        "lat": 52.2297,
        "lon": 21.0122
      },
      "beds": 2,
      "bathrooms": 1,
      "bedrooms": 1,
      "noOfPhotos": 12,
      "rates": [
        {
          "rate": "NRF",
          "room": "Deluxe City View",
          "board": 1,
          "price": 210.0,
          "discount": 0.0,
          "memberPrice": 200.0,
          "memberDiscount": 10.0,
          "remaining": 6
        },
        {
          "rate": "RF",
          "room": "Deluxe City View",
          "board": 2,
          "price": 230.0,
          "discount": 10.0,
          "remaining": 3
        }
      ]
    }
  ],
  "metadata": {
    "destinations": {
      "Warsaw": 1
    },
    "boards": {
      "1": 1,
      "2": 1
    },
    "ratings": {
      "5": 1
    },
    "minPrice": 210.0,
    "maxPrice": 230.0,
    "sortBy": "PRICE",
    "sortOrder": "ASC"
  },
  "checkin": "2026-04-18",
  "checkout": "2026-04-19",
  "adults": 2,
  "currency": "EUR",
  "symbol": "€"
}
```

{% endcode %}
{% endtab %}

{% tab title="400: Bad Request Validation failed (e.g., missing required parameters or invalid dates)" %}

```json
{
  "timestamp": "2025-11-25T14:13:22",
  "message": "Data provided is invalid"
}
```

{% endtab %}

{% tab title="401: Unauthorized Chain code could not be resolved or credentials are invalid" %}

{% endtab %}
{% endtabs %}

## Example

{% tabs %}
{% tab title="curl" %}

<pre><code><strong>curl 'https://api.rateparity.com/v1/availability/multi?chainCode=chaincode&#x26;checkin=2026-04-18&#x26;checkout=2026-04-19&#x26;adults=2¤cy=EUR'
</strong></code></pre>

{% endtab %}
{% endtabs %}


# Create Quote

The **Create** **Quote** method is used to create **offline offers** for a specific hotel. This endpoint allows users to send quote requests directly to hotels, often for personalized rates or availability inquiries not shown in standard search results.

`POST` `https://api.rateparity.com/v1/quote/{code}`

**Body Parameters**

| Parameter   | Type    | Required | Description                                                                                           |
| ----------- | ------- | -------- | ----------------------------------------------------------------------------------------------------- |
| `checkin`   | string  | Yes      | The desired check-in date (format: YYYY-MM-DD).                                                       |
| `nights`    | integer | Yes      | The number of nights for the stay.                                                                    |
| `firstName` | string  | Yes      | The first name of the person making the request.                                                      |
| `lastName`  | string  | Yes      | The last name of the person making the request.                                                       |
| `email`     | string  | Yes      | The email address of the requester.                                                                   |
| `phone`     | string  | No       | The phone number of the requester (optional, but useful for direct communication).                    |
| `country`   | string  | Yes      | The country of residence of the requester.                                                            |
| `notes`     | string  | No       | Any additional notes or special requests (e.g., room preferences, meal plans, or other requirements). |
| `adults`    | integer | Yes      | Number of adults included in the booking.                                                             |
| `children`  | integer | No       | Number of children included in the booking (default is 0 if not provided).                            |
| `rooms`     | integer | Yes      | Number of rooms requested.                                                                            |

***

## Request Example

```bash
curl --location 'https://api.rateparity.com/v1/quote/{code}' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {JWT_TOKEN}' \
--data-raw '{
    "checkin": "2025-08-26",
    "nights": 6,
    "firstName": "Asli",
    "lastName": "Calik",
    "email": "asli_calik@yahoo.com",
    "phone": "905377290056",
    "country": "Italy",
    "notes": "Dear all, we would like to visit Halkidiki with my family and your hotel seems amazing! What I would like to ask you, is there any possibility to have 'Standard Retreat' room with half-board option (with extra payment of course)? Thank you already!",
    "adults": 2,
    "children": 0,
    "rooms": 1
}'
```

***

## Response Example


# Lowest Monthly Rates

Lowest available direct rate per month for a property

<mark style="color:blue;">`GET`</mark> `https://api.rateparity.com/v1/rate/lowestmonthly/{code}`

Returns, for each month in the forecast horizon, the lowest direct rate found on the hotel website, along with:

* **month** – the month (1–12) the rate belongs to
* **year** – the calendar year of that month
* **rate** – the lowest nightly rate found for that month
* **day** – the specific date for which this lowest rate applies
* **minStay** – the minimum length of stay (in nights) required for that rate
* **timestamp** – when this lowest rate was last fetched

#### Path Parameters

| Name                                   | Type   | Description        |
| -------------------------------------- | ------ | ------------------ |
| code<mark style="color:red;">\*</mark> | String | The property code. |

{% tabs %}
{% tab title="200: OK Everything worked as expected" %}
{% code lineNumbers="true" %}

```json
{
  "data": {
    "hotelCode": "WOLAWARSAW",
    "currency": "PLN",
    "lowestMonthlyRates": [
      {
        "month": 12,
        "year": 2025,
        "rate": 210.0,
        "day": "2025-12-07T02:00:00",
        "minStay": 28,
        "timestamp": "2025-11-25T14:13:01.000+00:00"
      },
      {
        "month": 1,
        "year": 2026,
        "rate": 262.5,
        "day": "2026-01-11T02:00:00",
        "minStay": 1,
        "timestamp": "2025-11-25T14:13:03.000+00:00"
      },
      {
        "month": 2,
        "year": 2026,
        "rate": 262.5,
        "day": "2026-02-01T02:00:00",
        "minStay": 1,
        "timestamp": "2025-11-25T14:13:05.000+00:00"
      },
      {
        "month": 3,
        "year": 2026,
        "rate": 262.5,
        "day": "2026-03-01T02:00:00",
        "minStay": 1,
        "timestamp": "2025-11-25T14:13:07.000+00:00"
      },
      {
        "month": 4,
        "year": 2026,
        "rate": 241.5,
        "day": "2026-04-05T03:00:00",
        "minStay": 1,
        "timestamp": "2025-11-25T14:13:10.000+00:00"
      },
      {
        "month": 5,
        "year": 2026,
        "rate": 241.5,
        "day": "2026-05-10T03:00:00",
        "minStay": 1,
        "timestamp": "2025-11-25T14:13:12.000+00:00"
      },
      {
        "month": 6,
        "year": 2026,
        "rate": 241.5,
        "day": "2026-06-07T03:00:00",
        "minStay": 1,
        "timestamp": "2025-11-25T14:13:14.000+00:00"
      },
      {
        "month": 7,
        "year": 2026,
        "rate": 258.75,
        "day": "2026-07-05T03:00:00",
        "minStay": 1,
        "timestamp": "2025-11-25T14:13:16.000+00:00"
      },
      {
        "month": 8,
        "year": 2026,
        "rate": 258.75,
        "day": "2026-08-02T03:00:00",
        "minStay": 1,
        "timestamp": "2025-11-25T14:13:18.000+00:00"
      },
      {
        "month": 9,
        "year": 2026,
        "rate": 241.5,
        "day": "2026-09-06T03:00:00",
        "minStay": 1,
        "timestamp": "2025-11-25T14:13:20.000+00:00"
      },
      {
        "month": 10,
        "year": 2026,
        "rate": 241.5,
        "day": "2026-10-04T03:00:00",
        "minStay": 1,
        "timestamp": "2025-11-25T14:13:22.000+00:00"
      }
    ]
  }
}
```

{% endcode %}
{% endtab %}

{% tab title="400: Bad Request Invalid parameters (e.g. invalid property code or date configuration)" %}

```json
{
  "timestamp": "2025-11-25T14:13:22",
  "message": "Data provided is invalid"
}
```

{% endtab %}

{% tab title="401: Unauthorized No valid API key provided or not authorised to access the provided property code" %}

{% endtab %}
{% endtabs %}

## Example

{% tabs %}
{% tab title="curl" %}

<pre><code><strong>curl 'https://api.rateparity.com/v1/rate/lowestmonthly/WOLAWARSAW' \
</strong><strong>--header 'Authorization: Bearer YOUR_API_KEY'
</strong></code></pre>

{% endtab %}
{% endtabs %}


# Parity Timeline

A Timeline of Direct Prices Being Undercut by Online Travel Agencies (OTAs)

<mark style="color:blue;">`GET`</mark> `https://api.rateparity.com/v1/insights/paritytimeline/{code}`

By default the timeline period to search is 7 days (last week). Search for a custom period is also available for a maximum of 31 days.

#### Path Parameters

| Name                                   | Type   | Description       |
| -------------------------------------- | ------ | ----------------- |
| code<mark style="color:red;">\*</mark> | String | The property code |

#### Query Parameters

| Name | Type | Description                                                 |
| ---- | ---- | ----------------------------------------------------------- |
| from | Date | Search from date (ISO 8601). Defaults to today minus 7 days |
| to   | Date | Search to date (ISO 8601). Defaults to today - 1 days       |

{% tabs %}
{% tab title="200: OK Everything worked as expected" %}
{% code lineNumbers="true" %}

```json
{
    "data": [
        {
            "date": "2023-04-01",
            "visits": 1606,
            "disparities": 907,
            "conversion": 57.0
        },
        {
            "date": "2023-04-02",
            "visits": 1823,
            "disparities": 191,
            "conversion": 11.0
        },
        {
            "date": "2023-04-03",
            "visits": 1685,
            "disparities": 432,
            "conversion": 26.0
        },
        {
            "date": "2023-04-04",
            "visits": 1336,
            "disparities": 309,
            "conversion": 24.0
        }
    ],
    "summary": {
        "visits": 6450.0,
        "disparities": 1839.0,
        "conversion": 29.0
    }
}
```

{% endcode %}
{% endtab %}

{% tab title="400: Bad Request Period is more than 31 days or invalid (i.e. to date is earlier than from date)" %}

```json
{
    "timestamp": "27-04-2023 08:00:13",
    "message": "Data provided is invalid"
}
```

{% endtab %}

{% tab title="401: Unauthorized No valid API key provided or not authorised to access the provided property code" %}

{% endtab %}
{% endtabs %}

## Example

{% tabs %}
{% tab title="curl" %}

<pre><code><strong>curl 'https://api.rateparity.com/v1/insights/paritytimeline/LAURA?from=2023-03-01&#x26;to=2023-03-03' \
</strong><strong>--header 'Authorization: Bearer YOUR_API_KEY'
</strong></code></pre>

{% code lineNumbers="true" %}

```json
{
    "data": [
        {
            "date": "2023-03-01",
            "visits": 474,
            "disparities": 250,
            "conversion": 53.0
        },
        {
            "date": "2023-03-02",
            "visits": 766,
            "disparities": 239,
            "conversion": 32.0
        },
        {
            "date": "2023-03-03",
            "visits": 820,
            "disparities": 360,
            "conversion": 44.0
        }
    ],
    "summary": {
        "visits": 2060.0,
        "disparities": 849.0,
        "conversion": 42.0
    }
}
```

{% endcode %}
{% endtab %}
{% endtabs %}


