DIDA · CHANNEL MANAGER

Dida ChannelManager API Document

API Specification — Product Retrieval · Push · ARI · Reservations

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).
Note: ApiKey and ApiSecret are provided by Dida.

2. Authentication Process Overview

All protected API requests must satisfy both of the following 2 conditions:

  1. Identity: Provide the ApiKey in the request headers.
  2. Request Signature: Include a signature (X-Signature) in the request headers, which is calculated based on the request content and the ApiSecret. 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:

HeaderDescriptionExample 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-TimestampThe 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-NonceA 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-SignatureAn HMAC-SHA256 signature calculated from the request content, encoded in Base64. See the signature generation algorithm below.wS2X.../aBcDeFg=
Content-TypeIf 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 the X-Timestamp header.
  • nonce: The value of the X-Nonce header.
  • requestPath: The path portion of the request URL, excluding the domain and query parameters. Example: For https://api.example.com/v1/users?page=2, the requestPath is /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, the queryString is ?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 StatuscodemessagePossible Causes
401 Unauthorized401Missing API Key...Authorization: ApiKey or X-API-Key not found in request headers.
400 Bad Request400Missing required headers...Missing one or more of: X-Timestamp, X-Nonce, or X-Signature.
401 Unauthorized401Invalid or expired timestamp.X-Timestamp differs from server time by more than 5 minutes. Check server time sync.
401 Unauthorized401Replayed request detected.Duplicate X-Nonce value used. Ensure each request generates a unique nonce.
401 Unauthorized401Invalid API Key...The provided ApiKey is invalid or not configured in the system.
401 Unauthorized401Invalid 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

API Structure Diagram
API Structure Diagram

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": ""
}
NameDescription
PropertyIDA Dida hotel identifier, the hotel ID of DIDA, integer type
  1. When the PropertyID value is null, query all hotels.
  2. When the PropertyID value is a specific value, query the specified hotel.
HotelCodeA pushed hotel identifier, hotel ID, string type
  1. When the HotelCode value is null, query all hotels.
  2. When the HotelCode value is a specific value, query the specified hotel; if no data is returned, it indicates no match was found.

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"
        }
    ]
}
NameDescription
codeStatus Code
messageMessage
dataHotel Information
PropertyIDHotel ID
NameHotel Name
CustomerPropertyCodeHotel Code (customizable)
PriceModelPricing Mode: OBP or PDP
  • PDP (Package-Deal Pricing): Room-based pricing, set prices according to the room.
  • OBP (Occupancy-Based Pricing): Prices based on the number of guests.
ChildMaxAgeMaximum age limit for children / Age range for children
CurrencyCurrency

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.

NameDescription
RoomTypesRoom Type List
RoomTypeIDRoom Type ID
RoomTypeNameRoom Type Name
RoomTypeCodeRoom Type Code (customizable)
MaxPersonMaximum Total Occupancy
MaxAdultMaximum Adults
MaxChildMaximum Children
RatePlansRate Plan List
RatePlanIDRate Plan ID
RatePlanCodeYOUR_RatePlan_CODE
RatePlanNameRate Plan Name
CustomerRatePlanCodeRate Plan Code (customizable)
BasePersonCountBase Occupancy
CutoffDaysAdvance 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"
}
FieldDescription
HotelCodeHotel unique identifier
NameHotel name
StatusHotel status: 1: Active, 0: Inactive
PriceModelPricing mode: OBP or PDP. PDP: Room-based pricing. OBP: Prices based on number of guests.
ChildMaxAgeMaximum age limit for children; guests exceeding this age are considered adults.
CurrencyHotel currency code
CountryCountry/region
CityCity
AddrFull street address
PhoneContact number (typically front desk), including country code
EmailContact email (typically for reservations or inquiries)
LongitudeGeographic longitude coordinate
LatitudeGeographic 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
                        }
                    ]
                }
            }
        ]
    }
  ]
}
NameDescription
RoomTypes
RoomTypeCodeRequired, string, unique value in one hotel
IsOnRequestOptional, default value is null, instant confirm.
false: instant confirm resource
true: Non-instant confirm resource
IsDeletedOptional, 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
RatePlanCodeRequired, string, unique value in one hotel
CancellationPoliciesCancellation 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.
HourCountRepresents 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)
CancellationTypeNone: 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
FlatFeeWhen using a fixed fee, a value must be provided (two decimal places).
ExtraPersonChargeSettingListSee description below.
IsDeletedOptional, 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:

FieldDescription
ExtraPersonChargeSettingListExtra 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.
AgeCategoryCodeExtra person type.
A: Adult.
BA: Child.
Setting
ChargeTypeCharge type.
SA: Standalone charge, the most basic extra person fee, added on top of the base room rate.
Others: To be supplemented.
Rules
ExtraPersonCountExtra person count.
IncludedMealCountIncluded meal count.
AdjustTypeAdjust type.
ABS: Absolute value — the corresponding amounts are summed directly.
Others: To be supplemented.
AmountWhen 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
        }
    ]
}
NameDescription
PropertyIDDida Hotel ID, required in Dida static source mode (when using the Product Pull API)
HotelCodeSupplier Hotel Code, required in supplier static source mode (when using the Product Push mode)
InventoryListInventory update list
RoomTypeIDRoom Type ID, required in Dida static source mode (when using the Product Pull API)
RoomTypeCodeYOUR_ROOMTYPE_CODE
Supplier Room Type Code, required in supplier static source mode (when using the Product Push mode)
StayDateDate: YYYY-MM-DD
InventoryInventory
StatusStatus:
0: InActive
1: Active
RateListPrice update list
RatePlanIDRate Plan ID, required in Dida static source mode (when using the Product Pull API)
RatePlanCodeYOUR_RatePlan_CODE
Supplier Rate Plan Code, required in supplier static source mode (when using the Product Push mode)
StayDateDate: YYYY-MM-DD
PricePrice (PDP price setting, two decimal places)
CurrencyCurrency
StatusStatus:
0: InActive
1: Active
MinLOSMinimum stay
null: No restriction
MaxLOSMaximum stay
null: No restriction
CTACloseToArrive
True: Arrival not allowed
False: Arrival allowed
null: No restriction
CTDCloseToDepart
True: Departure not allowed
False: Departure allowed
null: No restriction
CuttoffDaysAdvance booking days
  • null: No restriction
  • This setting takes priority over the rate-plan (RP) level setting.
OBPPricesOBP price setting list
  • Total price = Adult price + Child price
OccupancyOccupancy, the number of guests
PricePrice
StatusStatus:
0: InActive
1: Active
Type"Adult"
"Child"

Response:

{
    "code": 200,
    "message": "success"
}

Failed Response Example:

{
    "code": 400,
    "message": "Property not found."
}
NameDescription
code200: ok
401: Incorrect account or password
400: Invalid Parameters
500: Service unavailable
messagesuccess: Update successful
fail: Update failed
🦊
Cancellation Policy, Hotel Policies, Service/Additional Fees and Taxes are not supported by SiteConnect Inventory and Rate API. These policies and fees/taxes should be configured internally within Dida extranet.

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"
    }
}
NameDescription
ClientIDAlways: DidaTravel
UserNameDidaUserName, provided by Dida, must be validated
PasswordDidaPassword, provided by Dida, must be validated
BookingIDDIDA unique Booking ID (used to detect duplicates)
StatusBooking status:
  • New: new booking
  • Cancel: cancellation
  • Modify: modification
PropertyIDHotel ID
RoomTypeIDRoom Type ID
RatePlanIDRate Plan ID
HotelCodeYOUR_HOTEL_CODE
RoomTypeCodeYOUR_ROOMTYPE_CODE
RatePlanCodeYOUR_RatePlan_CODE
PropertyNameHotel name
RoomTypeNameRoom type name
RatePlanNameRate plan name
MealTypeIDMeal type ID (see meal & bedding code specification)
MealTypeNameMeal type name
BedTypeIDBed type ID (see meal & bedding code specification)
BedTypeNameBed type name
CheckInDateCheck-in date
CheckOutDateCheck-out date
RoomCountNumber of rooms
PaymentInfoPayment information (if applicable)
CardNumberCard number
CardHolderNameCardholder name
CVCCVC (may be empty)
ActiveFromDateEffective date
ExpireDateExpiry date
GuestInfoListGuest information list
RoomNumRoom number
GuestFirstNameGuest first name
GuestLastNameGuest last name
AgeAge
IsAdultAdult or not
PriceInfoListPrice information list
RoomNumRoom number
AdultCountAdult count
ChildCountChild count
TotalPriceTotal room price
CurrencyCurrency
DailyRateListDaily price list
PricePrice
StayDateDate
ContactDida contact information
FirstNameDida
LastNameTravel
EmailDida contact email
PhoneDida contact phone number
AddressDida contact address

Response:

{
    "Success": true,
    "Msg": "Success",
    "BookingID": "DEB12345678",
    "ConfirmationCode": "123456"
}
NameDescription
Successtrue: booking successful
false: booking failed
MsgSuccess or error message
BookingIDDIDA unique Booking ID
ConfirmationCodeHotel 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
}
NameDescription
ClientIDAlways: DidaTravel
UserNameDidaUserName, provided by Dida, must be validated
PasswordDidaPassword, provided by Dida, must be validated
BookingIDDIDA unique Booking ID
StatusBooking status:
New: new booking
Cancel: cancellation
Modify: modification
Always Cancel
PropertyIDHotel ID
RoomTypeIDRoom Type ID
RatePlanIDRate Plan ID
HotelCodeYOUR_HOTEL_CODE
RoomTypeCodeYOUR_ROOMTYPE_CODE
RatePlanCodeYOUR_RatePlan_CODE
CheckInDateCheck-in date
CheckOutDateCheck-out date
RoomCountNumber of rooms

Response:

{
    "Success": true,
    "Msg": "Success"
}
NameDescription
Successtrue: Cancellation successful
false: Cancellation failed
MsgSuccess 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

NameDescription
BookingIDBooking ID
OrderDateStartBooking date range start (YYYY-MM-DD)
OrderDateEndBooking date range end (inclusive) (YYYY-MM-DD)
StayDateStartStay date range start (YYYY-MM-DD)
StayDateEndStay date range end (inclusive) (YYYY-MM-DD)
⚠️
Notes:
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

NameDescription
BookingIDBooking ID provided by DIDA when creating the reservation
StatusBooking status:
Confirmed = 1
Cancelled = 2
Rejected = 3
MsgAdditional information

Request:

{
    "BookingID": "DEB241217201xxxxx",
    "Status": 1,
    "Msg": "\u786e\u8ba4\u6210\u529f"
}

Response:

{
    "Success": true,
    "Msg": "Success"
}
NameDescription
Successtrue: processed successfully
false: failed to process
CodeStatus codes:
200: Confirmation successful
201: Booking already confirmed
400: Booking has been cancelled
401: Booking status abnormal
404: Booking not found
500: System error
MsgConfirmation result message

Update Hotel Confirmation Code API

API Endpoint: {{BaseUrl}}/api/v1/Booking/UpdateConfirmationCode

NameDescription
BookingIDBooking ID provided by DIDA when creating the reservation
ConfirmationCodeHotel confirmation code

Request:

{
    "BookingID": "DEB241217201xxxxx",
    "ConfirmationCode": "123456"
}

Response:

{
    "Success": true,
    "Msg": "Success",
    "Code": 200
}
NameDescription
Successtrue: processed successfully
false: failed to process
CodeStatus codes:
200: Confirmation successful
201: Confirmation code already exists
400: Parameter error
401: Booking already cancelled
404: Booking not found
500: System error
MsgConfirmation result message

Appendix

Meal Type Code Specification

CodeMeal Type
0Room Only
1Breakfast Included
2Half-Board
3Full-Board
4All Inclusive
5Dinner
6BreakfastAndDinner
7BreakfastAndLunch
8PKG (Room & Ticket)
9Lunch
10Lunch And Dinner
11Suhur
12Iftar
13Suhur And Iftar
14Suhur or Iftar

Main Bed Type Code Specification

CodeBed Type
11 Single
21 Double
31 Twin
43 Single
51 Double 1 Single
62 Double
71 Double 1 Twin
82 Twin
91 Double or 1 Twin
101 Double 1 Sofa
111 Single 1 Sofa
142 Single 1 Sofa
153 Single 1 Sofa
164 Single 1 Sofa
172 Double 1 Sofa
181 Double 2 Sofa
211 Double 1 Single 1 Sofa
221 Double 2 Single 1 Sofa
231 Double 2 Single 1 Double-Sofa
241 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": []
    }
  ]
}