Travelfusion Direct Connect XML API > Search and Book API
TF Order Change Notification API
tfOrderChangeNotification API offers a set of commands in order to check for any changes (changes made by the traveller at the airline, schedule changes and so on) or cancellations. The customer can then run the core command called GetLatestBookingDetails to receive a detailed breakdown of the booking data with the latest booking details.
The latest booking details look-up consists of the following three step process:
Step 1: Requesting changed or cancelled bookings.
Run the GetBookingUpdates command which returns a list of bookings that were changed or cancelled as per the airline system. This is a distilled list of only bookings that changed or were cancelled for any reason. It guarantees to not spam your system with the bookings that are not relevant.
GetBookingUpdates request XML
<CommandList>
<GetBookingUpdates>
<XmlLoginId>[Travelfusion Login Id]</XmlLoginId>
<LoginId>[Travelfusion Login Id]</LoginId>
</GetBookingUpdates>
</CommandList>
GetBookingUpdates response XML
<CommandList>
<GetBookingUpdates>
<BookingList>
<Booking
ackToken="34e63620-94fa-45e2-86fb-82c98797405b"
branchName="[Branch Name]"
tfBookingReference="[Travelfusion Booking Reference]"
supplierReference="[Supplier PNR]"
/>
<Booking
ackToken="806a6304-08fd-4ebc-a8b1-abf9931a9b4a"
branchName="[Branch Name]"
tfBookingReference="[Travelfusion Booking Reference]"
supplierReference="[Supplier PNR]"
/>
...
</BookingList>
</GetBookingUpdates>
</CommandList>
Step 2: Requesting latest booking details.
Run GetLatestBookingDetails for each booking returned in step 1, this will return a detailed breakdown of the booking. This data can then be used to update records of the bookings in the customer inventory.
The structure of the GetLatestBookingDetails response is similar to the structure of the GetBookingDetails response. The Router (link) and BookingProfile (link) elements generally follow the same structure and ought to be handled in the same way as in TF Direct Connect XML API specification (link). This can include EMD data (in a very structured format), the status of the booking and so on.
The differences between GetLatestBookingDetails and GetBookingDetails are highlighted in red, in the following example.
GetLatestBookingDetails request XML which supports look-up of the supplier booking record and any changes
<CommandList>
<GetLatestBookingDetails>
<XmlLoginId>[Travelfusion Login Id]</XmlLoginId>
<LoginId>[Travelfusion Login Id]</LoginId>
<!-- Either TF booking reference … -->
<TFBookingReference>TFREF000B</TFBookingReference>
<!-- ... or supplier booking reference (PNR, booking locator) needs to be provided -->
<SupplierReference>LTB7ZL</SupplierReference>
</GetLatestBookingDetails>
</CommandList>
GetLatestBookingDetails response XML example
<CommandList>
<GetLatestBookingDetails>
<SupplierReference>LTB7ZL</SupplierReference>
<!--
Status will be one of the following four values:
- Pending - indicates that the supplier system is currently updating the status. Please try again after a few minutes.
- OnHold - indicates that flights (and possibly ancillaries) have been reserved on the supplier system, but not yet charged. Usually a supplier will only hold a reservation for a day or two, and the customer must request ticketing to pay for and secure their booking.
- Ticketed - indicates that the supplier has taken payment and issued tickets (and where relevant EMDs) for this booking.
- Cancelled - indicates that the booking has been cancelled.
-->
<Status>Ticketed</Status>
<TFReference>TFREF000B</TFReference>
<!-- Optional: In case of post booking transactions performed via TF services the following element will contain
a comma-separated list of all related/linked TF references →
<ChangeLinkRefsList>
<ChangeLinkRefs>TFREF000A|TFREF000B|TFREF000C</ChangeLinkRefs>
<ChangeLinkRefs>TFREF000A|TFREF000B|TFREF000D|TFREF000E</ChangeLinkRefs>
</ChangeLinkRefsList>
<!-- More details can be found here -->
<Router>
<Supplier>lufthansagroup</Supplier>
<Complete>false</Complete>
<RequestedLocations>
<Origin>
<Type>Airport</Type>
</Origin>
<Destination>
<Type>Airport</Type>
</Destination>
</RequestedLocations>
<GroupList>
<Group>
<Id>.....</Id>
<OutwardList>
<Outward>
<Id>.....</Id>
<Price>
<Amount>110.00</Amount>
<Currency>EUR</Currency>
<PassengerPriceList>
<PassengerPrice>
<Amount>55.00</Amount>
<Currency>EUR</Currency>
<!-- Optional: TravellerRefs will be a comma-separated list of numbers, each number
referring to a Traveller/@id within the /BookingProfile/TravellerList element. -->
<TravellerRefs>1,2</TravellerRefs>
</PassengerPrice>
</PassengerPriceList>
</Price>
<Duration>380</Duration>
<SegmentList>
<!-- The Segment/@ID attribute value will simply be the segment number
within the itinerary as a whole. So "1" will always refer to the first segment of the outward bound. -->
<Segment id="1">
<Origin>
<Type>airport</Type>
<Code>TXL</Code>
</Origin>
<Destination>
<Type>airport</Type>
<Code>MUC</Code>
<Terminal>2</Terminal>
</Destination>
<DepartDate>06/04/2020-10:20</DepartDate>
<ArriveDate>06/04/2020-11:30</ArriveDate>
<Duration>70</Duration>
<TfOperator>
<Name>Lufthansa</Name>
<Code>LH1</Code>
</TfOperator>
<TfVendingOperator>
<Name>Lufthansa</Name>
<Code>LH1</Code>
</TfVendingOperator>
<Operator>
<Name>Lufthansa</Name>
<Code>LH</Code>
</Operator>
<VendingOperator>
<Name>Lufthansa</Name>
<Code>LH</Code>
</VendingOperator>
<FlightId>
<Code>LH1933</Code>
<Number>1933</Number>
</FlightId>
<TravelClass>
<TfClass>Economy With Restrictions</TfClass>
<SupplierClass>Light</SupplierClass>
<SupplierFareBasisCode>T03LGTM1</SupplierFareBasisCode>
<SupplierRBDCode>T</SupplierRBDCode>
</TravelClass>
<AircraftType>
<AircraftName>Airbus A321</AircraftName>
<AircraftCode>321</AircraftCode>
</AircraftType>
<SupplierInfoList>
<SupplierInfo>
<DisplayName>Status Code</DisplayName>
<InfoType>remark</InfoType>
<Info>HK</Info>
</SupplierInfo>
<SupplierInfo>
<DisplayName>Test Name</DisplayName>
<InfoType>text</InfoType>
<Info>Test Info</Info>
</SupplierInfo>
</SupplierInfoList>
<SegmentMayEndWithAStop>false</SegmentMayEndWithAStop>
</Segment>
<Segment id="2">
<Origin>
<Type>airport</Type>
<Code>MUC</Code>
<Terminal>2</Terminal>
</Origin>
<Destination>
<Type>airport</Type>
<Code>PMI</Code>
</Destination>
<DepartDate>06/04/2020-14:30</DepartDate>
<ArriveDate>06/04/2020-16:40</ArriveDate>
<Duration>130</Duration>
<TfOperator>
<Name>Lufthansa</Name>
<Code>LH1</Code>
</TfOperator>
<TfVendingOperator>
<Name>Lufthansa</Name>
<Code>LH1</Code>
</TfVendingOperator>
<Operator>
<Name>Lufthansa</Name>
<Code>LH</Code>
</Operator>
<VendingOperator>
<Name>Lufthansa</Name>
<Code>LH</Code>
</VendingOperator>
<FlightId>
<Code>LH1796</Code>
<Number>1796</Number>
</FlightId>
<TravelClass>
<TfClass>Economy With Restrictions</TfClass>
<SupplierClass>Light</SupplierClass>
<SupplierFareBasisCode>T03LGTM1</SupplierFareBasisCode>
<SupplierRBDCode>T</SupplierRBDCode>
</TravelClass>
<AircraftType>
<AircraftName>Airbus Industrie A320 (Sharklets)
</AircraftName>
<AircraftCode>32A</AircraftCode>
</AircraftType>
<SupplierInfoList>
<SupplierInfo>
<DisplayName>Status Code</DisplayName>
<InfoType>remark</InfoType>
<Info>HK</Info>
</SupplierInfo>
</SupplierInfoList>
<SegmentMayEndWithAStop>false</SegmentMayEndWithAStop>
</Segment>
</SegmentList>
<SupplierInfoList>
<SupplierInfo>
<DisplayName>Supplier fare type</DisplayName>
<InfoType>text</InfoType>
<Info>Negotiated/Private Fare</Info>
</SupplierInfo>
</SupplierInfoList>
</Outward>
</OutwardList>
<ReturnList>
<Return>
<Id>.....</Id>
<Price>
<Amount>90.00</Amount>
<Currency>EUR</Currency>
<PassengerPriceList>
<PassengerPrice>
<Amount>45.00</Amount>
<Currency>EUR</Currency>
<TravellerRefs>1,2</TravellerRefs>
</PassengerPrice>
</PassengerPriceList>
</Price>
<Duration>250</Duration>
<SegmentList mctViolated="true">
<Segment id="3" mctViolated="true" mctInferred="true" mctMinutes="40">
<Origin>record
<Type>airport</Type>
<Code>PMI</Code>
</Origin>
<Destination>
<Type>airport</Type>
<Code>MUC</Code>
<Terminal>2</Terminal>
</Destination>
<DepartDate>11/04/2020-18:25</DepartDate>
<ArriveDate>11/04/2020-20:30</ArriveDate>
<Duration>125</Duration>
<TfOperator>
<Name>Lufthansa</Name>
<Code>LH1</Code>
</TfOperator>
<TfVendingOperator>
<Name>Lufthansa</Name>
<Code>LH1</Code>
</TfVendingOperator>
<Operator>
<Name>Lufthansa</Name>
<Code>LH</Code>
</Operator>
<VendingOperator>
<Name>Lufthansa</Name>
<Code>LH</Code>
</VendingOperator>
<FlightId>
<Code>LH2661</Code>
<Number>2661</Number>
</FlightId>
<TravelClass>
<TfClass>Economy With Restrictions</TfClass>
<SupplierClass>Light</SupplierClass>
<SupplierFareBasisCode>K03LGTM3</SupplierFareBasisCode>
<SupplierRBDCode>K</SupplierRBDCode>
</TravelClass>
<AircraftType>
<AircraftName>Airbus A320-100/200</AircraftName>
<AircraftCode>320</AircraftCode>
</AircraftType>
<SupplierInfoList>
<SupplierInfo>
<DisplayName>Status Code</DisplayName>
<InfoType>remark</InfoType>
<Info>HK</Info>
</SupplierInfo>
</SupplierInfoList>
<SegmentMayEndWithAStop>false</SegmentMayEndWithAStop>
</Segment>
<Segment id="4">
<Origin>
<Type>airport</Type>
<Code>MUC</Code>
<Terminal>2</Terminal>
</Origin>
<Destination>
<Type>airport</Type>
<Code>TXL</Code>
</Destination>
<DepartDate>11/04/2020-21:30</DepartDate>
<ArriveDate>11/04/2020-22:35</ArriveDate>
<Duration>65</Duration>
<TfOperator>
<Name>Lufthansa</Name>
<Code>LH1</Code>
</TfOperator>
<TfVendingOperator>
<Name>Lufthansa</Name>
<Code>LH1</Code>
</TfVendingOperator>
<Operator>
<Name>Lufthansa</Name>
<Code>LH</Code>
</Operator>
<VendingOperator>
<Name>Lufthansa</Name>
<Code>LH</Code>
</VendingOperator>
<FlightId>
<Code>LH1962</Code>
<Number>1962</Number>
</FlightId>
<TravelClass>
<TfClass>Economy With Restrictions</TfClass>
<SupplierClass>Light</SupplierClass>
<SupplierFareBasisCode>K03LGTM3</SupplierFareBasisCode>
<SupplierRBDCode>K</SupplierRBDCode>
</TravelClass>
<AircraftType>
<AircraftName>Airbus A321</AircraftName>
<AircraftCode>321</AircraftCode>
</AircraftType>
<SupplierInfoList>
<SupplierInfo>
<DisplayName>Status Code</DisplayName>
<InfoType>remark</InfoType>
<Info>HK</Info>
</SupplierInfo>
</SupplierInfoList>
<SegmentMayEndWithAStop>false</SegmentMayEndWithAStop>
</Segment>
</SegmentList>
<SupplierInfoList>
<SupplierInfo>
<DisplayName>Supplier fare type</DisplayName>
<InfoType>text</InfoType>
<Info>Negotiated/Private Fare</Info>
</SupplierInfo>
</SupplierInfoList>
</Return>
</ReturnList>
<Price>
<Amount>490.00</Amount>
<Currency>EUR</Currency>
<PassengerPriceList>
<PassengerPrice>
<Amount>240</Amount>
<Currency>EUR</Currency>
<TaxItemList>
<TaxItem>
<Name>Airport Passenger Security And Noise Charge</Name>
<Amount>14.64</Amount>
<Currency>EUR</Currency>
</TaxItem>
</TaxItemList>
<TravellerRef>1</TravellerRef>
</PassengerPrice>
<PassengerPrice>
<Amount>180</Amount>
<Currency>EUR</Currency>
<TaxItemList>
<TaxItem>
<Name>Airport Passenger Security And Noise Charge</Name>
<Amount>14.64</Amount>
<Currency>EUR</Currency>
</TaxItem>
</TaxItemList>
<TravellerRef>2</TravellerRef>
</PassengerPrice>
</PassengerPriceList>
<TaxItemList>
<TaxItem>
<Name>Airport surcharge</Name>
<Amount>27.45</Amount>
<Currency>EUR</Currency>
</TaxItem>
</TaxItemList>
</Price>
</Group>
</GroupList>
<Features>
<Feature Type="HoldBag">
<Option Currency="EUR" Value="35.00">
<Condition Type="MaxWeight" Value="20 Kg" />
<Condition Type="MaxQuantity" Value="1" />
<!-- Optional: SegmentRefs will be a comma-separated list of numbers, each number
referring to a Segment/@id within the /Router/GroupList/Group/OutwardList/Outward/SegmentList
or /Router/GroupList/Group/ReturnList/Return/SegmentList elements. -->
<Condition Type="SegmentRefs" Value="1,2" />
<!-- Optional: TravellerRefs will be a comma-separated list of numbers, each
number referring to a Traveller/@id within the /BookingProfile/TravellerList element. -->
<Condition Type="TravellerRefs" Value="1" />
</Option>
<Option Currency="EUR" Value="70.00">
<Condition Type="MaxWeight" Value="40 Kg" />
<Condition Type="MaxQuantity" Value="2" />
<Condition Type="SegmentRefs" Value="3,4" />
<Condition Type="TravellerRefs" Value="2" />
</Option>
</Feature>
<Feature Type="Seat" Label="standard">
<Option Currency="EUR" Value="5.00">
<Condition Type="Channel" Value="Online" />
<Condition Type="SupplierClass" Value="BASIC" />
<Condition Type="SegmentRefs" Value="1,2" />
<Condition Type="TravellerRefs" Value="1" />
</Option>
</Feature>
<Feature Type="Seat" Label="Seat reservation with more legroom">
<Option Currency="EUR" Value="10.00">
<Condition Type="Channel" Value="Online" />
<Condition Type="SupplierClass" Value="BASIC" />
<Condition Type="SegmentRefs" Value="1,2" />
<Condition Type="TravellerRefs" Value="2" />
</Option>
</Feature>
<Feature Type="Bike">
<Option Currency="EUR" Value="160.00">
<Condition Type="MaxWeight" Value="35 Kg" />
<Condition Type="MaxQuantity" Value="1" />
<Condition Type="SegmentRefs" Value="1,2,3,4" />
<Condition Type="TravellerRefs" Value="1" />
</Option>
</Feature>
<Feature Type="SpecialAssistance">
<Option Currency="EUR" Value="0.00">
<Condition Type="SegmentRefs" Value="1,2,3,4" />
<Condition Type="TravellerRefs" Value="2" />
</Option>
</Feature>
<Feature Type="SpeedyBoarding" Label="standard">
<Option Currency="EUR" Value="10.00">
<Condition Type="Channel" Value="Airport" />
<Condition Type="SegmentRefs" Value="3,4" />
</Option>
</Feature>
</Features>
<SupplierInfoList>
<SupplierInfo>
<DisplayName>supplier data name 1</DisplayName>
<InfoType>text</InfoType>
<Info>For example text of the T&C</Info>
</SupplierInfo>
<SupplierInfo>
<DisplayName>supplier data name 2</DisplayName>
<InfoType>url</InfoType>
<Info>For example url to the T&C</Info>
</SupplierInfo>
</SupplierInfoList>
</Router>
<BookingProfile>
<TravellerList>
<!-- The Traveller/@ID attribute value will simply be the traveller number within the
traveller list. So "1" will always refer to the Traveller element which appears first in the list. -->
<Traveller id="1">
<Age>40</Age>
<Name>
<Title>Mrs</Title>
<NamePartList>
<NamePart>Hattie</NamePart>
<NamePart>Smith</NamePart>
</NamePartList>
</Name>
<SupplierInfoList>
<SupplierInfo>
<DisplayName>supplier free text data name 1</DisplayName>
<InfoType>text</InfoType>
<Info>TEST 1</Info>
</SupplierInfo>
<SupplierInfo>
<DisplayName>supplier free text data name 2</DisplayName>
<InfoType>text</InfoType>
<Info>TEST 2</Info>
</SupplierInfo>
</SupplierInfoList>
</Traveller>
<Traveller id="2">
<Age>50</Age>
<Name>
<Title>Mr</Title>
<NamePartList>
<NamePart>Jose Luis</NamePart>
<NamePart>Rodriguez</NamePart>
</NamePartList>
</Name>
</Traveller>
</TravellerList>
<ContactDetails>
<WorkPhone>
<Number>02012345678</Number>
</WorkPhone>
<MobilePhone>
<Number>07712345678</Number>
</MobilePhone>
<Email>jose.luis@example.com</Email>
</ContactDetails>
</BookingProfile>
<!-- More details can be found here -->
<TicketInfo>
<Amount>626.50</Amount>
<Currency>EUR</Currency>
<Commission>
<Amount>10.00</Amount>
<Currency>EUR</Currency>
</Commission>
<Fee>
<Amount>4.10</Amount>
<Currency>EUR</Currency>
</Fee>
<TicketList>
<Ticket>
<TicketNumber>11111</TicketNumber>
<TicketStatus>EXCHANGED</TicketStatus>
<Requester source="traveller" inferred="true">external</Requester>
<AgentId>00087654</AgentId>
<TicketIssueDate timezoneSource="agent" ignoreTime="true">25/08/2022-13:45</TicketIssueDate>
<Amount>305.10</Amount>
<Currency>EUR</Currency>
<Commission>
<Amount>3.00</Amount>
<Currency>EUR</Currency>
</Commission>
<Fee>
<Amount>2.10</Amount>
<Currency>EUR</Currency>
</Fee>
<TaxList>
<Tax>
<Name>YQ</Name>
<Amount>18.00</Amount>
<Currency>EUR</Currency>
</Tax>
</TaxList>
<PaymentMethod>Cash</PaymentMethod>
<TicketCoupons>
<Coupon>
<CouponPrice>
<Amount>150.00</Amount>
<Currency>EUR</Currency>
</CouponPrice>
<SegmentRefs>1</SegmentRefs>
<TravellerRefs>1</TravellerRefs>
<SupplierCouponStatus>E</SupplierCouponStatus>
<TFCouponStatus>EXR</TFCouponStatus>
</Coupon>
<Coupon>
<CouponPrice>
<Amount>150.00</Amount>
<Currency>EUR</Currency>
</CouponPrice>
<SegmentRefs>2</SegmentRefs>
<TravellerRefs>1</TravellerRefs>
<SupplierCouponStatus>E</SupplierCouponStatus>
<TFCouponStatus>EXR</TFCouponStatus>
</Coupon>
</TicketCoupons>
</Ticket>
<Ticket>
<TicketNumber>22222</TicketNumber>
<TicketStatus>TICKETED</TicketStatus>
<Requester source="traveller" inferred="true">external</Requester>
<AgentId>00087654</AgentId>
<TicketIssueDate timezoneSource="agent" ignoreTime="true">02/09/2022-23:55</TicketIssueDate>
<Amount>0.00</Amount>
<Currency>EUR</Currency>
<Commission>
<Amount>0.00</Amount>
<Currency>EUR</Currency>
</Commission>
<PaymentMethod>Cash</PaymentMethod>
<TicketCoupons>
<Coupon>
<SegmentRefs>1</SegmentRefs>
<TravellerRefs>1</TravellerRefs>
<SupplierCouponStatus>O</SupplierCouponStatus>
<TFCouponStatus>OPN</TFCouponStatus>
</Coupon>
<Coupon>
<SegmentRefs>2</SegmentRefs>
<TravellerRefs>1</TravellerRefs>
<SupplierCouponStatus>O</SupplierCouponStatus>
<TFCouponStatus>OPN</TFCouponStatus>
</Coupon>
</TicketCoupons>
<OriginalIssueInfo>
<TicketNumber>11111</TicketNumber>
</OriginalIssueInfo>
</Ticket>
<Ticket>
<TicketNumber>33333</TicketNumber>
<TicketStatus>TICKETED</TicketStatus>
<Requester source="traveller" inferred="true">external</Requester>
<AgentId>00087654</AgentId>
<TicketIssueDate timezoneSource="agent" ignoreTime="true">02/09/2022-23:55</TicketIssueDate>
<Amount>200.00</Amount>
<Currency>EUR</Currency>
<Commission>
<Amount>0.00</Amount>
<Currency>EUR</Currency>
</Commission>
<PaymentMethod>Cash</PaymentMethod>
<TicketCoupons>
<Coupon>
<SegmentRefs>1</SegmentRefs>
<TravellerRefs>1</TravellerRefs>
<SupplierCouponStatus>O</SupplierCouponStatus>
<TFCouponStatus>OPN</TFCouponStatus>
</Coupon>
<Coupon>
<SegmentRefs>2</SegmentRefs>
<TravellerRefs>1</TravellerRefs>
<SupplierCouponStatus>O</SupplierCouponStatus>
<TFCouponStatus>OPN</TFCouponStatus>
</Coupon>
</TicketCoupons>
<ConnectedTicketNumber>22222</ConnectedTicketNumber>
</Ticket>
<Ticket>
<TicketNumber>44444</TicketNumber>
<TicketStatus>REFUNDED</TicketStatus>
<Requester>internal</Requester>
<AgentId>00087654</AgentId>
<TicketIssueDate>05/09/2022-13:20</TicketIssueDate>
<Amount>107.30</Amount>
<Currency>EUR</Currency>
<Commission>
<Amount>5.00</Amount>
<Currency>EUR</Currency>
</Commission>
<Fee>
<Amount>2.30</Amount>
<Currency>EUR</Currency>
</Fee>
<TaxList>
<Tax>
<Name>YQ</Name>
<Amount>18.00</Amount>
<Currency>EUR</Currency>
</Tax>
</TaxList>
<PaymentMethod>Cash</PaymentMethod>
<TicketCoupons>
<Coupon>
<CouponPrice>
<Amount>50.00</Amount>
<Currency>EUR</Currency>
</CouponPrice>
<SegmentRefs>1</SegmentRefs>
<TravellerRefs>2</TravellerRefs>
<SupplierCouponStatus>R</SupplierCouponStatus>
<TFCouponStatus>RFD</TFCouponStatus>
</Coupon>
<Coupon>
<CouponPrice>
<Amount>50.00</Amount>
<Currency>EUR</Currency>
</CouponPrice>
<SegmentRefs>2</SegmentRefs>
<TravellerRefs>2</TravellerRefs>
<SupplierCouponStatus>R</SupplierCouponStatus>
<TFCouponStatus>RFD</TFCouponStatus>
</Coupon>
</TicketCoupons>
<RefundPrice>
<Amount>107.30</Amount>
<Currency>EUR</Currency>
<Commission>
<Amount>5.00</Amount>
<Currency>EUR</Currency>
</Commission>
<Fee>
<Amount>2.30</Amount>
<Currency>EUR</Currency>
</Fee>
<TaxList>
<Tax>
<Name>YQ</Name>
<Amount>18.00</Amount>
<Currency>EUR</Currency>
</Tax>
</TaxList>
</RefundPrice>
</Ticket>
</TicketList>
</TicketInfo>
<!-- Note that *ALL* elements of the EmdList structure must be assumed to be optional (will not
make an appearance at all, or will be empty), except those explicitly labelled as mandatory. -->
<EmdList>
<!-- If an EmdList element exists then it will contain at least one Emd child element. -->
<Emd>
<!-- Optional: if the supplier response gives the document number of the EMD then it
will be shown here (with any checksum digit removed). -->
<DocumentNumber>1234567890123</DocumentNumber>
<EmdStatus>ISSUED</EmdStatus>
<!-- Optional: the EmdPrice element describes the combined cost of the EMD and all of
its coupons. -->
<Requester>external</Requester>
<EmdPrice>
<!-- The Amount and Currency elements will be mandatory if an EmdPrice element exists. -->
<Amount>25.00</Amount>
<Currency>GBP</Currency>
</EmdPrice>
<!-- Optional: If the supplier does not provide data at the EMD coupon level, then an
EmdData element might be found which describes the EMD as a whole. In the worst case, if the supplier
gives no detailed EMD data, then neither an EmdData element nor an EmdCoupons element would appear. -->
<EmdData>
<!-- Optional: TicketNumberRefs will be a comma-separated list of numbers, each number
referring to a /TicketInfo/TicketList/Ticket/TicketNumber entry. Typically only a single ticket is expected
to be referenced, but the option is left open for multiple references. -->
<TicketNumberRefs>1234567890</TicketNumberRefs>
<RFIC>
<!-- The Code element will be mandatory if an RFIC element exists. -->
<Code>A</Code>
<Label>Air Transportation</Label>
</RFIC>
<RFIS>
<!-- The Code element will be mandatory if an RFIS element exists. -->
<Code>0B5</Code>
<Description>SEAT RESERVATION</Description>
<Detail>12A</Detail>
</RFIS>
<!-- Optional: SegmentRefs will be a comma-separated list of numbers, each number
referring to a Segment/@id within the /Router/GroupList/Group/OutwardList/Outward/SegmentList
or /Router/GroupList/Group/ReturnList/Return/SegmentList elements. Typically only a single segment is expected
to be referenced, but the option is left open for multiple references. -->
<SegmentRefs>1</SegmentRefs>
<!-- Optional: TravellerRefs will be a comma-separated list of numbers, each number
referring to a Traveller/@id within the /BookingProfile/TravellerList element. Typically only a single traveller
will be referenced by an EMD, but the option is left open for multiple references. -->
<TravellerRefs>1</TravellerRefs>
</EmdData>
<!-- Optional: The EmdCoupons element will only appear if the supplier gives data at
the EMD coupon level. Note that in this example both EmdData and EmdCoupons elements are shown side by
side, but this would not occur in a real Emd element: it would be one or the other or neither. -->
<EmdCoupons>
<!-- If an EmdCoupons element exists then it will contain at least one Coupon child
element. -->
<Coupon>
<!-- Optional: TicketNumberRefs will be a comma-separated list of numbers, each
number referring to a /TicketInfo/TicketList/Ticket/TicketNumber entry. Typically only a single ticket
is expected to be referenced, but the option is left open for multiple references. -->
<TicketNumberRefs>1234567890</TicketNumberRefs>
<RFIC>
<!-- The Code element will be mandatory if an RFIC element exists. -->
<Code>A</Code>
<Label>Air Transportation</Label>
</RFIC>
<RFIS>
<!-- The Code element will be mandatory if an RFIS element exists. -->
<Code>0B5</Code>
<Description>SEAT RESERVATION</Description>
<Detail>12A</Detail>
</RFIS>
<CouponPrice>
<!-- The Amount and Currency elements will be mandatory if a CouponPrice
element exists. -->
<Amount>12.50</Amount>
<Currency>GBP</Currency>
</CouponPrice>
<!-- Optional: SegmentRefs will be a comma-separated list of numbers, each number
referring to a Segment/@id within the /Router/GroupList/Group/OutwardList/Outward/SegmentList
or /Router/GroupList/Group/ReturnList/Return/SegmentList elements. Typically only a single segment is expected
to be referenced, but the option is left open for multiple references. -->
<SegmentRefs>1</SegmentRefs>
<!-- Optional: TravellerRefs will be a comma-separated list of numbers, each number
referring to a Traveller/@id within the /BookingProfile/TravellerList element. Typically only a single traveller
will be referenced by an EMD, but the option is left open for multiple references. -->
<TravellerRefs>1</TravellerRefs>
<!-- Optional: SupplierCouponStatus will show a coupon status code taken straight from the supplier response. -->
<SupplierCouponStatus>O</SupplierCouponStatus>
<!-- Optional: TFCouponStatus will show a Travelfusion standardized code representing our understanding of the coupon status, based on information found in the supplier response. -->
<TFCouponStatus>OPN</TFCouponStatus>
</Coupon>
<Coupon>
<TicketNumberRefs>1234567890</TicketNumberRefs>
<RFIC>
<Code>A</Code>
<Label>Air Transportation</Label>
</RFIC>
<RFIS>
<Code>0B5</Code>
<Description>SEAT RESERVATION</Description>
<Detail>12E</Detail>
</RFIS>
<CouponPrice>
<Amount>12.50</Amount>
<Currency>GBP</Currency>
</CouponPrice>
<SegmentRefs>2</SegmentRefs>
<TravellerRefs>1</TravellerRefs>
<SupplierCouponStatus>O</SupplierCouponStatus>
<TFCouponStatus>OPN</TFCouponStatus>
</Coupon>
</EmdCoupons>
</Emd>
<Emd>
<DocumentNumber>1234567890124</DocumentNumber>
<EmdStatus>ISSUED</EmdStatus>
<Requester>external</Requester>
<EmdPrice>
<Amount>70.00</Amount>
<Currency>GBP</Currency>
</EmdPrice>
<EmdCoupons>
<Coupon>
<TicketNumberRefs>12345678901234567890623</TicketNumberRefs>
<RFIC>
<Code>C</Code>
<Label>Baggage</Label>
</RFIC>
<RFIS>
<Code>0CC</Code>
<Description>1ST BAG UPTO50LB23KG 62LI158CM</Description>
</RFIS>
<CouponPrice>
<Amount>35.00</Amount>
<Currency>GBP</Currency>
</CouponPrice>
<SegmentRefs>1</SegmentRefs>
<TravellerRefs>1</TravellerRefs>
<SupplierCouponStatus>O</SupplierCouponStatus>
<TFCouponStatus>OPN</TFCouponStatus>
</Coupon>
<Coupon>
<TicketNumberRefs>1234567890</TicketNumberRefs>
<RFIC>
<Code>C</Code>
<Label>Baggage</Label>
</RFIC>
<RFIS>
<Code>0CC</Code>
<Description>1ST BAG UPTO50LB23KG 62LI158CM</Description>
</RFIS>
<CouponPrice>
<Amount>35.00</Amount>
<Currency>GBP</Currency>
</CouponPrice>
<SegmentRefs>2</SegmentRefs>
<TravellerRefs>1</TravellerRefs>
<SupplierCouponStatus>O</SupplierCouponStatus>
<TFCouponStatus>OPN</TFCouponStatus>
</Coupon>
</EmdCoupons>
</Emd>
<Emd>
<DocumentNumber>1234567890125</DocumentNumber>
<EmdStatus>REFUNDED</EmdStatus>
<Requester>external</Requester>
<EmdPrice>
<Amount>25.00</Amount>
<Currency>GBP</Currency>
</EmdPrice>
<EmdCoupons>
<Coupon>
<TicketNumberRefs>1234567890</TicketNumberRefs>
<RFIC>
<Code>A</Code>
<Label>Air Transportation</Label>
</RFIC>
<RFIS>
<Code>0B5</Code>
<Description>SEAT RESERVATION</Description>
<Detail>12B</Detail>
</RFIS>
<CouponPrice>
<Amount>12.50</Amount>
<Currency>GBP</Currency>
</CouponPrice>
<SegmentRefs>1</SegmentRefs>
<TravellerRefs>2</TravellerRefs>
<SupplierCouponStatus>O</SupplierCouponStatus>
<TFCouponStatus>OPN</TFCouponStatus>
</Coupon>
<Coupon>
<TicketNumberRefs>1234567890</TicketNumberRefs>
<RFIC>
<Code>A</Code>
<Label>Air Transportation</Label>
</RFIC>
<RFIS>
<Code>0B5</Code>
<Description>SEAT RESERVATION</Description>
<Detail>12F</Detail>
</RFIS>
<CouponPrice>
<Amount>12.50</Amount>
<Currency>GBP</Currency>
</CouponPrice>
<SegmentRefs>2</SegmentRefs>
<TravellerRefs>2</TravellerRefs>
<SupplierCouponStatus>O</SupplierCouponStatus>
<TFCouponStatus>OPN</TFCouponStatus>
</Coupon>
</EmdCoupons>
<RefundPrice>
<Amount>25.00</Amount>
<Currency>GBP</Currency>
</RefundPrice>
</Emd>
</EmdList>
</GetLatestBookingDetails>
</CommandList>
Step 3: Acknowledge booking update.
Run AcknowledgeBookingUpdates. This command needs to be used to let Travelfusion know the above set of bookings were successfully ingested. In case there is a break in the flow for any reason, you can simply rerun the above steps to complete the updating without the worry a small set of records were missed because of a communications break.
AcknowledgeBookingUpdates request XML
<CommandList>
<AcknowledgeBookingUpdates>
<XmlLoginId>[Travelfusion Login Id]</XmlLoginId>
<LoginId>[Travelfusion Login Id]</LoginId>
<BookingList>
<Booking token="34e63620-94fa-45e2-86fb-82c98797405b"/>
<Booking token="806a6304-08fd-4ebc-a8b1-abf9931a9b4a"/>
...
</BookingList>
</AcknowledgeBookingUpdates>
</CommandList>
AcknowledgeBookingUpdates response XML
<CommandList>
<AcknowledgeBookingUpdates>
<BookingList>
<Booking token="34e63620-94fa-45e2-86fb-82c98797405b" succeeded="true"/>
<Booking token="806a6304-08fd-4ebc-a8b1-abf9931a9b4a" succeeded="true"/>
...
</BookingList>
</AcknowledgeBookingUpdates>
</CommandList>
The above 3 steps should be frequently run as part of a scheduled task to constantly update records on your side.