Dear Agent
For your security you are required to change your Old Password.
The purpose of this document is to provide technical details about the API's. This document outlines the business processes supported by the API and details about specifications of API’s. It assumes that reader has a technical background and is familiar with JSON, API's.
It is recommended that at least all booking and cancellation transactions sent through the Test / Live environment should be logged and maintained by the hotel agent for at least 6 months.
In order to start testing, please notify our support team via e-mail at apisupport@technoheaven.com
When you have completed your development, contact your Account Manager for the activation of the access IP address of Test/Live Server is essential for whitelisting
Once you receive your Access token, you can start the development of your application/framework. The whole process of communication consists of simple JSON messages exchange (request /response) between your application/framework and system. Each request needs to be posted (through POST method) using https protocols. For details regarding requests and answers formats please consult the dedicated area of each request. For further assistance in development process do not hesitate to contact our support team.
Before you go live you need to share pdf sample voucher after booking.
{ "code": "NOCOUNT_ERROR", "type": "GENERAL", "description": "No availability found for given criteria try search with other criteria" }
{ "code": "INTERNAL_ERROR", "type": "API_ERROR", "description": "the server was unable to process the request due to an internal error" }
The Countries API has been designed to provide All Countries data. The following sections describe the Countries API Request and Response Format.
{ "Token": "Token" }
{ "CountryId": "ID", "Name": "name" }, Example : "CountryId": "25773", "Name": "AFGHANISTAN"
The Hotel List Search API has been designed to provide list of all Hotels with display Minimum price for particular city. The following sections describe the Hotel List Search request and response format
{ "Token": “Token”, "Request": { "CountryId": "ID" } }
{ "CityId":ID, "Name": "NAME" } Example : "CityId":26467, "Name": "KABUL"
AllCitieswithCountry API has been designed to provide list of all cities with country .The following sections describe the AllCitieswithCountry in one API call request and response format.
{ "Token": "", "Request": { "onlyhotel": 0 } }
{ "cityid": ID, "cityname": "", "countryid": ID, "countryname": "" },
AllHotelsByCity API has been designed to provide list of all Hotel details for that particular City. The following sections describe the AllHotelsByCity API request and response format.
{ "Token":"Token" , "Request": { "CityId" : ID } }
{ "HotelId": ID, "HotelName": "", "Latitude": " ", "longitude": " ", "Address": " ", "Rating": " ", "IsRecomondedHotel": false },
The Availability API has been designed to provide list of all Hotels The following sections describe the hotellistsearch API request and response format. Currency set up done only once account is created and you have to use that Currency for transaction with api.
'{ "Token": "{{token}}", "Request": { "Rooms": [ { "RoomNo": 1, "NoofAdults": 2, "NoOfChild": 0, "ChildAge": [] }, { "RoomNo": 2, "NoofAdults": 1, "NoOfChild": 0, "ChildAge": [] } ], "CityID": "{{testcityid}}", "CheckInDate": "10-15-2019", "CheckOutDate": "10-16-2019", "NoofNights": "1", "Nationality": "india", "Filters": { "IsRecommendedOnly": "0", "IsShowRooms": "1", "IsOnlyAvailable": "1", "StarRating": { "Min": 4, "Max": 5 }, "HotelIds": "6003" } }, "AdvancedOptions": { "Currency": "USD" } }'
{ "Error": [], "AvailabilityRS": { "SearchKey": "JUNI_abbcd_511377478234040736", "Count": 1, "Currency": "USD", "HotelResult": [ { "StartPrice": 89.88, "HotelId": 6003, "HotelOption": [ { "HotelOptionId": "0|6003||0", "MinPrice": 89.88, "IsCombineRoom": false, "HotelRooms": [ [ { "RoomNo": "1", "RoomTypeName": "Deluxe Room", "MealName": "RO", "Price": 44.94, "BookingStatus": "Available", "RoomToken": "MHwwfDB8MA==", "MappedMealName": "Room Only" }, { "RoomNo": "2", "RoomTypeName": "Deluxe Room", "MealName": "RO", "Price": 44.94, "BookingStatus": "Available", "RoomToken": "MHwwfDB8MQ==", "MappedMealName": "Room Only" } ] ] } ] } ] } }
As we have both direct inventories and dynamic rates also so for some cases you will receive combined room in multiple room search ,so for easy to identify these rates we have now added new parameter in availability response IsCombined (true,false) if its true then rooms are combined to one room .for example : if search is forrooms :2room 1 : 1 adultroom 2 : 2 adultthen id IsCombined =true that means both rooms are combined in one (roomNo: "1") ;if False : then you recieve list of rooms(RoomNo:1,RoomNo:2).and when you try to book such combined room you have to pass pax details separately for both the rooms.- For Essential information you need to hit CancellationPolicy/Multi API
The AvailabilityWithCancellation API has been designed to provide list of Hotels with cancellation policy. The following sections describe the hotellistsearch API request and response format. Currency set up done only once account is created and you have to use that Currency for transaction with api.
{ "Error": [], "AvailabilityRS": { "SearchKey": "JUNI_abbcd_511377478234040736", "Count": 1, "Currency": "USD", "HotelResult": [ { "StartPrice": 89.88, "HotelId": 6003, "HotelOption": [ { "HotelOptionId": "0|6003||0", "MinPrice": 89.88, "IsCombineRoom": false, "HotelRooms": [ [ { "RoomNo": "1", "RoomTypeName": "Deluxe Room", "MealName": "RO", "Price": 44.94, "BookingStatus": "Available", "RoomToken": "MHwwfDB8MA==", "MappedMealName": "Room Only", "CancellationPolicy": [ { "FromDate": "08-25-2019", "ToDate": "10-15-2019", "CancellationPrice": 44.94 } ] }, { "RoomNo": "2", "RoomTypeName": "Deluxe Room", "MealName": "RO", "Price": 44.94, "BookingStatus": "Available", "RoomToken": "MHwwfDB8MQ==", "MappedMealName": "Room Only", "CancellationPolicy": [ { "FromDate": "08-25-2019", "ToDate": "10-15-2019", "CancellationPrice": 44.94 } ] } ] ] } ] } ] } }
- As we have both direct inventories and dynamic rates also so for some cases you will receive combined room in multiple room search ,so for easy to identify these rates we have now added new parameter in availability response IsCombined (true,false) if its true then rooms are combined to one room .for example : if search is forrooms :2room 1 : 1 adultroom 2 : 2 adultthen id IsCombined =true that means both rooms are combined in one (roomNo: "1") ;if False : then you recieve list of rooms(RoomNo:1,RoomNo:2).and when you try to book such combined room you have to pass pax details separately for both the rooms.- For Essential information you need to hit CancellationPolicy/Multi API
The CancellationPolicy for Hotel API has been designed to provide Price of cancellation for particular Room. The following section describes API request and response format.
'{ "Token": "{{token}}", "Request": { "SearchKey": "JUNI_062f2_761297949105040736", "HotelOptionId": "0|518305|71|0", "RoomToken": "MHwwfDB8MA==" }, "AdvancedOptions": { "Currency": "USD" } }'
{ "Error": [], "CancellationRS": { "Currency": "", "EssentialInformation": "", "CancellationPolicy": [ { "FromDate": "", "ToDate": "", "CancellationPrice": 0 }, { "FromDate": "", "ToDate": "", "CancellationPrice": 4 } ] } }
The CancellationPolicyMulti for Hotel API has been designed to provide Price of cancellation for multiple Room in single request. The following section describes API request and response format.
'{ "Token": "{{token}}", "Request": { "SearchKey": "JUNI_8f472_314794958374040736", "HotelOption": { "HotelOptionId": "0|6003||1", "HotelRooms": [ { "RoomNo": "1", "RoomToken": "MHwxfDB8MA==" }, { "RoomNo": "2", "RoomToken": "MHwxfDB8MQ==" } ] } }, "AdvancedOptions": { "Currency": "USD" } }'
{ "Error": [], "Currency": "USD", "CancellationRS": [ { "RoomNo": "1", "RoomTypeName": "Deluxe Room", "MealName": "RO", "MappedMealName": "Room Only", "EssentialInformation": "test", "CancellationPolicy": [ { "FromDate": "09-14-2019", "ToDate": "10-09-2019", "CancellationPrice": 0 }, { "FromDate": "10-10-2019", "ToDate": "10-11-2019", "CancellationPrice": 44.94 }, { "FromDate": "10-12-2019", "ToDate": "10-15-2019", "CancellationPrice": 44.94 } ], "RoomToken": "MHwxfDB8MA==" }, { "RoomNo": "2", "RoomTypeName": "Deluxe Room", "MealName": "RO", "MappedMealName": "Room Only", "EssentialInformation": "test", "CancellationPolicy": [ { "FromDate": "09-14-2019", "ToDate": "10-09-2019", "CancellationPrice": 0 }, { "FromDate": "10-10-2019", "ToDate": "10-11-2019", "CancellationPrice": 44.94 }, { "FromDate": "10-12-2019", "ToDate": "10-15-2019", "CancellationPrice": 44.94 } ], "RoomToken": "MHwxfDB8MQ==" } ] }
The PreBook API has been designed to check availability status of booking before book.This APImust hit once for one booking or you will get duplication error.The following section describesAPI request and response format.in case of isCombineRoom= true we are going to do one change inprevious response we sending price = 0 in other rooms and in roomNo=1 we giving you total price , butin new response we divide price in each room Total price will not change.only price is divided insideroom.
{ "Error": [], "PreBookRS": { "HotelOption": { "HotelName": "Furama Bukit Bintang", "Nationality": "india", "BookingToken": "AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAB9ULsBH5aEqM0CAEECduwQQAAAACAAAAAAAQZgAAAAEAACAAAACeDkUq4CRX1EKMv2xwZiAUkJpI+16bG+RDz6HeA7YHsQAAAAAOgAAAAAIAACAAAABl5T3CvZFJr2tMct1T/U+H7ugI/C+3SYeflQFpVSUa1FAAAAC62+5S8KULsIOkO8F69KwQNsEltgfL89NS8YZUwA6uRh8F5EuZgY7zI3g3Rg2ZlHaO8YS1My/fRH7heUtQVT5hPmaHN8BTo8Y8EUcIG3AFeEAAAADCXPDswnJGd1NKmt/urgiYq3Xli6F71B0TgR80QsVufhY1toDousdPtSBNkf4qs9lUq+0yhKUxZe9cix+0EfK4", "Status": "Bookable", "IsPriceChange": 0, "CheckInDate": "10-15-2019", "CheckOutDate": "10-16-2019", "TotalPrice": 89.88, "HotelRooms": [ { "UniqueId": 306216, "RoomNo": "1", "RoomTypeName": "Deluxe Room", "MealName": "RO", "Price": 44.94, "PriceChange": { "OldPrice": 0, "NewPrice": 0 }, "MappedMealName": "Room Only" }, { "UniqueId": 306217, "RoomNo": "2", "RoomTypeName": "Deluxe Room", "MealName": "RO", "Price": 44.94, "PriceChange": { "OldPrice": 0, "NewPrice": 0 }, "MappedMealName": "Room Only" } ] }, "Currency": "USD" } }
{ "Error": [], "PreBookRS": { "HotelOption": { "HotelName": "AVANI Deira Dubai Hotel", "Nationality": "malaysia", "BookingToken": "BookingToken" , "Status": "Bookable", "IsPriceChange": 0, "CheckInDate": "01-21-2020", "CheckOutDate": "01-22-2020", "TotalPrice": 522.38, "HotelRooms": [ { "UniqueId": 158841, "RoomNo": "1", "RoomTypeName": "2 X Single room ", "MealName": "Room Only", "Price": 261.19, "PriceChange": { "OldPrice": 0, "NewPrice": 0 } }, { "UniqueId": 158842, "RoomNo": "2", "RoomTypeName": "2 X Single room ", "MealName": "Room Only", "Price": 261.19, "PriceChange": { "OldPrice": 0, "NewPrice": 0 } } ] }, "Currency": "AED" } }
The Book API has been designed to give booking details .The following section describes API request and response format. After getting response or error in book response. you have to mandatory perform booking detail api to get the actual status of booking using your internal reference or reference number from Bookresponse.
'{ "Token": "{{token}}", "Request": { "SearchKey": "JUNI_8f472_314794958374040736", "BookRQ": { "BookingToken": "AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAB9ULsBH5aEqM0CAEECduwQQAAAACAAAAAAAQZgAAAAEAACAAAACeDkUq4CRX1EKMv2xwZiAUkJpI+16bG+RDz6HeA7YHsQAAAAAOgAAAAAIAACAAAABl5T3CvZFJr2tMct1T/U+H7ugI/C+3SYeflQFpVSUa1FAAAAC62+5S8KULsIOkO8F69KwQNsEltgfL89NS8YZUwA6uRh8F5EuZgY7zI3g3Rg2ZlHaO8YS1My/fRH7heUtQVT5hPmaHN8BTo8Y8EUcIG3AFeEAAAADCXPDswnJGd1NKmt/urgiYq3Xli6F71B0TgR80QsVufhY1toDousdPtSBNkf4qs9lUq+0yhKUxZe9cix+0EfK4", "TotalPrice": 89.88, "InternalReference": "animesh7777q", "HotelRooms": [ { "UniqueId": 306216, "RoomNo": "1", "IsLead": "1", "PaxType": "Adult", "Prefix": "Mr.", "FirstName": "apitest", "LastName": "animesh", "ChildAge": "0" }, { "UniqueId": 306216, "RoomNo": "1", "IsLead": "0", "PaxType": "Adult", "Prefix": "Mr.", "FirstName": "apitest second", "LastName": "animesh", "ChildAge": "0" }, { "UniqueId": 306217, "RoomNo": "2", "IsLead": "0", "PaxType": "Adult", "Prefix": "Mr.", "FirstName": "apitest room two", "LastName": "animesh", "ChildAge": "0" } ] } }, "AdvancedOptions": { "Currency": "AED" } }'
{ "Error": [], "BookRS": { "BookingId": 0, "ReferenceNo": "JUNIMA091901633", "InternalReference": "animesh7777q", "Currency": "USD" } }
API has been designed to Generate bookingDetails .The following section describes API request and response format. Only one ID can be passed. You can get booking details using either BookigID or your internalReference
'{ "Token": "{{token}}", "Request": { "BookingDetailRQ": { "BookingId": "0", "ReferenceNo": "", "InternalReference": "animesh7777q" } }, "AdvancedOptions": { "Currency": "USD" } }'
{ "Error": [], "BookingDetailRS": { "HotelOption": { "HotelName": "Furama Bukit Bintang, Kuala Lumpur", "HotelId": "6003", "Nationality": "india", "BookingId": 61405, "InternalReference": "animesh7777q", "ReferenceNo": "JUNIMA091901633", "CheckInDate": "10-15-2019", "CheckOutDate": "10-16-2019", "BookingDate": "09-14-2019", "LeadPaxName": "Mr.apitest animesh", "TotalPrice": 89.88, "HotelRooms": [ { "RoomNo": "1", "RoomTypeName": "Deluxe Room-RO", "MealName": "RO", "MappedMealName": "Room Only", "Price": 44.94, "BookingStatus": "Confirmed", "CancellationPolicy": [ { "FromDate": "09-14-2019", "ToDate": "10-09-2019", "CancellationPrice": 0 }, { "FromDate": "10-10-2019", "ToDate": "10-11-2019", "CancellationPrice": 44.94 }, { "FromDate": "10-12-2019", "ToDate": "10-15-2019", "CancellationPrice": 44.94 } ], "Passenger": [ { "IsLead": 1, "PaxType": "Adult", "Name": "Mr.apitest animesh", "ChildAge": "0" }, { "IsLead": 0, "PaxType": "Adult", "Name": "Mr.apitest second animesh", "ChildAge": "0" } ] }, { "RoomNo": "2", "RoomTypeName": "Deluxe Room-RO", "MealName": "RO", "MappedMealName": "Room Only", "Price": 44.94, "BookingStatus": "Confirmed", "CancellationPolicy": [ { "FromDate": "09-14-2019", "ToDate": "10-09-2019", "CancellationPrice": 0 }, { "FromDate": "10-10-2019", "ToDate": "10-11-2019", "CancellationPrice": 44.94 }, { "FromDate": "10-12-2019", "ToDate": "10-15-2019", "CancellationPrice": 44.94 } ], "Passenger": [ { "IsLead": 0, "PaxType": "Adult", "Name": "Mr.apitest room two animesh", "ChildAge": "0" } ] } ] }, "Currency": "USD" } }
'{ "Token": "{{token}}", "Request": { "CheckHotelCancellationChargesRQ": { "BookingId": 0, "InternalReference": "animesh7777q", "ReferenceNo": "JUNIMA091901633" } } , "AdvancedOptions": { "Currency": "USD" } }'
{ "Error": [], "CheckHotelCancellationChargesRS": { "HotelOption": { "BookingId": 61405, "TotalPrice": 89.88, "TotalCharge": 0, "TotalRefund": 89.88, "CancelCode": "AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAB9ULsBH5aEqM0CAEECduwQQAAAACAAAAAAAQZgAAAAEAACAAAAA9wmuWbeR+QomGD5P6nTd5XEFIK1DB1NQB+xfY+O5xbQAAAAAOgAAAAAIAACAAAADl+mocQZJPIJnDMIpE7SIvsVaaIfxoFc8YDDxO1hQaL1AAAAAUwv8bPttkxmV4SjgLCJI7VTf9vsr9Q5wTuaZtprtl+2kwlBlQha9ujf96Cpkyc93ZMOD5aXs+k5X/tPW4HAQ8x33L/fX5BOFEdlzvGL+4w0AAAAAc2eQAPFfQ1OunEfg2MJKm2L/RaDAg/lTaeMg128qdOOsL1CJWxv/zCTp8ftFgfmq4PGmAhqsGktSej4d5s975", "HotelRooms": [ { "BookingDetailId": 66147, "RoomTypeName": "Deluxe Room-RO", "Price": 44.94, "RefundAmount": 44.94 }, { "BookingDetailId": 66148, "RoomTypeName": "Deluxe Room-RO", "Price": 44.94, "RefundAmount": 44.94 } ] }, "Currency": "USD" } }
API has been designed to cancle booking .The following section describes API request and response format.
'{ "Token": "{{token}}", "Request": { "CancelRQ": { "BookingId": 61405, "BookingDetailId": 66147, "CancelCode": "AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAB9ULsBH5aEqM0CAEECduwQQAAAACAAAAAAAQZgAAAAEAACAAAAA9wmuWbeR+QomGD5P6nTd5XEFIK1DB1NQB+xfY+O5xbQAAAAAOgAAAAAIAACAAAADl+mocQZJPIJnDMIpE7SIvsVaaIfxoFc8YDDxO1hQaL1AAAAAUwv8bPttkxmV4SjgLCJI7VTf9vsr9Q5wTuaZtprtl+2kwlBlQha9ujf96Cpkyc93ZMOD5aXs+k5X/tPW4HAQ8x33L/fX5BOFEdlzvGL+4w0AAAAAc2eQAPFfQ1OunEfg2MJKm2L/RaDAg/lTaeMg128qdOOsL1CJWxv/zCTp8ftFgfmq4PGmAhqsGktSej4d5s975", "CancelAll": 0, "Reason": "test booking" } }, "AdvancedOptions": { "Currency": "USD" } }'
{ "Error": [], "CancelRS": { "HotelOption": { "BookingId": 61405, "HotelRooms": [ { "RoomTypeName": "Deluxe Room-RO", "Message": "Room Cancelled Successfully!!!", "CancelStatus": 1 } ] }, "Currency": "USD" } }
API has been designed to Generate bookingDetails .Date range allowed 31 days. The following section describes API request and response format.
{ "Token": "", "Request": { "BookingSearchRQ": { "SearchBy": "bookingdate", {bookingdate or checkindate}, "OnlyAPI":1, "SearchCriteria": { "Dates": { "FromDate": "03-19-2019", "ToDate": "04-19-2019" } } } }, "AdvancedOptions": { "Currency": "MYR" } }
{ "Error": [], "BookingSearchRS": { "BookingList": [ { "HotelName": "J", "HotelId": "1", "BookingId": , "InternalReference": "", "ReferenceNo": "AAA", "CheckInDate": "08-14-2019", "CheckOutDate": "08-15-2019", "BookingDate": "04-01-2019", "TotalPrice": 1, "BookingStatus": "cancelled", "IsAPI":true ,false } ], "Currency": "MYR" } }
Please go through certification process in order to get live access.
To ensure what API methods you are using, flow of method calls for these methods. This will help us to verify the integration.
Here we are providing a list of test cases needs to be executed .Request / response for these cases will be required for verification .
Technical team will verify the test cases using Request / Response and suggest if there is any change required.
After completion of step 3, you have to provide test link of your integration website to verify the integration flow.
On successful completion of all the above steps, we will give sign off and provide Live access details.
We offer a wide range of accommodation and travel booking services (Services) across our websites, channels and platforms. We refer to all of these services, together with our applications and websites as "Services" in this Privacy Notice.
For the purposes of the General Data Protection Regulation 2016/679 ("GDPR"), and to the extent that we process personal information of our B2B Partners, we are an independent "data controller". Any personal information we collect and process in this context, is necessary to enable us to manage our business relationship with our B2B Partners (Agents and Suppliers), to supply our Services and to perform our business functions and activities, including:
We are firmly committed to ensuring the privacy of the personal information we collect and to maintaining safeguards to protect personal information in our care. There may be instances where your local data protection laws impose more restrictive information handling practices than the practices set out in this Privacy Notice. Where this occurs, we will adjust our information handling practices in your jurisdiction, to comply with these local data protection laws.
We collect personal information in order to manage our business relationships and continue providing our Services. Having this information enables the efficiency of our Services and allows us to continue fulfilling our obligations to our B2B Partners. Further information about the specific purposes for which we use the personal information we collect, and the legal basis of our processing for those purposes, can be found below.
We use the personal information we collect to provide our Services. In the course of conducting business, we may also work with service providers that may have access to your personal data and that process the aforementioned data in the name and on behalf of us as a result of the provision of services. The aforementioned service providers of us are included, by means of example but not limited to the following sectors: Accommodation, logistics & transport, technology and IT services.
While we do not store any credit cards details in facilitating payment process; we will use the personal information we collect to process transactions and payments, such as payments for accommodation and travel services;
We use contact information we collect from our B2B Partners to send transactional communications via email and within the Services, including confirming bookings, reminders of payments due, responding to questions and requests, providing customer support, and sending notices (on the basis of performing our contractual obligations, or on the basis of our legitimate interests to provide customer service to our B2B Partners) to Travel Service Provider. We also send communications during the process of Service onboarding, to help our B2B Partners become more proficient in using our Services.
We use B2B Partner contact information to resolve issues, to respond to requests for assistance and to ensure quality assurance and security, on the basis of our legitimate interest in improving our customer support.
We will not disclose any personal information unless it is required by authority, law, court order or the requirement of any regulatory body, including banking and tax reporting obligations.
We use reasonable technical and organisational measures to secure the personal information we hold.
We use reputable data hosting service providers to host the information we collect. We take steps to ensure that any personal information we store with our data hosting service providers is adequately safeguarded (including contractual provisions, appropriate supervision and assessment where necessary).
We cannot guarantee the security of any information or data you provide online. In the event of a serious security incident involving your personal information, we will notify you and report the incident to the relevant authorities as required by applicable law.
Our outsourced payment gateway for credit card payment, are PCI DSS Level 1 Certified; that imposed on businesses that store, process, or transmit payment card data.
Information we collect from our B2B Partners will be retained for the duration of our contractual relationship, and for a reasonable period thereafter. We retain this information as reasonably necessary to:
Once personal information is no longer needed to fulfil the purpose for which it was collected, we will take reasonable steps to securely destroy or de-identify that information unless we are prevented from doing so by law. If destruction or de-identification is not possible (for example, because the information has been stored in backup archives), then we will securely store your information and isolate it from any further use until secure deletion is possible.
We may change this Notice from time to time. We will post any changes on this page and, if the changes are significant, we will notify you by sending you an email notification. We encourage you to review this Notice whenever you use the Services to stay informed about our information practices and the ways you can help protect your privacy. If you disagree with any changes to this Notice, you will need to stop using the Services. If we make any changes to how you can exercise your individual rights, we will notify you.
If you have any questions about this Privacy Notice or our privacy practices, if you need to access this Privacy Notice in a different format, or if you would like to exercise your individual rights, please contact by email or phone, at: Email: info@withinearth.com
Notification