Skip to main content

EnhancedAirBookRQ

EnhancedAirBookRQ

The EnhancedAirBookRQ API allows client applications to book and price flight segments with a single call. You can also request air tax information, a feature useful for those who operate their own negotiated or private fare databases. Most of the time, all that is required in regard to pricing is the relevant tax-related information.

EnhancedAirBookRQ orchestrates the following operations:

  1. IgnoreTransactionLLSRQ (I)
  2. OTA_AirTaxRQ
  3. OTA_AirBookLLSRQ (JA)
  4. TravelItineraryReadRQ
  5. OTA_AirPriceLLSRQ (WP)
  6. TravelItineraryReadRQ
  7. IgnoreTransactionLLSRQ (I)

EnhancedAirBookRQ allows a client application to:

  • Perform an ignore transaction prior to booking to ensure that the AAA is clear.
  • Control steps to take when UC segments are encountered.
  • Specify a wait interval after booking to give carriers a chance to respond with an updated segment status.
  • In conjunction with this wait interval, client applications can also specify for the system to redisplay the itinerary, looking for UC segments up to ten times. If a UC segment is encountered, the client application can specify that the system halt processing for further action from the client application; for example, a new request utilizing different marriage connection logic, etc.
  • During the subsequent pricing step, the orchestration engine will also make note of the value contained in .../OTA_AirPriceRQ/PriceComparison@AmountSpecified, which can then be used to compare the actual price being stored during PNR creation against the price gathered during shopping.
  • After a successful OTA_AirPriceLLSRQ response is received, the orchestration engine will extract the value contained in OTA_AirPriceRS/PricedItineraries/PricedItinerary/AirItineraryPricingInfo/ItinTotalFare/TotalFare@Amount and return that value, along with the initial specified fare amount in the response, to allow customers to determine if there was a fare increase between the shopping and booking transaction.
  • Ignore the transaction upon successful processing. In terms of responses, client applications can opt to only receive the flight segments generated because of the OTA_AirBookLLSRQ message, or to receive the entire PNR generated as a result of the process via the TravelItineraryRS message.

Segment Status Handling

The EnhancedAirBookRQ API has a provision for checking segment status after an initial booking to ensure that the air itinerary can be successfully priced.

If the segment status results in an unconfirmed status code (UC) and if @NumAttempts, HaltOnStatus@Code, and RetryRebook option="true" are set, the application attempts to re-book the same O&D in the itinerary with the same or different booking class using low fare search with a re-booking option (WPNCB).

EnhancedAirBookRQ further re-checks to ensure if any segment status equals HaltOnStatus@Code and if @NumAttempts have been exceeded. Air segments that still result with a UC or NN status cannot be priced.

When NN is not specifically mentioned in HaltOnStatus@Code, it's set by default and the application will halt. This preventive measure is taken because segments cannot be priced with an NN status code. If only @NumAttempts is present in the request, then NN is set by default as HaltonStatus code.

To successfully utilize this functionality, client applications need to:

  1. Set the appropriate segment status codes, i.e. UC, NN, to halt processing via …/OTA_AirBookRQ/HaltOnStatus@Code.
  2. Set the appropriate number of times, 1-10, to redisplay the reservation via …/OTA_AirBookRQ/RedisplayReservation@NumAttempts, so that the segment status can be checked. The default wait time between the number of attempts after the first WaitInterval is 1000 milliseconds.
  3. Set the appropriate wait interval, 0-10000 milliseconds, for the first redisplay via …/OTA_AirBookRQ/RedisplayReservation@WaitInterval in order to give the carrier an opportunity to respond to the sell message. Some carriers can actually take up to seven seconds to respond to a sell message.
  4. If you want the application to rebook the segments to another available class in case of UC in any of the segments, set the value of …/OTA_AirBookRQ/RetryRebook@Option as true.
  5. Set the PostProcessing@IgnoreAfter flag to true if you want the API to ignore the whole transaction at the end of the flow when an error or warning is encountered. By default, the value is set to false.

Since SS segments can be priced, in the event the carrier responds with SS immediately upon initial booking, the orchestration engine will override any values set via …/HaltOnStatus and …/RedisplayReservation, and move onto the subsequent operations specified in the request message.

Example

<EnhancedAirBookRQ xmlns="http://services.sabre.com/sp/eab/v3_3">
  <OTA_AirBookRQ>
 <RetryRebook Option="true"/>
    <HaltOnStatus Code="UC"/>
    <OriginDestinationInformation>
    <FlightSegment ArrivalDateTime="2015-11-13T09:05" DepartureDateTime="2015-11-
13T07:05" FlightNumber="465" NumberInParty="8" ResBookDesigCode="P" Status="NN">

         <DestinationLocation LocationCode="LAS"/>
         <MarketingAirline Code="9W" FlightNumber="1022"/>
         <OriginLocation LocationCode="DFW"/>
       </FlightSegment>
    </OriginDestinationInformation>
    <RedisplayReservation NumAttempts="1" WaitInterval="100"/>
 </OTA_AirBookRQ>
 <OTA_AirPriceRQ>
   <PriceRequestInformation>
    <OptionalQualifiers>
     <PricingQualifiers>
       <PlusUp Amount="100.00"/>
     </PricingQualifiers>
    </OptionalQualifiers>
   </PriceRequestInformation>
 </OTA_AirPriceRQ>
 <PostProcessing IgnoreAfter="false">
    <RedisplayReservation WaitInterval="5"/>
 </PostProcessing>
 <PreProcessing IgnoreBefore="true">
    <UniqueID ID=""/>
  </PreProcessing>
</EnhancedAirBookRQ>

In the above example, the client application has specified to halt subsequent processing if a carrier returns UC, and RetryRebook@Option is set as true. For this request, since the sell is not successful (UC), the API attempts to re-book the same O&D in the itinerary with the same or different booking class using low fare search with a rebooking option (WPNCB).

The EnhancedAirBookRQ processes the following steps:

  • Cancels all the existing air segments in the itinerary. If a PNR ID is given in the PreProcessing tag, then the PNR is ignored and retrieved instead of cancellation.
  • Rebooks all segments in the AirBook request with a QF action code instead of NN
  • Performs WPNCB entry internally
  • Processes the Pricing qualifiers specified by the customer in the AirPrice request, if any
  • Processes the AirTax request, if any
  • Return the response. The re-book process was successful if the value in …/TravelItineraryReadRS/RetryRebook@Successful is true.
Guidelines

…/TravelItineraryReadRS/RetryRebook@Successful="true" will be available only if the request contains the RedisplayReservation tag in PostProcessing. When the IgnoreAfter is set to true, EnhancedAirBookRQ will ignore the segment status passed in the request and sell segments with a QF status. This is a special status that doesn't block airline inventory but still creates segments in a PNR. This allows pricing to provide a price for an itinerary that otherwise could not be booked (which is useful for troubleshooting purposes). It also provides a way to test the service without affecting an airlines' inventory. If UC is returned during the five second interval as specified in the above example, it will be re-booked with the lowest fare class available.

If pricing (WPNCB) fails with …/TravelItineraryReadRS/RetryRebook@Successful is false, all segments are returned with a QF status code to the customer.

If the carrier responds with SS at any point during the specified number of seconds (100 in this example), the orchestration engine will override any values set via …/HaltOnStatus and …/RedisplayReservation and move onto the subsequent operations specified in the request message.

The following diagram shows the control flow for EnhancedAirBookRQ:

Enhanced Air Book Control Flow

Support Multiple Pricing

There are scenarios where travel agencies assign different mark-ups or commissions to different fares, depending on the specific passenger type. For example, an agency makes a booking for one adult (ADT) and one child (CNN). The specific conditions of the fare may allow the agency to assign only a 2 percent (2%) commission to the child, but no commission to the adult.

EnhancedAirBookRQ performs a single OTA_AirPriceLLSRQ call to price and store a fare. In this scenario, agencies may need to call the pricing service twice to price & store two different fares. In-order to support this need, EAB has been modified to handle multiple pricing requests and responses, up to a maximum of ten (10).

Example

<EnhancedAirBookRQ xmlns="http://services.sabre.com/sp/eab/v3_9" IgnoreOnError="true"
HaltOnError="true">
 <OTA_AirBookRQ>
   <OriginDestinationInformation>
     <FlightSegment DepartureDateTime="2018-10-29T12:30:00" FlightNumber="519"
NumberInParty="1" ResBookDesigCode="F" Status="NN">
        <DestinationLocation LocationCode="LAS"/>
        <MarketingAirline Code="AA" FlightNumber="519"/>
        <OriginLocation LocationCode="DFW"/>
      </FlightSegment>
    </OriginDestinationInformation>
 </OTA_AirBookRQ>
 <OTA_AirPriceRQ>
   <PriceComparison AmountSpecified="1400">
       <AcceptablePriceDecrease HaltOnNonAcceptablePrice="true">
       <Amount>20</Amount>
 </AcceptablePriceDecrease>
 </PriceComparison>
 <PriceRequestInformation Retain="true">
   <OptionalQualifiers>
    <FOP_Qualifiers IgnoreStoredFOP="true">
     <BSP_Ticketing>
      <PayLaterPlan>
        <Fare Amount="200.00"/>
        <FOP>
          <CC_Info>
            <PaymentCard Code="AX" ExpireDate="2018-11"
ManualApprovalCode="563" Number="372042332191008"/>
                  </CC_Info>
                 </FOP>
                <Installment Count="03" PayLaterReferenceNumber="XRG065"
Value="10000"/>
              </PayLaterPlan>
            </BSP_Ticketing>
          </FOP_Qualifiers>
          <MiscQualifiers>
            <MultiTicket Ind="true"/>
        </MiscQualifiers>
        <PricingQualifiers NoDate="true" RoundTheWorld="false">
          <PassengerType Code="ADT" Quantity="1"/>
           <SpanishLargeFamilyDiscountLevel>1</SpanishLargeFamilyDiscountLevel>
    </PricingQualifiers>
 </OptionalQualifiers>
 </PriceRequestInformation>
 </OTA_AirPriceRQ>
 <OTA_AirPriceRQ>
   <PriceComparison AmountSpecified="1400" HaltOnNonAcceptablePrice="true">>
     <AcceptablePriceIncrease>
 <Amount>20</Amount>
   </AcceptablePriceIncrease>
 </PriceComparison>
 <PriceRequestInformation Retain="true">
   <OptionalQualifiers>
    <FOP_Qualifiers IgnoreStoredFOP="true">
      <BSP_Ticketing>
        <PayLaterPlan>
          <Fare Amount="200.00"/>
          <FOP>
           <CC_Info>
            <PaymentCard Code="AX" ExpireDate="2018-11"
ManualApprovalCode="563" Number="372042332191008"/>
            </CC_Info>
          </FOP>
          <Installment Count="03" PayLaterReferenceNumber="XRG065"
Value="10000"/>
              </PayLaterPlan>
             </BSP_Ticketing>
           </FOP_Qualifiers>
           <MiscQualifiers>
             <MultiTicket Ind="true"/>
           </MiscQualifiers>
           <PricingQualifiers NoDate="true" RoundTheWorld="false">
            <PassengerType Code="ADT" Quantity="1"/>
            <SpanishLargeFamilyDiscountLevel>1</SpanishLargeFamilyDiscountLevel>
          </PricingQualifiers>
       </OptionalQualifiers>
     </PriceRequestInformation>
  </OTA_AirPriceRQ>
 <PostProcessing IgnoreAfter="true">
   <RedisplayReservation WaitInterval="100" UnmaskCreditCard="true"/>
  </PostProcessing>
  <PreProcessing IgnoreBefore="true">
    <UniqueID ID=""/>
  </PreProcessing>
</EnhancedAirBookRQ>

Agencies may assign a mark-up or commission tied to a specific fare if the specific fare they end up pricing with CreatePassengerNameRecord or EnhancedAirBook is lower than what was anticipated. In this case, the mark-up or commission assignment may be incorrect, and therefore agencies need to be able to stop processing when this occurs, as they would need to recalculate or reassign a new mark-up or commission value to the new fare.

In the above example, in EnhancedAirBookRQ:

  • When AcceptablePriceIncrease/@HaltOnNonAcceptablePrice="true", EnhancedAirBookRQ halts processing when the price is higher than the user's expected price.
  • When AcceptablePriceDecrease/@HaltOnNonAcceptablePrice="true", EnhancedAirBookRQ halts processing when the price is lower than the user's expected price.

Note: The difference between EnhancedAirBookRS/PriceComparison/@AmountReturned and EnhancedAirBookRS/PriceComparison/@AmountSpecified is compared against EnhancedAirBookRQ/AcceptablePriceIncrease/@Amount (@Percent) or EnhancedAirBookRQ/AcceptablePriceDecrease/@Amount to determine if the price is higher or lower than the user anticipated price.

Intrepretation of Baggage Info

The sections of the response below are used to pass details pertaining to baggage information:

  • … /OTA_AirPriceRS/PriceQuote/MiscInformation/BaggageInfo
  • …/OTA_AirPriceRS/PriceQuote/PricedItinerary/AirItineraryPricingInfo/BaggageProvisions

By linking

…/PriceQuote/MiscInformation/BaggageInfo/SubCodeProperties/@RPH

To

…/PriceQuote/PricedItinerary/AirItineraryPricingInfo/BaggageProvisions/SubCodeInfo/SubCodeForChargesOthers

You can build the baggage correspondence piece concept vs. weight and how it relates to the segment/leg.

Provision Type (ProvisionType) Values:

  • A - Checked Baggage Allowance
  • C - Day of Check-in Charges
  • B - Carry-on Baggage Allowance
  • CC - Carry-on Baggage Charges
  • E - Baggage Embargo
  • P - Prepaid Checked Baggage Charges
  • EE - Generic Embargo: No Excess Permitted

Example

In this example, you can view the dimensions of the baggage:

<SubCodeProperties SolutionSequenceNmbr="1" RPH="1">
     <AncillaryFeeGroupCode>BG</AncillaryFeeGroupCode>
     <BookingMethod>01</BookingMethod>
     <CommercialNameofBaggageItemType>UPTO50LB 23KG AND62LI158LCM</CommercialNameofBaggageItemType>
     <DescriptionOne Code="23">
            <Text>UP TO 50 POUNDS/23 KILOGRAMS</Text>
     </DescriptionOne>
     <DescriptionTwo Code="6U">
            <Text>UP TO 62 LINEAR INCHES/158 LINEAR CENTIMETERS</Text>
     </DescriptionTwo>
     <EMD_Type>2</EMD_Type>
     <ExtendedSubCodeKey>0GOACLH</ExtendedSubCodeKey>
     <RFIC>C</RFIC>
     <SizeWeightInfo>
            <MaximumSizeInAlternate Units="C">158</MaximumSizeInAlternate>
            <MaximumSize Units="I">62</MaximumSize>
            <MaximumWeightInAlternate Units="K">23</MaximumWeightInAlternate>
            <MaximumWeight Units="L">50</MaximumWeight>
      </SizeWeightInfo>
      <SSR_Code>XBAG</SSR_Code>
</SubCodeProperties>

Here, you can see the provision type and segment/leg it relates to.

In this example, the baggage is chargeable and the allowance is not free:

<BaggageProvisions RPH="2">
     <Associations>
            <CarrierCode RPH="1">LH</CarrierCode>
            <CountForSegmentAssociatedID>1</CountForSegmentAssociatedID>
            <DepartureDate RPH="1">2016-09-20</DepartureDate>
            <DestinationLocation LocationCode="FRA" RPH="1"/>
            <FlightNumber RPH="1">921</FlightNumber>
            <OriginLocation LocationCode="LHR" RPH="1"/>
            <PNR_Segment RPH="1">3</PNR_Segment>
            <ResBookDesigCode RPH="1">T</ResBookDesigCode>
            <StatusCode RPH="1">SS</StatusCode>
      </Associations>
     <CarrierWhoseBaggageProvisionsApply>LH</CarrierWhoseBaggageProvisionsApply>
    <Commissionable>N</Commissionable>
    <FeeApplicationIndicator>4</FeeApplicationIndicator>
    <FeeNotGuaranteedIndicator>N</FeeNotGuaranteedIndicator>
    <FirstOccurrence>1</FirstOccurrence>
    <Interlineable>Y</Interlineable>
    <LastOccurrence>1</LastOccurrence>
    <PassengerType Code="ADT"/>
    <PriceInformation>
      <Base Amount="15.00" CurrencyCode="EUR"/>
      <Equiv Amount="12.00" CurrencyCode="GBP"/>
      <Total>12.00</Total>
    </PriceInformation>
    <ProvisionType>C</ProvisionType>
    <RefundReissue>N</RefundReissue>
    <SubCodeInfo>
      <SubCodeForChargesOthers>0GOACLH</SubCodeForChargesOthers>
    </SubCodeInfo>
</BaggageProvisions>

Example 2:

In this example, you can see the free baggage allowance:

<SubCodeProperties SolutionSequenceNmbr="1" RPH="4">
     <AncillaryFeeGroupCode>BG</AncillaryFeeGroupCode>
     <CommercialNameofBaggageItemType>FREE BAGGAGE
     ALLOWANCE</CommercialNameofBaggageItemType>
     <EMD_Type>4</EMD_Type>
     <RFIC>C</RFIC>
</SubCodeProperties>
But based on the provision type A, 0 (zero) is the allowance :
<BaggageProvisions RPH="1">
     <Associations>
           <CarrierCode RPH="1">LH</CarrierCode>
           <CountForSegmentAssociatedID>1</CountForSegmentAssociatedID>
           <DepartureDate RPH="1">2016-09-20</DepartureDate>
           <DestinationLocation LocationCode="FRA" RPH="1"/>
           <FlightNumber RPH="1">921</FlightNumber>
           <OriginLocation LocationCode="LHR" RPH="1"/>
           <PNR_Segment RPH="1">3</PNR_Segment>
           <ResBookDesigCode RPH="1">T</ResBookDesigCode>
           <StatusCode RPH="1">SS</StatusCode>
      </Associations>
      <CarrierWhoseBaggageProvisionsApply>LH</CarrierWhoseBaggageProvisionsApply>
      <NumPiecesBDI>0</NumPiecesBDI>
      <ProvisionType>A</ProvisionType>
      <SubCodeInfo>
            <SubCodeForChargesOthers>0DFAALH</SubCodeForChargesOthers>
      </SubCodeInfo>
</BaggageProvisions>

Example 3:

In this example, you can see the carrier-allowed free baggage allowance, number of pieces, and the weight/size details:

<SubCodeProperties SolutionSequenceNmbr="1" RPH="3">
     <AncillaryFeeGroupCode>BG</AncillaryFeeGroupCode>
     <CommercialNameofBaggageItemType>FREE BAGGAGE
      ALLOWANCE</CommercialNameofBaggageItemType>
     <EMD_Type>4</EMD_Type>
     <ExtendedSubCodeKey>0DFAABA</ExtendedSubCodeKey>
</SubCodeProperties>
<BaggageProvisions RPH="1">
     <Associations>
            <CarrierCode RPH="1">BA</CarrierCode>
            <CountForSegmentAssociatedID>1</CountForSegmentAssociatedID>
            <DepartureDate RPH="1">2016-08-20</DepartureDate>
            <DestinationLocation LocationCode="DFW" RPH="1"/>
            <FlightNumber RPH="1">193</FlightNumber>
            <OriginLocation LocationCode="LHR" RPH="1"/>
            <PNR_Segment RPH="1">2</PNR_Segment>
            <ResBookDesigCode RPH="1">Y</ResBookDesigCode>
            <StatusCode RPH="1">SS</StatusCode>
      </Associations>
      <CarrierWhoseBaggageProvisionsApply>BA</CarrierWhoseBaggageProvisionsApply>
      <NumPiecesBDI>1</NumPiecesBDI>
      <NumPiecesITR>1</NumPiecesITR>
      <ProvisionType>A</ProvisionType>
      <SubCodeInfo>
           <SubCodeForAllowance RPH="1">0IZACBA</SubCodeForAllowance>
           <SubCodeForChargesOthers>0DFAABA</SubCodeForChargesOthers>
      </SubCodeInfo>
</BaggageProvisions>
<SubCodeProperties SolutionSequenceNmbr="1" RPH="9">
     <AncillaryFeeGroupCode>BG</AncillaryFeeGroupCode>
     <BookingMethod>01</BookingMethod>
     <CommercialNameofBaggageItemType>BAG MAX 23KG 51LB 208LCM
     81LI</CommercialNameofBaggageItemType>
     <DescriptionOne Code="23">
            <Text>UP TO 50 POUNDS/23 KILOGRAMS</Text>
     </DescriptionOne>
     <DescriptionTwo Code="6C">
           <Text>UP TO 81 LINEAR INCHES/208 LINEAR CENTIMETERS</Text>
     </DescriptionTwo>
     <EMD_Type>4</EMD_Type>
     <ExtendedSubCodeKey>0IZACBA</ExtendedSubCodeKey>
     <RFIC>C</RFIC>
     <SizeWeightInfo>
            <MaximumSizeInAlternate Units="C">208</MaximumSizeInAlternate>
            <MaximumSize Units="I">81</MaximumSize>
            <MaximumWeightInAlternate Units="K">23</MaximumWeightInAlternate>
            <MaximumWeight Units="L">50</MaximumWeight>
      </SizeWeightInfo>
      <SSR_Code>XBAG</SSR_Code>
</SubCodeProperties>