Connection Guide

Registering to use the service
To obtain an login and password, please register here

Connecting to the service
Xml requests are submitted to api.travelfusion.com/Xml as the body of an HTTP 1.1 POST request. You must connect using https (secure). Please see the general guidelines for information about our secondary system and correct handling of IPs, URLs and DNS.

In general, UTF-8 encoding should be used. The 'Content-Type' and 'Host' header must be submitted in the HTTP headers. GZip compression must be requested in all HTTP requests. (But please note that Travelfusion's servers may not always return gzip compressed results)

Example java and PHP code is supplied below which can be used to submit the login request to the Travelfusion service and obtain a response. You should insert your login and password into the appropriate place (highlighted in red) before executing this code. This code is supplied as guidance only and it is not necessarily functional or correct and is not recommended for use in any application. It is recommended that you consider connection problems very carefully. There are many reasons that a connection to our system may timeout or fail completely. You should detect these cases and implement retries wherever applicable/ safe to do so. 

Java Code Example
import java.io.*;
import java.net.*;
import java.util.zip.*;
import javax.net.ssl.*;

public class TravelfusionXmlClient {

  private final static URL TARGET_URL;
  static {
    try {
      TARGET_URL = new URL("https://api.travelfusion.com");
    } catch (Exception ex) {
      throw new RuntimeException("Unable to initialise target url", ex);
    }
  }

  public static void closeSafely(Closeable closable) {
    if (closable == null) return;
    try {
      closable.close();
    } catch (Exception ex) {
      // Ignored
    }
  }

  public static String sendCommand(String command) throws Exception {
    HttpsURLConnection huc = (HttpsURLConnection) TARGET_URL.openConnection();
    byte[] payload = command.getBytes("UTF-8");
    huc.setRequestMethod("POST");
    huc.setDoInput(true);
    huc.setDoOutput(true);
    huc.setUseCaches(false);
    huc.setAllowUserInteraction(false);
    huc.setConnectTimeout(15000);
    huc.setReadTimeout(120000);
    huc.setRequestProperty("Accept", "text/xml");
    huc.setRequestProperty("Accept-Encoding", "gzip, deflate");
    huc.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
    huc.setRequestProperty("Content-Length", String.valueOf(payload.length));
    OutputStream os = null;
    try {
      os = huc.getOutputStream();
      os.write(payload);
    } finally {
      closeSafely(os);
    }
    InputStream is = null;
    try {
      is = new BufferedInputStream(huc.getResponseCode() >= 400 ? huc.getErrorStream() : huc.getInputStream());
      String hContentEncodingValue = String.valueOf(huc.getContentEncoding()).toLowerCase();
      if (hContentEncodingValue.contains("gzip")) {
        is = new GZIPInputStream(is);
      } else if (hContentEncodingValue.contains("deflate")) {
        is = new InflaterInputStream(is, new Inflater(true));
      }
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      byte[] b = new byte[4096];
      while (true) {
        int read = is.read(b, 0, b.length);
        if (read == -1) {
          break;
        }
        baos.write(b, 0, read);
      }
      return baos.toString("UTF-8");
    } finally {
      closeSafely(is);
    }
  }

  public static void main(String[] args) throws Exception {
String response = sendCommand("<CommandList><Login><Username>user</Username><Password>pwd</Password></Login></CommandList>");
    System.out.println("RESPONSE:" + response);
  }

}

PHP Code Example
<?php
$payload = "<CommandList>
  <Login>
    <Username>user</Username>
    <Password>pwd</Password>
  </Login>
</CommandList>
";
function sendCommand($payload) {
 $headers = array (
   'Accept: text/xml',
   'Accept-Encoding: gzip, deflate',
   'Content-Type: text/xml; charset=utf-8',
   'Content-Length: ' . strlen ( $payload ) 
 );
 $context_options = array (
   'http' => array (
     'method' => 'POST',
     'header' => $headers,
     'content' => $payload,
     'timeout' => 120000,
     'ignore_errors' => true 
   )
 );
 $context = stream_context_create ( $context_options );
 $handle = fopen ( 'compress.zlib://https://api.travelfusion.com', 'r', false, $context );
 $content = stream_get_contents ( $handle );
 fclose ( $handle );
 return $content;
}
$response = sendCommand ( $payload );
print "Response:" . PHP_EOL;
print $response;
?>











           
          
Recommended Timeouts
The timeouts below are examples / guidelines and are subject to the actual typical response times seen at customer's end. 
Each connection to our service involves 2 steps: connection and read. These two steps have separate timeouts.

Connection timeouts:
For all connections at any part of the search/ booking flow, we recommend 2 seconds for the first attempt, retrying if the connection fails, with increasing timeouts. Retry twice with timeouts of 4 seconds and then 8 seconds respectively.

Data read timeouts:
StartRouting: 4s read timeout, retry once with a 15 seconds timeout
CheckRouting: 7s read timeout (and continue with the standard polling process in case of a time out)
StartBooking: 20s read timeout, do NOT retry, instead proceed to CheckBooking
CheckBooking: 10s read timeout (and continue with the standard polling process in case of a time out)
ProcessDetails: 120s read timeout, no retry
ProcessTerms: 120s read timeout, no retry

We recommend careful logging of the number and type of timeouts in all cases and a regular check of this data to ensure that timeout rates are low. Each retry should be logged separately so that you can see how many timeouts occur on the first attempt and how many on each of the subsequent retries.