MultipleBrandedFares not returned on production API endpoint - sabre

My code is working properly on test/cert environment returning multiple branded fares as specified in request. However, when trying on REST production endpoint, I don't get multiple branded fares. Also, in response there is no Brand property in fareComponentDescs, it is like MultipleBrandedFares being completly ignored.
This is my request on production endpoint (Token and PseudoCityCode replaced for security reasons)
POST /v3/offers/shop HTTP/1.1
Host: api.havail.sabre.com
Content-Length: 1028
Accept: application/json
Authorization: Bearer <my token>
Content-Type: application/json
Conversation-Id: bGcUH2p5ptFkUi3JLrBDXMeYPfWw3Fji
Accept-Encoding: gzip
{
"OTA_AirLowFareSearchRQ": {
"Version": "3",
"OriginDestinationInformation": [
{
"RPH": "0",
"DepartureDateTime": "2021-09-30T00:00:00",
"OriginLocation": {
"LocationCode": "MUC"
},
"DestinationLocation": {
"LocationCode": "LHR"
}
},
{
"RPH": "1",
"DepartureDateTime": "2021-10-20T00:00:00",
"OriginLocation": {
"LocationCode": "LHR"
},
"DestinationLocation": {
"LocationCode": "MUC"
}
}
],
"POS": {
"Source": [
{
"PseudoCityCode": "<my code>",
"RequestorID": {
"CompanyName": {
"Code": "TN"
},
"ID": "1",
"Type": "1"
}
}
]
},
"TPA_Extensions": {
"IntelliSellTransaction": {
"RequestType": {
"Name": "100ITINS"
}
}
},
"TravelPreferences": {
"Baggage": {
"CarryOnInfo": true,
"Description": true,
"RequestType": "C"
},
"CabinPref": [
{
"Cabin": "Y"
}
],
"ETicketDesired": true,
"TPA_Extensions": {}
},
"TravelerInfoSummary": {
"AirTravelerAvail": [
{
"PassengerTypeQuantity": [
{
"Code": "ADT",
"Quantity": 1
}
]
}
],
"PriceRequestInformation": {
"TPA_Extensions": {
"BrandedFareIndicators": {
"MultipleBrandedFares": true,
"ReturnBrandAncillaries": true,
"UpsellLimit": 2
}
}
},
"SeatsRequested": [
1
]
},
"AvailableFlightsOnly": true
}
}

Multiple Branded Fares requires activation, is possible that is ignored because you don't have enabled this functionality.
Is possible to be enabled in CERT due to be for testing purpose.
To activate contact the account executive.

Related

Sabre BargainFinderMax REST API ResponseType field not working properly

Checking the BFM v4 Rest API docs we find that we can set a 'ResponseType' field to decide how the response will be formatted.
However, when testing this in Postman, we found some oddities. A request with the following Body to the endpoint /v4/offers/shop:
{
"OTA_AirLowFareSearchRQ": {
"POS": {
"Source": [
{
"PseudoCityCode": "{{pcc}}",
"RequestorID": {
"ID": "1",
"Type": "1",
"CompanyName": {
"Code": "TN",
"CodeContext": "TN"
}
}
}
]
},
"OriginDestinationInformation": [
{
"TPA_Extensions": {
"SegmentType": { "Code": "O"}
},
"RPH": "1",
"Fixed": false,
"DepartureDateTime": "{{start_date}}T11:00:00",
"OriginLocation": {
"AllAirports": false,
"LocationCode": "MIA",
"CodeContext": "IATA"
},
"DestinationLocation": {
"AllAirports": false,
"LocationCode": "MCO",
"CodeContext": "IATA"
}
}
],
"TravelPreferences": {
"CabinPref": [
{
"Cabin": "Y",
"PreferLevel": "Preferred"
}
],
"LookForAlternatives": false,
"TPA_Extensions": {
"TripType": { "Value": "OneWay" },
"JumpCabinLogic": { "Disabled": false },
"KeepSameCabin": { "Enabled": true },
"DiversityParameters": {
"AdditionalNonStopsNumber": 30
},
"ExcludeVendorPref": [
{
"Code": "G3"
}
]
},
"ETicketDesired": false,
"Hybrid": true,
"ValidInterlineTicket": true
},
"TravelerInfoSummary": {
"AirTravelerAvail": [
{
"PassengerTypeQuantity": [
{
"Code": "ADT",
"Quantity": 1,
"TPA_Extensions": {
"VoluntaryChanges": {
"Match": "Any"
}
}
}
]
}
],
"PriceRequestInformation": {
"NegotiatedFareCode": [],
"AccountCode": [{ "Code": "PROMAO" }],
"CurrencyCode": "BRL",
"TPA_Extensions": {
"BrandedFareIndicators": {
"SingleBrandedFare": true,
"MultipleBrandedFares": true
},
"Indicators": {
"MinMaxStay": { "Ind": true },
"RefundPenalty": { "Ind": true },
"ResTicketing": { "Ind": true }
},
"Priority": {
"Price": { "Priority": 1 },
"DirectFlights": { "Priority": 2 },
"Time": { "Priority": 3 },
"Vendor": { "Priority": 4 }
}
}
}
},
"TPA_Extensions": {
"IntelliSellTransaction": {
"RequestType": { "Name": "50ITINS" },
"CompressResponse": {
"Value": false
}
},
"AlternateAirportMileage": {
"Number": "25"
}
},
"DirectFlightsOnly": false,
"ResponseType": "OTA",
"SeparateMessages": false,
"Version": "v4"
}
}
produces a response in the GroupedItineraries format ("GIR" value), which is an undesired behavior for us.
Weirdly, the API accepts any string to this field 'ResponseType', not indicating any misuse, but always returning the GroupedItineraries format. The response contains the following messages:
{
"groupedItineraryResponse": {
"version": "6.5.2",
"messages": [
{
"severity": "Info",
"type": "SERVER",
"code": "ASE032LPSCIL549.ATSE.CERT.ASCINT.SABRECIRRUS.COM",
"text": "27138"
},
{
"severity": "Info",
"type": "WORKERTHREAD",
"code": "TRANSACTIONID",
"text": "7100110708344235563"
},
{
"severity": "Info",
"type": "DRE",
"code": "RULEID",
"text": "18411"
},
{
"severity": "Info",
"type": "DEFAULT",
"code": "RULEID",
"text": "25916"
},
{
"severity": "Info",
"type": "SCHEDULES",
"code": "MSG",
"text": "NO FLIGHT SCHEDULES FOR JOURNEY 2022-06-24 [FLL]-[ISM]"
},
{
"severity": "Info",
"type": "SCHEDULES",
"code": "MSG",
"text": "NO FLIGHT SCHEDULES FOR JOURNEY 2022-06-24 [MIA]-[ISM]"
},
{
"severity": "Info",
"type": "SCHEDULES",
"code": "MSG",
"text": "NO FLIGHT SCHEDULES FOR JOURNEY 2022-06-24 [OPF]-[ISM]"
},
{
"severity": "Info",
"type": "SCHEDULES",
"code": "MSG",
"text": "NO FLIGHT SCHEDULES FOR JOURNEY 2022-06-24 [OPF]-[MCO]"
},
{
"severity": "Info",
"type": "SCHEDULES",
"code": "MSG",
"text": "NO FLIGHT SCHEDULES FOR JOURNEY 2022-06-24 [OPF]-[ORL]"
},
{
"severity": "Info",
"type": "SCHEDULES",
"code": "MSG",
"text": "NO FLIGHT SCHEDULES FOR JOURNEY 2022-06-24 [TMB]-[ISM]"
},
{
"severity": "Info",
"type": "SCHEDULES",
"code": "MSG",
"text": "NO FLIGHT SCHEDULES FOR JOURNEY 2022-06-24 [TMB]-[MCO]"
},
{
"severity": "Info",
"type": "SCHEDULES",
"code": "MSG",
"text": "NO FLIGHT SCHEDULES FOR JOURNEY 2022-06-24 [TMB]-[ORL]"
}
] ...
Informing that there's no support for OTA using REST, the REST service answers will always be on GIR format.
Best regards.

SABRE Hotel Book request is missing TravelItineraryRead in the response

I'm having an issue performing the following SABRe hotel book in the CRT environment using an orchestrated workflow.
{
"CreatePassengerNameRecordRQ": {
"version": "2.3.0",
"TravelItineraryAddInfo": {
"CustomerInfo": {
"ContactNumbers": {
"ContactNumber": [
{
"NameNumber": "1.1",
"Phone": "17805555555",
"PhoneUseType": "H"
}
]
},
"Email": [
{
"Address": "chris#test.com",
"Type": "TO"
}
],
"PersonName": [
{
"NameNumber": "1.1",
"PassengerType": "ADT",
"GivenName": "Chris",
"Surname": "test"
}
]
}
},
"HotelBook": {
"BookingInfo": {
"BookingKey": "5d07cdba-0123-4510-9f9a-5257973b5f98",
"RequestorID": "SG000000"
},
"Rooms": {
"Room": [
{
"Guests": {
"Guest": [
{
...
}
]
},
"RoomIndex": 1
}
]
},
"PaymentInformation": {
"FormOfPayment": {
"PaymentCard": {
"PaymentType": "CC",
"CardCode": "VI",
"CardNumber": "4111111111111111",
"ExpiryMonth": 3,
"ExpiryYear": "2024",
"FullCardHolderName": {
"FirstName": "Chris",
"LastName": "test",
"Email": "chris#test.com"
},
"CSC": "013",
"Address": {
...
},
"Phone": {
"PhoneNumber": "17805555555"
}
}
},
"Type": "GUARANTEE"
},
"POS": {
"Source": {
"RequestorID": {
"Type": 5,
"Id": "XXX",
"IdContext": "IATA"
},
"AgencyAddress": {
"AddressLine1": "1 Lincoln Blvd",
"CountryName": {
"Code": "US"
}
},
"AgencyName": "Flying Wings",
"ISOCountryCode": "US",
"PseudoCityCode": "1MNJ"
}
}
},
"PostProcessing": {
"EndTransaction": {
"Source": {
"ReceivedFrom": "Flying Wings Web"
},
"Email": {
"Ind": true
}
}
}
}
}
The response I get is:
{
"CreatePassengerNameRecordRS": {
"ApplicationResults": {
"status": "Complete",
"Success": [
{
"timeStamp": "2021-03-08T01:18:50.544-06:00"
}
]
},
"ItineraryRef": {
"ID": "VKIJSI"
}
},
"Links": [
]
}
So a successful booking however I am expecting a TravelItineraryRead returned in the response and am not getting one. Am I missing something in the request?
Thanks.
try redisplaing the newly created reservation.
"RedisplayReservation": {
"waitInterval": 100
}
that should include the itinerary in the response

choosing cabin type on /v2/offers/shop

can someone help me? I am looking for a method to get all kind of cabin type of Sabre on /v2/offers/shop request at the same time in all itineraries. Below is my code. please answer with a full JSON. any help is valuable. another problem is where can I find some good examples for NDC and non-NDC for /v2/offers/shop?
{
"OTA_AirLowFareSearchRQ": {
"OriginDestinationInformation": [
{
"DepartureDateTime": "2020-06-21T00:00:00",
"DestinationLocation": {
"LocationCode": "YYC"
},
"OriginLocation": {
"LocationCode": "YYZ"
},
"RPH": "0"
},
{
"DepartureDateTime": "2020-06-25T00:00:00",
"DestinationLocation": {
"LocationCode": "YYZ"
},
"OriginLocation": {
"LocationCode": "YYC"
},
"RPH": "1"
}
],
"POS": {
"Source": [
{
"PseudoCityCode": "xxxxxxx",
"RequestorID": {
"CompanyName": {
"Code": "xxxxxxxxxx"
},
"ID": "1",
"Type": "1"
}
}
]
},
"TPA_Extensions": {
"IntelliSellTransaction": {
"RequestType": {
"Name": "xxxxxxx"
}
}
},
"TravelPreferences": {
"TPA_Extensions": {
"DataSources": {
"ATPCO": "Enable",
"LCC": "Enable",
"NDC": "Enable"
},
"NumTrips": {},
"FlexibleFares": {
"FareParameters": [
{
"PassengerType": {
"Code": "ADT"
},
"Cabin": {
"Type": "Y"
}
},
{
"PassengerType": {
"Code": "ADT"
},
"Cabin": {
"Type": "S"
}
},
{
"PassengerType": {
"Code": "ADT"
},
"Cabin": {
"Type": "C"
}
}
]
}
}
},
"TravelerInfoSummary": {
"AirTravelerAvail": [
{
"PassengerTypeQuantity": [
{
"Code": "ADT",
"Quantity": 3
},
{
"Code": "CNN",
"Quantity": 2
},
{
"Code": "INF",
"Quantity": 1
}
]
}
],
"SeatsRequested": [
5
]
},
"Version": "1"
}
}
I don't think you can get all kind of cabin type response in a single request,
you have to search differently for each cabin type,
here are the cabin types if you need them:
Premium First (P),
First (F),
Premium Business (J),
Business (C),
Premium Economy (S)
Economy (Y)
but you can search different flights with different cabin type in a single itinerary in the OriginDestinationInformation block
"OriginDestinationInformation": [
{
"DepartureDateTime": "2019-06-21T00:00:00",
"DestinationLocation": {
"LocationCode": "LAX"
},
"OriginLocation": {
"LocationCode": "NYC"
},
"TPA_Extensions": {
"CabinPref": {
"Cabin": "Y"
}
},
"RPH": "0"
},
{
"DepartureDateTime": "2019-06-22T00:00:00",
"DestinationLocation": {
"LocationCode": "NYC"
},
"OriginLocation": {
"LocationCode": "LAX"
},
"TPA_Extensions": {
"CabinPref": {
"Cabin": "C"
}
},
"RPH": "1"
}
]
You can search for different flights with different cabin types in a single itinerary in the OriginDestinationInformation block of the OTA_AirLowFareSearchRQ request.
You can use the Cabin Pref option to specify preferred cabin to be used in a search for this leg level (if SegmentType is "O") or segment (if SegmentType is "X").
The cabin type specified in this element will override the cabin type specified at the request level for this leg/segment.
If a cabin type is not specified for this element the cabin type at request level will be used as a default for this leg or segment.
If the cabin type is not specified at both the leg/segment level and request level a default cabin of "Economy" will be used.
Here is a sample:-
"OriginDestinationInformation": [
{
"DepartureDateTime": "2020-07-05T00:00:00",
"DestinationLocation": {
"LocationCode": "SFO"
},
"OriginLocation": {
"LocationCode": "NYC"
},
"TPA_Extensions": {
"CabinPref": {
"Cabin": "Y"
}
},
"RPH": "0"`},
{
"DepartureDateTime": "2020-07-10T00:00:00",
"DestinationLocation": {
"LocationCode": "NYC"
},
"OriginLocation": {
"LocationCode": "SFO"
},
"TPA_Extensions": {
"CabinPref": {
"Cabin": "C"
}
},
"RPH": "1"
}
]
`
Here is a link that provides details of NDC in Sabre:-
https://developer.sabre.com/guides/travel-agency/services/NDC

Using Both Alternative Dates and Airports in Bargain Finder Max and Getting More Results

I'm currently testing with the Bargain Finder Max REST API. I'm aware that there are versions of the BFM API specifically implementing alternative dates and alternative airports, but I was wondering if there was a way to combine alternative dates and alternative airports into a single request. I've tried things like
{
"OTA_AirLowFareSearchRQ": {
"AvailableFlightsOnly": true,
"POS": {
"Source": [{
"PseudoCityCode":"F9CE",
"RequestorID": {
"Type": "1",
"ID": "1",
"CompanyName": {
"Code": "TN",
"CodeContext": "Context"
}
}
}]
},
"OriginDestinationInformation": [{
"DepartureDateTime": "2018-04-07T00:00:00",
"OriginLocation": {
"LocationCode": "DTW"
},
"DestinationLocation": {
"LocationCode": "ORD"
}
}],
"TravelerInfoSummary": {
"AirTravelerAvail": [{
"PassengerTypeQuantity": [{
"Code": "ADT",
"Quantity": 1
}]
}],
"PriceRequestInformation": {
"CurrencyCode": "USD"
}
},
"TPA_Extensions": {
"IntelliSellTransaction": {
"RequestType": {
"Name": "AD1"
}
}
}
}
}
But this only returns alternate dates for DTW -> ORD, the original origin and destination airports.
I'm also trying to figure out how to get more results with the alternative date BFM API. Running the query
{
"OTA_AirLowFareSearchRQ": {
"AvailableFlightsOnly": true,
"POS": {
"Source": [{
"PseudoCityCode":"F9CE",
"RequestorID": {
"Type": "1",
"ID": "1",
"CompanyName": {
"Code": "TN",
"CodeContext": "Context"
}
}
}]
},
"OriginDestinationInformation": [{
"DepartureDateTime": "2018-04-07T00:00:00",
"OriginLocation": {
"LocationCode": "DTW"
},
"DestinationLocation": {
"LocationCode": "ORD"
}
}],
"TravelPreferences": {
"TPA_Extensions": {
"NumTrips": {
"Number": 100
}
}
},
"TravelerInfoSummary": {
"AirTravelerAvail": [{
"PassengerTypeQuantity": [{
"Code": "ADT",
"Quantity": 1
}]
}],
"PriceRequestInformation": {
"CurrencyCode": "USD"
}
},
"TPA_Extensions": {
"IntelliSellTransaction": {
"RequestType": {
"Name": "AD1"
}
}
}
}
}
But this only returns one itinerary per day.
Could anyone help me with these issues? Thanks kindly in advance!
When doing BFM you have different qualifiers that may help with searching for alternate airports, like AlternateAirportCities or SisterDestinationLocation, but these don't seem to be enabled for BFM Alternate Dates.
Instead, what you may use instead of the airport codes, is the actual city where it present. In your example you go from Detroit (DTW) to Chicago (ORD), but if you change, for example, the destination to Chicago city (CHI) you can get CHICAGO OHARE (ORD) as well as CHICAGO MIDWAY (MDW).
A few examples:
LON instead of LHR, LCY, LGW
NYC instead of JFK, LGA, EWR
PAR instead of CDG, ORY
MOW instead of DME, SVO, VKO
BUE instead of EZE, AEP
WAS instead of DCA, IAD

SABRE Bargain Finder Max API

Why Sabre is returning not found in this request?
Address: https://api.havail.sabre.com/v3.2.0/shop/flights?mode=live&limit=50&offset=1&enabletagging=true
Here is the Request:
{
"OTA_AirLowFareSearchRQ": {
"Target": "Production",
"OriginDestinationInformation": [{
"DepartureDateTime": "2017-10-04T00:00:00",
"DestinationLocation": {
"LocationCode": "JFK"
},
"OriginLocation": {
"LocationCode": "LAX"
},
"RPH": "1"
}, {
"DepartureDateTime": "2017-10-10T00:00:00",
"DestinationLocation": {
"LocationCode": "LAX"
},
"OriginLocation": {
"LocationCode": "JFK"
},
"RPH": "2"
}],
"POS": {
"Source": [{
"PseudoCityCode": "4OMI",
"RequestorID": {
"CompanyName": {
"Code": "TN"
},
"ID": "REQ.ID",
"Type": "1"
}
}]
},
"TPA_Extensions": {
"IntelliSellTransaction": {
"RequestType": {
"Name": "50ITINS"
}
}
},
"TravelPreferences": {
"ValidInterlineTicket": true,
"CabinPref": [{
"Cabin": "Y",
"PreferLevel": "Preferred"
}],
"TPA_Extensions": {
"TripType": {
"Value": "Return"
}
}
},
"TravelerInfoSummary": {
"SpecificPTC_Indicator": false,
"SeatsRequested": [1],
"AirTravelerAvail": [{
"PassengerTypeQuantity": [{
"Quantity": 1,
"Code": "ADT",
"Changeable": false
}]
}]
}
}
}
The response received from the API is always same as below:
{
"status": "Complete",
"reportingSystem": "RAF",
"timeStamp": "2017-09-01T21:00:14+00:00",
"type": "Application",
"errorCode": "WARN.RAF.APPLICATION",
"instance": "raf-darhlp012-9080",
"message": "{\"OTA_AirLowFareSearchRS\":{\"PricedItinCount\":0,\"BrandedOneWayItinCount\":0,\"SimpleOneWayItinCount\":0,\"DepartedItinCount\":0,\"SoldOutItinCount\":0,\"AvailableItinCount\":0,\"Version\":\"3.2.0\",\"Errors\":{\"Error\":[{\"Type\":\"WORKERTHREAD\",\"ShortText\":\"4666151528036279040\",\"Code\":\"TRANSACTIONID\",\"MessageClass\":\"I\",\"content\":\"\"},{\"Type\":\"SERVER\",\"ShortText\":\"27033\",\"Code\":\"TTFHLP689\",\"MessageClass\":\"I\",\"content\":\"\"},{\"Type\":\"DEFAULT\",\"ShortText\":\"17500\",\"Code\":\"RULEID\",\"MessageClass\":\"I\",\"content\":\"\"},{\"Type\":\"SERVER\",\"Code\":\"MSG\",\"MessageClass\":\"I\",\"content\":\"No Availability\"},{\"Type\":\"ERR\",\"ShortText\":\"No Availability\",\"Code\":\"NAV\",\"content\":\"\"}]}},\"Links\":[{\"rel\":\"self\",\"href\":\""},{\"rel\":\"linkTemplate\",\"href\":\""},{\"rel\":\"tagLookupLinkTemplate\",\"href\":\},{\"rel\":\"paginatedRequestLinkTemplate\",\"href\":\}]}"
}
With different dates and itineraries, the response is always the same.
Your user is probably not active for consuming this service.

Resources