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

  • PayNow

  • PayLater

  • CreditPay

  • Other

Optional

Indicates the product is prepaid to the hotel or pay at hotel or Credit pay

  • PayNow: prepay online

  • PayLater: pay at hotel

  • CreditPay: 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

  • Inclusive

  • Exclusive

Mandatory

The fee or tax is included in the amount before tax or not.

  • Inclusive

  • Excluxive

fee/amount

String

Mandatory

Amount value of fee or tax

 

fee/amountType

Enum

  • Fix

  • Percent

Mandatory

Indicates how to charge the fee or tax

  • Fix

  • Percent

fee/chargeType

Enum

  • PerRoomPerNight

  • PerPersonPerNight

  • PerRoomPerStay

  • PerPersonPerStay

Mandatory

Charge type of fee or tax

  • PerRoomPerNight

  • PerPersonPerNight

  • PerRoomPerStay

  • PerPersonPerStay

fee/paymentType

Enum

  • PayLater

  • PayNow

Optional

Indicates the fee or tax is prepaid to the hotel or pay at hotel

  • PayNow: prepay online

  • PayLater: 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:

  • VI: Visa

  • MC: Master Card

  • AX: American Express

  • BC: Bank Card

  • BL: Carte Bleu

  • CB: Carte Blanche

  • DN: Diners Club

  • DS: Discover Card

  • EC: Eurocard

  • JC: Japanese Credit Bureau Credit Card

  • TP: Universal Air Travel Card

  • CU: China Unionpay

  • MA: Maestro Card

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
- Adult
- Child
- Infant

Optional

Guest type indicates Adult, Child, or Infant.

/
marketCodeStringOptionalcurrently 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/mealPlanString

Refer to Meal Plan.

RoomRate/paymentType

Enum
- PayNow
- PayLater

- CreditPay

- Other

Optional

Indicates the product is prepaid to the hotel (PayNow) or pay at the hotel (PayLater) or Credit pay

/
RoomRate/guaranteeObject[Guarantee]Optional

RoomRate/Guarantee/guaranteeTypeStringOptional
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
- Inclusive
- Exclusive

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
- Fix
- Percent

Mandatory

Indicates how to charge the tax, 10% per room per night in this example

/

Fee/chargeType

Enum
- PerRoomPerNight
- PerPersonPerNight
- PerRoomPerStay
- PerPersonPerStay

Mandatory

//

Fee/paymentType

Enum
- PayLater
- PayNow

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

//
resProfilesList[ResProfile]OptionalProfile info attached in the reservation/
resProfiles/idStringMandatoryProfile id
resProfiles/nameStringMandatoryProfile name
resProfiles/type

Enum

  • COMPANY
  • TRAVEL_AGENT
MandatoryProfile type
resProfiles/contactObject[Contact]OptionalProfile contact info
contact/emailStringOptionalEmail of contact
corpAccountObject[CorpAccount]Optional

corpAccount/corpProgramCodeStringMandatoryCorporate Hotel Program of hotel supplier
corpAccount/corpIdStringMandatoryCorporate id in the program account
memberAccountObject[MemberAccount]Optional

memberAccount/programCodeStringOptionalLoyalty program code of the supplier
memberAccount/memberLevelStringOptionalMember level
memberAccount/memberIdStringMandatoryMember id or Loyalty program account id

notify

Boolean

Mandatory

A flag indicates Booking Notify or Booking Request

  1. true: Booking Notify mode. In this way, the distributor has already confirmed the reservation to the customer, your PMS has to accept it no matter availability or rates are valid or not.

  2. false: Booking Request mode. In this way, the distributor will confirm the reservation to the customer according to the result of your PMS.

/

extensions

Map <String: String>

Optional

An extension structure in case there are some additional fields to be supported

/
threeDomainSecurityObject
[ThreeDomainSecurity]
Optional

ThreeDomainSecurity/cavvStringOptionalCardholder Authentication Verification Value Information is retrieved from the 3DS provider when authentication is successful.
ThreeDomainSecurity/eciStringOptionalThe electronic commerce indicator.
ThreeDomainSecurity/xidStringOptionalTransaction identifier for a 3DS Version 1 provider, assigned by the Directory Server to identify a single transaction.
ThreeDomainSecurity/
threeDomainSecurityVersion
StringOptionalInclude this only for 3D Secure 2.
ThreeDomainSecurity/
merchantName
StringOptionalIdentifier 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:

  • VI: Visa

  • MC: Master Card

  • AX: American Express

  • BC: Bank Card

  • BL: Carte Bleu

  • CB: Carte Blanche

  • DN: Diners Club

  • DS: Discover Card

  • EC: Eurocard

  • JC: Japanese Credit Bureau Credit Card

  • TP: Universal Air Travel Card

  • CU: China Unionpay

  • MA: Maestro Card

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

  • Adult

  • Child

  • Infant

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

  • PayNow

  • PayLater

  • CreditPay

  • Other

Mandatory

Payment type

 

roomRate/guarantee

Object[guarantee]

Optional

 

 

guarantee/guaranteeType

Enum

-CCG

-GTTA

-GTC

-GTP

-NG

Optional

 

CCG: Credit Card Guarantee
GTTA: Guarantee to Travel Agent
GTC: Guarantee to Company
GTP: Guarantee to Property
NG: No Guarantee/Direct Bill

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

  • Inclusive

  • Exclusive

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

  • Fix

  • Percent

Mandatory

Indicates how to charge the tax, 10% per room per night in this example

 

fee/chargeType

Enum

  • PerRoomPerNight

  • PerPersonPerNight

  • PerRoomPerStay

  • PerPersonPerStay

Mandatory

 

 

fee/paymentType

Enum

  • PayLater

  • PayNow

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

  • COMPANY

  • TRAVEL_AGENT

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

  1. true: Booking Notify mode. In this way, the distributor has already confirmed the reservation to the customer, your PMS has to accept it no matter availability or rates is valid or not.

  2. false: Booking Request mode. In this way, the distributor will confirm the reservation to the customer according to the result of your PMS.

 

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


Element

Type

Occurrence

Description

Comment

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

  • CheckedOut

  • Cancelled

  • NoShow

  • Inhouse

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"
}