Usually, what I see in multi-city flight search it takes Origin, Destination and Departure date. Example https://www.onetravel.com/flights/multi-city
I am trying to find the API to do this kind of search in Sabre but couldn't find one.
I have seen an answer given on this question: Sabre's SOAP method for multicity search, but the api given in the answer is not taking departure time for all stops.
Any leads would be helpful.
Can you further elaborate this? In BFM one has to add departure times in all segments.
For Multi city just add all segment This is for REST Api BFM Seach
//For 1 City
{
"RPH": "1",
"DepartureDateTime": "2022-04-22T00:00:00",
"OriginLocation": {
"LocationCode": "DAC"
},
"DestinationLocation": {
"LocationCode": "DXB"
}
}
//For 2 City
{
"RPH": "1",
"DepartureDateTime": "2022-04-22T00:00:00",
"OriginLocation": {
"LocationCode": "DAC"
},
"DestinationLocation": {
"LocationCode": "DXB"
}
}, {
"RPH": "2",
"DepartureDateTime": "2022-04-26T00:00:00",
"OriginLocation": {
"LocationCode": "DXB"
},
"DestinationLocation": {
"LocationCode": "JFK"
}
}
//For 3 City
{
"RPH": "1",
"DepartureDateTime": "2022-04-22T00:00:00",
"OriginLocation": {
"LocationCode": "DAC"
},
"DestinationLocation": {
"LocationCode": "DXB"
}
}, {
"RPH": "2",
"DepartureDateTime": "2022-04-26T00:00:00",
"OriginLocation": {
"LocationCode": "DXB"
},
"DestinationLocation": {
"LocationCode": "JFK"
}
}, {
"RPH": "3",
"DepartureDateTime": "2022-04-28T00:00:00",
"OriginLocation": {
"LocationCode": "JFK"
},
"DestinationLocation": {
"LocationCode": "DXB"
}
}
//For 4 City
{
"RPH": "1",
"DepartureDateTime": "2022-04-22T00:00:00",
"OriginLocation": {
"LocationCode": "DAC"
},
"DestinationLocation": {
"LocationCode": "CCU"
}
}, {
"RPH": "2",
"DepartureDateTime": "2022-04-26T00:00:00",
"OriginLocation": {
"LocationCode": "CCU"
},
"DestinationLocation": {
"LocationCode": "KTM"
}
}, {
"RPH": "3",
"DepartureDateTime": "2022-04-28T00:00:00",
"OriginLocation": {
"LocationCode": "KTM"
},
"DestinationLocation": {
"LocationCode": "DXB"
}
}, {
"RPH": "4",
"DepartureDateTime": "2022-05-02T00:00:00",
"OriginLocation": {
"LocationCode": "DXB"
},
"DestinationLocation": {
"LocationCode": "DAC"
}
}
For 5 City You wont get any Itenary and Getting Its Very Rare Case
Related
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.
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.
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
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
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.