Travelfusion Direct Connect XML API > Guidelines >
Multi-bound and Open-jaw itineraries
Multi-bound
The Travelfusion API generally only supports itineraries with one or two bounds. A one-way itinerary has one bound (the outward bound), and a round-trip itinerary has two bounds (the outward bound and the inward bound).
However, some airlines support itineraries with as many as six bounds, making it possible to search, price, and book a journey which visits several different destinations across several different dates. Support is being added to selected Travelfusion integrations to allow searches which involve more than two bounds, and this page describes the AdditionalTripList feature which enables this.
Open-jaw
Some airlines permit open-jaw itineraries, where the airport or city the traveller departs from may not be the same as the arrival airport of the previous bound, or where the final airport or city the traveller arrives at may not be the same as the airport they originally departed from.
For example, an airline which does not permit open-jaw would only allow a round-trip from AAA-BBB and then BBB-AAA. But an airline which supports open-jaw itineraries might allow AAA-BBB followed by BBB-CCC, or AAA-BBB followed by CCC-AAA, or even AAA-BBB followed by CCC-DDD. Support is being added to selected Travelfusion integrations to allow open-jaw searches, and this page describes the AdditionalTripList feature which enables this.
StartRouting request with AdditionalTripList
The standard Travelfusion StartRouting request cannot represent a multi-bound itinerary or an open-jaw itinerary, so a new, optional XML structure has been defined to allow you to request such searches where the supplier and our integration support this. See below for our list of integrations which currently support these features.
The new structure is contained within an element named AdditionalTripList which must appear immediately after the OutwardDates element within your StartRouting request, and which replaces the ReturnDates element completely.
Open-jaw example
As an example, suppose we want to search for an open-jaw itinerary so that we travel LHR-CDG on 1st November and then travel CDG-EDI on 3rd November. The relevant section of the StartRouting request would look like this:
Open-jaw StartRouting request
<Origin>
<Descriptor>LHR</Descriptor>
<Type>airportcode</Type>
<Radius>1</Radius>
</Origin>
<Destination>
<Descriptor>CDG</Descriptor>
<Type>airportcode</Type>
<Radius>1</Radius>
</Destination>
<OutwardDates>
<DateOfSearch>01/11/2020-14:00</DateOfSearch>
</OutwardDates>
<AdditionalTripList>
<AdditionalTrip>
<Origin>
<Descriptor>CDG</Descriptor>
<Type>airportcode</Type>
<Radius>1</Radius>
</Origin>
<Destination>
<Descriptor>EDI</Descriptor>
<Type>airportcode</Type>
<Radius>1</Radius>
</Destination>
<OutwardDates>
<DateOfSearch>03/11/2020-14:00</DateOfSearch>
</OutwardDates>
</AdditionalTrip>
</AdditionalTripList>
<MaxChanges>2</MaxChanges>
<MaxHops>4</MaxHops>
The standard StartRouting elements Origin and Destination are used to describe the start and end points of the first bound, and the OutwardDates element describes the date of travel for that first bound. Then an AdditionalTrip element is used to describe the start and end points for the second bound, and the OutwardDates element within that AdditionalTrip describes the date of travel for this second bound.
Note that when using AdditionalTripList, the values for MaxChanges and MaxHops apply to the entire itinerary, so their values must be increased to avoid results being filtered out.
Multi-bound example
Suppose a traveller wants to gather all of the following trips under a single booking:
LHR-ARN departing 4th January,
GOT-PRG departing 12th January,
PRG-BCN departing 14th January,
MAD-FRA departing 20th January,
MUC-LAX departing 26th January,
LAX-LHR departing 12th April.
The relevant section of the StartRouting request would look like this:
Multi-bound StartRouting request
<Origin>
<Descriptor>LHR</Descriptor>
<Type>airportcode</Type>
<Radius>1</Radius>
</Origin>
<Destination>
<Descriptor>ARN</Descriptor>
<Type>airportcode</Type>
<Radius>1</Radius>
</Destination>
<OutwardDates>
<DateOfSearch>04/01/2020-14:00</DateOfSearch>
</OutwardDates>
<AdditionalTripList>
<AdditionalTrip>
<Origin>
<Descriptor>GOT</Descriptor>
<Type>airportcode</Type>
<Radius>1</Radius>
</Origin>
<Destination>
<Descriptor>PRG</Descriptor>
<Type>airportcode</Type>
<Radius>1</Radius>
</Destination>
<OutwardDates>
<DateOfSearch>12/01/2020-14:00</DateOfSearch>
</OutwardDates>
</AdditionalTrip>
<AdditionalTrip>
<Origin>
<Descriptor>PRG</Descriptor>
<Type>airportcode</Type>
<Radius>1</Radius>
</Origin>
<Destination>
<Descriptor>BCN</Descriptor>
<Type>airportcode</Type>
<Radius>1</Radius>
</Destination>
<OutwardDates>
<DateOfSearch>14/01/2020-14:00</DateOfSearch>
</OutwardDates>
</AdditionalTrip>
<AdditionalTrip>
<Origin>
<Descriptor>MAD</Descriptor>
<Type>airportcode</Type>
<Radius>1</Radius>
</Origin>
<Destination>
<Descriptor>FRA</Descriptor>
<Type>airportcode</Type>
<Radius>1</Radius>
</Destination>
<OutwardDates>
<DateOfSearch>20/01/2020-14:00</DateOfSearch>
</OutwardDates>
</AdditionalTrip>
<AdditionalTrip>
<Origin>
<Descriptor>MUC</Descriptor>
<Type>airportcode</Type>
<Radius>1</Radius>
</Origin>
<Destination>
<Descriptor>LAX</Descriptor>
<Type>airportcode</Type>
<Radius>1</Radius>
</Destination>
<OutwardDates>
<DateOfSearch>26/01/2020-14:00</DateOfSearch>
</OutwardDates>
</AdditionalTrip>
<AdditionalTrip>
<Origin>
<Descriptor>LAX</Descriptor>
<Type>airportcode</Type>
<Radius>1</Radius>
</Origin>
<Destination>
<Descriptor>LHR</Descriptor>
<Type>airportcode</Type>
<Radius>1</Radius>
</Destination>
<OutwardDates>
<DateOfSearch>12/04/2020-14:00</DateOfSearch>
</OutwardDates>
</AdditionalTrip>
</AdditionalTripList>
<MaxChanges>12</MaxChanges>
<MaxHops>14</MaxHops>
And if the airline supports open-jaw itineraries then the final destination would not need to be LHR, but could be any other airport.
Note that in AdditionalTripList mode the MaxChanges and MaxHops values represent the entire itinerary. These values must be set to a value high enough to reflect the fact that the combined itinerary will involve many different flight segments. Using values which are too low will mean that you’ll receive an error to say that all results have been filtered out. If this happens then increase the values of MaxChanges and MaxHops until you see results being returned.
Important notes about AdditionalTripList
It is valid to include a Radius element, but currently the value of the Radius element is ignored when using AdditionalTripList mode.
The value of Type cannot be “airportgroup” when AdditionalTripList mode is used. The value must be “airportcode” or “citycode” or “trainstationcode” and must be appropriate to the supplier being requested. Location groups cannot be used because of the exponential number of combinations that are produced by increasing the number of bounds.
CheckRouting response based on AdditionalTripList
When a search has been requested using a StartRouting request which uses AdditionalTripList, the CheckRouting response will come back with the structure of a one-way itinerary. All of the segments will be found within a single Result element, and the departure dates of the different segments may be separated by days, weeks, or months depending on the travel dates you specified within the AdditionalTripList.
Here is an example of how a result would appear, held entirely within an Outward element within the CheckRouting response, if the search requested an itinerary with three bounds: MAD-LGW, followed by MAN-LIN, followed by FCO-EDI.
CheckRouting response example
<Outward>
<Id>M46AF44NHQRXV1JY</Id>
<CacheInfo>
<CacheDataAgeSeconds>0</CacheDataAgeSeconds>
</CacheInfo>
<Price>
<Amount>520.17</Amount>
<Currency>GBP</Currency>
<PriceIncludesTax>true</PriceIncludesTax>
<PassengerPriceList>
<PassengerPrice>
<Amount>520.17</Amount>
<Currency>GBP</Currency>
<PriceIncludesTax>true</PriceIncludesTax>
<TaxItemList>
<TaxItem>
<Name>Total tax</Name>
<Amount>129.17</Amount>
<Currency>GBP</Currency>
</TaxItem>
</TaxItemList>
<Age>30</Age>
</PassengerPrice>
</PassengerPriceList>
</Price>
<Duration>17915</Duration>
<SegmentList>
<Segment>
<Origin>
<Type>airport</Type>
<Code>MAD</Code>
<Terminal>4</Terminal>
</Origin>
<Destination>
<Type>airport</Type>
<Code>LGW</Code>
<Terminal>S</Terminal>
</Destination>
<DepartDate>15/12/2019-08:50</DepartDate>
<ArriveDate>15/12/2019-10:10</ArriveDate>
<Duration>140</Duration>
<TfOperator>
<Name>Iberia Express</Name>
<Code>I21</Code>
</TfOperator>
<TfVendingOperator>
<Name>British Airways</Name>
<Code>BA</Code>
</TfVendingOperator>
<Operator>
<Name>Iberia Express</Name>
<Code>I2</Code>
</Operator>
<VendingOperator>
<Name>British Airways</Name>
<Code>BA</Code>
</VendingOperator>
<FlightId>
<Code>BA7284</Code>
<Number>7284</Number>
</FlightId>
<TravelClass>
<TfClass>Economy With Restrictions</TfClass>
<SupplierClass>Economy Economy</SupplierClass>
<SupplierFareBasisCode>OI2V2A/Y</SupplierFareBasisCode>
<SupplierRBDCode>O</SupplierRBDCode>
</TravelClass>
<AircraftType>
<AircraftName>Airbus A320 jet</AircraftName>
<AircraftCode>320</AircraftCode>
</AircraftType>
<SegmentMayEndWithAStop>false</SegmentMayEndWithAStop>
</Segment>
<Segment>
<Origin>
<Type>airport</Type>
<Code>MAN</Code>
<Terminal>3</Terminal>
</Origin>
<Destination>
<Type>airport</Type>
<Code>LHR</Code>
<Terminal>5</Terminal>
</Destination>
<DepartDate>20/12/2019-12:45</DepartDate>
<ArriveDate>20/12/2019-13:55</ArriveDate>
<Duration>70</Duration>
<TfOperator>
<Name>British Airways</Name>
<Code>BA</Code>
</TfOperator>
<TfVendingOperator>
<Name>British Airways</Name>
<Code>BA</Code>
</TfVendingOperator>
<Operator>
<Name>British Airways</Name>
<Code>BA</Code>
</Operator>
<VendingOperator>
<Name>British Airways</Name>
<Code>BA</Code>
</VendingOperator>
<FlightId>
<Code>BA1395</Code>
<Number>1395</Number>
</FlightId>
<TravelClass>
<TfClass>Economy With Restrictions</TfClass>
<SupplierClass>Economy Plus</SupplierClass>
<SupplierFareBasisCode>LV2R/N</SupplierFareBasisCode>
<SupplierRBDCode>L</SupplierRBDCode>
</TravelClass>
<AircraftType>
<AircraftName>Airbus A319 jet</AircraftName>
<AircraftCode>319</AircraftCode>
</AircraftType>
<SegmentMayEndWithAStop>false</SegmentMayEndWithAStop>
</Segment>
<Segment>
<Origin>
<Type>airport</Type>
<Code>LHR</Code>
<Terminal>5</Terminal>
</Origin>
<Destination>
<Type>airport</Type>
<Code>LIN</Code>
</Destination>
<DepartDate>20/12/2019-14:55</DepartDate>
<ArriveDate>20/12/2019-17:55</ArriveDate>
<Duration>120</Duration>
<TfOperator>
<Name>British Airways</Name>
<Code>BA</Code>
</TfOperator>
<TfVendingOperator>
<Name>British Airways</Name>
<Code>BA</Code>
</TfVendingOperator>
<Operator>
<Name>British Airways</Name>
<Code>BA</Code>
</Operator>
<VendingOperator>
<Name>British Airways</Name>
<Code>BA</Code>
</VendingOperator>
<FlightId>
<Code>BA568</Code>
<Number>568</Number>
</FlightId>
<TravelClass>
<TfClass>Economy With Restrictions</TfClass>
<SupplierClass>Economy Plus</SupplierClass>
<SupplierFareBasisCode>LV2R/Y</SupplierFareBasisCode>
<SupplierRBDCode>L</SupplierRBDCode>
</TravelClass>
<AircraftType>
<AircraftName>Airbus A321 jet</AircraftName>
<AircraftCode>321</AircraftCode>
</AircraftType>
<SegmentMayEndWithAStop>false</SegmentMayEndWithAStop>
</Segment>
<Segment>
<Origin>
<Type>airport</Type>
<Code>FCO</Code>
<Terminal>3</Terminal>
</Origin>
<Destination>
<Type>airport</Type>
<Code>LCY</Code>
</Destination>
<DepartDate>27/12/2019-15:05</DepartDate>
<ArriveDate>27/12/2019-16:40</ArriveDate>
<Duration>155</Duration>
<TfOperator>
<Name>BA Cityflyer</Name>
<Code>CJ</Code>
</TfOperator>
<TfVendingOperator>
<Name>British Airways</Name>
<Code>BA</Code>
</TfVendingOperator>
<Operator>
<Name>BA Cityflyer</Name>
<Code>CJ</Code>
</Operator>
<VendingOperator>
<Name>British Airways</Name>
<Code>BA</Code>
</VendingOperator>
<FlightId>
<Code>BA7348</Code>
<Number>7348</Number>
</FlightId>
<TravelClass>
<TfClass>Economy With Restrictions</TfClass>
<SupplierClass>Economy Plus</SupplierClass>
<SupplierFareBasisCode>KV2CO/Y</SupplierFareBasisCode>
<SupplierRBDCode>K</SupplierRBDCode>
</TravelClass>
<AircraftType>
<AircraftName>Embraer E190SR</AircraftName>
<AircraftCode>E90</AircraftCode>
</AircraftType>
<SegmentMayEndWithAStop>false</SegmentMayEndWithAStop>
</Segment>
<Segment>
<Origin>
<Type>airport</Type>
<Code>LCY</Code>
</Origin>
<Destination>
<Type>airport</Type>
<Code>EDI</Code>
</Destination>
<DepartDate>27/12/2019-17:10</DepartDate>
<ArriveDate>27/12/2019-18:25</ArriveDate>
<Duration>75</Duration>
<TfOperator>
<Name>BA Cityflyer</Name>
<Code>CJ</Code>
</TfOperator>
<TfVendingOperator>
<Name>British Airways</Name>
<Code>BA</Code>
</TfVendingOperator>
<Operator>
<Name>BA Cityflyer</Name>
<Code>CJ</Code>
</Operator>
<VendingOperator>
<Name>British Airways</Name>
<Code>BA</Code>
</VendingOperator>
<FlightId>
<Code>BA8712</Code>
<Number>8712</Number>
</FlightId>
<TravelClass>
<TfClass>Economy With Restrictions</TfClass>
<SupplierClass>Economy Plus</SupplierClass>
<SupplierFareBasisCode>OADDV2YO/Y</SupplierFareBasisCode>
<SupplierRBDCode>O</SupplierRBDCode>
</TravelClass>
<AircraftType>
<AircraftName>Embraer E190SR</AircraftName>
<AircraftCode>E90</AircraftCode>
</AircraftType>
<SegmentMayEndWithAStop>false</SegmentMayEndWithAStop>
</Segment>
</SegmentList>
</Outward>
Note that the segments from all three bounds are found within the one Outward/SegmentList element.
If your software is already able to handle a Travelfusion CheckRouting response which contains one-way results having any number of segments, then your software ought to be able to handle a multi-bound or open-jaw result in this form.
In later stages (Details, Terms, Booking), the usual Travelfusion flow is used, and no special handling should be required on your side.
Integrations currently supporting AdditionalTripList
Currently only our British Airways (“britishairways”) integration supports the AdditionalTripList mode, and can handle both multi-bound and open-jaw itineraries.