Overview

The booking journey can be summarised as follows and this section details how to implement each of these steps:

  1. Retrieve Airports and Ports

    Gather the set of available locations.

  2. Check for Availability

    Checking the availability of Airports/Ports for a specific date/time range.

  3. Obtain a Quotation

    Generating a full pricing breakdown for a specific product.

  4. Place An Order

    Sending all booking information and payment details to the API, and receiving booking confirmation.

Retrieving Airports and Ports

The API can provide a list of available airports and/or ports, should you wish to use it.

Here is how to obtain them from the API:

Note: You can create your own list instead using the list of IATA codes found in the Resources section.

using (var service = new AirportService.AirportServiceContractClient()) {
  var request = new AirportDTO();
  var response = service.AllByCountry("GB"); // Get airports filtered by country
          
  // Loop through response
  foreach (var item in response) {
    // Airport code
    string code = item.Code;

    //Airport name
    string name = item.Name;
  }
}
<?php
// SOAP headers
$headers = new SoapHeader($ns, 'ApiKey', $apikey);

// Soap client
$client = new SoapClient('http://sandbox.travelparkingapps.com/api/v3/AirportService.svc?wsdl');

// Soap parameters
$request = array("countryCode" => "GB");

// Soap results
$results = $client->__soapCall("AllByCountry", array($request), null, $headers);

// Loop through airport results
foreach($results->AllByCountryResult->AirportDTO as $item) {
  // Airport code
  $code = $item->Code;
  
  // Airport name
  $name = $item->Name;
}
?>

Check for Availability

Our API offers 2 web services for each of the product types we support; Airport Parking and Port Parking. This page provides example code snippets for implementing a search in both C# and PHP.

This process sends details of a chosen airport and date/time range to the API, and receives a list of available products and prices by return. This list is referred to as a 'quote' and each item returned in the quote is called a 'product'.

using (var service = new AirportParkingService.AirportParkingServiceContractClient()) {
  // Prepare search criteria
  var request = new AirportParkingQuoteItineraryDTO() {
    Airport = new AirportParkingService.AirportDTO() {
      Code = code
    },
    Dates = new AirportParkingService.DateRangeDTO() {
      From = new AirportParkingService.DateTimeDTO() {
          Date = dropdate,
          Time = droptime
      },
      To = new AirportParkingService.DateTimeDTO() {
          Date = returntime,
          Time = returndate
      }
    }
  };

  // Send the request
  var response = service.SearchAvailability(request);
}
<?php
// SOAP headers
$headers = new SoapHeader($ns, 'ApiKey', $apikey);

// Soap client
$client = new SoapClient('http://sandbox.travelparkingapps.com/api/v3/AirportParkingService.svc?wsdl');

// Soap parameters
$request = array(
  "itinerary" => array(
    "Airport" => array(
     "Code" => $code
    ),
    "Dates" => array(
      "From" => array(
        "Date" => $dateFrom,
        "Time" => $timeFrom
      ),
      "To" => array(
        "Date" => $dateTo,
        "Time" => $timeTo
      )
    )
  )
);

 // Soap results
$results = $client->__soapCall("SearchAvailability", array($request), null, $headers);

$quoteid = $results->SearchAvailabilityResult->Id;
?>

Parking Search (Deep-Linking)

If you can't create a full integration, we can offer a deep-link search service via the Looking4.com website.

The base search urls are:

Airport

Culture Url
en-GB https://www.looking4.com/uk/airport-parking/search-results
fr-FR https://www.looking4.com/fr/parking-a-aeroport/resultats-de-recherche
de-DE https://www.looking4.com/de/flughafen-parkplaetze/suchergebnisse
it-IT https://www.looking4.com/it/parcheggio-aeroporto/risultati-della-ricerca
es-ES https://www.looking4.com/es/aparcamiento-en-el-aeropuerto/resultados-de-busqueda

Port

Culture Url
en-GB https://www.looking4.com/uk/port-parking/search-results
fr-FR https://www.looking4.com/fr/parking-du-port/resultats-de-recherche
de-DE https://www.looking4.com/de/port-parkplatz/suchergebnisse
it-IT https://www.looking4.com/it/parcheggio-porto/risultati-della-ricerca
es-ES https://www.looking4.com/es/estacionamiento-del-puerto/resultados-de-busqueda

Train Station

Culture Url
en-GB Not Available
fr-FR Not Available
de-DE Not Available
it-IT https://www.looking4.com/it/parcheggio-stazione-treni/risultati-della-ricerca
es-ES https://www.looking4.com/es/aparcamiento-en-la-estación-de-tren/resultados-de-busqueda

Below are details of the parameter names and values that must be specified in order to successfully generate a deep-linked search request.

NB: In order for deep-link searches to be traceable back to your application you must supply the campaign code issued by your account manager.

Parameter Type Description Required
LocationCode string The unique identifier for the location
Dates.From.Date date [yyyy-MM-dd] The outbound date
Dates.From.Time time [HH:mm] The outbound time
Dates.To.Date date [yyyy-MM-dd] The return date
Dates.To.Time time [HH:mm] The return time
DiscountCode string A valid promotional discount code
Campaign string Your unique TPA campaign code as supplied by the Travel Parking Group

Examples

Airport Example

https://www.looking4.com/uk/airport-parking/search-results?LocationCode=LHR&Dates.From.Date=2024-10-20&Dates.From.Time=13:00&Dates.To.Date=2024-10-24&Dates.To.Time=13:00&Campaign=TEST

Port Example

https://www.looking4.com/uk/port-parking/search-results?LocationCode=GBDVR&Dates.From.Date=2024-10-20&Dates.From.Time=13:00&Dates.To.Date=2024-10-24&Dates.To.Time=13:00&Campaign=TEST

Train Station Example

https://www.looking4.com/it/parcheggio-stazione-treni/risultati-della-ricerca?LocationCode=03088461&Dates.From.Date=2024-10-20&Dates.From.Time=13:00&Dates.To.Date=2024-10-24&Dates.To.Time=13:00&Campaign=TEST

Locations

Parking location codes can be found here: https://www.travelparkingapps.com/api/docs/Parking/Locations

Obtaining a Quote

Once a car park (a product) has been selected, we must retrieve the quoteID and productID they wish to purchase, to the order form page.

using (var service = new AirportParkingService.AirportParkingServiceContractClient()) {
  // Retrieve quotation
  var response = service.GenerateQuotation(quoteId, productId);

  // Get to and from dates from itineray
  departureDate = Convert.ToDateTime(response.Itinerary.Dates.From.Date + " " + response.Itinerary.Dates.From.Time);
  arrivalDate = Convert.ToDateTime(response.Itinerary.Dates.To.Date + " " + response.Itinerary.Dates.To.Time);
}
<?php
 // SOAP headers
$headers = new SoapHeader($ns, 'ApiKey', $apikey);

// Soap client
$client = new SoapClient('http://sandbox.travelparkingapps.com/api/v3/AirportParkingService.svc?wsdl');

// Soap parameters
$request = array("quoteId" => $quoteid, "productId" => $productid);

// Soap results
$results = $client->__soapCall("GenerateQuotation", array($request), null, $headers);
?>

Placing An Order

This takes all of the contents of the order form and sends them along with the quoteID and productID to the API. A response is returned containing the new order's reference.

using (var service = new AirportParkingService.AirportParkingServiceContractClient()) {
  // Prepare booking itinerary criteria
  var request = new BookingItineraryDTO() {
    QuoteId = quoteId,
    ProductId = productId,
    Customer = new CustomerDTO() {
      Name = name,
      EmailAddress = emailAddress,
      ContactNumber = contactNumber
    },
    Card = new CardDTO() {
      CardHolderName = cardHoldersName,
      CardType = cardType,
      CardNumber = cardNumber,
      ExpiryMonth = Convert.ToInt16(cardExpiryMonth),
      ExpiryYear = Convert.ToInt16(cardExpiryYear),
      SecurityNumber = cardSecurityCode
    },
    Vehicle = new VehicleDTO() {
      Make = carMake,
      Model = carModel,
      Registration = carRegistration,
      Colour = carColour
    },
    Journey = new JourneyDTO() {
      DepartureInfo = new JourneyInfoDTO() {
        Date = departureDate,
        NumberOfPassengers = passengerCount
      },
      ArrivalInfo = new JourneyInfoDTO() {
        Date = arrivalDate,
        NumberOfPassengers = passengerCount
      },
      PassengerCount = passengerCount
    },
    ThirdPartyEmailsEnabled = termsAgree
  };

  // Post booking and get response
  var response = service.GenerateBooking(request);

  // Get order reference from the response
  orderRef = response.OrderReference;
}
<?php
// SOAP headers
$headers = new SoapHeader($ns, 'ApiKey', $apikey);

// Soap client
$client = new SoapClient($port_parking_wsdl);

// Soap parameters
$request =  array(
  "itinerary" => array(           
    "QuoteId" => $quoteid, 
    "ProductId" => $productid,
    "Customer" => array(
      "Name" => $name,
      "EmailAddress" => $email,
      "ContactNumber" => $tel
    ),
    "Card" => array(
      "CardHolderName" => $card_name,
      "CardType" => $card_type,
      "CardNumber" => $card_number,
      "ExpiryMonth" => $card_expiry_month,
      "ExpiryYear" => $card_expiry_year,
      "SecurityNumber" => $card_cvs
    ),
    "Vehicle" => array(
      "Make" => $car_make,
      "Model" => $car_model,
      "Registration" => $car_reg,
      "Colour" => $car_colour
    ),
    "Journey" => array(
      "DepartureInfo" => array(
        "Date" => $destinationdateformat,
        "NumberOfPassengers" => $passenger_count
      ),
      "ArrivalInfo" => array(
        "Date" => $arrivaldateformat,
        "NumberOfPassengers" => $passenger_count
      ),
      "PassengerCount" => $passenger_count
    ),
    "ThirdPartEmailsEnabled" => $agree
  )
);

// Soap results
$results = $client->__soapCall("GenerateBooking", $request, null, $headers);
?>

Localised Content

Localised content is available in two forms:

  • Product Information
  • Currency Conversion

Both of which are explained below.

Product Information

In order to get localised product information for search results and inside additional information windows / modals the API provides a Culture custom SOAP header for specifying which locale you would like the content returned in.

For example (and by default) if set the Culture header to en-GB the content will be returned in English. However, if fr-FR is provided then the content will be returned in French*.

Note: Internally we map these to .NET CultureInfo instances so we only support valid .NET combinations.

using (var service = new AirportParkingService.AirportParkingServiceContractClient()) {
    using (new OperationContextScope(service.InnerChannel)) {

        // Here we explicitly define the culture to use but normally
        // you would pick this up from a customer's preferences
        CultureInfo culture = CultureInfo.GetCultureInfo("en-GB");

        // Create and insert message header for required culture e.g en-GB
        MessageHeader headerNS = MessageHeader.CreateHeader("Culture", ConfigurationManager.AppSettings["NameSpace"].ToString(), culture);
        OperationContext.Current.OutgoingMessageHeaders.Add(headerNS);

        // Prepare search criteria
        var request = new AirportParkingQuoteItineraryDTO() {
            ....
        };

        // Send the request, each product in the response will now have localised information.
        var response = service.SearchAvailability(request);
    }
}
<?php
// Here we explicitly define the culture to use but normally
// you would pick this up from a customer's preferences
$culture = "en-GB";

// Create and insert message header for required culture e.g en-GB
$headers[] = new SoapHeader($ns, 'Culture', $culture);

// Soap client
$client = new SoapClient($airport_parking_wsdl);

// Soap parameters
$request = array(
    "itinerary" => array(
        "Airport" => array(
            "Code" => $code
        ),
        "Dates" => array(
            "From" => array(
                "Date" => $dateFrom,
                "Time" => $timeFrom
            ),
            "To" => array(
                "Date" => $dateTo,
                "Time" => $timeTo
            )
        )
    )
);

// Send the request, each product in the response will now have localised information.
$results = $client->__soapCall("SearchAvailability", array($request), null, $headers);
?>

*One small caveat with this is that if translations don’t exist for the content in the requested locale the API will return back English instead.

Currency Conversion

Currency conversion is instantiated at search level and propagated throughout the rest of the process.

To explicitly request a specific currency for the pricing to be calculated in you would use the CurrencySymbol field on the AirportParkingQuoteItineraryDTO / PortParkingQuoteItineraryDTO.

This tells the API that you want prices sending back in this currency.

By default the API will actually use the default currency of the current culture’s country which is again set using the Culture Header, so for en-GB the default currency is GBP but for en-US the default currency will be USD, and fr-FR is EUR, Etc.

See out Supported Currencies section for more details on specific currency support.

using (var service = new AirportParkingService.AirportParkingServiceContractClient()) {
    using (new OperationContextScope(service.InnerChannel)) {

        // Here we explicitly define the currency but normally
        // you would pick this up from a customer's preferences.
        string currencyCode = "SEK"

        // Prepare search criteria
        var request = new AirportParkingQuoteItineraryDTO() {
            Airport = new AirportParkingService.AirportDTO() {
                Code = code
            },
            Dates = new AirportParkingService.DateRangeDTO() {
                From = new AirportParkingService.DateTimeDTO() {
                    Date = dropdate,
                    Time = droptime
                },
                To = new AirportParkingService.DateTimeDTO() {
                    Date = returntime,
                    Time = returndate
                }
            },

            // Here we assign the desired currency for pricing
            CurrencySymbol = currencyCode
        };

        // Send the request, pricing will be returned calculated in the requested currency.
        var response = service.SearchAvailability(request);
    }
}
<?php
// Here we explicitly define the currency but normally
// you would pick this up from a customer's preferences.
$currencyCode = "SEK"

// SOAP headers
$headers[] = new SoapHeader($ns, 'Culture', $culture);

// Soap client
$client = new SoapClient($airport_parking_wsdl);

// Soap parameters
$request = array(
    "itinerary" => array(
        "Airport" => array(
            "Code" => $code
        ),
        "Dates" => array(
            "From" => array(
                "Date" => $dateFrom,
                "Time" => $timeFrom
            ),
            "To" => array(
                "Date" => $dateTo,
                "Time" => $timeTo
            )
        ),
        "CurrencySymbol" => $currencyCode
    )
);

// Send the request, pricing will be returned calculated in the requested currency.
$results = $client->__soapCall("SearchAvailability", array($request), null, $headers);
?>

Terms And Conditions

Terms and Conditions are available through the GetTermsConditions action on the InformationService and takes a TermsInformationDTO as request parameter.

The action returns a HTML string containing the terms and conditions content, optionally localised into the language specified in the Locale field of the request object.

using (var service = new InformationService.InformationServiceContractClient()) {

    // Prepare request
    var request = new TermsInformationDTO() {
        Type = TermsInformationDTO.TermsType.Parking
    };

    // Send the request to get the terms and conditions.
    var response = service.GetTermsConditions(request);
}
<?php
global $ns, $apikey, $information_wsdl, $culture;
    
// SOAP headers
$headers[] = new SoapHeader($ns, 'ApiKey', $apikey);
$headers[] = new SoapHeader($ns, 'Culture', $culture);

// Soap client
$client = new SoapClient($information_wsdl);
    
// Soap parameters
$request = array(
    "information" => array(         
        "Type" => "Parking"
    )        
);

// Soap results
$results = $client->__soapCall("GetTermsConditions", array($request), null, $headers);   
    
// Get the terms and conditions.
$results->GetTermsConditionsResult;
?>