DIDA · CHANNEL MANAGER
Dida ChannelManager API Document
API Endpoint
https://cm-dataapi.didatravel.com
API Authentication and Security Guide
To ensure the security of API calls and the integrity of data, all requests to this API must undergo strict authentication and signature. Please read and follow the guidelines below carefully.
1. Credentials
You will need to obtain the following two credentials from DIDA for API authentication:
- ApiKey (API key): A unique string used to identify the caller.
- ApiSecret (secret key): A confidential string used to generate a cryptographic signature for each request. This private key must never be exposed or transmitted in insecure environments (e.g., client-side frontend code).
2. Authentication Process Overview
All protected API requests must satisfy both of the following 2 conditions:
- Identity: Provide the
ApiKeyin the request headers. - Request Signature: Include a signature (
X-Signature) in the request headers, which is calculated based on the request content and theApiSecret. Also, provide the timestamp (X-Timestamp) and nonce (X-Nonce) which is used to generate the signature.
The server will validate your identity by checking the provided ApiKey, and it will recompute the signature to compare it with the one you submitted. Additionally, the server uses the timestamp and nonce to prevent replay attacks.
3. HTTP Request Header Requirements
Each request must include the following HTTP headers:
| Header | Description | Example Value |
|---|---|---|
Authorization | (Recommended) Used to transmit the ApiKey. Format: ApiKey <Your-ApiKey> | ApiKey a1b2c3d4e5f67890 |
X-API-Key | (Alternative) If the Authorization header cannot be used, this header can directly transmit the API key. | a1b2c3d4e5f67890 |
X-Timestamp | The current Unix timestamp (in seconds). Requests with a time difference of more than 300 seconds (5 minutes) from the server's time will be rejected. | 1678886400 |
X-Nonce | A one-time random string. Recommended to use UUID. The server will reject any duplicate Nonces within a 5-minute window. | c3a4b1d2-e5f6-4a7b-8c9d-0e1f2a3b4c5d |
X-Signature | An HMAC-SHA256 signature calculated from the request content, encoded in Base64. See the signature generation algorithm below. | wS2X.../aBcDeFg= |
Content-Type | If the request includes a body (e.g., POST, PUT), this header must be set to application/json. | application/json |
4. Signature Generation
The signature is the key mechanism to ensure that the request has not been tampered with. Please follow the steps below strictly to generate the value of X-Signature.
Step 1: Prepare the String to Sign (stringToSign)
Concatenate the following five components into a single string in order, with no separator in between:
stringToSign = timestamp + nonce + requestPath + queryString + requestBody
timestamp: The value of theX-Timestampheader.nonce: The value of theX-Nonceheader.requestPath: The path portion of the request URL, excluding the domain and query parameters. Example: Forhttps://api.example.com/v1/users?page=2, therequestPathis/v1/users.queryString: The query string portion of the URL, including the leading?. If the URL has no query parameters, this value should be an empty string"". Example: For/v1/users?page=2&size=10, thequeryStringis?page=2&size=10.requestBody:- For POST or PUT requests, this value is the unmodified raw request body (JSON string).
- For GET, DELETE, or other requests without a request body, this value should be an empty string
"".
Step 2: Compute the HMAC-SHA256 Signature
Use your ApiSecret as the key to perform an HMAC-SHA256 hash of the stringToSign generated in Step 1.
Step 3: Base64 Encode the Result
Base64-encode the binary hash output from Step 2 to obtain the final signature string.
5. Common Error Responses
| HTTP Status | code | message | Possible Causes |
|---|---|---|---|
| 401 Unauthorized | 401 | Missing API Key... | Authorization: ApiKey or X-API-Key not found in request headers. |
| 400 Bad Request | 400 | Missing required headers... | Missing one or more of: X-Timestamp, X-Nonce, or X-Signature. |
| 401 Unauthorized | 401 | Invalid or expired timestamp. | X-Timestamp differs from server time by more than 5 minutes. Check server time sync. |
| 401 Unauthorized | 401 | Replayed request detected. | Duplicate X-Nonce value used. Ensure each request generates a unique nonce. |
| 401 Unauthorized | 401 | Invalid API Key... | The provided ApiKey is invalid or not configured in the system. |
| 401 Unauthorized | 401 | Invalid signature. | Signature verification failed. Common causes: 1. stringToSign concatenation order/content incorrect. 2. Wrong ApiSecret. 3. Request body was altered in transit. |
6. Postman Demo Example
// 1. Retrieve keys
const apiKey = pm.environment.get("api_key");
const apiSecret = pm.environment.get("api_secret");
pm.request.headers.upsert({ key: "X-API-Key", value: apiKey });
// 2. Generate timestamp and nonce
const timestamp = Math.floor(Date.now() / 1000).toString();
const nonce = crypto.randomUUID(); // The Postman sandbox provides a built-in crypto object
// 3. Add Timestamp and Nonce to request headers
// Postman handles this automatically; even if a header with the same key already exists,
// it will be overwritten with the value specified here.
pm.request.headers.upsert({ key: "X-Timestamp", value: timestamp });
pm.request.headers.upsert({ key: "X-Nonce", value: nonce });
// 4. Retrieve request path and query parameters
const path = pm.request.url.getPath(); // e.g., /api/data
const query = pm.request.url.getQueryString(); // e.g., ?name=test&id=123
// 5. Safely retrieve the request body (the most critical step)
let bodyContent = "";
// Check whether a request body exists and whether the mode is 'raw' (most common for JSON)
if (pm.request.body && pm.request.body.mode === 'raw' && pm.request.body.raw) {
bodyContent = pm.request.body.raw;
}
// Note: For GET, DELETE, and other requests without a body,
// bodyContent remains an empty string "", which perfectly matches our server logic.
// 6. Construct the string to sign using the exact order required by the server
const stringToSign = \`\${timestamp}\${nonce}\${path}\${query}\${bodyContent}\`;
// 7. Compute the HMAC-SHA256 signature
const signature = CryptoJS.HmacSHA256(stringToSign, apiSecret).toString(CryptoJS.enc.Base64);
// 8. Add the final signature to the request header
pm.request.headers.upsert({ key: "X-Signature", value: signature });
// --- Debug logs ---
// You can view these outputs in the Postman Console (View -> Show Postman Console)
console.log("--- Signature Generation Details ---");
console.log("Timestamp:", timestamp);
console.log("Nonce:", nonce);
console.log("Path:", path);
console.log("Query:", query);
console.log("Body Content:", bodyContent);
console.log("String to Sign:", stringToSign);
console.log("Generated Signature:", signature);
console.log("------------------------------------");
Business Functionality
API Structure
Product Retrieval API (Dida static source mode, product data is provided by Dida)
PropertyList
API Endpoint: {{BaseUrl}}/api/v1/Property/GetList
Request:
{
"PropertyID": null,
"HotelCode": ""
}
| Name | Description |
|---|---|
PropertyID | A Dida hotel identifier, the hotel ID of DIDA, integer type
|
HotelCode | A pushed hotel identifier, hotel ID, string type
|
Response:
{
"code": 200,
"message": "success",
"data": [
{
"PropertyID": 2030330,
"Name": "Test Hotel",
"CustomerPropertyCode": null,
"PriceModel": "PDP"
},
{
"PropertyID": 2030331,
"Name": "Test_Hotel - 2 (Exia)",
"CustomerPropertyCode": null,
"PriceModel": "PDP"
}
]
}
| Name | Description | |
|---|---|---|
code | Status Code | |
message | Message | |
data | Hotel Information | |
PropertyID | Hotel ID | |
Name | Hotel Name | |
CustomerPropertyCode | Hotel Code (customizable) | |
PriceModel | Pricing Mode: OBP or PDP
| |
ChildMaxAge | Maximum age limit for children / Age range for children | |
Currency | Currency |
RoomTypeAndRatePlan
API Endpoint: {{BaseUrl}}/api/v1/Property/GetRoomTypeAndRatePlan
Request:
{
"PropertyID": 2030331,
"HotelCode": "P001"
}
Response:
{
"code": 200,
"message": "success",
"data": {
"PropertyID": 2030331,
"HotelCode": "P001",
"RoomTypes": [
{
"RoomTypeID": 1730029,
"RoomTypeCode": "YOUR_ROOMTYPE_CODE",
"RoomTypeName": "DELUXE KING ,1 Double or 1 Twin",
"RatePlans": [
{
"RatePlanID": 2300816,
"RatePlanName": "Room Only Room Only",
"RatePlanCode": "YOUR_RatePlan_CODE",
"CustomerRatePlanCode": null,
"CutoffDays": 0
}
]
}
]
}
}
The cancellation policy time zone is aligned with the hotel's local time zone.
| Name | Description | ||
|---|---|---|---|
RoomTypes | Room Type List | ||
RoomTypeID | Room Type ID | ||
RoomTypeName | Room Type Name | ||
RoomTypeCode | Room Type Code (customizable) | ||
MaxPerson | Maximum Total Occupancy | ||
MaxAdult | Maximum Adults | ||
MaxChild | Maximum Children | ||
RatePlans | Rate Plan List | ||
RatePlanID | Rate Plan ID | ||
RatePlanCode | YOUR_RatePlan_CODE | ||
RatePlanName | Rate Plan Name | ||
CustomerRatePlanCode | Rate Plan Code (customizable) | ||
BasePersonCount | Base Occupancy | ||
CutoffDays | Advance Booking Days (Rate Plan level) |
Product Push API (Supplier static source mode, product data is provided by you)
PushHotel
API Endpoint: {{BaseUrl}}/api/v1/Property/PushHotel
Request:
{
"HotelCode": "P001",
"Name": "Sunshine Hotel",
"Status": 1,
"PriceModel": "PDP",
"ChildMaxAge": 12,
"Currency": "USD",
"Country": "United States",
"City": "New York",
"Addr": "123 Sunshine Street, Manhattan",
"Phone": "+1-212-555-1234",
"Email": "zirun.dong@didatravel.com",
"Longitude": "-73.935242",
"Latitude": "40.730610"
}
| Field | Description |
|---|---|
HotelCode | Hotel unique identifier |
Name | Hotel name |
Status | Hotel status: 1: Active, 0: Inactive |
PriceModel | Pricing mode: OBP or PDP. PDP: Room-based pricing. OBP: Prices based on number of guests. |
ChildMaxAge | Maximum age limit for children; guests exceeding this age are considered adults. |
Currency | Hotel currency code |
Country | Country/region |
City | City |
Addr | Full street address |
Phone | Contact number (typically front desk), including country code |
Email | Contact email (typically for reservations or inquiries) |
Longitude | Geographic longitude coordinate |
Latitude | Geographic latitude coordinate |
Response:
{
"code": 200,
"message": "success",
"data": null
}
PushRoomTypeAndRatePlan
API Endpoint: {{BaseUrl}}/api/v1/Property/PushRoomTypeAndRatePlan
Request:
{
"HotelCode": "P001",
"RoomTypes": [
{
"RoomTypeCode": "DR001",
"RoomTypeName": "Deluxe Room",
"Status": 1,
"MaxPerson": 4,
"MaxAdult": 3,
"MaxChild": 1,
"BedTypeID": 1,
"BedTypeName": "King Bed"
},
{
"RoomTypeCode": "SR001",
"RoomTypeName": "Standard Room",
"Status": 1,
"MaxPerson": 2,
"MaxAdult": 2,
"MaxChild": 0,
"BedTypeID": 2,
"BedTypeName": "Queen Bed",
"IsOnRequest": true
}
],
"RatePlans": [
{
"RatePlanCode": "RP001",
"RoomTypeCode": "DR001",
"Status": 1,
"RatePlanName": "Standard Rate",
"BasePersonCount": 2,
"CutoffDays": 0,
"MealTypeID": 1,
"MealTypeName": "Breakfast Included"
},
{
"RatePlanCode": "RP002",
"RoomTypeCode": "SR001",
"Status": 1,
"RatePlanName": "Non-Refundable Rate",
"BasePersonCount": 1,
"CutoffDays": 7,
"MealTypeID": 0,
"MealTypeName": "Room Only",
"IsRefundable": true,
"CancellationPolicies": [
{
"HourCount": 6,
"CancellationType": "FullStay"
},
{
"HourCount": 48,
"CancellationType": "None",
"FlatFee": 60.06
}
],
// Extra person charge. Nullable. Set this value when the room type's maximum occupancy
// exceeds the RP BasePersonCount. If not set, room availability exceeding the base
// occupancy will not be sold by default.
"ExtraPersonChargeSettingList": [
{
"AgeCategoryCode": "A",
"Setting": {
"ChargeType": "SA",
"Rules": [
{
"ExtraPersonCount": 1,
"IncludedMealCount": 0,
"AdjustType": "ABS",
"Amount": 105.00
},
{
"ExtraPersonCount": 2,
"IncludedMealCount": 0,
"AdjustType": "ABS",
"Amount": 155.00
}
]
}
},
{
"AgeCategoryCode": "BA",
"Setting": {
"ChargeType": "SA",
"Rules": [
{
"ExtraPersonCount": 1,
"IncludedMealCount": 0,
"AdjustType": "ABS",
"Amount": 102.00
},
{
"ExtraPersonCount": 2,
"IncludedMealCount": 0,
"AdjustType": "ABS",
"Amount": 135.00
}
]
}
}
]
}
]
}
| Name | Description | ||
|---|---|---|---|
RoomTypes | |||
RoomTypeCode | Required, string, unique value in one hotel | ||
IsOnRequest | Optional, default value is null, instant confirm. false: instant confirm resource true: Non-instant confirm resource | ||
IsDeleted | Optional, default value is null, active. true: Remove the room type permanently. This action is irreversible and unrecoverable, and the RoomTypeCode cannot be reused afterwards. | ||
RatePlans | |||
RatePlanCode | Required, string, unique value in one hotel | ||
CancellationPolicies | Cancellation policy list. When IsRefundable = true, CancellationPolicies must be provided (must not be empty).Example: Check-in date 2025-06-06, HourCount = 6 / CancellationType = FullStay → If the booking is cancelled after 2025-06-05 18:00, a full-stay charge will be applied. Example: Check-in date 2025-06-06, HourCount = 48 / CancellationType = None / FlatFee = 60.06 → If the booking is cancelled after 2025-06-04 00:00, 60.06 charge will be applied. | ||
HourCount | Represents the number of hours before 00:00 on the check-in date when the cancellation policy becomes effective. Negative values are not supported (integer). (Hotel local time) | ||
CancellationType | None: Fixed fee FirstNight: Charge the first night TwoNights: Charge two nights TenPercentOfFullStay: Charge 10% of the full stay TwentyPercentOfFullStay: Charge 20% of the full stay ThirtyPercentOfFullStay: Charge 30% of the full stay FortyPercentOfFullStay: Charge 40% of the full stay FiftyPercentOfFullStay: Charge 50% of the full stay SixtyPercentOfFullStay: Charge 60% of the full stay SeventyPercentOfFullStay: Charge 70% of the full stay EightyPercentOfFullStay: Charge 80% of the full stay NinetyPercentOfFullStay: Charge 90% of the full stay FullStay: Charge the full stay | ||
FlatFee | When using a fixed fee, a value must be provided (two decimal places). | ||
ExtraPersonChargeSettingList | See description below. | ||
IsDeleted | Optional, default value is null, active. true: Remove the rate plan permanently. This action is irreversible and unrecoverable, and the RatePlanCode cannot be reused afterwards. |
Extra person charge field:
| Field | Description | |||
|---|---|---|---|---|
ExtraPersonChargeSettingList | Extra person charge list, divided into adult extra person charges and child extra person charges, with a maximum of one entry each. Nullable. Set this value when the room type's maximum occupancy exceeds the RP BasePersonCount. If not set, room availability exceeding the base occupancy will not be sold by default. Supports push updates. | |||
AgeCategoryCode | Extra person type. A: Adult. BA: Child. | |||
Setting | ||||
ChargeType | Charge type. SA: Standalone charge, the most basic extra person fee, added on top of the base room rate. Others: To be supplemented. | |||
Rules | ||||
ExtraPersonCount | Extra person count. | |||
IncludedMealCount | Included meal count. | |||
AdjustType | Adjust type. ABS: Absolute value — the corresponding amounts are summed directly. Others: To be supplemented. | |||
Amount | When AdjustType="ABS", this value is a numeric amount. |
Response:
{
"code": 200,
"message": "success",
"data": null
}
ARI Push API
API Endpoint: {{BaseUrl}}/api/v1/ARI/Push
Retry Instruction: If the API does not return status code: 200, a retry is required.
Field Notes: PropertyID, RoomTypeID, and RatePlanID correspond to the Dida static source mode. When using the Product Pull API, these three fields are required when pushing ARI. HotelCode, RoomTypeCode, and RatePlanCode correspond to the supplier static source mode. When using the Product Push mode, these three fields are required when pushing ARI.
PDP Mode
Request:
{
"PropertyID": 2030330,
"HotelCode": "",
"InventoryList": [
{
"RoomTypeID": 1730030,
"StayDate": "2024-12-20",
"Inventory": 3,
"Status": 1
},
{
"RoomTypeID": 1730030,
"StayDate": "2024-12-21",
"Inventory": 3,
"Status": 1
}
],
"RateList": [
{
"RoomTypeID": 1730030,
"RatePlanID": 2300817,
"RatePlanCode": "RP002",
"RoomTypeCode": "SR001",
"StayDate": "2024-12-20",
"Price": 100,
"Status": 1,
"Currency": "CNY",
"MinLOS": 0,
"MaxLOS": 999,
"CTA": false,
"CTD": false,
"CuttoffDays": 0
},
{
"RoomTypeID": 1730030,
"RatePlanID": 2300817,
"RatePlanCode": "RP002",
"RoomTypeCode": "SR001",
"StayDate": "2024-12-21",
"Price": 100,
"Status": 1,
"Currency": "CNY",
"MinLOS": 0,
"MaxLOS": 999,
"CTA": false,
"CTD": false,
"CuttoffDays": 0
}
]
}
OBP Mode
Request:
{
"PropertyID": 2030501,
"HotelCode": "",
"InventoryList": [
{
"RoomTypeID": 1731035,
"RoomTypeCode": "YOUR_ROOMTYPE_CODE",
"StayDate": "2024-12-20",
"Inventory": 3,
"Status": 1
},
{
"RoomTypeID": 1731035,
"RoomTypeCode": "YOUR_ROOMTYPE_CODE",
"StayDate": "2024-12-21",
"Inventory": 3,
"Status": 1
}
],
"RateList": [
{
"RoomTypeID": 1731035,
"RatePlanID": 2322702,
"RoomTypeCode": "YOUR_ROOMTYPE_CODE",
"RatePlanCode": "YOUR_RatePlan_CODE",
"StayDate": "2024-12-20",
"Price": null,
"Status": 1,
"Currency": "CNY",
"OBPPrices": [
{
"Occupancy": 1,
"Price": 100,
"Status": 1,
"Type": "Adult"
},
{
"Occupancy": 2,
"Price": 120,
"Status": 1,
"Type": "Adult"
},
{
"Occupancy": 1,
"Price": 50,
"Status": 1,
"Type": "Child"
}
],
"MinLOS": 0,
"MaxLOS": 999,
"CTA": false,
"CTD": false,
"CuttoffDays": 0
},
{
"RoomTypeID": 1731035,
"RatePlanID": 2322702,
"RoomTypeCode": "YOUR_ROOMTYPE_CODE",
"RatePlanCode": "YOUR_RatePlan_CODE",
"StayDate": "2024-12-21",
"Price": null,
"Status": 1,
"Currency": "CNY",
"OBPPrices": [
{
"Occupancy": 1,
"Price": 100,
"Status": 1,
"Type": "Adult"
},
{
"Occupancy": 2,
"Price": 120,
"Status": 1,
"Type": "Adult"
},
{
"Occupancy": 1,
"Price": 50,
"Status": 1,
"Type": "Child"
}
],
"MinLOS": 0,
"MaxLOS": 999,
"CTA": false,
"CTD": false,
"CuttoffDays": 0
}
]
}
| Name | Description | ||
|---|---|---|---|
PropertyID | Dida Hotel ID, required in Dida static source mode (when using the Product Pull API) | ||
HotelCode | Supplier Hotel Code, required in supplier static source mode (when using the Product Push mode) | ||
InventoryList | Inventory update list | ||
RoomTypeID | Room Type ID, required in Dida static source mode (when using the Product Pull API) | ||
RoomTypeCode | YOUR_ROOMTYPE_CODE Supplier Room Type Code, required in supplier static source mode (when using the Product Push mode) | ||
StayDate | Date: YYYY-MM-DD | ||
Inventory | Inventory | ||
Status | Status: 0: InActive 1: Active | ||
RateList | Price update list | ||
RatePlanID | Rate Plan ID, required in Dida static source mode (when using the Product Pull API) | ||
RatePlanCode | YOUR_RatePlan_CODE Supplier Rate Plan Code, required in supplier static source mode (when using the Product Push mode) | ||
StayDate | Date: YYYY-MM-DD | ||
Price | Price (PDP price setting, two decimal places) | ||
Currency | Currency | ||
Status | Status: 0: InActive 1: Active | ||
MinLOS | Minimum staynull: No restriction | ||
MaxLOS | Maximum staynull: No restriction | ||
CTA | CloseToArrive True: Arrival not allowed False: Arrival allowed null: No restriction | ||
CTD | CloseToDepart True: Departure not allowed False: Departure allowed null: No restriction | ||
CuttoffDays | Advance booking days
| ||
OBPPrices | OBP price setting list
| ||
Occupancy | Occupancy, the number of guests | ||
Price | Price | ||
Status | Status: 0: InActive 1: Active | ||
Type | "Adult" "Child" |
Response:
{
"code": 200,
"message": "success"
}
Failed Response Example:
{
"code": 400,
"message": "Property not found."
}
| Name | Description |
|---|---|
code | 200: ok 401: Incorrect account or password 400: Invalid Parameters 500: Service unavailable |
message | success: Update successful fail: Update failed |
Reservation API
Booking API
API Endpoint: {{WebHookURL}}
Request:
{
"ClientID": "DidaTravel",
"UserName": "DidaUserName",
"Password": "DidaPassword",
"BookingID": "DEB12345678000001",
"Status": "New",
"PropertyID": 2030330,
"RoomTypeID": 1730030,
"RatePlanID": 2300817,
"HotelCode": "YOUR_HOTEL_CODE",
"RoomTypeCode": "YOUR_ROOMTYPE_CODE",
"RatePlanCode": "YOUR_RatePlan_CODE",
"PropertyName": "PropertyName",
"RoomTypeName": "RoomTypeName",
"RatePlanName": "RatePlanName",
"MealTypeID": 0,
"MealTypeName": "Room Only",
"BedTypeID": 1,
"BedTypeName": "1 Single",
"CheckInDate": "2024-12-20",
"CheckOutDate": "2024-12-22",
"RoomCount": 1,
"Remark": "No Smoking",
"PaymentInfo": {
"CardNumber": "1234567890123456",
"CardHolderName": "John Doe",
"CVC": "123",
"ActiveFromDate": "2023-01-01",
"ExpireDate": "2024-12-31"
},
"GuestInfoList": [
{
"RoomNum": 1,
"GuestFirstName": "John",
"GuestLastName": "Doe",
"Age": 30,
"IsAdult": true
},
{
"RoomNum": 1,
"GuestFirstName": "Jane",
"GuestLastName": "Doe",
"Age": 28,
"IsAdult": true
}
],
"PriceInfoList": [
{
"RoomNum": 1,
"AdultCount": 2,
"ChildCount": 0,
"TotalPrice": 150.00,
"Currency": "USD",
"DailyRateList": [
{
"Price": 75.00,
"StayDate": "2024-12-20"
},
{
"Price": 75.00,
"StayDate": "2024-12-21"
}
]
}
],
"Contact": {
"FirstName": "Dida",
"LastName": "Travel",
"Email": "service@didatravel.com",
"Phone": "+86-0755-82628521",
"Address": "Shenzhen Bay Tech-Eco Park, Shenzhen, China"
}
}
| Name | Description | ||
|---|---|---|---|
ClientID | Always: DidaTravel | ||
UserName | DidaUserName, provided by Dida, must be validated | ||
Password | DidaPassword, provided by Dida, must be validated | ||
BookingID | DIDA unique Booking ID (used to detect duplicates) | ||
Status | Booking status:
| ||
PropertyID | Hotel ID | ||
RoomTypeID | Room Type ID | ||
RatePlanID | Rate Plan ID | ||
HotelCode | YOUR_HOTEL_CODE | ||
RoomTypeCode | YOUR_ROOMTYPE_CODE | ||
RatePlanCode | YOUR_RatePlan_CODE | ||
PropertyName | Hotel name | ||
RoomTypeName | Room type name | ||
RatePlanName | Rate plan name | ||
MealTypeID | Meal type ID (see meal & bedding code specification) | ||
MealTypeName | Meal type name | ||
BedTypeID | Bed type ID (see meal & bedding code specification) | ||
BedTypeName | Bed type name | ||
CheckInDate | Check-in date | ||
CheckOutDate | Check-out date | ||
RoomCount | Number of rooms | ||
PaymentInfo | Payment information (if applicable) | ||
CardNumber | Card number | ||
CardHolderName | Cardholder name | ||
CVC | CVC (may be empty) | ||
ActiveFromDate | Effective date | ||
ExpireDate | Expiry date | ||
GuestInfoList | Guest information list | ||
RoomNum | Room number | ||
GuestFirstName | Guest first name | ||
GuestLastName | Guest last name | ||
Age | Age | ||
IsAdult | Adult or not | ||
PriceInfoList | Price information list | ||
RoomNum | Room number | ||
AdultCount | Adult count | ||
ChildCount | Child count | ||
TotalPrice | Total room price | ||
Currency | Currency | ||
DailyRateList | Daily price list | ||
Price | Price | ||
StayDate | Date | ||
Contact | Dida contact information | ||
FirstName | Dida | ||
LastName | Travel | ||
Email | Dida contact email | ||
Phone | Dida contact phone number | ||
Address | Dida contact address |
Response:
{
"Success": true,
"Msg": "Success",
"BookingID": "DEB12345678",
"ConfirmationCode": "123456"
}
| Name | Description |
|---|---|
Success | true: booking successful false: booking failed |
Msg | Success or error message |
BookingID | DIDA unique Booking ID |
ConfirmationCode | Hotel confirmation code |
Cancellation API
API Endpoint: {{WebHookURL}}
Request:
{
"ClientID": "DidaTravel",
"UserName": "DidaUserName",
"Password": "DidaPassword",
"BookingID": "DEB12345678000001",
"Status": "Cancel",
"PropertyID": 2030330,
"RoomTypeID": 1730030,
"RatePlanID": 2300817,
"HotelCode": "YOUR_HOTEL_CODE",
"RoomTypeCode": "YOUR_ROOMTYPE_CODE",
"RatePlanCode": "YOUR_RatePlan_CODE",
"CheckInDate": "2024-12-20",
"CheckOutDate": "2024-12-22",
"RoomCount": 1
}
| Name | Description |
|---|---|
ClientID | Always: DidaTravel |
UserName | DidaUserName, provided by Dida, must be validated |
Password | DidaPassword, provided by Dida, must be validated |
BookingID | DIDA unique Booking ID |
Status | Booking status: New: new booking Cancel: cancellation Modify: modification Always Cancel |
PropertyID | Hotel ID |
RoomTypeID | Room Type ID |
RatePlanID | Rate Plan ID |
HotelCode | YOUR_HOTEL_CODE |
RoomTypeCode | YOUR_ROOMTYPE_CODE |
RatePlanCode | YOUR_RatePlan_CODE |
CheckInDate | Check-in date |
CheckOutDate | Check-out date |
RoomCount | Number of rooms |
Response:
{
"Success": true,
"Msg": "Success"
}
| Name | Description |
|---|---|
Success | true: Cancellation successful false: Cancellation failed |
Msg | Success or error message |
Modification API(In this interface, only the guest names, payment method, and remarks sections can be modified. If a field is null, it means that field’s information will not be modified.)
API Endpoint: {{WebHookURL}}/softchange
Request (fields have the same meaning as in the Booking API):
{
"ClientID": "DidaTravel",
"UserName": "DidaUserName",
"Password": "DidaPassword",
"BookingID": "DEB12345678000001",
"Status": "Modify",
"PropertyID": 2030330,
"RoomTypeID": 1730030,
"RatePlanID": 2300817,
"HotelCode": "YOUR_HOTEL_CODE",
"RoomTypeCode": "YOUR_ROOMTYPE_CODE",
"RatePlanCode": "YOUR_RatePlan_CODE",
"Remark": "No Smoking",
"PaymentInfo": {
"CardNumber": "1234567890123456",
"CardHolderName": "John Doe",
"ActiveFromDate": "2023-01-01",
"ExpireDate": "2024-12-31"
},
"GuestInfoList": [
{
"RoomNum": 1,
"GuestFirstName": "John",
"GuestLastName": "Doe",
"Age": 30,
"IsAdult": true
},
{
"RoomNum": 1,
"GuestFirstName": "Jane",
"GuestLastName": "Doe",
"Age": 28,
"IsAdult": true
}
]
}
Get Booking List API
API Endpoint: {{BaseUrl}}/api/v1/Booking/List
| Name | Description |
|---|---|
BookingID | Booking ID |
OrderDateStart | Booking date range start (YYYY-MM-DD) |
OrderDateEnd | Booking date range end (inclusive) (YYYY-MM-DD) |
StayDateStart | Stay date range start (YYYY-MM-DD) |
StayDateEnd | Stay date range end (inclusive) (YYYY-MM-DD) |
1. At least one query condition must be provided: query by
BookingID, query by order date range, or query by stay date range.2. When querying by order date range, both
OrderDateStart and OrderDateEnd are required.3. When querying by stay date range, both
StayDateStart and StayDateEnd are required.4. If multiple query conditions are provided at the same time, the query will be performed using the intersection of those conditions. For example, if both
BookingID and an order date range are provided, only orders whose BookingID matches and whose order date falls within the specified range will be returned. If the order does not fall within the order date range, it will not be returned.
Request:
{
"BookingID": "DEB241217201xxxxx",
"OrderDateStart": "2024-12-17",
"OrderDateEnd": "2024-12-17",
"StayDateStart": "2024-12-17",
"StayDateEnd": "2024-12-17"
}
Response (field descriptions are the same as in the Create Order API):
{
"code": 200,
"message": "success",
"data": [
{
"BookingID": "DEB241217201xxxxx",
"Status": null,
"ConfirmationCode": null,
"PropertyID": 1992267,
"RoomTypeID": 1209418,
"RatePlanID": 1581070,
"HotelCode": "YOUR_HOTEL_CODE",
"RoomTypeCode": "YOUR_ROOMTYPE_CODE",
"RatePlanCode": "YOUR_RatePlan_CODE",
"PropertyName": null,
"RoomTypeName": null,
"RatePlanName": null,
"MealTypeID": 0,
"MealTypeName": null,
"BedTypeID": 1,
"BedTypeName": null,
"CheckInDate": "2025-01-16T00:00:00",
"CheckOutDate": "2025-01-17T00:00:00",
"RoomCount": 1,
"Remark": null,
"PaymentInfo": null,
"GuestInfoList": [
{
"RoomNum": 1,
"GuestFirstName": "test",
"GuestLastName": "test",
"Age": null,
"IsAdult": true
}
],
"PriceInfoList": [
{
"RoomNum": 1,
"AdultCount": 1,
"ChildCount": 0,
"TotalPrice": 0.0,
"Currency": "JPY",
"DailyRateList": null
}
],
"Contact": null
}
]
}
Confirm Booking API (Applicable only to bookings pending confirmation on request)
API Endpoint: {{BaseUrl}}/api/v1/Booking/ConfirmOnRequest
| Name | Description |
|---|---|
BookingID | Booking ID provided by DIDA when creating the reservation |
Status | Booking status: Confirmed = 1 Cancelled = 2 Rejected = 3 |
Msg | Additional information |
Request:
{
"BookingID": "DEB241217201xxxxx",
"Status": 1,
"Msg": "\u786e\u8ba4\u6210\u529f"
}
Response:
{
"Success": true,
"Msg": "Success"
}
| Name | Description |
|---|---|
Success | true: processed successfully false: failed to process |
Code | Status codes: 200: Confirmation successful 201: Booking already confirmed 400: Booking has been cancelled 401: Booking status abnormal 404: Booking not found 500: System error |
Msg | Confirmation result message |
Update Hotel Confirmation Code API
API Endpoint: {{BaseUrl}}/api/v1/Booking/UpdateConfirmationCode
| Name | Description |
|---|---|
BookingID | Booking ID provided by DIDA when creating the reservation |
ConfirmationCode | Hotel confirmation code |
Request:
{
"BookingID": "DEB241217201xxxxx",
"ConfirmationCode": "123456"
}
Response:
{
"Success": true,
"Msg": "Success",
"Code": 200
}
| Name | Description |
|---|---|
Success | true: processed successfully false: failed to process |
Code | Status codes: 200: Confirmation successful 201: Confirmation code already exists 400: Parameter error 401: Booking already cancelled 404: Booking not found 500: System error |
Msg | Confirmation result message |
Appendix
Meal Type Code Specification
| Code | Meal Type |
|---|---|
| 0 | Room Only |
| 1 | Breakfast Included |
| 2 | Half-Board |
| 3 | Full-Board |
| 4 | All Inclusive |
| 5 | Dinner |
| 6 | BreakfastAndDinner |
| 7 | BreakfastAndLunch |
| 8 | PKG (Room & Ticket) |
| 9 | Lunch |
| 10 | Lunch And Dinner |
| 11 | Suhur |
| 12 | Iftar |
| 13 | Suhur And Iftar |
| 14 | Suhur or Iftar |
Main Bed Type Code Specification
| Code | Bed Type |
|---|---|
| 1 | 1 Single |
| 2 | 1 Double |
| 3 | 1 Twin |
| 4 | 3 Single |
| 5 | 1 Double 1 Single |
| 6 | 2 Double |
| 7 | 1 Double 1 Twin |
| 8 | 2 Twin |
| 9 | 1 Double or 1 Twin |
| 10 | 1 Double 1 Sofa |
| 11 | 1 Single 1 Sofa |
| 14 | 2 Single 1 Sofa |
| 15 | 3 Single 1 Sofa |
| 16 | 4 Single 1 Sofa |
| 17 | 2 Double 1 Sofa |
| 18 | 1 Double 2 Sofa |
| 21 | 1 Double 1 Single 1 Sofa |
| 22 | 1 Double 2 Single 1 Sofa |
| 23 | 1 Double 2 Single 1 Double-Sofa |
| 24 | 1 Sofa |
Postman Files
Below are the complete Postman environment and collection files. You can import these directly into Postman to test the API.
📄 CMOpenAPI.postman_environment.json
{
"_postman_exported_at": "2025-07-29T05:31:36.615Z",
"_postman_exported_using": "Postman/11.56.1",
"_postman_variable_scope": "environment",
"id": "b4b17b7a-6029-4ca3-88ff-b324d7748112",
"name": "CMOpenAPI",
"values": [
{
"enabled": true,
"key": "api_key",
"type": "default",
"value": "<YOUR_API_KEY>"
},
{
"enabled": true,
"key": "api_secret",
"type": "default",
"value": "<YOUR_API_SECRET>"
},
{
"enabled": true,
"key": "BaseUrl",
"type": "default",
"value": "https://cm-dataapi.didatravel.com"
},
{
"enabled": true,
"key": "WebHookURL",
"type": "default",
"value": "https://didacmapi.yourwebsite.com"
}
]
}
📄 CMOpenAPI.postman_collection.json
{
"auth": {
"apikey": [
{
"key": "value",
"type": "string",
"value": "ApiKey {{api_key}}"
},
{
"key": "key",
"type": "string",
"value": "Authorization"
}
],
"type": "apikey"
},
"event": [
{
"listen": "prerequest",
"script": {
"exec": [
"// 1. 获取key\r",
"const apiKey = pm.environment.get(\"api_key\");\r",
"const apiSecret = pm.environment.get(\"api_secret\");\r",
"\r",
"pm.request.headers.upsert({ key: \"X-API-Key\", value: apiKey });\r",
"\r",
"// 2. 生成时间戳和Nonce\r",
"const timestamp = Math.floor(Date.now() / 1000).toString();\r",
"const nonce = crypto.randomUUID(); // Postman沙箱内置了crypto对象\r",
"\r",
"// 3. 将Timestamp和Nonce添加到请求头\r",
"// Postman会自动处理,即使Headers中已存在同名key,也会使用这里设置的值\r",
"pm.request.headers.upsert({ key: \"X-Timestamp\", value: timestamp });\r",
"pm.request.headers.upsert({ key: \"X-Nonce\", value: nonce });\r",
"\r",
"// 4. 获取请求路径和查询参数\r",
"const path = pm.request.url.getPath(); // e.g., /api/data\r",
"const query = pm.request.url.getQueryString(); // e.g., ?name=test&id=123\r",
"\r",
"// 5. 安全地获取请求体 (最关键的一步)\r",
"let bodyContent = \"\";\r",
"// 检查请求体是否存在,并且模式是'raw' (最常见的情况,如JSON)\r",
"if (pm.request.body && pm.request.body.mode === 'raw' && pm.request.body.raw) {\r",
" bodyContent = pm.request.body.raw;\r",
"}\r",
"// 注意:对于GET, DELETE等没有请求体的请求,bodyContent会保持为空字符串 \"\"\r",
"// 这与我们服务器端的逻辑完全匹配\r",
"\r",
"// 6. 按照与服务器完全相同的顺序,构建待签名字符串\r",
"const stringToSign = `${timestamp}${nonce}${path}${query}${bodyContent}`;\r",
"\r",
"// 7. 计算HMAC-SHA256签名\r",
"const signature = CryptoJS.HmacSHA256(stringToSign, apiSecret).toString(CryptoJS.enc.Base64);\r",
"\r",
"// 8. 将最终的签名添加到请求头\r",
"pm.request.headers.upsert({ key: \"X-Signature\", value: signature });\r",
"\r",
"// --- 用于调试的日志 ---\r",
"// 你可以在Postman Console (View -> Show Postman Console) 中看到这些输出\r",
"console.log(\"--- Signature Generation Details ---\");\r",
"console.log(\"Timestamp:\", timestamp);\r",
"console.log(\"Nonce:\", nonce);\r",
"console.log(\"Path:\", path);\r",
"console.log(\"Query:\", query);\r",
"console.log(\"Body Content:\", bodyContent);\r",
"console.log(\"String to Sign:\", stringToSign);\r",
"console.log(\"Generated Signature:\", signature);\r",
"console.log(\"------------------------------------\");"
],
"packages": {},
"type": "text/javascript"
}
},
{
"listen": "test",
"script": {
"exec": [
""
],
"packages": {},
"type": "text/javascript"
}
}
],
"info": {
"_exporter_id": "29840969",
"_postman_id": "3e8e9b42-326a-4d84-8421-326d34b0b577",
"name": "CMOpenAPI",
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
},
"item": [
{
"event": [
{
"listen": "prerequest",
"script": {
"exec": [
""
],
"packages": {},
"type": "text/javascript"
}
}
],
"name": "GetPropertyList",
"request": {
"body": {
"mode": "raw",
"options": {
"raw": {
"language": "json"
}
},
"raw": "{\r\n \"PropertyID\": null,\r\n \"HotelCode\":\"\"\r\n}"
},
"header": [],
"method": "POST",
"url": {
"host": [
"{{BaseUrl}}"
],
"path": [
"api",
"v1",
"Property",
"GetList"
],
"raw": "{{BaseUrl}}/api/v1/Property/GetList"
}
},
"response": []
},
{
"name": "GetBedTypes",
"request": {
"body": {
"mode": "raw",
"options": {
"raw": {
"language": "json"
}
},
"raw": ""
},
"header": [],
"method": "POST",
"url": {
"host": [
"{{BaseUrl}}"
],
"path": [
"api",
"v1",
"Property",
"GetBedTypes"
],
"raw": "{{BaseUrl}}/api/v1/Property/GetBedTypes"
}
},
"response": []
},
{
"name": "GetMealTypes",
"request": {
"body": {
"mode": "raw",
"options": {
"raw": {
"language": "json"
}
},
"raw": ""
},
"header": [],
"method": "POST",
"url": {
"host": [
"{{BaseUrl}}"
],
"path": [
"api",
"v1",
"Property",
"GetMealTypes"
],
"raw": "{{BaseUrl}}/api/v1/Property/GetMealTypes"
}
},
"response": []
},
{
"name": "GetRoomTypeAndRatePlan",
"request": {
"body": {
"mode": "raw",
"options": {
"raw": {
"language": "json"
}
},
"raw": "{\r\n \"PropertyID\": 2030501,\r\n \"HotelCode\": \"\"\r\n}"
},
"header": [],
"method": "POST",
"url": {
"host": [
"{{BaseUrl}}"
],
"path": [
"api",
"v1",
"Property",
"GetRoomTypeAndRatePlan"
],
"raw": "{{BaseUrl}}/api/v1/Property/GetRoomTypeAndRatePlan"
}
},
"response": []
},
{
"name": "PushHotel",
"request": {
"body": {
"mode": "raw",
"options": {
"raw": {
"language": "json"
}
},
"raw": "{\r\n \"HotelCode\": \"P001\",\r\n \"Name\": \"Sunshine Hotel\",\r\n \"Status\": 1,\r\n \"PriceModel\": \"PDP\",\r\n \"ChildMaxAge\": 12,\r\n \"Currency\": \"USD\",\r\n \"Country\": \"United States\",\r\n \"City\": \"New York\",\r\n \"Addr\": \"123 Sunshine Street, Manhattan\",\r\n \"Phone\": \"+1-212-555-1234\",\r\n \"Email\":\"zirun.dong@didatravel.com\",\r\n \"Longitude\": \"-73.935242\",\r\n \"Latitude\": \"40.730610\"\r\n}"
},
"header": [],
"method": "POST",
"url": {
"host": [
"{{BaseUrl}}"
],
"path": [
"api",
"v1",
"Property",
"PushHotel"
],
"raw": "{{BaseUrl}}/api/v1/Property/PushHotel"
}
},
"response": []
},
{
"name": "PushRoomTypeAndRatePlan",
"request": {
"body": {
"mode": "raw",
"options": {
"raw": {
"language": "json"
}
},
"raw": "{\r\n \"HotelCode\": \"P001\",\r\n \"RoomTypes\": [\r\n {\r\n \"RoomTypeCode\": \"DR001\",\r\n \"Status\": 1,\r\n \"MaxPerson\": 4,\r\n \"MaxAdult\": 3,\r\n \"MaxChild\": 1,\r\n \"RoomTypeName\": \"Deluxe Room\",\r\n \"BedTypeID\": 1,\r\n \"BedTypeName\": \"King Bed\"\r\n },\r\n {\r\n \"RoomTypeCode\": \"SR001\",\r\n \"Status\": 1,\r\n \"MaxPerson\": 2,\r\n \"MaxAdult\": 2,\r\n \"MaxChild\": 0,\r\n \"RoomTypeName\": \"Standard Room\",\r\n \"BedTypeID\": 2,\r\n \"BedTypeName\": \"Queen Bed\"\r\n }\r\n ],\r\n \"RatePlans\": [\r\n {\r\n \"RatePlanCode\": \"RP001\",\r\n \"RoomTypeCode\": \"DR001\",\r\n \"Status\": 1,\r\n \"RatePlanName\": \"Standard Rate\",\r\n \"BasePersonCount\": 2,\r\n \"CutoffDays\": 0,\r\n \"MealTypeID\": 1,\r\n \"MealTypeName\": \"Breakfast Included\"\r\n },\r\n {\r\n \"RatePlanCode\": \"RP002\",\r\n \"RoomTypeCode\": \"SR001\",\r\n \"Status\": 1,\r\n \"RatePlanName\": \"Non-Refundable Rate\",\r\n \"BasePersonCount\": 1,\r\n \"CutoffDays\": 7,\r\n \"MealTypeID\": 2,\r\n \"MealTypeName\": \"Room Only\"\r\n }\r\n ]\r\n}"
},
"header": [],
"method": "POST",
"url": {
"host": [
"{{BaseUrl}}"
],
"path": [
"api",
"v1",
"Property",
"PushRoomTypeAndRatePlan"
],
"raw": "{{BaseUrl}}/api/v1/Property/PushRoomTypeAndRatePlan"
}
},
"response": []
},
{
"name": "ARIUpdate PDP",
"request": {
"body": {
"mode": "raw",
"options": {
"raw": {
"language": "json"
}
},
"raw": "{\r\n \"PropertyID\": 2030330,\r\n \"HotelCode\":\"P001\",\r\n \"InventoryList\": [\r\n {\r\n \"RoomTypeID\": 1730030,\r\n \"StayDate\": \"2024-12-20\",\r\n \"Inventory\": 3,\r\n \"Status\": 1\r\n },\r\n {\r\n \"RoomTypeID\": 1730030,\r\n \"StayDate\": \"2024-12-21\",\r\n \"Inventory\": 3,\r\n \"Status\": 1\r\n }\r\n ],\r\n \"RateList\": [\r\n {\r\n \"RoomTypeID\": 1730030,\r\n \"RatePlanID\": 2300817,\r\n \"StayDate\": \"2024-12-20\",\r\n \"Price\": 100,\r\n \"Status\": 1,\r\n \"Currency\": \"CNY\",\r\n \"MinLOS\": 0,\r\n \"MaxLOS\": 999,\r\n \"CTA\": false,\r\n \"CTD\": false,\r\n \"CuttoffDays\": 0\r\n },\r\n {\r\n \"RoomTypeID\": 1730030,\r\n \"RatePlanID\": 2300817,\r\n \"StayDate\": \"2024-12-21\",\r\n \"Price\": 100,\r\n \"Status\": 1,\r\n \"Currency\": \"CNY\",\r\n \"MinLOS\": 0,\r\n \"MaxLOS\": 999,\r\n \"CTA\": false,\r\n \"CTD\": false,\r\n \"CuttoffDays\": 0\r\n }\r\n ]\r\n}"
},
"header": [],
"method": "POST",
"url": {
"host": [
"{{BaseUrl}}"
],
"path": [
"api",
"v1",
"ARI",
"Push"
],
"raw": "{{BaseUrl}}/api/v1/ARI/Push"
}
},
"response": []
},
{
"name": "ARIUpdate OBP",
"request": {
"body": {
"mode": "raw",
"options": {
"raw": {
"language": "json"
}
},
"raw": "{\r\n \"PropertyID\": 2030501,\r\n \"HotelCode\":\"P001\",\r\n \"InventoryList\": [\r\n {\r\n \"RoomTypeID\": 1731035,\r\n \"StayDate\": \"2024-12-20\",\r\n \"Inventory\": 3,\r\n \"Status\": 1\r\n },\r\n {\r\n \"RoomTypeID\": 1731035,\r\n \"StayDate\": \"2024-12-21\",\r\n \"Inventory\": 3,\r\n \"Status\": 1\r\n }\r\n ],\r\n \"RateList\": [\r\n {\r\n \"RoomTypeID\": 1731035,\r\n \"RatePlanID\": 2322702,\r\n \"StayDate\": \"2024-12-20\",\r\n \"Price\": null,\r\n \"Status\": 1,\r\n \"Currency\": \"CNY\",\r\n \"OBPPrices\": [\r\n {\r\n \"Occupancy\": 1,\r\n \"Price\": 100,\r\n \"Status\": 1,\r\n \"Type\": \"Adult\"\r\n },\r\n {\r\n \"Occupancy\": 2,\r\n \"Price\": 120,\r\n \"Status\": 1,\r\n \"Type\": \"Adult\"\r\n },\r\n {\r\n \"Occupancy\": 1,\r\n \"Price\": 50,\r\n \"Status\": 1,\r\n \"Type\": \"Child\"\r\n }\r\n ],\r\n \"MinLOS\": 0,\r\n \"MaxLOS\": 999,\r\n \"CTA\": false,\r\n \"CTD\": false,\r\n \"CuttoffDays\": 0\r\n },\r\n {\r\n \"RoomTypeID\": 1731035,\r\n \"RatePlanID\": 2322702,\r\n \"StayDate\": \"2024-12-21\",\r\n \"Price\": null,\r\n \"Status\": 1,\r\n \"Currency\": \"CNY\",\r\n \"OBPPrices\": [\r\n {\r\n \"Occupancy\": 1,\r\n \"Price\": 100,\r\n \"Status\": 1,\r\n \"Type\": \"Adult\"\r\n },\r\n {\r\n \"Occupancy\": 2,\r\n \"Price\": 120,\r\n \"Status\": 1,\r\n \"Type\": \"Adult\"\r\n },\r\n {\r\n \"Occupancy\": 1,\r\n \"Price\": 50,\r\n \"Status\": 1,\r\n \"Type\": \"Child\"\r\n }\r\n ],\r\n \"MinLOS\": 0,\r\n \"MaxLOS\": 999,\r\n \"CTA\": false,\r\n \"CTD\": false,\r\n \"CuttoffDays\": 0\r\n }\r\n ]\r\n}"
},
"header": [],
"method": "POST",
"url": {
"host": [
"{{BaseUrl}}"
],
"path": [
"api",
"v1",
"ARI",
"Push"
],
"raw": "{{BaseUrl}}/api/v1/ARI/Push"
}
},
"response": []
},
{
"name": "GetBookingList",
"request": {
"body": {
"mode": "raw",
"options": {
"raw": {
"language": "json"
}
},
"raw": "{\r\n \"BookingID\": \"DEB241217201431338\",\r\n \"OrderDateStart\": \"2024-12-17\",\r\n \"OrderDateEnd\": \"2024-12-17\"\r\n}"
},
"header": [],
"method": "POST",
"url": {
"host": [
"{{BaseUrl}}"
],
"path": [
"api",
"v1",
"Booking",
"List"
],
"raw": "{{BaseUrl}}/api/v1/Booking/List"
}
},
"response": []
},
{
"name": "AddBooking",
"request": {
"body": {
"mode": "raw",
"options": {
"raw": {
"language": "json"
}
},
"raw": "{\r\n \"ClientID\": \"DidaTravel\",\r\n \"UserName\": \"DidaUserName\",\r\n \"Password\": \"DidaPassword\",\r\n \"BookingID\": \"DEB12345678000001\",\r\n \"Status\": \"New\",\r\n \"PropertyID\": 2030330,\r\n \"PropertyName\": \"PropertyName\",\r\n \"RoomTypeID\": 1730030,\r\n \"RoomTypeName\": \"RoomTypeName\",\r\n \"RatePlanID\": 2300817,\r\n \"RatePlanName\": \"RatePlanName\",\r\n \"MealTypeID\": \"0\",\r\n \"MealTypeName\": \"Room Only\",\r\n \"BedTypeID\": \"1\",\r\n \"BedTypeName\": \"1 Single\",\r\n \"CheckInDate\": \"2024-12-20\",\r\n \"CheckOutDate\": \"2024-12-21\",\r\n \"RoomCount\": 1,\r\n \"Remark\": \"no smoking\",\r\n \"PaymentInfo\": {\r\n \"CardNumber\": \"1234567890123456\",\r\n \"CardHolderName\": \"John Doe\",\r\n \"CVC\": \"123\",\r\n \"ActiveFromDate\": \"2023-01-01\",\r\n \"ExpireDate\": \"2024-12-31\"\r\n },\r\n \"GuestInfoList\": [\r\n {\r\n \"RoomNum\": 1,\r\n \"GuestFirstName\": \"John\",\r\n \"GuestLastName\": \"Doe\",\r\n \"Age\": 30,\r\n \"IsAdult\": true\r\n },\r\n {\r\n \"RoomNum\": 1,\r\n \"GuestFirstName\": \"Jane\",\r\n \"GuestLastName\": \"Doe\",\r\n \"Age\": 28,\r\n \"IsAdult\": true\r\n }\r\n ],\r\n \"PriceInfoList\": [\r\n {\r\n \"RoomNum\": 1,\r\n \"AdultCount\": 2,\r\n \"ChildCount\": 0,\r\n \"TotalPrice\": 150.00,\r\n \"Currency\": \"USD\",\r\n \"DailyRateList\": [\r\n {\r\n \"Price\": 75.00,\r\n \"StayDate\": \"2024-12-20\"\r\n },\r\n {\r\n \"Price\": 75.00,\r\n \"StayDate\": \"2024-12-21\"\r\n }\r\n ]\r\n }\r\n ],\r\n \"Contact\": {\r\n \"FirstName\": \"Dida\",\r\n \"LastName\": \"Travel\",\r\n \"Email\": \"service@didatravel.com\",\r\n \"Phone\": \"+86-0755-82628521\",\r\n \"Address\": \"Shenzhen Bay Tech-Eco Park, Shenzhen, China\"\r\n }\r\n}"
},
"header": [],
"method": "POST",
"url": {
"host": [
"{{WebHookURL}}"
],
"raw": "{{WebHookURL}}"
}
},
"response": []
},
{
"name": "CancelBooking",
"request": {
"body": {
"mode": "raw",
"options": {
"raw": {
"language": "json"
}
},
"raw": "{\r\n \"ClientID\": \"DidaTravel\",\r\n \"UserName\": \"DidaUserName\",\r\n \"Password\": \"DidaPassword\",\r\n \"BookingID\": \"DEB12345678000001\",\r\n \"Status\": \"Cancel\",\r\n \"PropertyID\": 2030330,\r\n \"RoomTypeID\": 1730030,\r\n \"RatePlanID\": 2300817,\r\n \"CheckInDate\": \"2024-12-20\",\r\n \"CheckOutDate\": \"2024-12-21\",\r\n \"RoomCount\": 1\r\n}"
},
"header": [],
"method": "POST",
"url": {
"host": [
"{{WebHookURL}}"
],
"raw": "{{WebHookURL}}"
}
},
"response": []
},
{
"name": "ModifyBooking",
"request": {
"body": {
"mode": "raw",
"options": {
"raw": {
"language": "json"
}
},
"raw": "{\r\n \"ClientID\": \"DidaTravel\",\r\n \"UserName\": \"DidaUserName\",\r\n \"Password\": \"DidaPassword\",\r\n \"BookingID\": \"DEB12345678000001\",\r\n \"Status\": \"Modify\",\r\n \"PropertyID\": 2030330,\r\n \"RoomTypeID\": 1730030,\r\n \"RatePlanID\": 2300817,\r\n \"CheckInDate\": \"2024-12-20\",\r\n \"CheckOutDate\": \"2024-12-22\",\r\n \"RoomCount\": 1,\r\n \"PaymentInfo\": {\r\n \"CardNumber\": \"1234567890123456\",\r\n \"CardHolderName\": \"John Doe\",\r\n \"CVC\": \"123\",\r\n \"ActiveFromDate\": \"2023-01-01\",\r\n \"ExpireDate\": \"2024-12-31\"\r\n },\r\n \"GuestInfoList\": [\r\n {\r\n \"RoomNum\": 1,\r\n \"GuestFirstName\": \"John\",\r\n \"GuestLastName\": \"Doe\",\r\n \"Age\": 30,\r\n \"IsAdult\": true\r\n },\r\n {\r\n \"RoomNum\": 1,\r\n \"GuestFirstName\": \"Jane\",\r\n \"GuestLastName\": \"Doe\",\r\n \"Age\": 28,\r\n \"IsAdult\": true\r\n }\r\n ],\r\n \"PriceInfoList\": [\r\n {\r\n \"RoomNum\": 1,\r\n \"AdultCount\": 2,\r\n \"ChildCount\": 0,\r\n \"TotalPrice\": 150.00,\r\n \"Currency\": \"USD\",\r\n \"DailyRateList\": [\r\n {\r\n \"Price\": 75.00,\r\n \"StayDate\": \"2024-12-20\"\r\n },\r\n {\r\n \"Price\": 75.00,\r\n \"StayDate\": \"2024-12-21\"\r\n }\r\n ]\r\n }\r\n ]\r\n}"
},
"header": [],
"method": "POST",
"url": {
"host": [
"{{WebHookURL}}"
],
"raw": "{{WebHookURL}}"
}
},
"response": []
}
]
}