Reservation
Modified on: 2024-04-26 10:36
TABLE OF CONTENTS
Overview
There are five types of messages to transfer reservations to your PMS:
From DerbySoft Property Connector to PMS:
1. Live Check: to check real-time availability to get all available rooms and rates from your PMS.
2. Book: to send a new reservation to your PMS.
3. Cancel: to cancel an existing reservation to your PMS.
4. Modify: to modify an existing reservation to your PMS.
From PMS to DerbySoft Property Connector:
5. Booking Status: to update the status of a reservation to DerbySoft Property Connector.
Modification: Modification: Currently, all modification requests are pushed to PMS as cancellation + rebook. With the newly developed interface, supported channels such as Agoda, Booking.com and Expedia are able to push the modification request to PMS as modification. Other non-supported channels remain as cancellation + rebook for any modification request.
Multi-room-count booking: In the scenario of one reservation booked with multiple rooms, DerbySoft Property Connector will split the single reservation from the distributor into multiple ones with one room count for each booking and attach a new derbyResId for each one. Please identify each reservation using derbyResId instead of distributorResId.
Important:
Because of the PCI compliance, DerbySoft Property Connector can only support HTTPS/SSL for message exchange.
Live Check
This API is used to check real-time availability to get all available rooms and rates. A call will be sent to your PMS to get real-time results.
Please note that live check requests are started by distributors (channels), but some distributors do not support it.
POST https://{your pms endpoint}/availability HTTP/1.1 Authorization: Bearer 53ac07777cdffac2d53000002d698728ce964432d7167596bc005c5fc Accept-Encoding: gzip Content-Encoding: gzip Content-Type: application/json;charset=utf-8
Request Schema
Element | Type | Occurrence | Description | Comment |
---|---|---|---|---|
hotelId | String | Mandatory | Hotel unique id of PMS | |
stayRange | Object[stayRange] | Mandatory |
|
|
stayRange/checkin | Date:yyyy-MM-dd | Mandatory | Checkin |
|
stayRange/checkout | Date:yyyy-MM-dd | Mandatory | Checkout |
|
roomCriteria | Object[roomCriteria] | Mandatory |
| |
roomCriteria/roomCount | Integer | Mandatory | Total room count per request |
|
roomCriteria/adultCount | Integer | Mandatory | Adult count per room |
|
roomCriteria/childCount | Integer | Optional | Child count per room |
|
roomCriteria/childAges | List[Integer] | Optional | Child ages for each child, the size must be the same as childCount | |
productCandidate | Object[productCandidate] | Optional |
|
|
productCandidate/roomId | String | Optional | Room type id of PMS | |
productCandidate/rateId | String | Optional | Rate plan id of PMS | |
iata | String | Optional | IATA of distributor |
|
loyaltyAccount | Object[loyaltyAccount] | Optional |
|
|
loyaltyAccount/programCode | String | Mandatory | Loyalty program code of PMS | |
loyaltyAccount/accountId | String | Mandatory | Loyalty program account ID | |
corpAccount | Object[corpAccount] | Optional |
|
|
corpAccount/corpProgramCode | String | Mandatory | Corporate hotel program of PMS | |
corpAccount/corpId | String | Mandatory | Corporate ID in the program account |
Example 1.1 - General Live Check Request
{ "header": { "echoToken": "dda577cc-20e0-4427-bd41-609a6608dc54", "timeStamp": "2018-01-01T17:09:04.674Z", "version": "0.1" }, "hotelId": "FSDH", "stayRange": { "checkin": "2018-01-01", "checkout": "2018-01-04" }, "roomCriteria": { "roomCount": 2, "adultCount": 2, "childCount": 2, "childAges": [ 4, 8 ] } }
Example 1.2 - Live Check Request for the Specific RoomType & RatePlan
{ "header": { "echoToken": "dda577cc-20e0-4427-bd41-609a6608dc54", "timeStamp": "2018-01-01T17:09:04.674Z", "version": "0.1" }, "hotelId": "FSDH", "stayRange": { "checkin": "2018-01-01", "checkout": "2018-01-04" }, "roomCriteria": { "roomCount": 2, "adultCount": 2, "childCount": 2, "childAges": [ 4, 8 ] }, "productCandidate": { "roomId": "King", "rateId": "BAR" } }
Example 1.3 - Full-size Live Check Request
{ "header": { "echoToken": "dda577cc-20e0-4427-bd41-609a6608dc54", "timeStamp": "2018-01-01T17:09:04.674Z", "version": "0.1" }, "hotelId": "FSDH", "stayRange": { "checkin": "2018-01-01", "checkout": "2018-01-04" }, "roomCriteria": { "roomCount": 2, "adultCount": 2, "childCount": 2, "childAges": [ 4, 8 ] }, "productCandidate": { "roomId": "King", "rateId": "BAR" }, "iata": "string", "loyaltyAccount": { "programCode": "BW", "accountId": "1234567890123457" }, "corpAccount": { "corpProgramCode": "CR", "corpId": "A-1232" } }
Response Schema
Element | Type | Occurrence | Description | Comment |
---|---|---|---|---|
hotelId | String | Mandatory | Hotel unique id of PMS |
|
stayRange | Object[stayRange] | Mandatory |
|
|
stayRange/checkin | Date:yyyy-MM-dd | Mandatory | Checkin |
|
stayRange/checkout | Date:yyyy-MM-dd | Mandatory | Checkout |
|
roomCriteria | Object[roomCriteria] | Mandatory |
| |
roomCriteria/roomCount | Integer | Mandatory | Total room count per request |
|
roomCriteria/adultCount | Integer | Mandatory | Adult count per room |
|
roomCriteria/childCount | Integer | Optional | Child count per room |
|
roomCriteria/childAges | List[Integer] | Optional | Child ages for each child, the size must be the same as childCount | |
productCandidate | Object[productCandidate] | Optional |
|
|
productCandidate/roomId | String | Optional | Room type id of PMS | |
productCandidate/rateId | String | Optional | Rate plan id of PMS | |
iata | String | Optional | IATA of distributor |
|
roomRates | List[roomRates] | Mandatory |
|
|
roomRates/inventory | Integer | Mandatory | Available inventory count according to request criteria |
|
roomRates/roomId | String | Mandatory | Room type id of PMS | |
roomRates/rateId | String | Mandatory | Rate plan id of PMS | |
roomRates/currency | String | Mandatory | Currency code with ISO 4217 standard | |
roomRates/amountBeforeTax | List[BigDecimal] | Optional | Daily rate excluding tax & fee | Either amountBeforeTax or amountAfterTax is required |
roomRates/amountAfterTax | List[BigDecimal] | Optional | Daily rate including tax & fee | |
roomRates/mealPlan | String | Optional | Meal plan code | Please refer to Appendix - Meal Plan |
roomRates/paymentType | Enum
| Optional | Indicates the product is prepaid to the hotel or pay at hotel or Credit pay |
|
roomRates/fees | List[fees] | Optional | Fee or tax by date range |
|
fees/dateRange | Object[dateRange] | Mandatory |
|
|
dateRange/startDate | Date:yyyy-MM-dd | Mandatory | Start date of date range |
|
dateRange/endDate | Date:yyyy-MM-dd | Mandatory | End date of date range |
|
fees/fee | Object[fee] | Mandatory |
|
|
fee/name | String | Mandatory | Pattern: \w[\w\d]+ |
|
fee/type | Enum
| Mandatory | The fee or tax is included in the amount before tax or not. |
|
fee/amount | String | Mandatory | Amount value of fee or tax |
|
fee/amountType | Enum
| Mandatory | Indicates how to charge the fee or tax |
|
fee/chargeType | Enum
| Mandatory | Charge type of fee or tax |
|
fee/paymentType | Enum
| Optional | Indicates the fee or tax is prepaid to the hotel or pay at hotel |
|
roomRates/cancelPolicy | Object[cancelPolicy] | Optional |
|
|
cancelPolicy/code | String | Mandatory | Code of cancel policy | Please refer to Appendix - Cancel Policy |
cancelPolicy/description | String | Optional | The description of cancel policy |
|
Example - Live Check Response
Response(Success)
{ "header": { "echoToken": "dda577cc-20e0-4427-bd41-609a6608dc54", "timeStamp": "2018-01-01T17:09:04.674Z", "version": "0.1" }, "hotelId": "FSDH", "stayRange": { "checkin": "2018-01-01", "checkout": "2018-01-04" }, "roomCriteria": { "roomCount": 2, "adultCount": 2, "childCount": 2, "childAges": [ 4, 8 ] }, "productCandidate": { "roomId": "King", "rateId": "BAR" }, "iata": "string", "roomRates": [ { "inventory": 2, "roomId": "King", "rateId": "BAR", "currency": "USD", "amountBeforeTax": [ 100, 100, 120 ], "amountAfterTax": [ 110, 110, 130 ], "mealPlan": "RO", "paymentType": "PayNow", "fees": [ { "dateRange": { "startDate": "2018-01-01", "endDate": "2018-01-04" }, "fee": { "name": "Service Charge", "type": "Exclusive", "amount": 10, "amountType": "Percent", "chargeType": "PerRoomPerNight", "paymentType": "PayNow" } } ], "cancelPolicy": { "code": "AD100P_100P", "description": "Non Refundable" } } ] }
Response(Error)
{ "header": { "echoToken": "dda577cc-20e0-4427-bd41-609a6608dc54", "timeStamp": "2018-01-01T17:09:04.674Z", "version": "0.1" }, "errorCode": "InvalidField", "errorMessage": "Invalid token" }
Book
This API is used to make a new reservation to your PMS.
POST https://{your pms endpoint}/book HTTP/1.1 Authorization: Bearer 53ac07777cdffac2d53000002d698728ce964432d7167596bc005c5fc Accept-Encoding: gzip Content-Encoding: gzip Content-Type: application/json;charset=utf-8
Request Schema
Element | Type | Occurrence | Description | Comment |
---|---|---|---|---|
reservationIds | Object [ReservationIds] | Mandatory | / | / |
ReservationIds/distributorResId | String | Mandatory | Reservation id in distributor’s system | / |
ReservationIds/derbyResId | String | Mandatory | Reservation id in DerbySoft system, this is a unique id as DerbySoft would do the splitting reservation. | / |
distributorId | String | Mandatory | Id of distributor in DerbySoft’s system | You can find a full list of all distributor ids in the Appendix. |
iata | String | Optional | IATA of distributor | / |
hotelId | String | Mandatory | Hotel unique id of PMS | / |
stayRange | Object [StayRange] | Mandatory | / | / |
StayRange/checkin | Date: yyyy-MM-dd | Mandatory | Checkin | / |
StayRange/checkout | Date: yyyy-MM-dd | Mandatory | Checkout | / |
contactPerson | Object[ContactPerson] | Mandatory | / | / |
ContactPerson/firstName | String | Mandatory | First Name of Contact | These are the original names from distributors, which could be non-Latin characters |
ContactPerson/lastName | String | Mandatory | Last Name of Contact | / |
ContactPerson/firstNameRoma | String | Optional | First Name of Contact in Latin characters | DerbySoft Property Connector will translate the non-Latin characters into Latin characters in case your PMS doesn’t support them. |
ContactPerson/lastNameRoma | / | / | First Name of Contact in Latin characters | / |
ContactPerson/email | String | Optional | Email of Contact | / |
ContactPerson/phone | String | Optional | Phone of Contact | / |
ContactPerson/address | String | Optional | Address of Contact | / |
roomCriteria | Object [RoomCriteria] | Mandatory | / | / |
RoomCriteria/roomCount | Integer | Mandatory | Room count to be booked | DerbySoft Property Connector will split the reservation into single room ones by default so that the actual stay status can be delivered back easily in the future. |
RoomCriteria/adultCount | Integer | Mandatory | Adult count | / |
RoomCriteria/childCount | Integer | Optional | Child count | / |
RoomCriteria/childAges | List [Integer] | Optional | Ages of each guest | / |
total | Object [Rate] | Mandatory | / | / |
Rate/amountBeforeTax | BigDecimal | Optional | Total rate without tax & fee | / |
Rate/amountAfterTax | BigDecimal | Optional | Total rate with tax & fee | / |
payment | Object [Payment] | Optional | / | This could be empty if your PMS doesn’t comply with PCI-DSS or no payment is provided by distributors. |
Payment/cardCode | Enum:
| Mandatory | VI, MC, AX, etc. | Please refer to Appendix - Payment Card Code |
Payment/cardNumber | String | Mandatory | Credit card number | / |
Payment/cardHolderName | String | Mandatory | Card holder name | / |
Payment/expireDate | Date: MMYY | Mandatory | It should be 2 digits for month, 2 digits for year, as “MMYY” | example: 0119 |
guests | List [Guest] | Mandatory | / | / |
Guest/firstName | String | Mandatory | First name of the guest | / |
Guest/lastName | String | Mandatory | Last name of the guest | / |
Guest/firstNameRoma | String | Optional | First Name of guest in Latin characters | DerbySoft Property Connector will translate the non-Latin characters into Latin characters in case your PMS doesn’t support |
Guest/lastNameRoma | String | Optional | Last Name of guest in Latin characters | / |
Guest/email | String | Optional | Email of guest | / |
Guest/phone | String | Optional | Phone of guest | / |
Guest/address | String | Optional | Address of guest | / |
Guest/age | Integer | Optional | Guest age | / |
Guest/type | Enum | Optional | Guest type indicates Adult, Child, or Infant. | / |
marketCode | String | Optional | currently only synxis channel support | / |
comments | List [String] | Optional | / | / |
roomRate | Object [RoomRate] | Mandatory | / | / |
RoomRate/roomId | String | Mandatory | Room type id of PMS | / |
RoomRate/rateId | String | Mandatory | Rate plan id of PMS | / |
RoomRate/currency | String | Mandatory | Currency code with ISO 4217 standard | / |
RoomRate/amountBeforeTax | List [BigDecimal] | Optional | Daily rate without tax & fee | / |
RoomRate/amountAfterTax | List [BigDecimal] | Optional | Daily rate with tax & fee | / |
RoomRate/mealPlan | String | Refer to Meal Plan. | ||
RoomRate/paymentType | Enum - CreditPay - Other | Optional | Indicates the product is prepaid to the hotel (PayNow) or pay at the hotel (PayLater) or Credit pay | / |
RoomRate/guarantee | Object[Guarantee] | Optional | ||
RoomRate/Guarantee/guaranteeType | String | Optional | CCG/GTTA/GTC/GTP/NG | |
fees | List [Fees] | Optional | List of tax and fee | / |
Fees/dateRange | Object [DateRange] | Mandatory | / | / |
DateRange/startDate | Date: yyyy-MM-dd | Mandatory | Start date | / |
DateRange/endDate | Date: yyyy-MM-dd | Mandatory | End date | Include end date |
Fees/fee | Object [Fee] | Mandatory | / | / |
Fee/name | String | Mandatory | The name of the fee or tax | / |
Fee/type | Enum | Mandatory | The fee or tax is included in the amount before tax or not | / |
Fee/amount | String | Mandatory | Amount value of fee or tax | / |
Fee/amountType | Enum | Mandatory | Indicates how to charge the tax, 10% per room per night in this example | / |
Fee/chargeType | Enum | Mandatory | / | / |
Fee/paymentType | Enum | Optional | Indicates the fee is prepaid to the hotel (PayNow) or pay at hotel (PayLater) | Enum:PayLater/PayNow |
cancelPolicy | Object [CancelPolicy] | Optional | Cancellation policy defines what penalty will be charged when a guest cancels the booking at a certain advance time range. The penalty is related to no show or a time range before no show | / |
CancelPolicy/code | String | Mandatory | / | Please refer to Appendix - Cancel Policy |
CancelPolicy/description | String | Mandatory | / | / |
resProfiles | List[ResProfile] | Optional | Profile info attached in the reservation | / |
resProfiles/id | String | Mandatory | Profile id | |
resProfiles/name | String | Mandatory | Profile name | |
resProfiles/type | Enum
| Mandatory | Profile type | |
resProfiles/contact | Object[Contact] | Optional | Profile contact info | |
contact/email | String | Optional | Email of contact | |
corpAccount | Object[CorpAccount] | Optional | ||
corpAccount/corpProgramCode | String | Mandatory | Corporate Hotel Program of hotel supplier | |
corpAccount/corpId | String | Mandatory | Corporate id in the program account | |
memberAccount | Object[MemberAccount] | Optional | ||
memberAccount/programCode | String | Optional | Loyalty program code of the supplier | |
memberAccount/memberLevel | String | Optional | Member level | |
memberAccount/memberId | String | Mandatory | Member id or Loyalty program account id | |
notify | Boolean | Mandatory | A flag indicates Booking Notify or Booking Request
| / |
extensions | Map <String: String> | Optional | An extension structure in case there are some additional fields to be supported | / |
threeDomainSecurity | Object [ThreeDomainSecurity] | Optional | ||
ThreeDomainSecurity/cavv | String | Optional | Cardholder Authentication Verification Value Information is retrieved from the 3DS provider when authentication is successful. | |
ThreeDomainSecurity/eci | String | Optional | The electronic commerce indicator. | |
ThreeDomainSecurity/xid | String | Optional | Transaction identifier for a 3DS Version 1 provider, assigned by the Directory Server to identify a single transaction. | |
ThreeDomainSecurity/ threeDomainSecurityVersion | String | Optional | Include this only for 3D Secure 2. | |
ThreeDomainSecurity/ merchantName | String | Optional | Identifier of the merchant completing the 3DS transaction. |
Response Schema
Element | Type | Occurrence | Description | Comment |
---|---|---|---|---|
reservationIds/distributorResId | String | Mandatory | Reservation id in distributor’s system. | / |
reservationIds/derbyResId | String | Mandatory | Reservation id in Derbysoft system, this is a unique id as DerbySoft would do the splitting reservation. | / |
reservationIds/supplierResId | String | Mandatory | Reservation id in PMS. | / |
extensions | Map <String:String> | Optional | An extension structure in case there is some additional fields to be supported | / |
Example
1.1 Make a new reservation.
Request
{ "header": { "echoToken": "f67ade36-0b83-49cf-bfb1-b932c45b7d34", "timeStamp": "2018-06-27T17:09:04.674Z", "version": "0.1" }, "reservationIds": { "distributorResId": "C2084DFL0", "derbyResId": "D15F893D34DF" }, "distributorId": "CTRIP", "hotelId": "FSDH", "stayRange": { "checkin": "2021-01-01", "checkout": "2021-01-04" }, "contactPerson": { "firstName": "小明", "lastName": "王", "firstNameRoma": "XIAOMING", "lastNameRoma": "WANG", "email": "007@james.com" }, "roomCriteria": { "roomCount": 2, "adultCount": 1, "childCount": 2, "childAges": [ 4, 8 ] }, "total": { "amountBeforeTax": 640, "amountAfterTax": 704 }, "payment": { "cardCode": "VI", "cardNumber": "4111111111111111", "cardHolderName": "Sherlock Holmes", "expireDate": "0119" }, "guests": [{ "firstName": "小小", "lastName": "张", "firstNameRoma": "XIAOXIAO", "lastNameRoma": "ZHANG" }], "marketCode": "ASDDD", "comments": [ "no smoking", "high floor" ], "roomRate": { "roomId": "King", "rateId": "BAR", "currency": "USD", "amountBeforeTax": [ 100, 100, 120 ], "amountAfterTax": [ 110, 110, 132 ], "mealPlan": "RO", "guarantee": { "guaranteeType": "CCG" }, "paymentType": "PayNow", "fees": [{ "dateRange": { "startDate": "2018-01-01", "endDate": "2018-01-04" }, "fee": { "name": "Service Charge", "type": "Exclusive", "amount": 10, "amountType": "Percent", "chargeType": "PerRoomPerNight", "paymentType": "PayNow" } }], "cancelPolicy": { "code": "AD100P_100P", "description": "Non Refundable" } }, "threeDomainSecurity": { "cavv": "string", "eci": "string", "xid": "string", "threeDomainSecurityVersion": "string", "transactionId": "string", "merchantName": "string" }, "notify": false }
Response-Success
{ "header": { "echoToken": "f67ade36-0b83-49cf-bfb1-b932c45b7d34", "timeStamp": "2018-06-27T17:09:04.674Z", "version": "0.1" }, "reservationIds": { "distributorResId": "C2084DFL0", "derbyResId": "D15F893D34DF", "supplierResId": "89389494" } }
Response-Error
{ "header": { "echoToken": "f67ade36-0b83-49cf-bfb1-b932c45b7d34", "timeStamp": "2018-06-27T17:09:04.674Z", "version": "0.1" }, "errorCode": "InvalidField", "errorMessage": "Invalid token" }
1.2 Make a new reservation with Company.
{ "header": { "echoToken": "f67ade36-0b83-49cf-bfb1-b932c45b7d34", "timeStamp": "2018-06-27T17:09:04.674Z", "version": "0.1" }, "reservationIds": { "distributorResId": "C2084DFL0", "derbyResId": "D15F893D34DF" }, "distributorId": "CTRIP", "hotelId": "FSDH", "stayRange": { "checkin": "2021-01-01", "checkout": "2021-01-04" }, "contactPerson": { "firstName": "小明", "lastName": "王", "firstNameRoma": "XIAOMING", "lastNameRoma": "WANG", "email": "007@james.com" }, "roomCriteria": { "roomCount": 2, "adultCount": 1, "childCount": 2, "childAges": [ 4, 8 ] }, "total": { "amountBeforeTax": 640, "amountAfterTax": 704 }, "payment": { "cardCode": "VI", "cardNumber": "4111111111111111", "cardHolderName": "Sherlock Holmes", "expireDate": "0119" }, "guests": [ { "firstName": "小小", "lastName": "张", "firstNameRoma": "XIAOXIAO", "lastNameRoma": "ZHANG" } ], "marketCode": "ASDDD", "comments": [ "no smoking", "high floor" ], "roomRate": { "roomId": "King", "rateId": "BAR", "currency": "USD", "amountBeforeTax": [ 100, 100, 120 ], "amountAfterTax": [ 110, 110, 132 ], "mealPlan": "RO", "guarantee": { "guaranteeType": "CCG" }, "paymentType": "PayNow", "fees": [ { "dateRange": { "startDate": "2018-01-01", "endDate": "2018-01-04" }, "fee": { "name": "Service Charge", "type": "Exclusive", "amount": 10, "amountType": "Percent", "chargeType": "PerRoomPerNight", "paymentType": "PayNow" } } ], "cancelPolicy": { "code": "AD100P_100P", "description": "Non Refundable" } }, "resProfiles": [ { "id": "XX1", "name": "XXX1", "type": "COMPANY", "contact": { "email": "xxx@xx.com" } } ], "corpAccount": { "corpProgramCode": "CR", "corpId": "A-1232" }, "threeDomainSecurity": { "cavv": "string", "eci": "string", "xid": "string", "threeDomainSecurityVersion": "string", "transactionId": "string", "merchantName": "string" }, "notify": false }
1.3 Make a new reservation with Travel Agent
{ "header": { "echoToken": "f67ade36-0b83-49cf-bfb1-b932c45b7d34", "timeStamp": "2018-06-27T17:09:04.674Z", "version": "0.1" }, "reservationIds": { "distributorResId": "C2084DFL0", "derbyResId": "D15F893D34DF" }, "distributorId": "CTRIP", "hotelId": "FSDH", "stayRange": { "checkin": "2021-01-01", "checkout": "2021-01-04" }, "contactPerson": { "firstName": "小明", "lastName": "王", "firstNameRoma": "XIAOMING", "lastNameRoma": "WANG", "email": "007@james.com" }, "roomCriteria": { "roomCount": 2, "adultCount": 1, "childCount": 2, "childAges": [ 4, 8 ] }, "total": { "amountBeforeTax": 640, "amountAfterTax": 704 }, "payment": { "cardCode": "VI", "cardNumber": "4111111111111111", "cardHolderName": "Sherlock Holmes", "expireDate": "0119" }, "guests": [ { "firstName": "小小", "lastName": "张", "firstNameRoma": "XIAOXIAO", "lastNameRoma": "ZHANG" } ], "marketCode": "ASDDD", "comments": [ "no smoking", "high floor" ], "roomRate": { "roomId": "King", "rateId": "BAR", "currency": "USD", "amountBeforeTax": [ 100, 100, 120 ], "amountAfterTax": [ 110, 110, 132 ], "mealPlan": "RO", "guarantee": { "guaranteeType": "CCG" }, "paymentType": "PayNow", "fees": [ { "dateRange": { "startDate": "2018-01-01", "endDate": "2018-01-04" }, "fee": { "name": "Service Charge", "type": "Exclusive", "amount": 10, "amountType": "Percent", "chargeType": "PerRoomPerNight", "paymentType": "PayNow" } } ], "cancelPolicy": { "code": "AD100P_100P", "description": "Non Refundable" } }, "resProfiles": [ { "id": "XX2", "name": "XXX2", "type": "TRAVEL_AGENT", "contact": { "email": "xxx@xx.com" } } ], "threeDomainSecurity": { "cavv": "string", "eci": "string", "xid": "string", "threeDomainSecurityVersion": "string", "transactionId": "string", "merchantName": "string" }, "notify": false }
Cancel
This API is used to cancel an existing reservation to your PMS.
POST https://{your pms endpoint}/cancel HTTP/1.1 Authorization: Bearer 53ac07777cdffac2d53000002d698728ce964432d7167596bc005c5fc Accept-Encoding: gzip Content-Encoding: gzip Content-Type: application/json;charset=utf-8
Request Schema
Element | Type | Occurrence | Description | Comment |
---|---|---|---|---|
reservationIds | Object[ReservationIds] | / | / | / |
ReservationIds/distributorResId | String | Mandatory | Reservation id in distributor’s system. | / |
ReservationIds/derbyResId | String | Mandatory | Reservation id in Derbysoft system, this is a unique id as DerbySoft would do the splitting reservation. | / |
ReservationIds/supplierResId | String | Mandatory | Reservation id in PMS. | / |
Response Schema
Element | Type | Occurrence | Description | Comment |
---|---|---|---|---|
reservationIds | Object[ReservationIds] | / | / | / |
ReservationIds/distributorResId | String | Mandatory | Reservation id in distributor’s system. | / |
ReservationIds/derbyResId | String | Mandatory | Reservation id in Derbysoft system, this is a unique id as DerbySoft would do the splitting reservation. | / |
ReservationIds/supplierResId | String | Mandatory | Reservation id in PMS. | / |
cancellationId | String | Mandatory | Cancellation confirmation number in PMS. | / |
Example
2.1 Cancel an existing reservation.
Request
{ "header": { "echoToken": "65510873-0037-464e-a7b6-d6e88336bfc0", "timeStamp": "2021-03-21T17:09:04.674Z", "version": "0.1" }, "reservationIds": { "distributorResId": "C2084DFL0", "derbyResId": "D15F893D34DF", "supplierResId": "PMS5682587AEC" } }
Response-Success
{ "header": { "echoToken": "65510873-0037-464e-a7b6-d6e88336bfc0", "timeStamp": "2021-03-21T17:09:05.674Z", "version": "0.1" }, "reservationIds": { "distributorResId": "C2084DFL0", "derbyResId": "D15F893D34DF", "supplierResId": "PMS5682587AEC" }, "cancellationId": "PMS5682587AES" }
Response-Error
{ "header": { "echoToken": "65510873-0037-464e-a7b6-d6e88336bfc0", "timeStamp": "2021-03-21T17:09:05.674Z", "version": "0.1" }, "errorCode": "InvalidField", "errorMessage": "Invalid token" }
Modify
This api is used to modify an existing reservation to your PMS.
POST https://{your pms endpoint}/modify HTTP/1.1 Authorization: Bearer 53ac07777cdffac2d53000002d698728ce964432d7167596bc005c5fc Accept-Encoding: gzip Content-Encoding: gzip Content-Type: application/json;charset=utf-8
Request Schema
Element | Type | Occurrence | Description | Comment |
---|---|---|---|---|
reservationIds | Object[reservationIds] | Mandatory |
|
|
reservationIds/distributorResId | String | Mandatory | Reservation id in distributor’s system. |
|
reservationIds/derbyResId | String | Mandatory | Reservation id in derbysoft system, this is an unqiue id as DerbySoft would do splitting reservation. |
|
reservationIds/supplierResId | String | Mandatory | Reservation id in PMS. |
|
distributorId | String | Mandatory | Id of distributor in DerbySoft’s system | You can find full list of all distributor ids in the console. |
iata | String | Optional | IATA of distributor |
|
hotelId | String | Mandatory | Hotel unique id of PMS |
|
stayRange | Object[stayRange] | Mandatory |
|
|
stayRange/checkin | Date:yyyy-MM-dd | Mandatory | Checkin |
|
stayRange/checkout | Date:yyyy-MM-dd | Mandatory | Checkout |
|
contactPerson | Object[contactPerson] | Mandatory |
|
|
contactPerson/firstName | String | Mandatory | First Name of Contact | This is the original names from distributors, which could be non-latin characters |
contactPerson/lastName | String | Mandatory | Last Name of Contact | |
contactPerson/firstNameRoma | String | Optional | First Name of Contact in Latin characters | DerbySoft Property Connect will translate the non-Latin characters into Latin characters in case your PMS doesn’t support |
contactPerson/lastNameRoma | String | Optional | First Name of Contact in Latin characters | |
contactPerson/email | String | Optional | Email of Contact |
|
contactPerson/phone | String | Optional | Phone of Contact |
|
contactPerson/address | String | Optional | Address of Contact |
|
roomCriteria | Object[roomCriteria] | Mandatory |
|
|
roomCriteria/roomCount | Integer | Mandatory | Room count to be booked | DerbySoft Property Connect will split the reservation into single room ones by default, so that the acutal stay status can be delivered back easily in the future. But you can ask us to disable the splitting if your PMS can handle them well. |
roomCriteria/adultCount | Integer | Mandatory | Adult count |
|
roomCriteria/childCount | Integer | Optional | Child count |
|
roomCriteria/childAges | List[Integer] | Optional | Ages of each guests |
|
total | Object[total] | Mandatory | Total rate |
|
total/amountBeforeTax | BigDecimal | Optional | Total rate without tax & fee |
|
total/amountAfterTax | BigDecimal | Optional | Total rate with tax & fee |
|
payment | Object[payment] | Optional |
| This could be empty if your PMS doesn’t compliance with PCI-DSS, or no payment provided by distributors |
payment/cardCode | Enum:
| Mandatory | VI, MC, AX etc. | Please refer to Appendix - Payment Card Code |
payment/cardNumber | String | Mandatory | Credit card number |
|
payment/cardHolderName | String | Mandatory | Card holder name |
|
payment/expireDate | Date: MMYY | Mandatory | It should be 2 digits for month, 2 digits for year, as “MMYY” | example: 0119 |
guests | List[guests] | Mandatory |
|
|
guests/firstName | String | Mandatory | First name of guest |
|
guests/lastName | String | Mandatory | Last name of guest |
|
guests/firstNameRoma | String | Optional | First Name of guest in Latin characters | DerbySoft Property Connect will translate the non-Latin characters into Latin characters in case your PMS doesn’t support |
guests/lastNameRoma | String | Optional | Last Name of guest in Latin characters | |
guests/email | String | Optional | Email of guest |
|
guests/phone | String | Optional | Phone of guest |
|
guests/address | String | Optional | Address of guest |
|
guests/age | Integer | Optional | Guest age |
|
guests/type | Enum
| Optional | Guest type indicates Adult, Child or Infant |
|
marketCode | String | Optional | currently only synxis channel support |
|
comments | List[String] | Optional |
|
|
roomRate | Object[roomRate] | Mandatory |
|
|
roomRate/roomId | String | Mandatory | Room type id of PMS |
|
roomRate/rateId | String | Mandatory | Rate plan id of PMS |
|
roomRate/currency | String | Mandatory | Currency code with ISO 4217 standard |
|
roomRate/amountBeforeTax | List[BigDecimal] | Optional | Daily rate without tax & fee |
|
roomRate/amountAfterTax | List[BigDecimal] | Optional | Daily rate with tax & fee |
|
roomRate/mealPlan | String |
|
| Please refer to Appendix - Meal Plan |
roomRate/paymentType | Enum
| Mandatory | Payment type |
|
roomRate/guarantee | Object[guarantee] | Optional |
|
|
guarantee/guaranteeType | Enum -CCG -GTTA -GTC -GTP -NG | Optional |
| CCG: Credit Card Guarantee |
fees | List[fees] | Optional | List of tax and fee |
|
fees/dateRange | Object[dateRange] | Mandatory |
|
|
dateRange/startDate | Date:yyyy-MM-dd | Mandatory | Start date |
|
dateRange/endDate | Date:yyyy-MM-dd | Mandatory | End date | Include end date |
fees/fee | Object[fee] | Mandatory |
|
|
fee/name | String | Mandatory | The name of fee or tax |
|
fee/type | Enum
| Mandatory | The fee or tax is included in amount before tax or not |
|
fee/amount | String | Mandatory | Amount value of fee or tax |
|
fee/amountType | Enum
| Mandatory | Indicates how to charge the tax, 10% per room per night in this example |
|
fee/chargeType | Enum
| Mandatory |
|
|
fee/paymentType | Enum
| Optional | Indicates the fee is prepaid to hotel(PayNow) or pay at hotel(PayLater) | Enum:PayLater/PayNow |
cancelPolicy | Object[cancelPolicy] | Optional | Cancellation policy defines what penalty will be charge when a guest cancels the booking at certain advance time range. The penalty is related to no show or a time range before no show |
|
cancelPolicy/code | String | Mandatory |
| Please refer to Appendix - Cancel Policy |
cancelPolicy/description | String | Mandatory |
|
|
resProfiles | List[ResProfile] | Optional | Profile info attached in the reservation |
|
resProfiles/id | String | Mandatory | Profile id |
|
resProfiles/name | String | Mandatory | Profile name |
|
resProfiles/type | Enum
| Mandatory | Profile type |
|
resProfiles/contact | Object[Contact] | Optional | Profile contact info |
|
contact/email | String | Optional | Email of contact |
|
corpAccount | Object[CorpAccount] | Optional |
|
|
corpAccount/corpProgramCode | String | Mandatory | Corporate Hotel Program of hotel supplier |
|
corpAccount/corpId | String | Mandatory | Corporate id in the program account |
|
memberAccount | Object[MemberAccount] | Optional |
|
|
memberAccount/programCode | String | Optional | Loyalty program code of the supplier |
|
memberAccount/memberLevel | String | Optional | Member level |
|
memberAccount/memberId | String | Mandatory | Member id or Loyalty program account id |
|
notify | Boolean | Mandatory | A flag indicates Booking Notify or Booking Request
|
|
extensions | Map<String:String> | Optional | A extension structure in case there is some additional fields to be supported |
|
threeDomainSecurity | Object[ThreeDomainSecurity] | Optional |
|
|
ThreeDomainSecurity/cavv | String | Optional | Cardholder Authentication Verification Value Information retrieved from the 3DS provider when authentication is successful. |
|
ThreeDomainSecurity/eci | String | Optional | The electronic commerce indicator. |
|
ThreeDomainSecurity/xid | String | Optional | Transaction identifier for a 3DS Version 1 provider, assigned by the Directory Server to identify a single transaction. |
|
ThreeDomainSecurity/threeDomainSecurityVersion | String | Optional | Include this only for 3D Secure 2. |
|
ThreeDomainSecurity/merchantName | String | Optional | Identifier of the merchant completing the 3DS transaction. |
|
Response Schema
Element | Type | Occurrence | Description | Comment |
---|---|---|---|---|
reservationIds | Object[reservationIds] | Mandatory |
|
|
reservationIds/distributorResId | String | Mandatory | Reservation id in distributor’s system. |
|
reservationIds/derbyResId | String | Mandatory | Reservation id in derbysoft system, this is an unqiue id as DerbySoft would do splitting reservation. |
|
reservationIds/supplierResId | String | Mandatory | Reservation id in PMS. |
|
extensions | Map<String:String> | Optional | A extension structure in case there is some additional fields to be supported |
|
Example - Modify a reservation
Request
{ "header": { "echoToken": "f67ade36-0b83-49cf-bfb1-b932c45b7d34", "timeStamp": "2018-06-27T17:09:04.674Z", "version": "0.1" }, "reservationIds": { "distributorResId": "C2084DFL0", "derbyResId": "D15F893D34DF", "supplierResId": "89389494" }, "distributorId": "CTRIP", "hotelId": "FSDH", "stayRange": { "checkin": "2021-01-01", "checkout": "2021-01-04" }, "contactPerson": { "firstName": "小明", "lastName": "王", "firstNameRoma": "XIAOMING", "lastNameRoma": "WANG", "email": "007@james.com" }, "roomCriteria": { "roomCount": 2, "adultCount": 1, "childCount": 2, "childAges": [ 4, 8 ] }, "total": { "amountBeforeTax": 640, "amountAfterTax": 704 }, "payment": { "cardCode": "VI", "cardNumber": "4111111111111111", "cardHolderName": "Sherlock Holmes", "expireDate": "0119" }, "guests": [ { "firstName": "小小", "lastName": "张", "firstNameRoma": "XIAOXIAO", "lastNameRoma": "ZHANG" } ], "marketCode": "ASDDD", "comments": [ "no smoking", "high floor" ], "roomRate": { "roomId": "King", "rateId": "BAR", "currency": "USD", "amountBeforeTax": [ 100, 100, 120 ], "amountAfterTax": [ 110, 110, 132 ], "mealPlan": "RO", "guarantee": { "guaranteeType": "CCG" }, "paymentType": "PayNow", "fees": [ { "dateRange": { "startDate": "2018-01-01", "endDate": "2018-01-04" }, "fee": { "name": "Service Charge", "type": "Exclusive", "amount": 10, "amountType": "Percent", "chargeType": "PerRoomPerNight", "paymentType": "PayNow" } } ], "cancelPolicy": { "code": "AD100P_100P", "description": "Non Refundable" } }, "resProfiles": [ { "id": "XX1", "name": "XXX1", "type": "COMPANY", "contact": { "email": "xxx@xx.xx" } }, { "id": "XX2", "name": "XXX2", "type": "TRAVEL_AGENT" } ], "memberAccount": { "programCode": "BW", "memberId": "1234567890123457" }, "corpAccount": { "corpProgramCode": "CR", "corpId": "A-1232" }, "threeDomainSecurity": { "cavv": "string", "eci": "string", "xid": "string", "threeDomainSecurityVersion": "string", "transactionId": "string", "merchantName": "string" }, "notify": false }
Response(Success)
{ "header": { "echoToken": "f67ade36-0b83-49cf-bfb1-b932c45b7d34", "timeStamp": "2018-06-27T17:09:04.674Z", "version": "0.1" }, "reservationIds": { "distributorResId": "C2084DFL0", "derbyResId": "D15F893D34DF", "supplierResId": "89389494" } }
Response(Error)
{ "header": { "echoToken": "f67ade36-0b83-49cf-bfb1-b932c45b7d34", "timeStamp": "2018-06-27T17:09:04.674Z", "version": "0.1" }, "errorCode": "InvalidField", "errorMessage": "Invalid token" }
Reservation Status (asynchronous callback)
This API is used to sync Reservation status from PMS to Property Connector to ensure the status within the Property Connector is properly.
We recommend your PMS calls this API if the reservation status is changed in your PMS.
POST /pcapigateway/tunnel/{accountId}/resStatus HTTP/1.1 Authorization: Bearer 53ac07777cdffac2d53000002d698728ce964432d7167596bc005c5fc Accept-Encoding: gzip Content-Encoding: gzip Content-Type: application/json;charset=utf-8
Request Schema
reservationIds | Object[ReservationIds] | Mandatory |
|
|
ReservationIds/supplierResId | String | Mandatory | Reservation id in PMS. |
|
ReservationIds/cancellationId | String | Optional | If this reservation was canceled, enter the cancellation number. |
|
hotelId | String | Mandatory |
|
|
cancellationDate | Date: yyyy-MM-dd | Optional |
|
|
roomNo | String | Optional |
|
|
amountBeforeTax | BigDecimal | Optional |
|
|
amountAfterTax | BigDecimal | Optional |
|
|
currency | String | Optional | Currency code with ISO 4217 standard |
|
status | Enum
| Mandatory | Inhouse, CheckedOut, Cancelled, NoShow |
|
Example
Call back reservation status to Property Connector
Request:
{ "header": { "echoToken": "f67ade36-0b83-49cf-bfb1-b932c45b7d34", "timeStamp": "2021-06-27T17:09:04.674Z", "version": "0.2" }, "reservationIds": { "supplierResId": "C2084DFL0" }, "hotelId": "FSDH", "roomNo": "1805", "amountBeforeTax": 200, "amountAfterTax": 218.88, "currency": "USD", "status": "CheckedOut" }
Response(success)
{ "header": { "echoToken": "f67ade36-0b83-49cf-bfb1-b932c45b7d34", "timeStamp": "2021-06-27T17:09:04.674Z", "version": "0.2" } }
Response(Error)
{ "header": { "echoToken": "f67ade36-0b83-49cf-bfb1-b932c45b7d34", "timeStamp": "2021-06-27T17:09:04.674Z", "version": "0.2" } "errorCode": "InvalidField", "errorMessage": "Invalid token" }
Did you find it helpful? Yes No
Send feedback