Reservation
Modified on: 2024-12-31 17:32
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. Update Reservation Status: to update the status of a reservation to DerbySoft Property Connector.
Guest Name Latinization: When the hotel enables the Guest Name Latinization function in the DerbySoft Property Connector Portal, if DerbySoft receives Non-Latinized Guest Name reservtion from distributor, DerbySoft Property Connect will send both Latinized Guest Name and Original Guest Name (Non-Latinized) to your PMS.
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)
Example 1.1 - The Response which is satisfied with the 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 ] }, "roomRates": [ { "inventory": 2, "roomId": "King", "rateId": "BAR", "currency": "USD", "amountBeforeTax": [ 100, 100, 120 ], "amountAfterTax": [ 110, 110, 132 ], "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": "AD0_0", "description": "Free Cancel" } }, { "inventory": 5, "roomId": "Twin", "rateId": "BAR", "currency": "USD", "amountBeforeTax": [ 100, 100, 120 ], "amountAfterTax": [ 110, 110, 132 ], "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": "AD0_0", "description": "Free Cancel" } }, { "inventory": 2, "roomId": "King", "rateId": "BARB", "currency": "USD", "amountBeforeTax": [ 120, 120, 140 ], "amountAfterTax": [ 132, 132, 154 ], "mealPlan": "BB", "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" } }, { "inventory": 5, "roomId": "Twin", "rateId": "BARB", "currency": "USD", "amountBeforeTax": [ 120, 120, 140 ], "amountAfterTax": [ 132, 132, 154 ], "mealPlan": "BB", "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" } } ] }
Example 1.2 - The Response which isn't satisfied with the 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 ] }, "roomRates": [] }
Example 1.3 - The Response which is satisfied with the 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" }, "roomRates": [ { "inventory": 2, "roomId": "King", "rateId": "BAR", "currency": "USD", "amountBeforeTax": [ 100, 100, 120 ], "amountAfterTax": [ 110, 110, 132 ], "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": "AD0_0", "description": "Free Cancel" } } ] }
Example 1.4 - The Response which isn't satisfied with the 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" }, "roomRates": [] }
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 | DerbySoft system, this is a unique id as DerbySoft would do the splitting reservation. | / |
distributorId | String | Mandatory | Id of distributor in DerbySoft’s system | 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 | String | Optional | Total rate without tax & fee | / |
Rate/amountAfterTax | String | 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. | 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 [String] | Optional | Daily rate without tax & fee | / |
RoomRate/amountAfterTax | List [String] | Optional | Daily rate with tax & fee | / |
RoomRate/mealPlan | String | 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 | / | 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": "[email protected]" }, "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": "[email protected]" }, "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": "[email protected]" } } ], "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": "[email protected]" }, "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": "[email protected]" } } ], "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.
Please note that distributorResId and derbyResId will not change if a reservation is modified through Modify API.
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 | String | Optional | Total rate without tax & fee |
|
total/amountAfterTax | String | 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[String] | Optional | Daily rate without tax & fee |
|
roomRate/amountAfterTax | List[String] | 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": "[email protected]" }, "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": "[email protected]" } }, { "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" }
Update 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 | 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