OpenTravel API
The OpenTravel API, also known as OTA API, allows pushing rates, availability and price information to the system. The OpenTravel API of the LODGEA system was designed for Hotel and Vacation Rental channel management systems. It is compatible with all major implementations by channel management software in the market. If you are the vendor of a channel management or property management software and already connect to OTAs using OpenTravel, then it's highly likely that our implementation is already compatible with yours. If you are a channel management software vendor, wish to connect and be listed in the connectivity section of LODGEA, please contact the partner management team through partner@lodgea.com and we are happy to discuss a cooperation.
Introduction
The OTA API uses SOAP and provides different ways of authentication and distributing rates as well as bookings. Each LODGEA customer, described as a tenant, has its own API endpoint. Each tenant environment can configure OpenTravel.org API credentials with its endpoint. There is no certification process required and it is up to the tenant or customer and its suppliers to ensure a functional and tested connection.
Steps to update rates and availability
- Retrieve rooms and rates with
OTA_HotelRatePlanRQ
orOTA_HotelAvailRQ
- Update availability and rates with
OTA_HotelAvailNotifRQ
and/orOTA_HotelRateAmountNotifRQ
- Retrieve bookings with
OTA_ReadRQ
or push the bookings withOTA_HotelResNotifRQ
Pushing vs. pulling bookings
There are two ways of receiving reservations. You can use OTA_ReadRQ
(Pull) to periodically pull the reservations from the system. This is especially helpful for source systems that are not permanently connected to the Internet backbone. With OTA_HotelResNotifRQ
(Push) bookings are pushed immediately to the remote system which can result in a higher load and requires the remote system to be permanently available and connected to the Internet backbone. Although the push of bookings is decoupled from the actual booking process, it is however immediately executed. This means that a high number of bookings will also result in a high number of connections to your channel manager. If you are unsure of whether you can cope with the amount of transactions being pushed, consider using the Pull-method instead.
Endpoints
LODGEA provides different endpoints per tenant. The format of the endpoint URL is the following based on the tenant identification or code of the customer. Each of LODGEA's customers therefore has its own endpoint that content can be pushed to.
https://tenant-system-code.opentravel.connect.lodgea.com
Finding your tenant system code: The tenant-system-code is the identification shown on the top right of Management Console when logged in. A tenant with the tenant code eu-test
for example, is available under the endpoint eu-test.opentravel.connect.lodgea.com
. The connectivity configuration in the Management Console provides information about the endpoint URL. If you want to connect a channel manager to a single endpoint URL and serve different tenants, you can use the global endpoint with the $-prefix for usernames and hotel codes.
https://opentravel.connect.lodgea.com
Formatting the username and hotel codes: A username my-hotel-user will become tenant-system-code$my-hotel-user and the hotel codes will also be served with the $-prefix. This means that a hotel code my-hotel will become tenant-system-code$my-hotel.
Configuration
Credentials can be created within the connectivity configuration section of the Management Console. The authorised hotels need to be mapped and the property id of each mapped property will be the hotelCode
to be used in the OTA API requests. Please see the SOAP Authentication section for more information about the other configuration options under Reservation-Push
as well as the supported request types and SOAP versions. The OpenTravel configuration is generic and should support any channel management implementation in the market. If you have completed your integration and would like to get your channel manager listed in the connectivity section, contact our partner management team.
Authentication
The authentication credentials need to be part of the SOAP envelope provided with the HTTP POST request to the API endpoint. The following different SOAP envelope tags are supported and automatically detected by the API. Any combination of Envelope-Versions or Tags with any combination of authentication profiles or formats is supported. The system will automatically detect the corresponding format and accept the credentials. Which authentication format to use solely depends on your implementation. We recommend the WS-Security UsernameToken Profile as it is the most common formats used for current OTA implementations. There are no functional differences for the different protocol forms.
The mode soap:Envelope uses the prefix soap:Envelope
in the tags of the SOAP envelope.
<?xml version="1.0"?>
<soap:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
...
</soap:Header>
<soap:Body>
...
</soap:Body>
</soap:Envelope>
The mode SOAP-ENV:Envelope uses the prefix SOAP-ENV:Envelope
in the tags of the SOAP envelope.
<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
...
</SOAP-ENV:Header>
<SOAP-ENV:Body xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
...
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
The mode soapenv:Envelope uses the prefix soapenv:Envelope
in the tags of the SOAP envelope.
<?xml version="1.0"?>
<soapenv:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
...
</soapenv:Header>
<soapenv:Body>
...
</soapenv:Body>
</soapenv:Envelope>
The mode XML only does not use a SOAP envelope at all only directly posts the XML message to the endpoint. If you post the XML requests from the OpenTravel protocol directly to the endpoint, you need to provide the credentials inside a RequestorID
-tag instead of the SOAP header.
<?xml version="1.0"?>
...
WS-Security UsernameToken Profile (recommended)
The WS-Security UserNameToken Profile provides the username and password in an wsse:Security
-tag inside the SOAP header.
<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:mustUnderstand="1">
<wsse:UsernameToken>
<wsse:Username>MyUserName</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">MyPassword</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</SOAP-ENV:Header>
<SOAP-ENV:Body xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
...
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
AccessHeader-Tag in the SOAP header
An AccessHeader
-tag with a UserName and Password tag will be used inside the SOAP header to provide the username and the password as configured. You can use this method, but it is recommended to use the WS-Security UsernameToken Profile instead for compatibility reasons.
<?xml version="1.0"?>
<soap:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<AccessHeader>
<UserName>MyUserName</UserName>
<Password>MyPassword</Password>
</AccessHeader>
</soap:Header>
<soap:Body>
...
</soap:Body>
</soap:Envelope>
XML-only without a SOAP-envelope
If you want to push the XML requests directly without wrapping them in a SOAP-envelope, you can do so by putting the authentication credentials inside a POS
and Source
XML node directly within the OpenTravel message.
<?xml version="1.0"?>
<OTA_PingRQ xmlns="http://www.opentravel.org/OTA/2003/05"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.opentravel.org/OTA/2003/05 OTA_PingRQ.xsd"
TimeStamp="2003-03-17T09:30:47-05:00">
<POS>
<Source>
<RequestorID ID="MyUserName" MessagePassword="MyPassword"></RequestorID>
</Source>
</POS>
<EchoData>Ping Pong</EchoData>
</OTA_PingRQ>
Messages
The OpenTravel API receives messages from you and sends you the corresponding response. There are a number of OpenTravel APIs defined by OpenTravel for a variety of use cases. The LODGEA system however only supports the OpenTravel API for compatibility with channel management systems. That's why the system only supports SOAP and XML messages and does not provide any messages for availability or booking requests. The OpenTravel API was designed purely for Hotels and Vacation Rentals to synchronize their rates and availabilities with the system.
OTA_HotelRatePlanRQ
The rate plan request within the OTA_HotelRatePlanRQ
method requests the rooms and rate plan combinations from the system for the hotel requested.
<?xml version="1.0"?>
<soap:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<AccessHeader>
<UserName>MyUserName</UserName>
<Password>MyPassword</Password>
</AccessHeader>
</soap:Header>
<soap:Body>
<OTA_HotelRatePlanRQ Version="1"
xmlns="http://www.opentravel.org/OTA/2003/05">
<POS>
<Source>
<RequestorID ID="myhotelcode" />
</Source>
</POS>
</OTA_HotelRatePlanRQ>
</soap:Body>
</soap:Envelope>
The result will include all available rooms and their rate plans to which this user has access on the hotel to which the hotel code belongs. The ID or hotelCode
needs to match the code of the property mapped, known as the property id.
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<OTA_HotelRatePlanRS EchoToken="" Version="1"
TimeStamp="2021-09-29T17:08:57.252Z"
PrimaryLangID="en-US"
xmlns="http://www.opentravel.org/OTA/2003/05">
<RatePlans HotelCode="myhotelcode">
<RatePlan RatePlanType="Rack" RatePlanCode="suitestandard">
<Rates>
<Rate MinGuestApplicable="1"
MaxGuestApplicable="2"
InvCode="Suite"
InvTypeCode="suite" />
</Rates>
<Description Name="Short Description">
<Text Language="en">Suite Standard</Text>
</Description>
</RatePlan>
</RatePlans>
</OTA_HotelRatePlanRS>
</soap:Body>
</soap:Envelope>
The output contains the rate plan with the rates and the description including the following fields.
Field | Description |
---|---|
HotelCode | Unique id of the property |
RatePlanCode | Code of the rate plan as configured |
MinGuestApplicable | The minimum occupancy for the room/unit |
MaxGuestApplicable | The maximum occupancy for the room/unit |
InvCode | Name of the room/unit |
InvTypeCode | Unique id of the room/unit |
Description Name | Is always Short Description |
Text | The name of the rate plan |
OTA_HotelAvailRQ
This request is an alternative to the OTA_HotelRatePlanRQ
request. Depending on your use case or how you connect your channel manager to the corresponding channels, the connectivity provides compatbility for most combinations in the market. There are no advantages or disadvantages of the different combinations of requests. The hotel availability request allows the retrieval of the rate plan and room combinations for the hotel for which the hotel code was provided in the request body. The property for which the property id was provided as the hotel code needs to be mapped to this user.
<?xml version="1.0"?>
<soap:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<AccessHeader>
<UserName>MyUserName</UserName>
<Password>MyPassword</Password>
</AccessHeader>
</soap:Header>
<soap:Body>
<OTA_HotelAvailRQ xmlns="http://www.opentravel.org/OTA/2003/05"
AvailRatesOnly="true"
EchoToken="66899191-67f6-4092-b82e-0321ebf75601"
TimeStamp="2021-09-16T06:58:10+00:00" Version="1.0">
<AvailRequestSegments>
<AvailRequestSegment AvailReqType="Room">
<HotelSearchCriteria>
<Criterion>
<HotelRef HotelCode="my-hotel-code" />
</Criterion>
</HotelSearchCriteria>
</AvailRequestSegment>
</AvailRequestSegments>
</OTA_HotelAvailRQ>
</soap:Body>
</soap:Envelope>
The response to the request will include all rooms and their associated rates with their codes and names.
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<OTA_HotelAvailRS EchoToken="66899191-67f6-4092-b82e-0321ebf75601"
Version="1.0" TimeStamp="2021-09-29T18:43:57.771Z"
PrimaryLangID="en-US"
xmlns="http://www.opentravel.org/OTA/2003/05">
<Success />
<RoomStays>
<RoomStay>
<RoomTypes>
<RoomType RoomTypeCode="doppelzimmer">
<RoomDescription Name="Doppelzimmer" />
</RoomType>
</RoomTypes>
<RatePlans>
<RatePlan RatePlanCode="nonref-double">
<RatePlanDescription Name="Nonref Double" />
</RatePlan>
</RatePlans>
</RoomStay>
<RoomStay>
<RoomTypes>
<RoomType RoomTypeCode="doppelzimmer">
<RoomDescription Name="Doppelzimmer" />
</RoomType>
</RoomTypes>
<RatePlans>
<RatePlan RatePlanCode="standard-double">
<RatePlanDescription Name="Standard Double" />
</RatePlan>
</RatePlans>
</RoomStay>
<RoomStay>
<RoomTypes>
<RoomType RoomTypeCode="einzelzimmer">
<RoomDescription Name="Einzelzimmer" />
</RoomType>
</RoomTypes>
<RatePlans>
<RatePlan RatePlanCode="standard-single">
<RatePlanDescription Name="Standard Single" />
</RatePlan>
</RatePlans>
</RoomStay>
<RoomStay>
<RoomTypes>
<RoomType RoomTypeCode="suite">
<RoomDescription Name="Suite" />
</RoomType>
</RoomTypes>
<RatePlans>
<RatePlan RatePlanCode="standard-2568">
<RatePlanDescription Name="Standard 2568" />
</RatePlan>
</RatePlans>
</RoomStay>
</RoomStays>
</OTA_HotelAvailRS>
</soap:Body>
</soap:Envelope>
The output contains the rate plan with the rates and the description including the following fields.
Field | Description |
---|---|
RoomTypeCode | Code of the room/unit |
RoomDescription Name | Name of the room/unit |
RatePlanCode | Code of the rate plan |
RatePlanDescription | Name of the rate plan |
OTA_HotelAvailNotifRQ
The hotel availaiblity notification request updates the property availability for the property for which the hotel code was provided in the request. The OTA_HotelAvailNotifRQ
can become very large, depending on how many updates you push. The system currently has a payload restriction of 6 MB (Megabytes). It is recommended to keep the requests small, but execute multiple requests. You should ideally push updates as soon as they happen in your system or as soon as you receive them.
<?xml version="1.0"?>
<soap:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<AccessHeader>
<UserName>MyUserName</UserName>
<Password>MyPassword</Password>
</AccessHeader>
</soap:Header>
<soap:Body>
<OTA_HotelAvailNotifRQ EchoToken="wuemxniopt"
Version="1" MessageContentCode="3"
xmlns="http://www.opentravel.org/OTA/2003/05/beta">
<AvailStatusMessages HotelCode="my-hotel-code">
<AvailStatusMessage>
<StatusApplicationControl
Start="2021-09-17" End="2022-10-19"
RatePlanCode="standard-2568" InvTypeCode="suite" />
<LengthsOfStay>
<LengthOfStay Time="1" MinMaxMessageType="SetMinLOS" />
<LengthOfStay Time="0" MinMaxMessageType="SetMaxLOS" />
</LengthsOfStay>
<RestrictionStatus Restriction="Master" Status="Open" />
</AvailStatusMessage>
</AvailStatusMessages>
</OTA_HotelAvailNotifRQ>
</soap:Body>
</soap:Envelope>
The request can contain multiple AvailStatusMessage
nodes in the AvailStatusMessages
node. Each AvailStatusMessage
node can contain the nodes specified below with their child nodes and attributes. Other than the payload restriction, there is no limitation on how many nodes an AvailStatusMessage
can contain.
StatusApplicationControl
The StatusApplicationControl
element defines the rate, room/unit and timespan of this inventory application. The fields of the StatusApplicationControl
element are as follows.
Field | Description | Example |
---|---|---|
Start | Start date of the status application | 2022-05-05 |
End | End date of the status application | 2022-05-18 |
RatePlanCode | Code of the rate plan this application is for | suite-standard |
InvTypeCode | Code of the room/unit this application is for | suite |
LengthOfStay
The LengthOfStay
element defines the minimum and maximum length of stay for this application with the following fields.
Field | Description | Example |
---|---|---|
Time | Length of stay as number | 1 |
MinMaxMessageType | Type of length of stay (min or max) | SetMinLOS or SetMaxLOS |
RestrictionStatus
The RestrictionStatus
element defines the availability of the room and rate combination for the date application with the following fields.
Field | Description | Example |
---|---|---|
Restriction | Type of restriction to apply | Master , Departure or Arrival |
Status | Type of length of stay (min or max) | Open or Close |
The response is simple and will only contain a <Success />
node when the operation was successfully completed by the system.
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<OTA_HotelAvailNotifRS EchoToken="wuemxniopt"
Version="1" TimeStamp="2021-09-29T18:57:39.207Z"
PrimaryLangID="en-US"
xmlns="http://www.opentravel.org/OTA/2003/05/beta">
<Success />
</OTA_HotelAvailNotifRS>
</soap:Body>
</soap:Envelope>
OTA_HotelRateAmountNotifRQ
The rate amount notification request allows pushing the prices or rate amounts for the specified property, rate and room to the system. The BaseByGuestAmt
-node can also specify rates per occupancy. Maximum payload restriction of 6 MB (Megabytes): The OTA_HotelRateAmountNotifRQ
can become very large, depending on how many updates you push. The system currently has a payload restriction of 6 MB (Megabytes). It is recommended to keep the requests small, but execute multiple requests. You should ideally push updates as soon as they happen in your system or as soon as you receive them.
<?xml version="1.0"?>
<soap:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<AccessHeader>
<UserName>MyUserName</UserName>
<Password>MyPassword</Password>
</AccessHeader>
</soap:Header>
<soap:Body>
<OTA_HotelRateAmountNotifRQ EchoToken="jbfljenvnl"
Version="1" xmlns="http://www.opentravel.org/OTA/2003/05">
<POS>
<Source>
<RequestorID ID="my-hotel-code" />
</Source>
</POS>
<RateAmountMessages HotelCode="my-hotel-code">
<RateAmountMessage LocatorID="1">
<StatusApplicationControl
RatePlanCode="standard-2568"
InvTypeCode="suite" />
<Rates>
<Rate Start="2021-09-03" End="2021-12-31"
Mon="true" Tue="true" Weds="true"
Thur="true" Fri="true" Sat="true"
Sun="true" CurrencyCode="EUR">
<BaseByGuestAmts>
<BaseByGuestAmt AmountAfterTax="199"
NumberOfGuests="1"
AgeQualifyingCode="10" />
</BaseByGuestAmts>
</Rate>
</Rates>
</RateAmountMessage>
</RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
</soap:Body>
</soap:Envelope>
The request primarily consists of the StatusApplicationControl
-element, the Rate
-element and the BaseByGuestAmt
-element to define and apply the rate amount or price. Each RateAmountMessage
node can contain the nodes specified below with their child nodes and attributes. Other than the payload restriction, there is no limitation on how many nodes a RateAmountMessage
can contain.
Rate
The rate
element defines the date, the weekdays and the currency code of the rate.
Field | Description | Example |
---|---|---|
Start | Start date of the rate application | 2022-05-05 |
End | End date of the rate application | 2022-05-18 |
Mon | Applies on Monday | true or false |
Tue | Applies on Tuesday | true or false |
Weds | Applies on Wednesday | true or false |
Thur | Applies on Thursday | true or false |
Fri | Applies on Friday | true or false |
Sat | Applies on Saturday | true or false |
Sun | Applies on Sunday | true or false |
CurrencyCode | ISO currency code of the currency | EUR , USD , CHF , GBP etc. |
BaseByGuestAmt
The base by guest amount or BaseByGuestAmt
-element defines the amount of the daily rate for the defined occupancy.
Field | Description | Example |
---|---|---|
AmountAfterTax | Float/double value specifying the amount | 199.99 |
NumberOfGuests | Occupancy for which this amount is valid | 1 , 2 , 3 etc. |
AgeQualifyingCode | Currently only adults are supported (Code 10 ) | 10 |
The rate amount notification response is simple as it will only include a <Success />
node when the operation succeeded in the system.
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<OTA_HotelRateAmountNotifRS EchoToken="jbfljenvnl"
Version="1" TimeStamp="2021-09-29T19:38:34.429Z"
PrimaryLangID="en-US"
xmlns="http://www.opentravel.org/OTA/2003/05">
<Success />
</OTA_HotelRateAmountNotifRS>
</soap:Body>
</soap:Envelope>
OTA_ReadRQ
The read request allows to periodically pull bookings or reservations from the system. Once a reservation is retrieved, it will no longer be returned in the future. The only request parameter required for the read request is the property id known as the hotel code.
<?xml version="1.0"?>
<soap:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<AccessHeader>
<UserName>MyUserName</UserName>
<Password>MyPassword</Password>
</AccessHeader>
</soap:Header>
<soap:Body>
<OTA_ReadRQ Version="0"
xmlns="http://www.opentravel.org/OTA/2003/05/beta">
<ReadRequests>
<HotelReadRequest HotelCode="my-hotel-code" />
</ReadRequests>
</OTA_ReadRQ>
</soap:Body>
</soap:Envelope>
The reservation retrieval response OTA_ResRetrieveRS
will always contain a ReservationsList
XML node. If there aren't any new reservations that node will not have any child nodes other than a <Succes />
node. If there are new reservations, the node will contain a single or multiple HotelReservation
XML nodes. There are different implementations, codes and nodes depending on which channel manager or system is connected. This documentation describes the default codes and format for a standard OpenTravel.org connectivity. If your system uses different formats, contact the partner support to walk through the different options.
<HotelReservation CreateDateTime="2021-09-15T07:06:41.000Z"
LastModifyDateTime="2021-09-15T07:18:12.213Z" ResStatus="Commit">
<UniqueID Type="14" ID="77o9tqQ6BgsHgmO0mRF423" />
<ResGlobalInfo>
<HotelReservationIDs>
<HotelReservationID ResID_Type="CRS"
ResID_Value="77o9tqQ6BgsHgmO0mRF423" />
</HotelReservationIDs>
<BasicPropertyInfo HotelCode="my-hotel-code" />
<Total AmountAfterTax="1716" CurrencyCode="EUR" />
<Guarantee GuaranteeCode="CC">
<GuaranteesAccepted>
<GuaranteeAccepted GuaranteeID="CC">
<PaymentCard CardCode="VI"
CardNumber="4444333322221111"
SeriesCode="999" ExpireDate="0224">
<CardNumber>
<PlainText>
<![CDATA[4444333322221111]]>
</PlainText>
</CardNumber>
<CardHolderName>
<![CDATA[Jan Kammerath]]>
</CardHolderName>
</PaymentCard>
</GuaranteeAccepted>
</GuaranteesAccepted>
</Guarantee>
<Profiles>
<ProfileInfo>
<Profile ProfileType="1">
<Customer>
<PersonName>
<GivenName>
<![CDATA[Jan]]>
</GivenName>
<Surname>
<![CDATA[Kammerath]]>
</Surname>
</PersonName>
<Telephone PhoneNumber="004989244199410"
FormattedInd="false" />
<Email>support@lodgea.com</Email>
<Address>
<AddressLine>
<![CDATA[Landwehrstr. 61]]>
</AddressLine>
<CityName>
<![CDATA[Munich]]>
</CityName>
<PostalCode>
<![CDATA[80336]]>
</PostalCode>
<CountryName Code="DE">DE</CountryName>
</Address>
</Customer>
</Profile>
</ProfileInfo>
</Profiles>
</ResGlobalInfo>
<RoomStays>
<RoomStay>
<RoomRates>
<RoomRate RoomTypeCode="suite"
NumberOfUnits="1"
RatePlanCode="standard-2568">
<Rates>
<Rate EffectiveDate="2022-02-16"
ExpireDate="2022-02-20" RateTimeUnit="Day"
UnitMultiplier="1">
<Base AmountAfterTax="429"
CurrencyCode="EUR" />
</Rate>
</Rates>
</RoomRate>
</RoomRates>
<GuestCounts IsPerRoom="true">
<GuestCount AgeQualifyingCode="10" Count="2" />
</GuestCounts>
<ResGuestRPHs>
<ResGuestRPH RPH="0" />
<ResGuestRPH RPH="1" />
</ResGuestRPHs>
<Guarantee GuaranteeCode="CC">
<GuaranteesAccepted>
<GuaranteeAccepted GuaranteeID="CC">
<PaymentCard CardCode="VI"
CardNumber="4444333322221111"
SeriesCode="999" ExpireDate="0224">
<CardNumber>
<PlainText>
<![CDATA[4444333322221111]]>
</PlainText>
</CardNumber>
<CardHolderName>
<![CDATA[Jan Kammerath]]>
</CardHolderName>
</PaymentCard>
</GuaranteeAccepted>
</GuaranteesAccepted>
</Guarantee>
<Total AmountAfterTax="1716" CurrencyCode="EUR" />
<TimeSpan Start="2022-02-16" End="2022-02-20" />
<BasicPropertyInfo HotelCode="my-hotel-code" />
</RoomStay>
</RoomStays>
<ResGuests>
<ResGuest PrimaryIndicator="true">
<Profiles>
<ProfileInfo>
<Profile ProfileType="1">
<Customer>
<PersonName>
<GivenName>
<![CDATA[Jan]]>
</GivenName>
<Surname>
<![CDATA[Kammerath]]>
</Surname>
</PersonName>
<Telephone PhoneNumber="0049089244199410"
FormattedInd="false" />
<Email>support@lodgea.com</Email>
<Address>
<AddressLine>
<![CDATA[Landwehrstr. 61]]>
</AddressLine>
<CityName>
<![CDATA[Munich]]>
</CityName>
<PostalCode>
<![CDATA[80336]]>
</PostalCode>
<CountryName Code="DE">DE</CountryName>
</Address>
</Customer>
</Profile>
</ProfileInfo>
</Profiles>
</ResGuest>
<ResGuest ResGuestRPH="0" PrimaryIndicator="false">
<Profiles>
<ProfileInfo>
<Profile ProfileType="1">
<Customer>
<PersonName>
<GivenName>
<![CDATA[Jan]]>
</GivenName>
<Surname>
<![CDATA[Kammerath]]>
</Surname>
</PersonName>
</Customer>
</Profile>
</ProfileInfo>
</Profiles>
</ResGuest>
<ResGuest ResGuestRPH="1" PrimaryIndicator="false">
<Profiles>
<ProfileInfo>
<Profile ProfileType="1">
<Customer>
<PersonName>
<GivenName>
<![CDATA[Nicole]]>
</GivenName>
<Surname>
<![CDATA[Kammerath]]>
</Surname>
</PersonName>
</Customer>
</Profile>
</ProfileInfo>
</Profiles>
</ResGuest>
</ResGuests>
</HotelReservation>
The above example shows a complete example of a reservation. The remainder of the information should be self-explanatory and further details can be found in the official OpenTravel.org documentation and specification. The ResGuestRPH
attribute links the guest profiles to the RoomStay
elements and thus linking them to the room the guests are allocated to. The payment and guest information will only be present if the property was configured to collect these information. If guest information are not collected, the guest first and last name will be set to TBA. Duplication of contents in the HotelReservation node are to be compatible with the various different implementations in channel managers and property management systems.
OTA_NotifReportRQ
The reservation notification report request allows updating a previously retrieved reservation with the record locator of the external system that collected the reservation or booking. OTA_NotifReportRQ
is entirely optional. You can provide your external record locator, but it is not necessary to do so if you do not indent to perform any further operations with it.
<?xml version="1.0"?>
<soap:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<AccessHeader>
<UserName>MyUserName</UserName>
<Password>MyPassword</Password>
</AccessHeader>
</soap:Header>
<soap:Body>
<OTA_NotifReportRQ EchoToken="hulapalu"
TimeStamp="2021-09-03T14:17:28.1597969+02:00"
Version="1" xmlns="http://www.opentravel.org/OTA/2003/05">
<NotifDetails>
<HotelNotifReport>
<HotelReservations>
<HotelReservation>
<UniqueID Type="14"
ID="HVt81vPB8sM0Q9YudeHTQ6"
ID_Context="CrsConfirmNumber" />
<ResGlobalInfo>
<HotelReservationIDs>
<HotelReservationID
ResID_Type="10"
ResID_Value="40774706"
ResID_Source="PMS"
ResID_SourceContext="PmsConfirmNumber" />
<HotelReservationID
ResID_Type="10"
ResID_Value="HVt81vPB8sM0Q9YudeHTQ6"
ResID_Source="CRS"
ResID_SourceContext="CrsConfirmNumber" />
</HotelReservationIDs>
<BasicPropertyInfo HotelCode="my-hotel-code" />
</ResGlobalInfo>
</HotelReservation>
</HotelReservations>
</HotelNotifReport>
</NotifDetails>
<POS>
<Source>
<RequestorID ID="my-hotel-code" />
</Source>
</POS>
</OTA_NotifReportRQ>
</soap:Body>
</soap:Envelope>
The UniqueID element contains the CrsConfirmNumber
which is the interal reservation number of the booking blockchain and the same as the HotelReservationID
node with the attribute ResID_SourceContext
set to CrsConfirmNumber
. The reservation record locator or id value provided in the ResID_Value
field of the HotelReservationID
with the attribute value PmsConfirmNumber
is the external system's record locator or reservation id (Your channel manager or PMS). The latter will be stored in the existing booking as a reference to the external system. The response of the OTA_NotifReportRQ
request will only contain a <Success />
node when the operation to attach the external record locator was successful.
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<OTA_NotifReportRS EchoToken="hulapalu" Version="1"
TimeStamp="2021-09-29T20:32:32.192Z" PrimaryLangID="en-US"
xmlns="http://www.opentravel.org/OTA/2003/05">
<Success />
</OTA_NotifReportRS>
</soap:Body>
</soap:Envelope>
OTA_HotelResNotifRQ
This request is pushing reservations to you. You can not send the OTA_HotelResNotifRQ
to the system, the system will send it to you once you configured the reservation push in the OpenTravel connection in the connectivity configuration. Reservations are already confirmed: The reservations that are pushed to you are already confirmed to the consumer. If you accept or do not accept the request, your system fails or is unreachable, the system will try to deliver reservation again at a later time. Once a reservation or booking is made in the system and the property is connected through the OpenTravel API, the reservation will be queued for delivery to the configured endpoint. The delivery will be done immediately after the reservation was confirmed to the consumer. The delivery of the reservation however will not block the reservation or booking process for the consumer.
<?xml version="1.0"?>
<soap:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<AccessHeader>
<UserName>MyUserName</UserName>
<Password>MyPassword</Password>
</AccessHeader>
</soap:Header>
<soap:Body>
<OTA_HotelResNotifRQ xmlns="http://www.opentravel.org/OTA/2003/05"
Version="1.0" EchoToken="hulapalu" ResStatus="Commit"
TimeStamp="2021-09-03T14:17:28.1597969+02:00">
<HotelReservations>
...
</HotelReservations>
</OTA_HotelResNotifRQ>
</soap:Body>
</soap:Envelope>
The HotelReservations
node will contain a single HotelReservation
node with the booking or reservation made in the format of a HotelReservation
element. The system expects the endpoint to return a SOAP message indicating the success or failure of the delivery of the reservation or booking record and the reservation record locator created.
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<OTA_HotelResNotifRS xmlns="http://www.opentravel.org/OTA/2003/05"
Version="1.0" TimeStamp="2021-01-01T09:30:47+02:00"
EchoToken="hulapalu">
<Success />
<HotelReservations>
<HotelReservation>
<UniqueID Type="14" ID="4711" />
<ResGlobalInfo>
<HotelReservationIDs>
<HotelReservationID
ResID_Type="14"
ResID_Value="4711" />
</HotelReservationIDs>
</ResGlobalInfo>
</HotelReservation>
</HotelReservations>
</OTA_HotelResNotifRS>
</soap:Body>
</soap:Envelope>