Overview

This guide covers critical differences between the SOAP and REST versions of the EAN API. Use this guide to assist in updating your integration to REST and to validate your changes. Only the basic booking path (list, avail, book) is covered in this guide.


Global Changes

Empty Nodes

If your integration expects empty nodes in a response (e.g. an empty thumbNailUrl node for a property with no thumbnail image), please note that REST will not return empty nodes. If a node has no value, it will be omitted from the response.

Common Elements

The API's common request elements are critical to authentication, commissions, stats, and pricing. Omitting any required common element may cause price mismatches, booking failures, or other errors. These elements are highlighted in yellow for this guide.

With SOAP, common elements were included in the request body. When updating to REST, these elements are sent as URL parameters.

JSON responses are not returned by default. To request a JSON-formatted response, you must include Accept: application/json in your HTML request headers. If you do not include the correct Accept header value, responses to REST requests will default to XML.

During testing, instead of changing your request headers, you may include the parameter _type=json in your request body. This parameter is highlighted in the examples below as a reminder that responses do not default to JSON - please do not use this parameter in production requests.

SOAP Common Elements
<soapenv:Body>
<v3:{serviceName}>
<{requestParentElement}>
<apiKey>#####</apiKey>
<cid>######</cid>
<customerIpAddress>##########</customerIpAddress> <customerUserAgent>##########</customerUserAgent> <customerSessionId>##########</customerSessionId>
<minorRev>##</minorRev> <locale>en_US</locale> <currencyCode>USD</currencyCode> ...
REST Common Elements
http://api.ean.com/ean-services/rs/hotel/v3/{serviceName}?
apiKey=#####
&cid=#####
&customerIpAddress=#####
&customerUserAgent=######
&customerSessionId=#####
&minorRev=##
&locale=en_US
&currencyCode=USD
&_type=json
...


Hotel List

The most critical change to your list request is the REST API's unique room object structure, which compacts the values from previous SOAP elements into a comma-delimited list:

&room[room number, starting with 1]= [number of adults], [first child's age], [second child's age], [etc]


Note that there is no direct equivalent in REST for the numberOfChildren element used in SOAP and XML. Instead, each room's child guest count is determined by the number of child age values provided.

The samples below request the same occupancies: one room for two adults and two children aged 8 and 12, and one room for two adults only.

SOAP Common Elements
<soapenv:Body>
<v3:{serviceName}>
<{requestParentElement}>
<apiKey>#####</apiKey>
<cid>######</cid>
<customerIpAddress>##########</customerIpAddress> <customerUserAgent>##########</customerUserAgent> <customerSessionId>##########</customerSessionId>
<minorRev>##</minorRev> <locale>en_US</locale> <currencyCode>USD</currencyCode> ...
REST Common Elements
http://api.ean.com/ean-services/rs/hotel/v3/{serviceName}?
apiKey=#####
&cid=#####
&customerIpAddress=#####
&customerUserAgent=######
&customerSessionId=#####
&minorRev=##
&locale=en_US
&currencyCode=USD
&_type=json
...


Hotel List

The most critical change to your list request is the REST API's unique room object structure, which compacts the values from previous SOAP elements into a comma-delimited list:

&room[room number, starting with 1]= [number of adults], [first child's age], [second child's age], [etc]


Note that there is no direct equivalent in REST for the numberOfChildren element used in SOAP and XML. Instead, each room's child guest count is determined by the number of child age values provided.

The samples below request the same occupancies: one room for two adults and two children aged 8 and 12, and one room for two adults only.

SOAP List Request
<v3:getList>
<HotelListRequest>
<apiKey>#####</apiKey>
<cid>######</cid>
<customerIpAddress>##########</customerIpAddress> <customerUserAgent>##########</customerUserAgent> <customerSessionId>##########</customerSessionId>
<minorRev>##</minorRev> <locale>en_US</locale> <currencyCode>USD</currencyCode>
<destinationString>Milan, Italy</destinationString>
<arrivalDate>08/10/2014</arrivalDate>
<departureDate>08/12/2014</departureDate>
<RoomGroup>
<Room>
<numberOfAdults>2</numberOfAdults>
<numberOfChildren>2</numberOfChildren> <childAges>8</childAges> <childAges>12</childAges>
</Room> <Room>
<numberOfAdults>2</numberOfAdults>
</Room>
</RoomGroup>
</HotelListRequest>
</v3:getList>
REST List Request
http://api.ean.com/ean-services/rs/hotel/v3/list?
apiKey=#####
&cid=#####
&customerIpAddress=#####
&customerUserAgent=######
&customerSessionId=#####
&minorRev=##
&locale=en_US
&currencyCode=USD
&_type=json
&destinationString=Milan, Italy
&arrivalDate=08/10/2014
&departureDate=08/12/2014
&room1=2,8,12
&room2=2


List Response
SOAP List Response
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:getListResponse xmlns:ns2="http://v3.hotel.wsapi.ean.com/">
<HotelListResponse>
<customerSessionId>0ABAAACD-8CA1-3191-46D2-55EAD0C935EA</customerSessionId>
<numberOfRoomsRequested>2</numberOfRoomsRequested>
<moreResultsAvailable>true</moreResultsAvailable>
<cacheKey>768ca131:146d55ead0c:35f1</cacheKey>
<cacheLocation>10.186.170.205:7300</cacheLocation>
<cachedSupplierResponse supplierCacheTolerance="NOT_SUPPORTED" cachedTime="0" supplierRequestNum="476" supplierResponseNum="1" supplierResponseTime="108" candidatePreptime="82" otherOverheadTime="34" tpidUsed="5001" matchedCurrency="true" matchedLocale="true"/>
<HotelList size="1" activePropertyCount="532">
<HotelSummary order="0" ubsScore="70578488">
<hotelId>124869</hotelId>
<name>Novotel Milan Nord Ca Granda</name>
<address1>Viale Giovanni Suzzani 13</address1>
<city>Milan</city>
<postalCode>20162</postalCode>
<countryCode>IT</countryCode>
<airportCode>LIN</airportCode>
<supplierType>E</supplierType>
<propertyCategory>1</propertyCategory>
<hotelRating>4.0</hotelRating>
<confidenceRating>50</confidenceRating>
<amenityMask>33587339</amenityMask>
<locationDescription>In Milan (Niguarda)</locationDescription>
<shortDescription><![CDATA[&lt;p&gt;&lt;b&gt;Property Location&lt;/b&gt; &lt;br /&gt;With a stay at Novotel Milan Nord Ca Granda in Milan (Niguarda), you&apos;ll be close to Niguarda Ca Granda Hospital and Cathedral of Milan. This 4-star hotel is within]]></shortDescription>
<highRate>103.05</highRate>
<lowRate>103.05</lowRate>
<rateCurrencyCode>USD</rateCurrencyCode>
<latitude>45.5062</latitude>
<longitude>9.19759</longitude>
<proximityDistance>2.127312</proximityDistance>
<proximityUnit>MI</proximityUnit>
<hotelInDestination>true</hotelInDestination>
<thumbNailUrl>/hotels/1000000/20000/11500/11430/11430_86_t.jpg</thumbNailUrl>
<deepLink>{removed for brevity}</deepLink>
<RoomRateDetailsList>
<RoomRateDetails>
<roomTypeCode>185262</roomTypeCode>
<rateCode>200103261</rateCode>
<maxRoomOccupancy>4</maxRoomOccupancy>
<quotedRoomOccupancy>2</quotedRoomOccupancy>
<minGuestAge>0</minGuestAge>
<roomDescription>Superior Room, 1 King Bed with Sofabed</roomDescription>
<propertyAvailable>true</propertyAvailable>
<propertyRestricted>false</propertyRestricted>
<expediaPropertyId>11430</expediaPropertyId>
<RateInfos size="1">
<RateInfo priceBreakdown="true" promo="true" rateChange="false">
<RoomGroup>
<Room>
<numberOfAdults>2</numberOfAdults>
<numberOfChildren>2</numberOfChildren>
<childAges>8</childAges>
<childAges>12</childAges>
</Room>
<Room>
<numberOfAdults>2</numberOfAdults>
<numberOfChildren>0</numberOfChildren>
</Room>
</RoomGroup>
<ChargeableRateInfo averageBaseRate="103.05" averageRate="103.05" commissionableUsdTotal="412.2" currencyCode="USD" maxNightlyRate="103.05" nightlyRateTotal="412.2" surchargeTotal="22.68" total="434.88">
<NightlyRatesPerRoom size="2">
<NightlyRate baseRate="103.05" rate="103.05" promo="false"/>
<NightlyRate baseRate="103.05" rate="103.05" promo="false"/>
</NightlyRatesPerRoom>
<Surcharges size="1">
<Surcharge type="TaxAndServiceFee" amount="22.68"/>
</Surcharges>
</ChargeableRateInfo>
<nonRefundable>true</nonRefundable>
<HotelFees size="1">
<HotelFee description="MandatoryTax" amount="109.05"/>
</HotelFees>
<rateType>MerchantStandard</rateType>
<promoId>205982103</promoId>
<promoDescription>Sale! Save 30% on this Stay.</promoDescription>
<promoType>Standard</promoType>
<currentAllotment>0</currentAllotment>
</RateInfo>
</RateInfos>
<ValueAdds size="1">
<ValueAdd id="2048">
<description>Free Wireless Internet</description>
</ValueAdd>
</ValueAdds>
</RoomRateDetails>
</RoomRateDetailsList>
</HotelSummary>
</HotelList>
</HotelListResponse>
</ns2:getListResponse>
</soap:Body>
</soap:Envelope>
JSON List Response
    {
"HotelListResponse": {
"customerSessionId": "0ABAAA7C-15C0-2291-46D2-4F67C5B91386",
"numberOfRoomsRequested": 2,
"moreResultsAvailable": true,
"cacheKey": "5315c022:146d4f67c5b:138c",
"cacheLocation": "10.186.170.124:7300",
"cachedSupplierResponse": {
"@supplierCacheTolerance": "NOT_SUPPORTED",
"@cachedTime": "0",
"@supplierRequestNum": "476",
"@supplierResponseNum": "1",
"@supplierResponseTime": "109",
"@candidatePreptime": "14",
"@otherOverheadTime": "25",
"@tpidUsed": "5001",
"@matchedCurrency": "true",
"@matchedLocale": "true"
},
"HotelList": {
"@size": "1",
"@activePropertyCount": "532",
"HotelSummary": {
"@order": "0",
"@ubsScore": "70790284",
"hotelId": 124869,
"name": "Novotel Milan Nord Ca Granda",
"address1": "Viale Giovanni Suzzani 13",
"city": "Milan",
"postalCode": 20162,
"countryCode": "IT",
"airportCode": "LIN",
"supplierType": "E",
"propertyCategory": 1,
"hotelRating": 4,
"confidenceRating": 50,
"amenityMask": 33587339,
"locationDescription": "In Milan (Niguarda)",
"shortDescription": "&lt;p&gt;&lt;b&gt;Property Location&lt;/b&gt; &lt;br /&gt;With a stay at Novotel Milan Nord Ca Granda in Milan (Niguarda), you&apos;ll be close to Niguarda Ca Granda Hospital and Cathedral of Milan. This 4-star hotel is within",
"highRate": 102.86,
"lowRate": 102.86,
"rateCurrencyCode": "USD",
"latitude": 45.5062,
"longitude": 9.19759,
"proximityDistance": 2.127312,
"proximityUnit": "MI",
"hotelInDestination": true,
"thumbNailUrl": "/hotels/1000000/20000/11500/11430/11430_86_t.jpg",
"deepLink": {removed for brevity}
"RoomRateDetailsList": {
"RoomRateDetails": {
"roomTypeCode": 185262,
"rateCode": 200103261,
"maxRoomOccupancy": 4,
"quotedRoomOccupancy": 2,
"minGuestAge": 0,
"roomDescription": "Superior Room, 1 King Bed with Sofabed",
"propertyAvailable": true,
"propertyRestricted": false,
"expediaPropertyId": 11430,
"RateInfos": {
"@size": "1",
"RateInfo": {
"@priceBreakdown": "true",
"@promo": "true",
"@rateChange": "false",
"RoomGroup": {
"Room": [
{
"numberOfAdults": 2,
"numberOfChildren": 2,
"childAges": [
8,
12
]
},
{
"numberOfAdults": 2,
"numberOfChildren": 0
}
]
},
"ChargeableRateInfo": {
"@averageBaseRate": "102.86",
"@averageRate": "102.86",
"@commissionableUsdTotal": "411.44",
"@currencyCode": "USD",
"@maxNightlyRate": "102.86",
"@nightlyRateTotal": "411.44",
"@surchargeTotal": "22.64",
"@total": "434.08",
"NightlyRatesPerRoom": {
"@size": "2",
"NightlyRate": [
{
"@baseRate": "102.86",
"@rate": "102.86",
"@promo": "false"
},
{
"@baseRate": "102.86",
"@rate": "102.86",
"@promo": "false"
}
]
},
"Surcharges": {
"@size": "1",
"Surcharge": {
"@type": "TaxAndServiceFee",
"@amount": "22.64"
}
}
},
"nonRefundable": true,
"HotelFees": {
"@size": "1",
"HotelFee": {
"@description": "MandatoryTax",
"@amount": "108.84"
}
},
"rateType": "MerchantStandard",
"promoId": 205982103,
"promoDescription": "Sale! Save 30% on this Stay.",
"promoType": "Standard",
"currentAllotment": 0
}
},
"ValueAdds": {
"@size": "1",
"ValueAdd": {
"@id": "2048",
"description": "Free Wireless Internet"
}
}
}
}
}
}
}
}


Room Availability

For the availability request, integrate all required common elements and the REST-specific room group format as previously detailed for the hotel list request. There are no updates unique to the availability request.

SOAP Availability Request
<v3:getAvailability>
<HotelRoomAvailabilityRequest> <apiKey>#####</apiKey>
<cid>######</cid>
<customerIpAddress>##########</customerIpAddress> <customerUserAgent>##########</customerUserAgent> <customerSessionId>##########</customerSessionId>
<minorRev>##</minorRev> <locale>en_US</locale> <currencyCode>USD</currencyCode>
<hotelId>124869</hotelId>
<arrivalDate>08/10/2014</arrivalDate>
<departureDate>08/12/2014</departureDate>
<RoomGroup>
<Room>
<numberOfAdults>2</numberOfAdults>
<numberOfChildren>2</numberOfChildren> <childAges>8</childAges> <childAges>12</childAges>
</Room> <Room>
<numberOfAdults>2</numberOfAdults>
</Room>
</RoomGroup> <includeDetails>true</includeDetails>
</HotelRoomAvailabilityRequest>
</v3:getAvailability>
REST Availability Request
http://api.ean.com/ean-services/rs/hotel/v3/avail?
apiKey=#####
&cid=#####
&customerIpAddress=#####
&customerUserAgent=######
&customerSessionId=#####
&minorRev=##
&locale=en_US
&currencyCode=USD
&_type=json
&hotelId=124869
&arrivalDate=08/10/2014
&departureDate=08/12/2014
&includeDetails=true
&room1=2,8,12
&room2=2
    
Availability Response

Ensure you are capturing the single value or the customer's choice, as applicable, from the response elements highlighted in orange. These values must be passed through in corresponding required elements your booking request.

For brevity, only the first room for the requested occupancy is shown. Note that HotelFeeBreakdown is returned for the REST example only – the request parameter includeHotelFeeBreakdown defaults to true if omitted under REST.

SOAP Availability Response
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:getAvailabilityResponse xmlns:ns2="http://v3.hotel.wsapi.ean.com/">
<HotelRoomAvailabilityResponse size="8">
<customerSessionId>0ABAAA40-F6D7-B914-7452-5318ED902AB5</customerSessionId>
<hotelId>124869</hotelId>
<arrivalDate>08/10/2014</arrivalDate>
<departureDate>08/12/2014</departureDate>
<hotelName>Novotel Milan Nord Ca Granda</hotelName>
<hotelAddress>Viale Giovanni Suzzani 13</hotelAddress>
<hotelCity>Milan</hotelCity>
<hotelCountry>IT</hotelCountry>
<numberOfRoomsRequested>2</numberOfRoomsRequested>
<checkInInstructions>{removed for brevity}</checkInInstructions>
<HotelRoomResponse>
<rateCode>201985271</rateCode>
<roomTypeCode>185262</roomTypeCode>
<rateDescription>Superior Room, 1 King Bed with Sofabed</rateDescription>
<roomTypeDescription>Superior Room, 1 King Bed with Sofabed</roomTypeDescription>
<supplierType>E</supplierType>
<propertyId>11430</propertyId>
<BedTypes size="1">
<BedType id="67">
<description>1 king and 1 sofa bed</description>
</BedType>
</BedTypes>
<smokingPreferences>S,NS</smokingPreferences>
<rateOccupancyPerRoom>4</rateOccupancyPerRoom>
<quotedOccupancy>2</quotedOccupancy>
<minGuestAge>0</minGuestAge>
<RateInfos size="1">
<RateInfo priceBreakdown="true" promo="false" rateChange="true">
<RoomGroup>
<Room>
<numberOfAdults>2</numberOfAdults>
<numberOfChildren>2</numberOfChildren>
<childAges>8</childAges>
<childAges>12</childAges>
<rateKey>0b07a27f-74dc-4a70-b4ac-c67766eb1342</rateKey>
</Room>
<Room>
<numberOfAdults>2</numberOfAdults>
<numberOfChildren>0</numberOfChildren>
<rateKey>0b07a27f-74dc-4a70-b4ac-c67766eb1342</rateKey>
</Room>
</RoomGroup>
<ChargeableRateInfo averageBaseRate="108.905" averageRate="108.905" commissionableUsdTotal="435.62" currencyCode="USD" maxNightlyRate="115.71" nightlyRateTotal="435.62" surchargeTotal="23.96" total="459.58">
<NightlyRatesPerRoom size="2">
<NightlyRate baseRate="114.97" rate="114.97" promo="false"/>
<NightlyRate baseRate="128.5" rate="128.5" promo="false"/>
</NightlyRatesPerRoom>
<Surcharges size="1">
<Surcharge type="TaxAndServiceFee" amount="23.96"/>
</Surcharges>
</ChargeableRateInfo>
<cancellationPolicy>This rate is non-refundable and cannot be changed or cancelled - if you do choose to change or cancel this booking you will not be refunded any of the payment.</cancellationPolicy>
<CancelPolicyInfoList>
<CancelPolicyInfo>
<versionId>206382052</versionId>
<cancelTime>18:00:00</cancelTime>
<startWindowHours>0</startWindowHours>
<nightCount>0</nightCount>
<percent>100</percent>
<currencyCode>USD</currencyCode>
<timeZoneDescription>(GMT+01:00) Brussels, Copenhagen, Madrid, Paris</timeZoneDescription>
</CancelPolicyInfo>
<CancelPolicyInfo>
<versionId>206382051</versionId>
<cancelTime>18:00:00</cancelTime>
<startWindowHours>999</startWindowHours>
<nightCount>0</nightCount>
<percent>100</percent>
<currencyCode>USD</currencyCode>
<timeZoneDescription>(GMT+01:00) Brussels, Copenhagen, Madrid, Paris</timeZoneDescription>
</CancelPolicyInfo>
</CancelPolicyInfoList>
<nonRefundable>true</nonRefundable>
<HotelFees size="1">
<HotelFee description="MandatoryTax" amount="81.16"/>
</HotelFees>
<rateType>MerchantStandard</rateType>
<currentAllotment>0</currentAllotment>
<guaranteeRequired>false</guaranteeRequired>
<depositRequired>true</depositRequired>
<taxRate>26.78</taxRate>
</RateInfo>
</RateInfos>
<ValueAdds size="1">
<ValueAdd id="16777216">
<description>Breakfast Buffet</description>
</ValueAdd>
</ValueAdds>
<deepLink>{removed for brevity}</deepLink>
</HotelRoomResponse>

{other room options removed for brevity}
</HotelRoomAvailabilityResponse>
</ns2:getAvailabilityResponse>
</soap:Body>
</soap:Envelope>
JSON Availability Response
{
"HotelRoomAvailabilityResponse": {
"@size": "8",
"customerSessionId": "0ABAAA8A-00AA-9091-4712-CE0FE89929BF",
"hotelId": 124869,
"arrivalDate": "08\/10\/2014",
"departureDate": "08\/12\/2014",
"hotelName": "Novotel Milan Nord Ca Granda",
"hotelAddress": "Viale Giovanni Suzzani 13",
"hotelCity": "Milan",
"hotelCountry": "IT",
"numberOfRoomsRequested": 2,
"checkInInstructions": {removed for brevity}
"HotelRoomResponse": [
{
"rateCode": 201985271,
"roomTypeCode": 185262,
"rateDescription": "Superior Room, 1 King Bed with Sofabed",
"roomTypeDescription": "Superior Room, 1 King Bed with Sofabed",
"supplierType": "E",
"propertyId": 11430,
"BedTypes": {
"@size": "1",
"BedType": {
"@id": "67",
"description": "1 king and 1 sofa bed"
}
},
"smokingPreferences": "S,NS",
"rateOccupancyPerRoom": 4,
"quotedOccupancy": 2,
"minGuestAge": 0,
"RateInfos": {
"@size": "1",
"RateInfo": {
"@priceBreakdown": "true",
"@promo": "false",
"@rateChange": "true",
"RoomGroup": {
"Room": [
{
"numberOfAdults": 2,
"numberOfChildren": 2,
"childAges": [
8,
12
],
"rateKey": "9d451f73-4a54-48e9-bf18-f8a54e205af1"
},
{
"numberOfAdults": 2,
"numberOfChildren": 0,
"rateKey": "9d451f73-4a54-48e9-bf18-f8a54e205af1"
}
]
},
"ChargeableRateInfo": {
"@averageBaseRate": "108.905",
"@averageRate": "108.905",
"@commissionableUsdTotal": "435.62",
"@currencyCode": "USD",
"@maxNightlyRate": "115.71",
"@nightlyRateTotal": "435.62",
"@surchargeTotal": "23.96",
"@total": "459.58",
"NightlyRatesPerRoom": {
"@size": "2",
"NightlyRate": [
{
"@baseRate": "102.1",
"@rate": "102.1",
"@promo": "false"
},
{
"@baseRate": "115.71",
"@rate": "115.71",
"@promo": "false"
}
]
},
"Surcharges": {
"@size": "1",
"Surcharge": {
"@type": "TaxAndServiceFee",
"@amount": "23.96"
}
}
},
"cancellationPolicy": "This rate is non-refundable and cannot be changed or cancelled - if you do choose to change or cancel this booking you will not be refunded any of the payment.",
"CancelPolicyInfoList": {
"CancelPolicyInfo": [
{
"versionId": 206382052,
"cancelTime": "18:00:00",
"startWindowHours": 0,
"nightCount": 0,
"percent": 100,
"currencyCode": "USD",
"timeZoneDescription": "(GMT+01:00) Brussels, Copenhagen, Madrid, Paris"
},
{
"versionId": 206382051,
"cancelTime": "18:00:00",
"startWindowHours": 999,
"nightCount": 0,
"percent": 100,
"currencyCode": "USD",
"timeZoneDescription": "(GMT+01:00) Brussels, Copenhagen, Madrid, Paris"
}
]
},
"nonRefundable": true,
"HotelFees": {
"@size": "1",
"HotelFee": {
"@description": "MandatoryTax",
"@amount": "81.68",
"HotelFeeBreakdown": {
"@unit": "Per person",
"@frequency": "Per night"
}
}
},
"rateType": "MerchantStandard",
"currentAllotment": 0,
"guaranteeRequired": false,
"depositRequired": true,
"taxRate": 23.96
}
},
"ValueAdds": {
"@size": "1",
"ValueAdd": {
"@id": "16777216",
"description": "Breakfast Buffet"
}
},
"deepLink": {removed for brevity}
},
{other room options removed for brevity}
]
}
}


Booking

Check your integration against the points below before attempting your first test booking – they are the most common trouble sources for partners updating to REST from SOAP.

  • Elements highlighted in orange in the sample below are required and must carry over appropriate values from the room availability response:
    • Use the customer's choice for smoking preferences, or omit the element if it was not provided in the room response.
    • Each room's BedTypeId value must use a corresponding BedType @id attribute from the room response.
    • The roomTypeCode, chargeableRate @total, and rateCode values that correspond with the customer's room selection must be carried over from the room response.
    • The room response's rateKey value is always used, regardless of individual room selection.
  • Review our complete reservation request documentation and verify all required elements are present and formatted as prescribed.
    • Ensure customer input values are validated properly against their required formats. E.g. stateProvinceCode and countryCode only accept two-character codes – full names or any other value format will cause a booking failure.
SOAP Booking Request
<v3:getReservation>
<HotelRoomReservationRequest>
<apiKey>#####</apiKey>
<cid>######</cid>
<customerIpAddress>##########</customerIpAddress> <customerUserAgent>##########</customerUserAgent> <customerSessionId>##########</customerSessionId>
<minorRev>##</minorRev> <locale>en_US</locale> <currencyCode>USD</currencyCode>
<hotelId>124869</hotelId>
<arrivalDate>08/10/2014</arrivalDate>
<departureDate>08/12/2014</departureDate>
<supplierType>E</supplierType>
<rateKey>e5b389fc-486b-404a-a819-259ab955eb8b</rateKey>
<roomTypeCode>185262</roomTypeCode>
<rateCode>446847</rateCode>
<chargeableRate>518.11</chargeableRate>
<RoomGroup>
<Room>
<firstName>test</firstName>
<lastName>tester</lastName>
<numberOfAdults>2</numberOfAdults>
<numberOfChildren>2</numberOfChildren>
<childAges>8</childAges>
<childAges>12</childAges> <bedTypeId>67</bedTypeId>
<smokingPreference>NS</smokingPreference>
</Room> <Room> <firstName>test</firstName>
<lastName>tester</lastName>
<numberOfAdults>2</numberOfAdults> <bedTypeId>67</bedTypeId>
<smokingPreference>NS</smokingPreference>
</Room>
</RoomGroup>
<ReservationInfo>
<email>test@yourdomain.com</email>
<firstName>test</firstName>
<lastName>tester</lastName>
<homePhone>##########</homePhone>
<workPhone>##########</workPhone>
<creditCardType>##</creditCardType>
<creditCardNumber>#################</creditCardNumber>
<creditCardIdentifier>123</creditCardIdentifier>
<creditCardExpirationMonth>11</creditCardExpirationMonth>
<creditCardExpirationYear>2016</creditCardExpirationYear>
</ReservationInfo>
<AddressInfo>
<address1>travelnow</address1>
<city>Seattle</city>
<stateProvinceCode>WA</stateProvinceCode>
<countryCode>US</countryCode>
<postalCode>98004</postalCode>
</AddressInfo>
</HotelRoomReservationRequest> </v3:getReservation>
REST Booking Request
https://book.api.ean.com/ean-services/rs/hotel/v3/res?
apiKey=#####
&cid=#####
&customerIpAddress=#####
&customerUserAgent=######
&customerSessionId=#####
&minorRev=##
&locale=en_US
&currencyCode=USD
&_type=json
&hotelId=124869
&arrivalDate=08/10/2014
&departureDate=08/12/2014
&supplierType=E
&rateKey=e5b389fc-486b-404a-a819-259ab955eb8b
&roomTypeCode=185262
&rateCode=446847
&chargeableRate=518.11
&room1=2,8,12
&room1FirstName=test
&room1LastName=tester
&room1BedTypeId=67
&room1SmokingPreference=NS
&room2=1
&room2FirstName=test
&room2LastName=tester
&room2BedTypeId=67
&room2SmokingPreference=NS
&email=test@yourdomain.com
&firstName=tester
&lastName=testing
&homePhone=##########
&workPhone=##########
&creditCardType=CA
&creditCardNumber=#################
&creditCardIdentifier=123
&creditCardExpirationMonth=11
&creditCardExpirationYear=2016
&address1=travelnow
&city=Seattle
&stateProvinceCode=WA
&countryCode=US
&postalCode=98004 
    


Booking Response

SOAP Booking Response
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:getReservationResponse xmlns:ns2="http://v3.hotel.wsapi.ean.com/">
<HotelRoomReservationResponse>
<customerSessionId>0ABAAA7D-2A56-5914-7452-7D1C8B902456</customerSessionId>
<itineraryId>####</itineraryId>
<confirmationNumbers>1234</confirmationNumbers>
<confirmationNumbers>1235</confirmationNumbers>
<processedWithConfirmation>true</processedWithConfirmation>
<supplierType>E</supplierType>
<reservationStatusCode>CF</reservationStatusCode>
<existingItinerary>false</existingItinerary>
<numberOfRoomsBooked>2</numberOfRoomsBooked>
<drivingDirections/>
<checkInInstructions/>
<arrivalDate>08/10/2014</arrivalDate>
<departureDate>08/12/2014</departureDate>
<hotelName>Novotel Milan Nord Ca Granda</hotelName>
<hotelAddress>Viale Giovanni Suzzani 13</hotelAddress>
<hotelCity>Milan</hotelCity>
<hotelPostalCode>20162</hotelPostalCode>
<hotelCountryCode>IT</hotelCountryCode>
<roomDescription>Superior Room, 1 King Bed with Sofabed</roomDescription>
<rateOccupancyPerRoom>3</rateOccupancyPerRoom>
<RateInfos size="1">
<RateInfo priceBreakdown="true" promo="false" rateChange="true">
<RoomGroup>
<Room>
<numberOfAdults>2</numberOfAdults>
<numberOfChildren>2</numberOfChildren>
<childAges>8</childAges>
<childAges>12</childAges>
<firstName>test</firstName>
<lastName>tester</lastName>
<bedTypeId>67</bedTypeId>
<bedTypeDescription>1 king and 1 sofa bed</bedTypeDescription>
<smokingPreference>NS</smokingPreference>
</Room>
<Room>
<numberOfAdults>2</numberOfAdults>
<numberOfChildren>0</numberOfChildren>
<firstName>test</firstName>
<lastName>tester</lastName>
<bedTypeId>67</bedTypeId>
<bedTypeDescription>1 king and 1 sofa bed</bedTypeDescription>
<smokingPreference>NS</smokingPreference>
</Room>
</RoomGroup>
<ChargeableRateInfo averageBaseRate="122.77" averageRate="122.77" commissionableUsdTotal="491.08" currencyCode="USD" maxNightlyRate="129.59" nightlyRateTotal="491.08" surchargeTotal="27.02" total="518.1">
<NightlyRatesPerRoom size="2">
<NightlyRate baseRate="115.95" rate="115.95" promo="false"/>
<NightlyRate baseRate="129.59" rate="129.59" promo="false"/>
</NightlyRatesPerRoom>
<Surcharges size="1">
<Surcharge type="TaxAndServiceFee" amount="27.02"/>
</Surcharges>
</ChargeableRateInfo>
<cancellationPolicy>We understand that sometimes your travel plans change. We do not charge a change or cancel fee. However, this property (Novotel Milan Nord Ca Granda) imposes the following penalty to its customers that we are required to pass on: Cancellations or changes made after 5:00 PM ((GMT+01:00) Brussels, Copenhagen, Madrid, Paris) on Aug 10, 2014 are subject to a 1 Night Room &amp; Tax penalty. The property makes no refunds for no shows or early checkouts.</cancellationPolicy> <CancelPolicyInfoList>
<CancelPolicyInfo>
<versionId>209134416</versionId>
<cancelTime>18:00:00</cancelTime>
<startWindowHours>0</startWindowHours>
<nightCount>1</nightCount>
<currencyCode>USD</currencyCode>
<timeZoneDescription>(GMT+01:00) Brussels, Copenhagen, Madrid, Paris</timeZoneDescription>
</CancelPolicyInfo>
<CancelPolicyInfo>
<versionId>209134415</versionId>
<cancelTime>18:00:00</cancelTime>
<startWindowHours>1</startWindowHours>
<nightCount>0</nightCount>
<currencyCode>USD</currencyCode>
<timeZoneDescription>(GMT+01:00) Brussels, Copenhagen, Madrid, Paris</timeZoneDescription>
</CancelPolicyInfo>
</CancelPolicyInfoList>
<nonRefundable>false</nonRefundable>
<HotelFees size="1">
<HotelFee description="MandatoryTax" amount="81.16">
<HotelFeeBreakdown unit="Per person" frequency="Per night"/>
</HotelFee>
</HotelFees>
<rateType>MerchantStandard</rateType>
</RateInfo>
</RateInfos>
</HotelRoomReservationResponse>
</ns2:getReservationResponse>
</soap:Body>
</soap:Envelope>
JSON Booking Response
{
"HotelRoomReservationResponse": {
"customerSessionId": "0ABAAACE-8D64-3191-4722-1D3859B948E8",
"itineraryId": ####,
"confirmationNumbers": [
1234,
1235
],
"processedWithConfirmation": true,
"supplierType": "E",
"reservationStatusCode": "CF",
"existingItinerary": false,
"numberOfRoomsBooked": 2,
"drivingDirections": "",
"checkInInstructions": "",
"arrivalDate": "08\/10\/2014",
"departureDate": "08\/12\/2014",
"hotelName": "Novotel Milan Nord Ca Granda",
"hotelAddress": "Viale Giovanni Suzzani 13",
"hotelCity": "Milan",
"hotelPostalCode": 20162,
"hotelCountryCode": "IT",
"roomDescription": "Superior Room, 1 King Bed with Sofabed",
"rateOccupancyPerRoom": 3,
"RateInfos": {
"@size": "1",
"RateInfo": {
"@priceBreakdown": "true",
"@promo": "false",
"@rateChange": "true",
"RoomGroup": {
"Room": [
{
"numberOfAdults": 2,
"numberOfChildren": 2,
"childAges": [
8,
12
],
"firstName": "test",
"lastName": "tester",
"bedTypeId": 67,
"bedTypeDescription": "1 king and 1 sofa bed",
"smokingPreference": "NS"
},
{
"numberOfAdults": 1,
"numberOfChildren": 0,
"firstName": "test",
"lastName": "tester",
"bedTypeId": 67,
"bedTypeDescription": "1 king and 1 sofa bed",
"smokingPreference": "NS"
}
]
},
"ChargeableRateInfo": {
"@averageBaseRate": "122.77",
"@averageRate": "122.77",
"@commissionableUsdTotal": "491.08",
"@currencyCode": "USD",
"@maxNightlyRate": "129.59",
"@nightlyRateTotal": "491.08",
"@surchargeTotal": "27.02",
"@total": "518.1",
"NightlyRatesPerRoom": {
"@size": "2",
"NightlyRate": [
{
"@baseRate": "115.95",
"@rate": "115.95",
"@promo": "false"
},
{
"@baseRate": "129.59",
"@rate": "129.59",
"@promo": "false"
}
]
},
"Surcharges": {
"@size": "1",
"Surcharge": {
"@type": "TaxAndServiceFee",
"@amount": "27.02"
}
}
},
"cancellationPolicy": "We understand that sometimes your travel plans change. We do not charge a change or cancel fee. However, this property (Novotel Milan Nord Ca Granda) imposes the following penalty to its customers that we are required to pass on: Cancellations or changes made after 5:00 PM ((GMT+01:00) Brussels, Copenhagen, Madrid, Paris) on Aug 10, 2014 are subject to a 1 Night Room & Tax penalty. The property makes no refunds for no shows or early checkouts.",
"CancelPolicyInfoList": {
"CancelPolicyInfo": [
{
"versionId": 209134416,
"cancelTime": "18:00:00",
"startWindowHours": 0,
"nightCount": 1,
"currencyCode": "USD",
"timeZoneDescription": "(GMT+01:00) Brussels, Copenhagen, Madrid, Paris"
},
{
"versionId": 209134415,
"cancelTime": "18:00:00",
"startWindowHours": 1,
"nightCount": 0,
"currencyCode": "USD",
"timeZoneDescription": "(GMT+01:00) Brussels, Copenhagen, Madrid, Paris"
}
]
},
"nonRefundable": false,
"HotelFees": {
"@size": "1",
"HotelFee": {
"@description": "MandatoryTax",
"@amount": "68.20",
"HotelFeeBreakdown": {
"@unit": "Per person",
"@frequency": "Per night"
}
}
},
"rateType": "MerchantStandard"
}
}
}
}


Itinerary Request

The itinerary request differs only when specifying a date range. Under REST, simply omit the <ItineraryQuery> element and provide your creation or departure date parameters directly. There are no updates unique to single itinerary retrievals.

SOAP Itinerary Request - Single Itinerary
<v3:getItinerary>
<HotelItineraryRequest>
<apiKey>#####</apiKey>
<cid>#####</cid>
<customerIpAddress>xxx</customerIpAddress>
<customerSessionId>xxx</customerSessionId>
<customerUserAgent>xxx</customerUserAgent> <minorRev>##</minorRev>
<locale>en_US</locale>
<currencyCode>USD</currencyCode> <itineraryId>##########</itineraryId>
<email>test@travelnow.com</email>
</HotelItineraryRequest>
</v3:getItinerary>
REST Itinerary Request - Single Itinerary
http://api.ean.com/ean-services/rs/hotel/v3/itin?
apiKey=#####
&cid=#####
&customerIpAddress=#####
&customerUserAgent=######
&customerSessionId=#####
&minorRev=##
&locale=en_US
&currencyCode=USD
&_type=json
&itineraryId=#########
&email=test@travelnow.com
    

SOAP Itinerary Request - Date Range
<v3:getItinerary>
<HotelItineraryRequest>
<apiKey>#####</apiKey>
<cid>#####</cid>
<customerIpAddress>xxx</customerIpAddress>
<customerSessionId>xxx</customerSessionId>
<customerUserAgent>xxx</customerUserAgent> <minorRev>##</minorRev>
<locale>en_US</locale>
<currencyCode>USD</currencyCode> <ItineraryQuery> <creationDateStart>09/1/2014</creationDateStart> <creationDateEnd>09/8/2014</creationDateEnd> </ItineraryQuery>
</HotelItineraryRequest>
</v3:getItinerary>
REST Itinerary Request - Date Range
http://api.ean.com/ean-services/rs/hotel/v3/itin?
apiKey=#####
&cid=#####
&customerIpAddress=#####
&customerUserAgent=######
&customerSessionId=#####
&minorRev=##
&locale=en_US
&currencyCode=USD
&_type=json
&creationDateStart=09/01/2014
&creationDateEnd=09/08/2014
    
Itinerary Response

All SOAP itinerary responses place each itinerary within their own Itinerary object.

Under REST, for creation or departure date range responses only, itineraries are indexed numerically within a single Itinerary object, with the first itinerary beginning at 0. Individual itinerary requests still return data within a single Itinerary object. For brevity, only example date range responses are provided below.

SOAP Itinerary Response - Date Range
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:getItineraryResponse xmlns:ns2="http://v3.hotel.wsapi.ean.com/">
<HotelItineraryResponse size="17">
<customerSessionId>xxx</customerSessionId>
<Itinerary>
<itineraryId>##########</itineraryId>
<affiliateId>######</affiliateId>
<creationDate>09/03/2014</creationDate>
<creationTime>15:13:11 CDT</creationTime>
<itineraryStartDate>10/03/2014</itineraryStartDate>
<itineraryEndDate>10/05/2014</itineraryEndDate>
<Customer>
<email>test@travelnow.com</email>
<firstName>test</firstName>
<lastName>tester</lastName>
<homePhone>#########</homePhone>
<workPhone>#########</workPhone>
<CustomerAddresses>
<address1>travelnow</address1>
<city>Seattle</city>
<stateProvinceCode>WA</stateProvinceCode>
<countryCode>US</countryCode>
<postalCode>98004</postalCode>
<isPrimary>true</isPrimary>
<type>1</type>
</CustomerAddresses>
</Customer>
<HotelConfirmation>
<supplierId>13</supplierId>
<chainCode>EP</chainCode>
<arrivalDate>10/03/2014</arrivalDate>
<departureDate>10/05/2014</departureDate>
<confirmationNumber>1234</confirmationNumber>
<RateInfos size="1">
<RateInfo priceBreakdown="true" promo="false" rateChange="false">
<ChargeableRateInfo averageBaseRate="8941.0" averageRate="8941.0" commissionableUsdTotal="170.14" currencyCode="JPY" maxNightlyRate="8941.0" nightlyRateTotal="17882.0" total="17882.0">
<NightlyRatesPerRoom size="2">
<NightlyRate baseRate="8941.0" rate="8941.0" promo="false"/>
<NightlyRate baseRate="8941.0" rate="8941.0" promo="false"/>
</NightlyRatesPerRoom>
</ChargeableRateInfo>
<cancellationPolicy>Ce montant ne peut être ni remboursé, ni modifié, ni annulé. Si vous décidez tout de même de modifier ou annuler cette réservation, vos paiements ne vous seront pas remboursés.</cancellationPolicy>
<nonRefundable>true</nonRefundable>
<online>true</online>
<HotelFees size="1">
<HotelFee description="MandatoryTax" amount="1919"/>
</HotelFees>
<rateType>MerchantStandard</rateType>
</RateInfo>
</RateInfos>
<numberOfAdults>2</numberOfAdults>
<numberOfChildren>0</numberOfChildren>
<smokingPreference>N</smokingPreference>
<supplierPropertyId>525133</supplierPropertyId>
<roomTypeCode>176765</roomTypeCode>
<rateCode>1086015</rateCode>
<rateDescription>Réservez tôt et économisez 14%</rateDescription>
<roomDescription>Chambre Double Standard</roomDescription>
<status>DT</status>
<locale>fr_FR</locale>
<ReservationGuest>
<firstName>test</firstName>
<lastName>tester</lastName>
</ReservationGuest>
<Hotel>
<hotelId>113856</hotelId>
<statusCode>A</statusCode>
<name>Hotel BLOOM</name>
<address1>Rue Royale 250</address1>
<city>Brussels</city>
<countryCode>BE</countryCode>
<postalCode>1210</postalCode>
<phone>32-22-206611</phone>
<fax>32-22-178444</fax>
<latitude>50.8552</latitude>
<longitude>4.36673</longitude>
<coordinateAccuracyCode>1</coordinateAccuracyCode>
<lowRate>154.7501</lowRate>
<highRate>297.7253</highRate>
<confidence>88</confidence>
<hotelRating>4.0</hotelRating>
<tripAdvisorRating>4.0</tripAdvisorRating>
<market>Brussels, Belgium</market>
<region>Benelux</region>
<superRegion>EMEA</superRegion>
<theme>Business Hotel</theme>
</Hotel>
<nights>2</nights>
</HotelConfirmation>
</Itinerary>
<Itinerary>
<itineraryId>169502105</itineraryId>
<affiliateId>451667</affiliateId> {truncated for brevity}
JSON Itinerary Response - Date Range
{
@size: "17",
customerSessionId: "0ABAAA35-7CC0-4914-85B2-C2517490798A",
Itinerary: { 1: {
itineraryId: 169435416,
affiliateId: 451667,
creationDate: "09/03/2014",
creationTime: "15:13:11 CDT",
itineraryStartDate: "10/03/2014",
itineraryEndDate: "10/05/2014",
Customer: {
email: "test@travelnow.com",
firstName: "test",
lastName: "tester",
homePhone: 2145370159,
workPhone: 2145370159,
CustomerAddresses: {
address1: "travelnow",
city: "Seattle",
stateProvinceCode: "WA",
countryCode: "US",
postalCode: 98004,
isPrimary: true,
type: 1
}
},
HotelConfirmation: {
supplierId: 13,
chainCode: "EP",
arrivalDate: "10/03/2014",
departureDate: "10/05/2014",
confirmationNumber: 1234,
RateInfos: {
@size: "1",
RateInfo: {
@priceBreakdown: "true",
@promo: "false",
@rateChange: "false",
ChargeableRateInfo: {
@averageBaseRate: "8941.0",
@averageRate: "8941.0",
@commissionableUsdTotal: "170.14",
@currencyCode: "JPY",
@maxNightlyRate: "8941.0",
@nightlyRateTotal: "17882.0",
@total: "17882.0",
NightlyRatesPerRoom: {
@size: "2",
NightlyRate: {
0: {
@baseRate: "8941.0",
@rate: "8941.0",
@promo: "false"
},
1: {
@baseRate: "8941.0",
@rate: "8941.0",
@promo: "false"
}
}
}
},
cancellationPolicy: "Ce montant ne peut être ni remboursé, ni modifié, ni annulé. Si vous décidez tout de même de modifier ou annuler cette réservation, vos paiements ne vous seront pas remboursés.",
nonRefundable: true,
online: true,
HotelFees: {
@size: "1",
HotelFee: {
@description: "MandatoryTax",
@amount: "1919"
}
},
rateType: "MerchantStandard"
}
},
numberOfAdults: 2,
numberOfChildren: 0,
smokingPreference: "N",
supplierPropertyId: 525133,
roomTypeCode: 176765,
rateCode: 1086015,
rateDescription: "Réservez tôt et économisez 14%",
roomDescription: "Chambre Double Standard",
status: "DT",
locale: "fr_FR",
ReservationGuest: {
firstName: "test",
lastName: "tester"
},
Hotel: {
hotelId: 113856,
statusCode: "A",
name: "Hotel BLOOM",
address1: "Rue Royale 250",
city: "Brussels",
countryCode: "BE",
postalCode: 1210,
phone: "32-22-206611",
fax: "32-22-178444",
latitude: 50.8552,
longitude: 4.36673,
coordinateAccuracyCode: 1,
lowRate: 154.7501,
highRate: 297.7253,
confidence: 88,
hotelRating: 4,
tripAdvisorRating: 4,
market: "Brussels, Belgium",
region: "Benelux",
superRegion: "EMEA",
theme: "Business Hotel"
},
nights: 2
}
},
2: {
itineraryId: 169502105,
affiliateId: 451667,
creationDate: "09/04/2014",
creationTime: "03:05:07 CDT", {truncated for brevity}



Cancellation Request

There are no updates unique to the cancellation request or response. Examples are provided for comparison.

SOAP Cancellation Request
<v3:getCancellation>
<HotelRoomCancellationRequest>
<apiKey>#####</apiKey>
<cid>#####</cid>
<customerIpAddress>xxx</customerIpAddress>
<customerSessionId>xxx</customerSessionId>
<customerUserAgent>xxx</customerUserAgent> <minorRev>##</minorRev>
<locale>en_US</locale>
<currencyCode>USD</currencyCode> <itineraryId>170009837</itineraryId>
<email>test@travelnow.com</email> <reason>COP</reason> <confirmationNumber>xxxxxxx</confirmationNumber>
</HotelRoomCancellationRequest>
</v3:getCancellation>
REST Cancellation Request
http://api.ean.com/ean-services/rs/hotel/v3/itin?
apiKey=#####
&cid=#####
&customerIpAddress=#####
&customerUserAgent=######
&customerSessionId=#####
&minorRev=##
&locale=en_US
&currencyCode=USD
&itineraryId=xxxxxxx
&email=email@domain.com
&reason=COP
&confirmationNumber=xxxxxxxx 
Cancellation Response
SOAP Cancellation Response
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <ns1:getCancellationResponse xmlns:ns1="http://v3.hotel.wsapi.ean.com/">
         <HotelRoomCancellationResponse>
            <customerSessionId>XXXX</customerSessionId>
            <cancellationNumber>XXXXX</cancellationNumber>
         </HotelRoomCancellationResponse>
      </ns1:getCancellationResponse>
JSON Cancellation Response
{
   "HotelRoomCancellationResponse":{
      "customerSessionId":"XXXX",
      "cancellationNumber":"XXXXX"
   }
}