Skip to main content
The OTA_HotelResRQ (Hotel Reservation Request) is used to quote or commit a reservation. This message links rooms, guests, and ancillary services via RPH references within a single booking.
Already know the flow? Jump straight into testing the payloads below.

OTA_HotelResRQ API call

Skip & Hit the Playground.

Purpose

  • Quote or book room stays and associated services under one reservation.
  • Link rooms to specific guests and services using RPH.
  • Support multi-room bookings (up to 5 rooms).

Structure – Root Element

<OTA_HotelResRQ>
Key Attributes:
  • ResStatus
    • Quote validates availability and returns per-room totals, cancellation rules, and offers; no booking is created.
    • Commit performs the same calculations and commits the reservation; penalties may apply for later changes.
  • Version: e.g., 2008.1
  • PrimaryLangID: ISO 639 (e.g., EN)
  • xmlns: http://www.opentravel.org/OTA/2003/05

Structure – Core Elements

POS (Point of Sale)

Identifies the requesting party and contains credentials.
<POS>
  <Source>
    <RequestorID ID_Context="AxisData" Type="22" ID="TST1" Instance="PriceBreakdown"/>
  </Source>
  <Source>
    <RequestorID Type="88" ID="TST1" MessagePassword="TST1password?"/>
  </Source>
</POS>
Setting Instance = "PriceBreakdown ensures that the response section TPA_Extensions/RateDetails returns per-day RateComponents and per-guest totals; when applicable, EBPrepayment includes due date and amount.

HotelReservation

Container for one booking transaction. Include one or more <RoomStay> entries. Use <Services> (e.g., board codes) and <ResGuests> to provide guest details. Use <ResGlobalInfo> for booking-level references and comments.

RoomStay Element

Each <RoomStay> represents one room in the booking. Link guest and service RPHs here.
<RoomStay RPH="1">
  <RoomTypes>
    <RoomType RoomTypeCode="RMSD000000"/>
  </RoomTypes>
  <TimeSpan Start="2026-10-17" End="2026-10-24"/>
  <BasicPropertyInfo HotelCode="AMTSES08UI"/>
  <ResGuestRPHs>
    <ResGuestRPH RPH="1"/>
    <ResGuestRPH RPH="2"/>
  </ResGuestRPHs>
  <ServiceRPHs>
    <ServiceRPH RPH="1"/>
  </ServiceRPHs>
</RoomStay>
  • RoomTypeCode: send the contracted code (include contract/rateplan if applicable, e.g., RMSD000000;-SUP1-0P0A0). See RatePlans and Multicontracting
  • TimeSpan: check-in/-out at room level.
  • BasicPropertyInfo: send the contracted hotel code.
  • Link guests to rooms via RoomStay/ResGuestRPHs; the first adult is the room responsible.
  • Link non-room services (board/extras/transfers) using ServiceRPHs and pax-level ResGuestRPHs.
  • Up to 5 <RoomStay> items per booking.

Services

Use for board codes and other ancillary services. Reference them from <ServiceRPHs> inside each linked <RoomStay>. Board is sent via ServiceInventoryCode (e.g., RO, BB).
<Services>
  <Service ServiceInventoryCode="BB" ServiceRPH="1"/>
</Services>

ResGuest

Provide guest details per RPH. Adults, children, and infants are differentiated via AgeQualifyingCode. For Quote, pax profiles may be omitted; for Commit, include adult titles.
<ResGuest AgeQualifyingCode="10" ResGuestRPH="1">
  <Profiles>
    <ProfileInfo>
      <Profile>
        <Customer BirthDate="1996-09-04">
          <PersonName>
            <NamePrefix>Mr</NamePrefix>
            <GivenName>Bender</GivenName>
            <Surname>Bending</Surname>
          </PersonName>
        </Customer>
      </Profile>
    </ProfileInfo>
  </Profiles>
  <GuestCounts>
    <GuestCount Count="1" Age="27"/>
  </GuestCounts>
</ResGuest>
Rules:
  • Adults=10, Children=8, Infants=7.
  • Prices may change if switching between age and birthdate across flow; keep consistent.
  • Name and surname, mandatory.
  • NamePrefix (Mr., Mrs., etc.) is mandatory for all adult pax in a booking.
  • Age or true date of birth, mandatory for children and infants. Never both!
  • Contact info (Telephone and email), optional.
  • AgequalifyingCode, mandatory.
  • ResGuestRPH, mandatory.

ResGlobalInfo

Comments Only Name="Applicant Notice" comments are processed. Up to 10 comments; max 250 characters each.
<ResGlobalInfo>
  <Comments>
    <Comment Name="Applicant Notice">
      <Text>late arrival - flight lands at 22:55 local time</Text>
    </Comment>
  </Comments>
</ResGlobalInfo>
HotelReservationIDs Provide your booking references. Use one parent reference and optional child/item references linked by Item_RPH. This reference must be printed on the voucher and is used to avoid duplicates.
<HotelReservationIDs>
  <HotelReservationID ResID_SourceContext="Client" ResID_Type="36" ResID_Value="test_xxx"/>
  <HotelReservationID Item_RPH="1" ResID_SourceContext="Client" ResID_Type="37" ResID_Value="test_xxx_ac1"/>
</HotelReservationIDs>
See Master and Child References for more information.

TPA_Extensions

Send optional extras to be added to the quote/booking. Repeat per pax if required, and scope them by date range.
<TPA_Extensions>
  <Extras>
    <Extra Code="106" Start="2026-07-17" End="2026-07-24" ResGuestRPH="1" Quantity="1"/>
  </Extras>
</TPA_Extensions>
Attributes: Code (contract code), Quantity, Start, End, ResGuestRPH. Applicability and pricing are returned in the response; booked extras will appear with IncludedInRate="true".

Additional Features

Expected Booking Value

You can include an expected booking value in each booking request to help ensure price consistency between search, quote, and notifications. This value is stored in the booking details and can be used to detect discrepancies or contract issues at the time of booking.
  • If the expected value is lower than the booking value, partners and destinations can investigate and avoid publishing rates that are not bookable.
  • If the expected value is higher than the booking value, it helps both parties understand complex contract conditions or mismatches in distribution.
There is no additional functionality beyond storing the expected value for transparency and review.

Complete Examples


<OTA_HotelResRQ xmlns="http://www.opentravel.org/OTA/2003/05" ResStatus="Quote" Version="2008.1" PrimaryLangID="EN">
  <POS>
    <Source>
      <RequestorID ID_Context="AxisData" Type="22" ID="TST1" Instance="PriceBreakdown"/>
    </Source>
    <Source>
      <RequestorID Type="88" ID="TST1" MessagePassword="TST1password?"/>
    </Source>
  </POS>
  <HotelReservations>
    <HotelReservation>
      <RoomStays>
        <RoomStay RPH="1">
          <RoomTypes>
            <RoomType RoomTypeCode="RMSD000000"/>
          </RoomTypes>
          <TimeSpan End="2026-07-24" Start="2026-07-17"/>
          <BasicPropertyInfo HotelCode="AMTSES08UI"/>
          <ResGuestRPHs>
            <ResGuestRPH RPH="1"/>
            <ResGuestRPH RPH="2"/>
            <ResGuestRPH RPH="3"/>
          </ResGuestRPHs>
          <ServiceRPHs>
            <ServiceRPH RPH="1"/>
          </ServiceRPHs>
        </RoomStay>
      </RoomStays>
      <Services>
        <Service ServiceInventoryCode="BB" ServiceRPH="1"/>
      </Services>
      <ResGuests>
        <ResGuest AgeQualifyingCode="10" ResGuestRPH="1">
          <Profiles>
            <ProfileInfo>
              <Profile>
                <Customer BirthDate="1996-09-04">
                  <PersonName>
                    <NamePrefix>Mr</NamePrefix>
                    <GivenName>Bender</GivenName>
                    <Surname>Bending</Surname>
                  </PersonName>
                </Customer>
              </Profile>
            </ProfileInfo>
          </Profiles>
          <GuestCounts>
            <GuestCount Count="1" Age="27"/>
          </GuestCounts>
        </ResGuest>
        <ResGuest AgeQualifyingCode="10" ResGuestRPH="2">
          <Profiles>
            <ProfileInfo>
              <Profile>
                <Customer BirthDate="1996-09-05">
                  <PersonName>
                    <NamePrefix>Mrs</NamePrefix>
                    <GivenName>Angelina</GivenName>
                    <Surname>Bending</Surname>
                  </PersonName>
                </Customer>
              </Profile>
            </ProfileInfo>
          </Profiles>
          <GuestCounts>
            <GuestCount Count="1" Age="27"/>
          </GuestCounts>
        </ResGuest>
        <ResGuest AgeQualifyingCode="8" ResGuestRPH="3">
          <Profiles>
            <ProfileInfo>
              <Profile>
                <Customer BirthDate="2018-09-06">
                  <PersonName>
                    <NamePrefix>Jr</NamePrefix>
                    <GivenName>Ben</GivenName>
                    <Surname>Bending</Surname>
                  </PersonName>
                </Customer>
              </Profile>
            </ProfileInfo>
          </Profiles>
          <GuestCounts>
            <GuestCount Count="1" Age="6"/>
          </GuestCounts>
        </ResGuest>
      </ResGuests>
      <ResGlobalInfo>
        <Comments>
          <Comment Name="Applicant Notice">
            <Text>late arrival - flight lands at 22:55 local time</Text>
          </Comment>
        </Comments>
        <HotelReservationIDs>
          <HotelReservationID ResID_SourceContext="Client" ResID_Type="36" ResID_Value="test_xxx"/>
          <HotelReservationID Item_RPH="1" ResID_SourceContext="Client" ResID_Type="37" ResID_Value="test_xxx_ac1"/>
        </HotelReservationIDs>
      </ResGlobalInfo>
    </HotelReservation>
  </HotelReservations>
</OTA_HotelResRQ>

Best Practices

  1. Quote (ResStatus="Quote") before Commit to re-validate price/availability.
  2. Keep guest details consistent across all services (same order and age/birthdate concept).
  3. Provide partner references in HotelReservationIDs to prevent duplicates and facilitate cancellation flows.
  4. Use ISO dates (YYYY-MM-DD) and link everything with RPH.
  5. When multicontracting applies, send the full room+contract+rateplan code as RoomTypeCode.
  6. Be aware that timestamps should include timezone information
  7. Implement proper error handling for the response messages. Error Scenarios.

Playground

OTA_HotelResRQ API call

Try the Booking API playground with Quote first, then Commit.
Use your real ResID_Value as partner reference. For test extras, add them under TPA_Extensions/Extras.