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:
- IgnoreTransactionLLSRQ (I)
- OTA_AirTaxRQ
- OTA_AirBookLLSRQ (JA)
- TravelItineraryReadRQ
- OTA_AirPriceLLSRQ (WP)
- TravelItineraryReadRQ
- 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 @NumAttempt
s 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:
- Set the appropriate segment status codes, i.e. UC, NN, to halt processing via
…/OTA_AirBookRQ/HaltOnStatus@Code
. - 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 firstWaitInterval
is 1000 milliseconds. - 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. - 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
astrue
. - Set the
PostProcessing@IgnoreAfter
flag totrue
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 tofalse
.
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
<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 aQF
action code instead ofNN
- Performs
WPNCB
entry internally - Processes the
Pricing
qualifiers specified by the customer in theAirPrice
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
istrue
.
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:
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
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
andEnhancedAirBookRS/PriceComparison/@AmountSpecified
is compared againstEnhancedAirBookRQ/AcceptablePriceIncrease/@Amount
(@Percent
) orEnhancedAirBookRQ/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 AllowanceC
- Day of Check-in ChargesB
- Carry-on Baggage AllowanceCC
- Carry-on Baggage ChargesE
- Baggage EmbargoP
- Prepaid Checked Baggage ChargesEE
- Generic Embargo: No Excess Permitted
Example
In this example, you can view the dimensions of the baggage:
<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:
<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:
<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:
<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>