Air Pricing for Optional Services
Low Cost Carriers (LCC) on ACH require two air pricing requests for Optional Services that are not Paid Seating Optional Services. The first price request is sent to retrieve the optional services available for the selected flights. A second price request is then sent to price the available services returned in the first price request. Tokens from the response from the first price request are used in the second re-price request.
For Paid Seating Optional Services, a Seat Map request must be sent after the first price request and before the second price request.
Important! Carriers that support ATPCO-filed Optional Services only require one air pricing request to price the Optional Services. A second air pricing request for ATPCO-filed carriers is not supported.
Request
Use the AirPriceReq to send:
- Two air pricing requests for Optional Services for Low Cost Carriers (LCC) on ACH.
- One air pricing request for carriers that support ATPCO-filed Optional Services.
Response
If two pricing request are required, tokens from the response from the first price request are used in the second re-price request.
Air Pricing for Available Optional Services
Request
The first price request is sent to retrieve the optional services available for the selected flights.
The request uses a standard AirPriceReq service. No indicator is required to send an Air Pricing request with Optional Services. The inclusion of available Optional Services in the responses depends solely on the routing of the request to a supplier that uses an Optional Service model for Air Pricing.
Cabin class or class of service must be included to return Optional Services.
- AirPriceReq/AirItinerary/AirSegment/ @CabinClass
- AirPriceReq/AirItinerary/AirSegment/ @ClassOfService
- AirPriceReq/AirPricingCommand/AirSegmentPricingModifiers @AirSegmentRef and @CabinClass
If cabin class or class of service is not sent in the request, a warning is returned: No Merchandising optional services returned for Flight(s) [Carrier][Flight Number].
To ensure that each non-seat Optional Service is associated with a single booking traveler Passenger Type Code (PTC), AirPriceReq must include SearchPassenger @Code and SearchPassenger @Key or @BookingTravelerRef to correctly map the Optional Services to the booking traveler(s) in AirPriceRsp. If both @Key and @BookingTravelerRef are included in the pricing request, the BookingTravelerRef value is used to create the OptionalService/ServiceData with BookingTravelerRef.
Although both the Key and BookingTravelerRef attributes in AirPricingReq are optional, if neither attribute is sent, an error is returned: SearchPassenger Key or BookingTravelerRef is required.
Additionally, SearchPassenger @Age is validated by Universal API and sent in the request to ensure age-related Optional Services are returned, if available.
Notes:
- Universal API does not support SearchPassenger @Code with a PTC that includes an age.
- If an Optional Service that references an infant (INF PTC) is sent in a request, it is ignored and a warning is returned: "OptionalServices may not be Supported/Required for passenger type INF."
Response
The response returns AirPriceRsp. Any optional services available for the associated flight segment are returned in the AirPriceResult/AirPricingSolution/OptionalServices child, which serves as a wrapper for available optional services for the selected flight segment.
The OptionalServices element may contain one or more OptionalService elements. If the OptionalServices element is not returned, no services are associated with the associated segment in the flight itinerary.
The TaxInfo element in AirPricingSolution/OptionalServices/OptionalService is used to specify a tax breakdown with a category code, if a tax breakdown is provided by the carrier. A TaxInfo element is returned for each tax returned by the carrier. If more than one Tax is returned, the total of all taxes is returned in OptionalService @Taxes. TaxElement is available.
Certain rules and restrictions are associated with Optional Services filed through ATPCO. OptionalServices/OptionalService returns additional details that can be sent in Air Booking and Air Merchandising Fulfillment requests; these details are also saved to the Universal Record and Universal Record History.
Additional ATPCO-supported secondary types may also be available. See ATPCO Secondary Optional Services.
Note: These details are not provided for ACH responses, as ACH carriers do not file their Optional Services through ATPCO.
Show additional details
- OptionalService attributes added: InclusiveOfTax, InterlineSettlementAllowed, GeographySpecification, ExcessWeightRate
- TourCode element
- OptionalService/EMD attributes added: FulfillmentTypeDescription and Reusable
OptionalServices/OptionalService:
@ViewableOnly: When "true", an optional services is viewable only and cannot be sold.
Note: An enhancement released with Universal API 21.4.2 stops returning services that cannot be sold. For example, an optional service that is ViewableOnly="true" is suppressed from the AirPrice and AMOA response.
This is a limited release feature. Contact your Travelport representative for further details. Release 21.4
/ServiceData :
- Each non-seat Optional Service is associated with a single booking traveler PTC. This creates one optional service for every booking traveler reference that includes the BookingTravelerRef and AirSegmentRef in one ServiceData element.
- One Optional Service is returned referencing one or more air segment(s) based on the following criteria:
- When an ATPCO-filed Optional Service is for a sector, the Optional Service is associated to one air segment.
- When an ATPCO-filed Optional Service is for a portion of travel or for a journey, the Optional Service is associated to one or more air segments.
Note: Galileo (1G), Apollo (1V), and Worldspan (1P) do not support the Geography Specification “Journey”.
- When the provider is ACH, the Optional Service is associated to one or more air segments.
Air Pricing for Baggage Optional Services
As of the Universal API 20.1.3 release, all Air.xsd and Universal.xsd schema returns optional service baggage information in a structured format so that customers can easily parse relevant information for travelers to make educated decisions on cost of checked bags. Release 20.1 In an AirPrice response, when baggage information returns, this functionality:
- Identifies which of the paid baggage options available (for a given air element) is the first paid bag and which one the second, regardless of being from a no-bag fare or a bag-included fare in a structured format in the optional services.
- Clearly identifies price and currency of the bag in the optional services.
- When number of pieces exists, keeps the current attribute 'Quantity' enabled and includes the maximum weight allowed in the optional services.
- When weight exists, the value returns in a structured attribute in optional services.
- Returns in AirPriceResponse/AirPriceResult/AirPricingSolution/OptionalServices/OptionalService @TotalWeight, @FirstPiece, @LastPiece
<air:OptionalServices>
<air:OptionalServicesTotal/>
<air:OptionalService Type="Baggage" TotalPrice="AUD27.70" SupplierCode="AR" PerTraveler="false" CreateDate="2020-02-04T16:47:19.178+00:00" ServiceStatus="Offered" SequenceNumber="100000" ServiceSubCode="02U" SSRCode="ASVC" Key="zhXJNACJ3BKA0HAAAAAAAA==" AssessIndicator="MileageOrCurrency" InclusiveOfTax="true" InterlineSettlementAllowed="false" GeographySpecification="Portion" Source="MCE" ViewableOnly="true" TotalWeight="46" ProviderCode="1G" Quantity="1" BasePrice="AUD27.70" ApproximateTotalPrice="AUD27.70" ApproximateBasePrice="AUD27.70" Taxes="AUD0.00" OptionalServicesRuleRef="zhXJNACJ3BKA1HAAAAAAAA==" FirstPiece="2" LastPiece="2">
<common_v50_0:ServiceData BookingTravelerRef="zhXJNACJ3BKADHAAAAAAAA==" AirSegmentRef="zhXJNACJ3BKAgHAAAAAAAA==" TravelerType="ADT"/>
<common_v50_0:ServiceInfo>
<common_v50_0:Description>2ND ADD BAG UP TO 33LB 15KG</common_v50_0:Description>
</common_v50_0:ServiceInfo>
<air:EMD FulfillmentType="4" AssociatedItem="Chargeable Baggage" RefundReissueIndicator="Reuse" Commissionable="false" Booking="SSR" FulfillmentTypeDescription="Other than EMD"/>
<air:FeeApplication Code="4">Per Travel</air:FeeApplication>
<air:BrandingInfo Key="BI3" CommercialName="2ND ADD BAG UP TO 33LB 15KG">
<air:Title Type="External" LanguageCode="EN">2ND ADD BAG UP TO 33LB 15KG</air:Title>
<air:AirSegmentRef Key="zhXJNACJ3BKAgHAAAAAAAA=="/>
</air:BrandingInfo>
</air:OptionalService>
Note: The OptionalService attributes WeightInExcess and BaggageUnitPrice are not currently returned in the response.
C Type Baggage
Prior to Universal API release 21.2.2, customers were limited to viewing prices and purchasing F type filed bags only. Release 21.2
Release 21.2.2 and later allows customers to receive baggage data and purchase bags for itineraries where C type data has been filed by the carrier.
C type baggage data is shopped and sold via the following:
-
C type baggage including max quantity and price information is viewable in the AirPrice and AirMerchandisingOfferAvailability responses.
-
C type baggage is sellable in the AirCreateReservation and AirMerchandisingFulfillment requests.
While workflows should not change, it is important to ensure the @IsRepriceRequired element is not omitted from @OptionalServices in the AirCreateReservation and AirMerchandisingFulfillment requests because that information is used to ensure accurate pricing returns for the selected option.
xPath:
OptionalServices/OptionalService/@IsRepriceRequired
-
AirPriceRsp/AirPriceResult/AirPricingSolution/
-
AirMerchandisingOfferAvailabilityRsp/
-
AirCreateReservationReq/AirPricingSolution/
-
AirCreateReservationRsp/UniversalRecord/AirReservation/
-
AirMerchandisingFulfillmentReq/
-
AirMerchandisingFulfillmentRsp/UniversalRecord/AirReservation/
Notes:
-
See DA 901 for further details and examples.
Air Pricing for Baggage Optional Services on ACH
To price and book an extra paid bag on an ACH carrier, including the “free” bag that is already included in the fare, you need to request two bags in the AirPrice and AirCreateReservation requests as separate optional services. Include one optional services element for the included “free” bag (with a zero for the price), and a second optional services element for the paid bag, including the price for that bag. Universal API processes this request and programmatically understands that one bag is free and one is paid. If you request only one, or zero, bags, you get pricing or booking failures. Review the following sample with the bag fees highlighted:
<air:OptionalService Type="Baggage" TotalPrice="EUR25.00" SupplierCode="FR" CreateDate="2016-01-28T17:24:58.762+00:00" ServiceStatus="Offered" Key="hs8L696CS2egnELk9pVv8w==" AssessIndicator="MileageOrCurrency" IsPricingApproximate="false" Source="ACH" DisplayText="Baggage, 20kg" ProviderCode="ACH" Quantity="1" ProviderDefinedType="BGPP20" BasePrice="EUR25.00" ApproximateTotalPrice="AUD37.10" ApproximateBasePrice="AUD37.10" OptionalServicesRuleRef="GuCX4uCDS+CxO2H5DrFFOw==">
<com:ServiceData BookingTravelerRef="1" AirSegmentRef="7NgzruvqQWKqD9gw4knirw=="/>
<com:ServiceInfo>
<com:Description>Prepaid check-in baggage, up to 20kg - Prepaid check-in baggage up to 20kg</com:Description>
<com:Description>Valid baggage combinations include: 3 bags of any type per passenger per segment - Prepaid check-in baggage up to 20kg</com:Description>
</com:ServiceInfo>
<air:BrandingInfo Key="BI11" CommercialName="Prepaid check-in baggage up to 20kg">
<air:Title Type="External">Prepaid check-in baggage up to 20kg</air:Title>
<air:AirSegmentRef Key="7NgzruvqQWKqD9gw4knirw=="/>
</air:BrandingInfo>
</air:OptionalService>
<air:OptionalService Type="Baggage" TotalPrice="EUR0.00" SupplierCode="FR" CreateDate="2016-01-28T17:30:05.065+00:00" ServiceStatus="Offered" Key="7RKEhhPiRBCICAEgnpJSuQ==" AssessIndicator="MileageOrCurrency" IsPricingApproximate="false" Source="ACH" DisplayText="Free 20kg bag" ProviderCode="ACH" Quantity="1" ProviderDefinedType="BG__20FR" BasePrice="EUR0.00" ApproximateTotalPrice="AUD0.00" ApproximateBasePrice="AUD0.00" OptionalServicesRuleRef="YDNo/BUvRqOT32bCd13hRw==">
<com:ServiceData BookingTravelerRef="1" AirSegmentRef="7NgzruvqQWKqD9gw4knirw=="/>
<com:ServiceInfo>
<com:Description>Free 20kg bag included in the BusinessPlus bundle - Free 20kg bag included in the BusinessPlus bundle</com:Description>
<com:Description>Valid baggage combinations include: 3 bags of any type per passenger per segment - Free 20kg bag included in the BusinessPlus bundle</com:Description>
</com:ServiceInfo>
<air:BrandingInfo Key="BI2" CommercialName="Free 20kg bag included in the BusinessPlus bundle">
<air:Title Type="External">Free 20kg bag included in the BusinessPlus bundle</air:Title>
<air:AirSegmentRef Key="7NgzruvqQWKqD9gw4knirw=="/>
</air:BrandingInfo>
</air:OptionalService>
Air Pricing to Price Requested Optional Services (LCCs on ACH)
Important! The second Air Pricing Request is ONLY required for Low Cost Carriers (LCC) on ACH. A second air pricing request for ATPCO-filed carriers is not supported.
A second price request, which must contain one booking traveler and one or more air segments in each optional service, is sent to price the available services returned in the first price request.
When an AirPriceReq that includes OptionalService@Quantity greater than "1" is sent to the ACH provider for a Low Cost Carrier (LCC), the Quantity returned is the total number of Optional Services requested and may reference multiple air segments and always one booking traveler.
The TotalPrice of the OptionalService is returned in TotalPrice in AirPriceRsp/AirPriceResult/AirPricingSolution/OptionalServices/OptionalService.
For Paid Seating Optional Services, a Seat Map request must be sent after the first price request and before the second price request. The host token from the Seat Map response and the seat number being requested must be sent in the second air price request. The Paid Seating Optional Service taken from SeatMapRsp (Air v35 and later) must be sent in the second price request with ServiceStatus="Offered".
Important! You must use the correct host tokens with Seat acquisition. Host tokens are passed on from transaction to transaction and must be used consistently and correctly.
In the second price request, Universal API returns:
- An OptionalServicesTotal element that has the total for the priced Optional Services.
- The optional service sent in the request with @ServiceStatus="Priced".
- The available optional services with a @ServiceStatus="Offered", the same as it was returned in the first Air Pricing request.
Note: The first Air Pricing request returns the OptionalServiceTotal element but the element is blank (not populated with any prices <air:OptionalServicesTotal/>)
The "priced” optional services can be copied and sent in the Air Booking request. If OptionalServicesTotal is sent in the Booking request it is ignored, and no error is returned.
Errors and Warnings
If the second AirPriceReq contains any invalid Optional Services, errors are returned.
Show OptionalService Errors
Action Error AirPriceReq is sent with one or more Optional Services that are invalid.
Price request unsuccessful due to incorrect OptionalService/ServiceData.
Note: If the same error message applies to multiple optional services, the error message displays only once.
When OptionalService @Type=”PreReservedSeatAssignment”, and:
- OptionalService/ServiceData is not sent.
- BookingTravelerRef in OptionalService/ServiceData is not sent.
- AirSegmentRef in OptionalService/ServiceData is not sent.
- BookingTravelerRef and AirSegmentRef in OptionalService/ServiceData are not sent.
- Two or more OptionalService/ServiceData are sent.
The error message Price request unsuccessful due to incorrect OptionalService/ServiceData. is returned.
The error One OptionalService/ServiceData is required for seat optional service and must reference one air segment and one booking traveler to fulfill optional service. is appended.
OptionalService/ServiceData element
<com:ServiceData AirSegmentRef="TWPiNzWTQROEwSGKTr9ztw==" BookingTravelerRef="pLz6JCp3TY6uUL+WZl7DAQ==" Data="17C"/>
When OptionalService @Type does not equal “PreReservedSeatAssignment”, and:
- OptionalService/ServiceData is not sent.
- BookingTravelerRef in OptionalService/ServiceData is not sent.
- AirSegmentRef in OptionalService/ServiceData is not sent.
- BookingTravelerRef and AirSegmentRef in OptionalService/ServiceData are not sent.
The error message Price request unsuccessful due to incorrect OptionalService/ServiceData. is returned.
The error At least one OptionalService/ServiceData is required for non-seat optional service and must reference one air segment and one booking traveler to fulfill optional service. is appended.
OptionalService/ServiceData element
<com:ServiceData AirSegmentRef="TWPiNzWTQROEwSGKTr9ztw==" BookingTravelerRef="pLz6JCp3TY6uUL+WZl7DAQ=="/>
When OptionalService @Type does not equal “PreReservedSeatAssignment”, and:
- Two or more OptionalService/ServiceData are sent with different booking traveler references.
The error message Price request unsuccessful due to incorrect OptionalService/ServiceData. is returned.
The error Multiple booking traveler references not allowed within one OptionalService. is appended.
OptionalService/ServiceData element
<com:ServiceData AirSegmentRef="TWPiNzWTQROEwSGKTr9ztw==" BookingTravelerRef="pLz6JCp3TY6uUL+WZl7DAQ=="/>
<com:ServiceData AirSegmentRef=”zy3g8mFKQiipTilS2b7C3Q==" BookingTravelerRef="pLz6JCp3TY6uUL+WZl7DAQ=="/>
For example:
AirPricingReq is sent with:
- One OptionalService Type=”PreReservedSeatAssignment” with two ServiceData elements
- One OptionalService Type=”Baggage” with one ServiceData element that has AirSegmentRef and another ServiceData element that has BookingTravelerRef
- One OptionalService Type=”MealOrBeverage” that references two booking travelers
- One OptionalService Type=”Toy” with no ServiceData element
- One OptionalService Type=”TravelInsurance” with one ServiceData element that has AirSegmentRef and BookingTravelerRef
Universal API returns one main error and appends three error messages.
Price request unsuccessful due to incorrect OptionalService/ServiceData. One OptionalService/ServiceData is required for seat optional service and must reference one air segment and one booking traveler to fulfill optional service. At least one OptionalService/ServiceData is required for non-seat optional service and must reference one air segment and one booking traveler to fulfill optional service. Multiple booking traveler references not allowed within one OptionalService.
Additionally, an Optional Service with multiple OptionalService/ServiceData that has a ServiceData that is mapped correctly and a ServiceData that is not mapped correctly is considered an invalid Optional Service. For example:
AirPriceReq is sent with one OptionalService Type=”Baggage” and:
- One ServiceData that has AirSegmentRef and BookingTravelerRef.
- One ServiceData that has AirSegmentRef
Universal API returns one main error and appends one error message.
Price request unsuccessful due to incorrect OptionalService/ServiceData. At least one OptionalService/ServiceData is required for non-seat optional service and must reference one air segment and one booking traveler to fulfill optional service.
TSPT-12700 Support C type baggage data for Air Price, Air Booking, and Air Merchandising Fulfillment (AMF).