Developer Portal
API & SDKs Marketing OpenTravel
Log In to the Console
Table of contents

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

  1. Retrieve rooms and rates with OTA_HotelRatePlanRQ or OTA_HotelAvailRQ
  2. Update availability and rates with OTA_HotelAvailNotifRQ and/or OTA_HotelRateAmountNotifRQ
  3. Retrieve bookings with OTA_ReadRQ or push the bookings with OTA_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.

FieldDescription
HotelCodeUnique id of the property
RatePlanCodeCode of the rate plan as configured
MinGuestApplicableThe minimum occupancy for the room/unit
MaxGuestApplicableThe maximum occupancy for the room/unit
InvCodeName of the room/unit
InvTypeCodeUnique id of the room/unit
Description NameIs always Short Description
TextThe 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.

FieldDescription
RoomTypeCodeCode of the room/unit
RoomDescription NameName of the room/unit
RatePlanCodeCode of the rate plan
RatePlanDescriptionName 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.

FieldDescriptionExample
StartStart date of the status application2022-05-05
EndEnd date of the status application2022-05-18
RatePlanCodeCode of the rate plan this application is forsuite-standard
InvTypeCodeCode of the room/unit this application is forsuite

LengthOfStay

The LengthOfStay element defines the minimum and maximum length of stay for this application with the following fields.

FieldDescriptionExample
TimeLength of stay as number1
MinMaxMessageTypeType 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.

FieldDescriptionExample
RestrictionType of restriction to applyMaster, Departure or Arrival
StatusType 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.

FieldDescriptionExample
StartStart date of the rate application2022-05-05
EndEnd date of the rate application2022-05-18
MonApplies on Mondaytrue or false
TueApplies on Tuesdaytrue or false
WedsApplies on Wednesdaytrue or false
ThurApplies on Thursdaytrue or false
FriApplies on Fridaytrue or false
SatApplies on Saturdaytrue or false
SunApplies on Sundaytrue or false
CurrencyCodeISO currency code of the currencyEUR, USD, CHF, GBP etc.

BaseByGuestAmt

The base by guest amount or BaseByGuestAmt-element defines the amount of the daily rate for the defined occupancy.

FieldDescriptionExample
AmountAfterTaxFloat/double value specifying the amount199.99
NumberOfGuestsOccupancy for which this amount is valid1, 2, 3 etc.
AgeQualifyingCodeCurrently 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>