1. Getting Started

This page is meant as a quick start guide for integrating with Carnect car hire platform using SOAP (https://api.carhire-solutions.com/service.asmx). All mentioned terms, abbreviations, etc. in this document are based on the Open Travel Alliance 2007A Specifications. Please find all information regarding the OTA specifications under https://opentravel.org.

Make sure you have your credentials available and your IP range has been whitelisted for access. As well, pay special attention to HTTP compression. If you don’t configure your http/SOAP client to use http 1.1 and make sure that it is sending the header Accept-Encoding: gzip you will end up receiving a „403 Forbidden“ error!

1.1. System Information

The main function of the car platform is to provide all necessary and/or required information within a short limited time period.

1.1.1. Search Geographic

1.1.1.1. Search by Geo-point

A search by geo-point can be carried out by using the latitude and longitude of a given geo-point.

Search will return offers of multiple suppliers located within the system defined radius around the given geo-point.

1.1.1.2. Search by Airport

A search by airport can be carried out by using the airport IATA-Code or airport ID.

Search will return offers of multiple suppliers located at the airport.

1.1.1.3. Search by City

A search by city can be carried out by using the a city ID or by using a geo-point.

Search will return offers of multiple suppliers located within the city (downtown). If a supplier is only located at the airport, offers are also be returned for city search if the location is in the given radius.

1.1.1.4. Search by Location

A search by location can be carried out by using

  • Location ID (assigned only to one supplier)

  • Location code and GDS code (queries only one supplier)

Location is always unique to a single supplier and therefore a search will not return offers from multiple suppliers.

Note

To request for a specific location of a supplier it is always recommended to request with GDS Code + location code!

1.1.2. System Access

Client partners implementing access of the OTA2007A interface need to test their implementation first before setting their software productive. For testing please use this URL

Staging web-service URL: https://ota2007a.cnx-uat.com/service.asmx

Unless qualification, all tests need to be performed using the staging URL given above. This applies to all message types:

  • Availrate

  • Raterule

  • Reservation

  • Retrieve

  • Cancellation

For testing pleaser refer to the instructions provided in test reservations. After testing every single message type please share samples of the inbound and outbound XML with the Carnect integrations team (contact details will be provided at the beginning of the integration phase).

After the samples have been reviewed and certified, the client partner shall provide the Carnect Integrations Team access to their test system – this allows Carnect to perform the front-end certification and ensure the correct display of the car rental product on the client partner’s website.

After the whole certification process has been finalized the Carnect Integrations team will activate the client partner for the live environment and will share the production URL with him.

1.1.3. OTA-SOAP Message-Format

Each request for the OTA interface contains two parts, the SOAP-Header and the SOAP-Body. Both the OTA Request and the OTA Response messages are transmitted inside the SOAP body.

_images/soap-ota.png

SOAP-Webservice

https://api.carhire-solutions.com/service.asmx

WDSL Location

https://api.carhire-solutions.com/service.asmx?WSDL

targetNamespace

http://www.opentravel.org/OTA/2003/05

SOAP Action URL

e.g. http://www.opentravel.org/OTA/2003/05/getVehAvailRate

An example of a valid request is given below

Request SOAP Header:

SOAPAction:http://www.opentravel.org/OTA/2003/05/getVehAvailRate
Content-Type:text/xml

Request SOAP Body:

Note

RequestorID must be filled in correct. Values are provided by Carnect

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <VehAvailRateRQ xmlns="http://www.opentravel.org/OTA/2003/05">
            <POS>
                <Source ISOCountry="DE">
                    <RequestorID Type="XXX" ID_Context="XXX" />
                </Source>
            </POS>
            <VehAvailRQCore RateQueryType="Live">
                <RateQueryParameterType>2</RateQueryParameterType>
                <VehRentalCore PickUpDateTime="2017-09-20T12:00:00.000+02:00" ReturnDateTime="2017-09-25T12:00:00.000+02:00">
                    <PickUpLocation LocationCode="47" CodeContext="1" />
                    <ReturnLocation LocationCode="47" CodeContext="1" />
                </VehRentalCore>
            </VehAvailRQCore>
        </VehAvailRateRQ>
    </soap:Body>
</soap:Envelope>

1.1.4. OTA-SOAPAction header

Our logging relies on the SOAPAction header, which is required by SOAP 1.1, but not by SOAP 1.2.

Please make sure you are adding this header, if you are using SOAP 1.2, depending on the call you are performing.

VehAvailRateRQ

SOAPAction:

http://www.opentravel.org/OTA/2003/05/getVehAvailRate

VehRateRule

SOAPAction:

http://www.opentravel.org/OTA/2003/05/getVehRateRule

VehReservation

SOAPAction:

http://www.opentravel.org/OTA/2003/05/getVehReservation

VehRetReservation

SOAPAction:

http://www.opentravel.org/OTA/2003/05/getVehRetReservation

VehCancelReservation

SOAPAction:

http://www.opentravel.org/OTA/2003/05/getVehCancelReservation

VehLocationSearchRQ

SOAPAction:

http://www.opentravel.org/OTA/2003/05/getVehLocationSearch

VehLocDetail

SOAPAction:

http://www.opentravel.org/OTA/2003/05/getVehLocDetail

curl example:

curl --location --request POST 'https://api.carhire-solutions.com/service.asmx' \
     --header 'Content-Type: text/xml;charset=UTF-8' \
     --header 'SOAPAction: "http://www.opentravel.org/OTA/2003/05/getVehAvailRate"' \
     --data-raw 'HERE GOES YOUR SOAP'

Note

  • Sending no SOAPAction header will result in a 400 Bad Request in Staging Environment

  • Sending no valid Accept-Encoding header will result in a 400 Bad Request in Staging Environment

  • Sending invalid SOAP Action Text will result in a 400 Bad Request in Staging Environment

  • Incorrect use of Content_type header will result in a 400 Bad Request in Staging Environment

1.1.5. XML Sample Output Tool

There are websites with sample implementations of the OTA-Interface. These websites provide capabilities to create valid sample XML requests and to analyze input and output XML messages. Intention of these sites is to help developers in testing and verifying their own request and response messages. There are two testing websites which differ in the type of their setup.

You may also refer to (insert document Rate rules)

1.1.5.1. SOAP Client

The SOAP client is a web tool for testing SOAP compliancy and can be found at https://www.soapui.org/, https://www.getpostman.com/ and http://www.soapclient.com/.

1.1.6. Message Timeouts

We recommend using two different timeout values, one for reservation, one for all other calls. Non-reservation calls are expected to complete within 6s, thus the suggested timeout value for SOAP client is 7s, to allow for the transmission overhead.

For reservation requests we recommend a timeout of 130s as this call will require waiting for a transaction confirmation from the supplier and may also require a credit card transaction.

Some customers might require lower timeouts than these. Should your implementation require use of lower timeout values, please contact us to discuss.

1.1.7. HTTP Compression

Make sure that the HTTP/SOAP client you are using

  • is configured to use HTTP 1.1 (not 1.0)

  • is sending the header Accept-Encoding: gzip (only sending deflate is insufficient)

in order to enable efficient compression. All new implementations must implement this. Learn more about HTTP compression on Wikipedia.

Note

Sending another Accept-Encoding header or using HTTP 1.0 will result in a 403 Forbidden error.

1.1.8. HTTPS

All communication with the API must use HTTPS (not plain HTTP) and TLS 1.2 or higher.

1.1.9. Data Dumps

CarHire Solutions related data can be downloaded to your own system. Please note that using the API to obtain this information instead is strongly encouraged.

Data that used to be provided as CSV files but is now deprecated

1.2. SOAP clients

Your programming language of choice should allow you to generate SOAP proxies/clients. The two WSDL files for initial integration process are https://ota2007a.cnx-uat.com/service.asmx?WSDL and https://ota2007a.cnx-uat.com/destination.asmx?WSDL . Those services are meant for testing and currently do not place actual reservations with car rental suppliers (however, you should make sure to cancel all your test reservations).

1.3. Test reservations

For test bookings you can use testcheck@carnect.com as email address and chose a pick-up date 14 days in advance. This way your reservations will be automatically cancelled. If you don’t use this email address please use „Test“ in your surname and make sure you cancel them afterwards. Staging (UAT) urls will not accept reservations made less than 14 days in advance of the target reservation date. Reservations that are not cancelled will be cancelled automatically - however, this is a fallback mechanism, you should take care to cancel all test reservations yourself.

Note

Please make sure you are using a valid mailbox in case you don’t use testcheck@carnect.com as email address. All emails to an invalid mailbox will bounce back. A high bounce rate has a negative impact on the delivery of our emails.

1.4. Available destinations

You can search for offers using the IATA codes for cities and airports. However, many smaller cities do not have an IATA code but are still served by our suppliers. To search in those destinations, you need to first load the list of available destinations. Those do not change often and should be cached in your database (however, please do refresh them on a schedule - daily if possible). GEO Destinations details.

Sample request to list available cities in Germany
<soap:Envelope xmlns="http://www.opentravel.org/OTA/2003/05" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <VehicleCityRequest>
      <Language>DE</Language>
      <CountryISO>DE</CountryISO>
    </VehicleCityRequest>
  </soap:Body>
</soap:Envelope>
Response
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.opentravel.org/OTA/2003/05">
  <soap:Body>
    <VehicleCityResponse>
      <Cities>
        <City id="59" iata="AAH" latitude="50.7781295776367" longitude="6.08849000930786">
          <Name>Aachen</Name>
          <RegionID>1</RegionID>
        </City>
        <City id="60" latitude="48.837760925293" longitude="10.0920295715332">
          <Name>Aalen</Name>
          <RegionID>1</RegionID>
        </City>
        <City id="8474" latitude="52.0726890563965" longitude="7.00794982910156">
          <Name>Ahaus</Name>
          <RegionID>1</RegionID>
        </City>
        <City id="61" latitude="53.6694488525391" longitude="10.2319297790527">
          <Name>Ahrensburg</Name>
          <RegionID>1</RegionID>
        </City>
        <City id="38600" state-code="NY" latitude="41.4706446" longitude="-74.1122506">
          <Name>New Windsor-NY</Name>
          <RegionID>24</RegionID>
        </City>
        <City id="41" state-code="NY" iata="NYC" latitude="40.7127753" longitude="-74.0059728">
          <Name>New York</Name>
          <RegionID>24</RegionID>
        </City>
      </Cities>
    </VehicleCityResponse>
  </soap:Body>
</soap:Envelope>

1.5. Searching for offers

For the end user, the search is the first step when booking a car. A simple search form might look like in these examples

_images/search-form.png _images/Slide02.png

These search forms might translate to an XML search request like

Sample request to search for offers in Palma De Majorca, by City ID
<soap:Envelope xmlns="http://www.opentravel.org/OTA/2003/05" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <VehAvailRateRQ EchoToken="1.0" ReqRespVersion="large" Version="1.0">
      <POS>
        <Source ISOCountry="US">
          <RequestorID ID_Context="password" Type="username"/>
        </Source>
      </POS>
      <VehAvailRQCore RateQueryType="Live">
        <RateQueryParameterType>2</RateQueryParameterType>
        <VehRentalCore PickUpDateTime="2024-06-12T09:00:00.000" ReturnDateTime="2024-06-16T09:00:00.000">
          <PickUpLocation CodeContext="1" LocationCode="51"/>
          <ReturnLocation CodeContext="1" LocationCode="51"/>
        </VehRentalCore>
      </VehAvailRQCore>
    </VehAvailRateRQ>
  </soap:Body>
</soap:Envelope>
Response to the sample request (cut to only 1 result)
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Header>
    <informationHeader xmlns="http://www.opentravel.org/OTA/2003/05">
      <Successfully>true</Successfully>
      <ProcessingTime>1.6014142</ProcessingTime>
    </informationHeader>
  </soap:Header>
  <soap:Body>
    <VehAvailRateRS xmlns="http://www.opentravel.org/OTA/2003/05"
    EchoToken="1.5892924;1.6014142" TimeStamp="2017-09-29T17:03:52" Version="3">
      <VehAvailRSCore>
        <VehRentalCore PickUpDateTime="2018-06-12T09:00:00"
        ReturnDateTime="2018-06-16T09:00:00" Quantity="5">
          <PickUpLocation LocationCode="51" />
          <ReturnLocation LocationCode="51" />
        </VehRentalCore>
        <VehVendorAvails>
          <VehVendorAvail>
            <VehAvails>
              <VehAvail>
                <VehAvailCore Status="Available">
                  <Vehicle AirConditionInd="true" TransmissionType="Manual" FuelType="Petrol"
                  DriveType="Unspecified" PassengerQuantity="4" BaggageQuantity="2"
                  VendorCarType="R" Code="Opel Mokka/Nissan Juke" CodeContext="">
                    <VehType VehicleCategory="3" />
                    <VehClass Size="3" />
                    <VehMakeModel Name="Opel Mokka/Nissan Juke" Code="EFMR" />
                    <PictureURL>
                    https://static.carhire-solutions.com/images/car/Goldcar/small/CXMR-R.jpg</PictureURL>
                  </Vehicle>
                  <RentalRate>
                    <RateDistance Unlimited="true" DistUnitName="Km" />
                    <VehicleCharges>
                      <VehicleCharge CurrencyCode="EUR" Amount="195.43" TaxInclusive="true"
                      Purpose="original" RateConvertInd="true">
                        <Calculation UnitName="Day" Quantity="4" />
                      </VehicleCharge>
                      <VehicleCharge CurrencyCode="EUR" Amount="195.43" TaxInclusive="true"
                      Purpose="preferred" RateConvertInd="true" />
                      <VehicleCharge CurrencyCode="EUR" Amount="171.43" TaxInclusive="true"
                      Purpose="baserate" RateConvertInd="true" />
                      <VehicleCharge CurrencyCode="EUR" Amount="1400.00" TaxInclusive="true"
                      Description="Upon collection of the car usually a security deposit will be blocked on the drivers credit card. This deposit typically corresponds to the stated amount of the possible excess plus the value of one tank of fuel. This deposit can only be blocked on a valid credit card (prepaid debit cards,prepaid credit cards and cash cannot be accepted).&lt;br /&gt;&lt;br /&gt; For luxury cars two credit cards in the same name are required for all rentals. The credit card must not be from the same issuer. Please note some suppliers will not accept American Express, Visa Premier or Diners Club credit cards, we strongly recommend to use a Visa or Mastercard. &lt;br /&gt;&lt;br /&gt; In the event that you fail to produce a valid credit card or have insufficient funds available the car rental agent may refuse to release the vehicle. In this instance no funds will be reimbursed. Estimated deposit amount: EUR 1400.00"
                      IncludedInEstTotalInd="false" Purpose="Estimated deposit amount"
                      RateConvertInd="true" />
                    </VehicleCharges>
                    <RateQualifier VendorRateID="MICRONNEXUS">
                      <RateComments>
                        <RateComment Name="SilverPackage" />
                      </RateComments>
                    </RateQualifier>
                    <RateRestrictions>
                      <MinimumAge>21</MinimumAge>
                      <MaximumAge>80</MaximumAge>
                      <NoShowFeeInd>false</NoShowFeeInd>
                    </RateRestrictions>
                  </RentalRate>
                  <TotalCharge CurrencyCode="EUR" EstimatedTotalAmount="195.43"
                  RateConvertInd="false" />
                  <Fees>
                    <Fee CurrencyCode="EUR" Amount="0.00" TaxInclusive="true"
                    Description="Location service charge(LSC)" IncludedInRate="true"
                    IncludedInEstTotalInd="true" />
                    <Fee CurrencyCode="EUR" Amount="0.00" TaxInclusive="true"
                    Description="VAT(TAX)" IncludedInRate="true"
                    IncludedInEstTotalInd="true" />
                  </Fees>
                  <Reference URL="https://www.carhiremarket.com/upsell_parameter.aspx?reference_number=54114770862533183651462627A034&amp;live=true"
                  Type="16" ID_Context="5Pr_0" />
                  <Vendor TravelSector="Car Rental" Code="GR" CodeContext="34">Goldcar
                  rental</Vendor>
                  <VendorLocation LocationCode="PMIC191" CodeContext="PPM"
                  ExtendedLocationCode="51-GRPPM" CounterLocation="3"
                  Name="Majorca - Promenade">Majorca - Promenade</VendorLocation>
                  <DropOffLocation LocationCode="PMIC191" CodeContext="PPM"
                  ExtendedLocationCode="51-GRPPM" Name="Majorca - Promenade" />
                </VehAvailCore>
                <VehAvailInfo>
                  <PricedCoverages>
                    <PricedCoverage>
                      <Coverage CoverageType="Location service charge" Code="LSC">
                        <Details>
                          <Charge Amount="0.00" IncludedInRate="true" />
                        </Details>
                      </Coverage>
                      <Charge CurrencyCode="EUR" Amount="0.00" TaxInclusive="true"
                      Description="An additional service charge applies at some airports, railway stations and ports- In this offer it is included."
                      GuaranteedInd="true" IncludedInRate="true"
                      IncludedInEstTotalInd="true" />
                    </PricedCoverage>
                    <PricedCoverage>
                      <Coverage CoverageType="Collision damage waiver" Code="CDW">
                        <Details>
                          <Charge Amount="0.00" IncludedInRate="true" />
                        </Details>
                      </Coverage>
                      <Charge CurrencyCode="EUR" Amount="0.00" TaxInclusive="true"
                      Description="Maximum excess of 1,400 EUR to be paid in the case of damage. Please note that comprehensive insurance does not cover damage to wheels, tires, mirrors and underbody"
                      GuaranteedInd="true" IncludedInRate="true"
                      IncludedInEstTotalInd="true" />
                    </PricedCoverage>
                    <PricedCoverage>
                      <Coverage CoverageType="Supplementary Liability Insurance" Code="SLI">
                        <Details>
                          <Charge Amount="0.00" IncludedInRate="true" />
                        </Details>
                      </Coverage>
                      <Charge CurrencyCode="EUR" Amount="0.00" TaxInclusive="true"
                      Description="Legally required, insurance for damages on the adversarial vehicle, persons and objects- In this offer it is included."
                      GuaranteedInd="true" IncludedInRate="true"
                      IncludedInEstTotalInd="true" />
                    </PricedCoverage>
                    <!-- some fees omitted from the sample -->
                  </PricedCoverages>
                  <PaymentRules>
                    <PaymentRule PaymentType="4">Prepayment. For the local pick up of your car
                    a valid credit card is mandatory. The card holder and driver must be the
                    same person. Prepaid or debit cards, such as for instance Maestro, Visa
                    electron or Visa Premier are not accepted for pick-up.</PaymentRule>
                  </PaymentRules>
                  <TPA_Extensions>
                    <TermsConditions xmlns=""
                    url="https://createpdf.carhire-solutions.com/termsandconditions.aspx?reference=54114770863341183651462362&amp;languageId=2" />
                    <SupplierLogo xmlns=""
                    url="https://static.carhire-solutions.com/images/supplier/logo/logo34.png" />
                  </TPA_Extensions>
                </VehAvailInfo>
                <AdvanceBooking RulesApplyInd="true" />
              </VehAvail>
            </VehAvails>
          </VehVendorAvail>
        </VehVendorAvails>
      </VehAvailRSCore>
    </VehAvailRateRS>
  </soap:Body>
</soap:Envelope>

This should be sufficient to show a listing of search results to the customer.

Note

Search results must not be cached.

Before they book, you should also display a page with offer details. More sample searches

Offers include details about the cars available, which should be used for displaying them to the customer. As this data changes often, the contents of the SOAP response have to take precedence over cached / stored information.

1.6. How-To guides

To help our client partners with various integration scenarios, we are providing a collection of different How-To guides at Advanced How-tos.

1.7. System status

We recommend to subscribe to our Status page. https://status.carnect.com/. Here we will inform about planned downtimes or outages.