BonusLink Travel API Documentation
VERSION 1.0
February 2026
Change Log
| Version | Date | Changes |
|---|---|---|
| 1.0 | Feb 2026 | Initial API documentation for BonusLink Travel integration |
Table of Contents
- Introduction
- API Workflow
- API Specification
- Authentication API
- 4.1 Request Parameters
- 4.2 Request Sample
- 4.3 Response Parameters
- 4.4 Success Response Sample
- 4.5 Token Usage
- 4.6 Token Expiration
- Booking Retrieval API
- 5.1 Request Parameters
- 5.2 Request Sample
- 5.3 Response Parameters
- 5.4 Response Sample
- 5.5 Booking Object Structure
- 5.6 Contact Object
- 5.7 Payment Object
- 5.8 Traveler Object
- 5.9 Product Object
- 5.10 Price Object
- Booking Products API
- 6.1 Request Headers
- 6.2 Request Parameters
- 6.3 Request Sample
- 6.4 Response Parameters
- 6.5 Product Data Object (Hotel)
- 6.6 Room Object
- 6.7 Room Rate Object
- 6.8 Cancellation Object
- 6.9 Product Type Object
- 6.10 Currency Info Object
- 6.11 Price Info Object
- 6.12 Reward Info Object
- 6.13 Response Sample
- Status Codes
- 7.1 Booking Status
- 7.2 Product Status
- 7.3 Payment Status
- 7.4 Payment Line Status
- Error Codes
<a id="1-introduction"></a>
1. Introduction
This document provides guidance for integrating with the BonusLink Travel API system. The API provides authentication and booking retrieval capabilities for hotel bookings.
Key Features:
- JWT-based authentication with agent scope
- Comprehensive hotel booking retrieval with payment details
- Support for multi-traveler hotel bookings
- Detailed payment transaction information with WowPay gateway integration
- Hotel-specific pricing breakdown and voucher status tracking
<a id="2-api-workflow"></a>
2. API Workflow
<a id="21-complete-booking-retrieval-sequence"></a>
2.1 Complete Booking Retrieval Sequence
<a id="3-api-specification"></a>
3. API Specification
- Protocol: HTTPS only
- Encoding: UTF-8
- Content-Type: application/json
- Authentication: Bearer token in Authorization header
- Base URL:
https://booking.travel.bonuslink.com.my
<a id="authentication-header"></a>
Authentication Header
Authorization: Bearer {access_token}
<a id="error-response-format"></a>
Error Response Format
{
"error": "ErrorCode",
"message": "Human readable error message",
"meta": {
"additional_info": "value"
}
}
<a id="4-authentication-api"></a>
4. Authentication API
Endpoint: POST /v2/auth
This endpoint authenticates an agent user and returns a JWT access token for subsequent API requests.
<a id="41-request-parameters"></a>
4.1 Request Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| string | Yes | Agent email address | |
| password | string | Yes | Agent password |
| flow_type | string | Yes | Authentication flow type (e.g., "Basic") |
| scope_type | string | Yes | Access scope type (e.g., "Agent") |
<a id="42-request-sample"></a>
4.2 Request Sample
{
"email": "agent@example.com",
"password": "your_secure_password",
"flow_type": "Basic",
"scope_type": "Agent"
}
<a id="43-response-parameters"></a>
4.3 Response Parameters
| Parameter | Type | Description |
|---|---|---|
| exp | integer | Token expiration timestamp (Unix timestamp) |
| account_id | string | Agent account identifier (UUID) |
| string | Agent email address | |
| access_token | string | JWT token for API authentication |
<a id="44-success-response-sample"></a>
4.4 Success Response Sample
{
"exp": 1752503790,
"account_id": "2463c7d1-316f-452e-a903-0dc5038c9d0f",
"email": "agent@example.com",
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE3NTI1MDM3OTAsInJlZnJlc2hfdG9rZW4iOiIyNDYzYzdkMS0zMTZmLTQ1MmUtYTkwMy0wZGM1MDM4YzlkMGYiLCJhY2NvdW50X2lkIjoiMjQ2M2M3ZDEtMzE2Zi00NTJlLWE5MDMtMGRjNTAzOGM5ZDBmIn0..."
}
<a id="45-token-usage"></a>
4.5 Token Usage
Include the access_token in the Authorization header for all subsequent API requests:
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...
<a id="46-token-expiration"></a>
4.6 Token Expiration
- The token expires at the Unix timestamp specified in the
expfield - Tokens are typically valid for 30 days from issuance
- When a token expires, you must authenticate again to obtain a new token
- Monitor the
exptimestamp and refresh before expiration to avoid service interruption
<a id="5-booking-retrieval-api"></a>
5. Booking Retrieval API
Endpoint: GET /booking
This endpoint retrieves complete booking details including contact information, payment status, travelers, products, and pricing.
<a id="51-request-parameters"></a>
5.1 Request Parameters (Query String)
| Parameter | Type | Required | Description |
|---|---|---|---|
| booking_code | string | Yes | Unique booking confirmation code |
<a id="52-request-sample"></a>
5.2 Request Sample
GET /booking?booking_code=DEMOP010156
Authorization: Bearer {access_token}
<a id="53-response-parameters"></a>
5.3 Response Parameters
| Parameter | Type | Description |
|---|---|---|
| id | string | Booking UUID |
| created_at | string | Booking creation timestamp (ISO 8601) |
| updated_at | string | Last update timestamp (ISO 8601) |
| deleted | boolean | Deletion status |
| code | string | Booking confirmation code |
| tax_invoice_number | string | Tax invoice number (if applicable) |
| app_id | string | Application identifier (UUID) |
| agent_id | string | Agent identifier (UUID) |
| payment_id | string | Payment transaction identifier (UUID) |
| account_id | string | Account identifier (UUID) |
| customer_id | string | Customer identifier (UUID) |
| shopping_id | string | Shopping session identifier |
| trip_id | string | Trip identifier (UUID) |
| package_id | string | Package identifier (UUID) |
| office_id | string | Office identifier (UUID) |
| flight_campaign_id | string | Flight campaign identifier (UUID) |
| currency_code | string | Currency code (e.g., "USD", "MYR") |
| language_code | string | Language code (e.g., "en-US") |
| promotion_code | string | Promotion code applied |
| partner_id | string | Partner identifier (UUID) |
| status | string | Booking status (success, pending, failed, cancelled) |
| number | integer | Booking sequence number |
| total_amount | float | Total booking amount |
| elevy_amount | float | E-levy amount |
| webhook_data | object | Webhook callback data |
| package_search | object | Package search criteria |
| promotion | object | Promotion details |
| group_booking | boolean | Group booking flag |
| group_booking_confirmed | boolean | Group booking confirmation status |
| departure_date | string | Travel departure date (ISO 8601) |
| offline_payment_ref | string | Offline payment reference |
| offline_payment_origin | string | Offline payment origin |
| is_offline_payment | boolean | Offline payment indicator |
| cid | string | Campaign identifier |
| contact | object | Contact person details (see Contact Object) |
| payment | object | Payment transaction details (see Payment Object) |
| json_url | string | JSON booking data URL |
| travel_start_date | string | Travel start date (ISO 8601) |
| travel_end_date | string | Travel end date (ISO 8601) |
| travelers | array | List of travelers (see Traveler Object) |
| products | array | List of booked products (see Product Object) |
| insurance | object | Insurance details |
| prices | array | Pricing breakdown by product (see Price Object) |
<a id="54-response-sample"></a>
5.4 Response Sample
{
"id": "829763bb-950d-44a3-82b7-0c499463fb4f",
"created_at": "2026-01-10T14:31:50.016973+00:00",
"updated_at": "2026-01-10T14:32:40.417212+00:00",
"deleted": false,
"code": "DEMOP010156",
"tax_invoice_number": null,
"app_id": "bbf70af6-4382-4ff8-beb3-b2847f682f34",
"agent_id": null,
"payment_id": "f34b4742-01fd-422b-8f8f-57791da7e44c",
"account_id": "bbfad219-30d7-4b00-bb4e-359fd42dcf43",
"customer_id": null,
"shopping_id": "17b6d15bbf5c4093abca1523ba34e647",
"trip_id": null,
"package_id": "4a5c9770-f901-4b96-8673-ecdc5ee49102",
"office_id": null,
"flight_campaign_id": null,
"currency_code": "USD",
"language_code": "en-US",
"promotion_code": null,
"partner_id": null,
"status": "success",
"number": 10156,
"total_amount": 6727.05,
"elevy_amount": 0.0,
"webhook_data": {},
"package_search": {},
"promotion": null,
"group_booking": false,
"group_booking_confirmed": false,
"departure_date": "2026-02-01T00:00:00+00:00",
"offline_payment_ref": null,
"offline_payment_origin": null,
"is_offline_payment": false,
"cid": "",
"contact": {
"id": "ce70ccc9399a4a68bd29f3649acdc627",
"created_at": "2026-01-10T14:31:50.022467+00:00",
"updated_at": "2026-01-10T14:31:50.022482+00:00",
"deleted": false,
"booking_id": "829763bb-950d-44a3-82b7-0c499463fb4f",
"first_name": "asd",
"last_name": "asd",
"title": "Mr",
"email": "abdelrhman.awaad@gmail.com",
"phone": "+20 12346654",
"city": null,
"country_code": "EG",
"country_name": null,
"address": "cairo",
"postcode": null,
"country": null,
"middle_name": "dsa",
"details": {
"country_code": "EG",
"phone": "+20 12346654",
"address": "cairo",
"last_name": "asd",
"email": "abdelrhman.awaad@gmail.com",
"title": "Mr",
"first_name": "asd",
"middle_name": "dsa"
}
},
"payment": {
"id": "f34b4742-01fd-422b-8f8f-57791da7e44c",
"created_at": "2026-01-10T14:31:50.428441+00:00",
"updated_at": "2026-01-10T14:32:35.410683+00:00",
"deleted": false,
"scope_type": "App",
"account_id": "bbfad219-30d7-4b00-bb4e-359fd42dcf43",
"shopping_id": "17b6d15bbf5c4093abca1523ba34e647",
"promotion_code": null,
"scope_id": "bbf70af6-4382-4ff8-beb3-b2847f682f34",
"transaction_id": "f76021490c6a6fca",
"status": "success",
"method": "wow-pay",
"flow_type": "ProductBooking",
"desc": "Payment for booking: DEMOP010156",
"amount": 6727.05,
"postpaid": false,
"meta": {
"booking_code": "DEMOP010156"
},
"currency_info": {
"origin": "USD",
"conversion": "USD",
"rate": 1.0
},
"client_info": {
"origin": "demo.apps.easygds.com",
"redirect_url": "https://demo.apps.easygds.com/api/payment/callback",
"ip": "156.201.113.66"
},
"contact": {
"country_code": "EG",
"phone_number": "+20 12346654",
"phone": "+20 12346654",
"title": "Mr",
"first_name": "asd",
"address": "cairo",
"last_name": "asd",
"email": "abdelrhman.awaad@gmail.com",
"middle_name": "dsa"
},
"lines": [
{
"id": "f0bd63450e384a31b8464949b38ac104",
"transaction_id": "450516165a075e07",
"status": "success",
"method": "wow-pay",
"amount": 6727.05,
"desc": "Payment for booking: DEMOP010156",
"message": "Payment complete.",
"meta": {
"app_id": "bbf70af6-4382-4ff8-beb3-b2847f682f34",
"switch_id": "cccce8af-f966-49eb-9b62-4080e15e6344",
"wow-pay": {
"response": {
"CARD_HOLDER_NAME": "",
"CURRENCY": "USD",
"PAYMENT_TYPE": "CreditCard",
"PAYMENT_REFERENCE3": "KCA002641",
"PAYMENT_REFERENCE1": "ch_3So3DRCbbjpW3zmI0xCpvpua",
"CARD_TYPE": "Visa",
"PAYMENT_DESCRIPTION": "Payment complete.",
"MERCHANT_ID": "e81932f2-71b7-4e78-96c8-f8cc42f2d6b7",
"ORDERREF": "450516165a075e07",
"PAYMENT_STATUSCODE": "1",
"APPROVAL_CODE": "pi_3So3DRCbbjpW3zmI0JQaGEjs",
"EXPIRY_YEAR": "2026",
"PAYMENT_STATUS": "APPROVED",
"CARD_NUMBER": "401288XXXXXX1881",
"EXPIRY_MONTH": "01",
"PAYMENT_CHANNEL": "Visa",
"AMOUNT": 6727.05
}
}
},
"created_at": "2026-01-10T14:31:50.432182+00:00"
}
]
},
"json_url": "https://core.services.easygds.com/api/bookings/json?token=a0b3445308ac291a02b135e74d7be739302ee1dc14bfdc54eefcc53748b988bb&code=DEMOP010156",
"travel_start_date": "2026-02-01T00:00:00",
"travel_end_date": "2026-02-08T00:00:00",
"travelers": [
{
"id": "a4d2ddac52c947b4a4fb597f53cfbebf",
"created_at": "2026-01-10T14:31:51.203691+00:00",
"updated_at": "2026-01-10T14:31:51.203706+00:00",
"deleted": false,
"booking_id": "829763bb-950d-44a3-82b7-0c499463fb4f",
"details": {
"title": {
"value": "Mr",
"key": "title",
"data_type": "str",
"translation_label": "travelers.title"
},
"birthday": {
"value": "2001-02-03",
"key": "birthday",
"data_type": "date",
"translation_label": "travelers.birthday"
},
"last_name": {
"value": "asd",
"key": "last_name",
"data_type": "str",
"translation_label": "travelers.last_name"
},
"country_code": {
"value": "EG",
"key": "country_code",
"data_type": "str",
"translation_label": "travelers.country_code"
},
"type": {
"value": "adult",
"key": "type",
"data_type": "str",
"translation_label": "travelers.type"
},
"first_name": {
"value": "asd",
"key": "first_name",
"data_type": "str",
"translation_label": "travelers.first_name"
},
"middle_name": {
"value": "dsa",
"key": "middle_name",
"data_type": "str",
"translation_label": "travelers.middle_name"
}
},
"data": {
"title": "Mr",
"birthday": "2001-02-03",
"last_name": "asd",
"country_code": "EG",
"type": "adult",
"first_name": "asd",
"middle_name": "dsa"
}
}
],
"products": [
{
"id": "a2c4bb36-1072-47d8-ad82-5b3b1ffb1a27",
"status": "vouchered",
"product_code": "hotel"
}
],
"insurance": {},
"prices": [
{
"product_code": "hotel",
"total_amount": 6727.05,
"currency_code": "USD",
"scope_type": "BookingProduct"
}
]
}
<a id="55-booking-object-structure"></a>
5.5 Booking Object Structure
The main booking object contains all booking-related information organized into the following sections:
- Booking Metadata: Core booking identifiers and status
- Contact Information: Primary contact person details
- Payment Information: Payment transaction and processing details
- Travelers: List of all travelers in the booking
- Products: Booked travel products (hotels, flights, etc.)
- Pricing: Detailed pricing breakdown by product
<a id="56-contact-object"></a>
5.6 Contact Object
The contact object contains information about the primary contact person for the booking.
| Parameter | Type | Description |
|---|---|---|
| id | string | Contact record identifier |
| created_at | string | Contact creation timestamp (ISO 8601) |
| updated_at | string | Last update timestamp (ISO 8601) |
| deleted | boolean | Deletion status |
| booking_id | string | Associated booking identifier (UUID) |
| first_name | string | Contact first name |
| last_name | string | Contact last name |
| title | string | Contact title (Mr, Ms, Mrs, etc.) |
| string | Contact email address | |
| phone | string | Contact phone number with country code |
| city | string | Contact city |
| country_code | string | Contact country code (ISO 2-letter) |
| country_name | string | Contact country name |
| address | string | Contact address |
| postcode | string | Contact postal code |
| country | string | Contact country |
| middle_name | string | Contact middle name |
| details | object | Nested contact details object |
<a id="57-payment-object"></a>
5.7 Payment Object
The payment object contains comprehensive payment transaction information.
| Parameter | Type | Description |
|---|---|---|
| id | string | Payment record identifier (UUID) |
| created_at | string | Payment creation timestamp (ISO 8601) |
| updated_at | string | Last update timestamp (ISO 8601) |
| deleted | boolean | Deletion status |
| scope_type | string | Payment scope type (App, Agent, etc.) |
| account_id | string | Account identifier (UUID) |
| shopping_id | string | Shopping session identifier |
| promotion_code | string | Applied promotion code |
| scope_id | string | Scope identifier (UUID) |
| transaction_id | string | Unique transaction identifier |
| status | string | Payment status (success, pending, failed) |
| method | string | Payment method (wow-pay, credit-card, etc.) |
| flow_type | string | Payment flow type (ProductBooking, etc.) |
| desc | string | Payment description |
| amount | float | Payment amount |
| postpaid | boolean | Postpaid payment indicator |
| meta | object | Payment metadata including booking code |
| currency_info | object | Currency conversion information |
| client_info | object | Client origin and IP information |
| contact | object | Payment contact information |
| lines | array | Payment transaction lines with detailed gateway response |
Payment Lines Object
Each payment line represents a payment transaction attempt.
| Parameter | Type | Description |
|---|---|---|
| id | string | Payment line identifier |
| transaction_id | string | Transaction identifier |
| status | string | Transaction status (success, failed) |
| method | string | Payment method used |
| amount | float | Transaction amount |
| desc | string | Transaction description |
| message | string | Transaction status message |
| meta | object | Detailed payment gateway response |
| created_at | string | Transaction creation timestamp |
<a id="58-traveler-object"></a>
5.8 Traveler Object
The traveler object contains information about each traveler in the booking.
| Parameter | Type | Description |
|---|---|---|
| id | string | Traveler record identifier |
| created_at | string | Traveler record creation timestamp (ISO 8601) |
| updated_at | string | Last update timestamp (ISO 8601) |
| deleted | boolean | Deletion status |
| booking_id | string | Associated booking identifier (UUID) |
| details | object | Detailed traveler attributes with metadata |
| data | object | Simplified traveler data object |
Traveler Details Structure
The details object contains structured traveler attributes:
| Attribute | Type | Description |
|---|---|---|
| title | object | Traveler title (value, key, data_type, translation_label) |
| birthday | object | Traveler date of birth (value, key, data_type, translation_label) |
| first_name | object | Traveler first name (value, key, data_type, translation_label) |
| last_name | object | Traveler last name (value, key, data_type, translation_label) |
| middle_name | object | Traveler middle name (value, key, data_type, translation_label) |
| country_code | object | Traveler country code (value, key, data_type, translation_label) |
| type | object | Traveler type: adult, child, infant (value, key, data_type, translation_label) |
Traveler Data Structure
The data object contains simplified traveler information:
| Parameter | Type | Description |
|---|---|---|
| title | string | Traveler title |
| birthday | string | Date of birth (YYYY-MM-DD) |
| first_name | string | First name |
| last_name | string | Last name |
| middle_name | string | Middle name |
| country_code | string | Country code (ISO 2-letter) |
| type | string | Traveler type (adult, child, infant) |
<a id="59-product-object"></a>
5.9 Product Object
The product object represents a booked hotel product.
| Parameter | Type | Description |
|---|---|---|
| id | string | Product record identifier (UUID) |
| status | string | Hotel product status (see Product Status for all possible values) |
| product_code | string | Product type code (currently only "hotel" is supported) |
Note: This API currently supports hotel bookings only. For detailed information on all hotel product status values and their meanings, see Section 7.2 - Product Status (Hotel Only).
<a id="510-price-object"></a>
5.10 Price Object
The price object provides pricing breakdown by hotel product.
| Parameter | Type | Description |
|---|---|---|
| product_code | string | Product type code (currently only "hotel") |
| total_amount | float | Total amount for the hotel booking |
| currency_code | string | Currency code (e.g., "USD", "MYR") |
| scope_type | string | Pricing scope type (typically "BookingProduct") |
6. Booking Products API
Endpoint: GET /bookings/products
This endpoint retrieves detailed product information for a specific booking, including hotel booking data, supplier details, voucher information, and room-level pricing breakdown.
6.1 Request Headers
| Header | Required | Description |
|---|---|---|
| Authorization | Yes | Bearer token obtained from Authentication API. Format: Bearer {access_token} |
6.2 Request Parameters (Query String)
| Parameter | Type | Required | Description |
|---|---|---|---|
| booking_code | string | Yes | Unique booking confirmation code |
6.3 Request Sample
GET /bookings/products?booking_code=BL100022
Authorization: Bearer {access_token}
6.4 Response Parameters
The response contains a total count and a result array of booking product objects.
| Parameter | Type | Description |
|---|---|---|
| total | integer | Total number of booking products |
| result | array | List of booking product objects |
Booking Product Object
| Parameter | Type | Description |
|---|---|---|
| id | string | Booking product identifier (UUID) |
| created_at | string | Product creation timestamp (ISO 8601) |
| updated_at | string | Last update timestamp (ISO 8601) |
| deleted | boolean | Deletion status |
| booking_id | string | Associated booking identifier (UUID) |
| package_id | string | Package identifier (UUID, nullable) |
| product_id | string | Product definition identifier |
| product_ref | string | Product reference identifier |
| shopping_id | string | Shopping session identifier |
| shopping_item_id | string | Shopping item identifier |
| status | string | Product status (see Product Status for all possible values) |
| free_cancellation_deadline | string | Free cancellation deadline (ISO 8601, nullable) |
| free_cancellation | boolean | Whether free cancellation is currently available |
| data | object | Detailed hotel product data (see Section 6.5 Product Data Object) |
| currency_info | object | Currency conversion information (see Section 6.10 Currency Info Object) |
| product | object | Product type metadata (see Section 6.9 Product Type Object) |
| pdf_url | string | URL to download the booking voucher PDF |
| error_message | string | Error message if booking failed (nullable) |
| search | object | Original search parameters and metadata |
| logs | array | Product processing log entries |
6.5 Product Data Object (Hotel)
The data object contains comprehensive hotel booking details including supplier information, room details, pricing, and hotel content.
| Parameter | Type | Description |
|---|---|---|
| source_id | string | Supplier source identifier |
| contract_id | string | Hotel contract identifier |
| hotel_id | string | Hotel identifier in supplier system |
| easygds_id | string | EasyGDS internal hotel identifier |
| eps_id | string | Expedia property system identifier |
| supplier_code | string | Supplier code (e.g., "APItude", "HMS") |
| supplier_source | string | Supplier data source identifier |
| currency | string | Supplier pricing currency code |
| is_client | boolean | Whether this is a client-contracted rate |
| is_has_refundable_rooms | boolean | Whether refundable rooms are available |
| name | string | Hotel name |
| street_address | string | Hotel full street address |
| type | string | Product type (e.g., "hotel") |
| star | float | Hotel star rating |
| phone | string | Hotel phone number |
| room_count | integer | Number of rooms booked |
| pax_count | integer | Number of guests |
| night_count | integer | Number of nights |
| checkin_date | string | Check-in date (ISO 8601) |
| checkout_date | string | Check-out date (ISO 8601) |
| checkin_time | string | Check-in time |
| checkout_time | string | Check-out time |
| rooms | array | List of room objects (see Section 6.6 Room Object) |
| selected_rooms | array | List of selected/booked room objects with booking references |
| free_cancellation | boolean | Whether free cancellation is available |
| free_cancellation_deadline | string | Free cancellation deadline (ISO 8601, nullable) |
| cancellation_deadline | string | Cancellation deadline (ISO 8601, nullable) |
| price_info | object | Aggregated price information (see Section 6.11 Price Info Object) |
| prices | array | Price breakdown by level |
| reward_info | object | Reward/loyalty points information (see Section 6.12 Reward Info Object) |
| currency_info | object | Currency conversion information |
| search_id | string | Original search session identifier |
| package_id | string | Package identifier (nullable) |
| location | object | Hotel location with GPS coordinates |
| avatar | object | Hotel thumbnail image URLs (sm, md, lg) |
| ratings | object | Hotel ratings from various sources (expedia, liteapi, tripadvisor) |
| contents | object | Hotel content details (descriptions, amenities, policies, fees) |
| booking_ref | string | Supplier booking reference number |
| country_code | string | Booking country code (ISO 2-letter) |
6.6 Room Object
Each room object within the rooms array contains details about a booked room.
| Parameter | Type | Description |
|---|---|---|
| idx | integer | Room index (1-based) |
| room_name | string | Room type display name |
| room_type_id | string | Room type identifier |
| name | string | Room name (mapped) |
| supplier_room_name | string | Original room name from supplier |
| easygds_id | string | EasyGDS room identifier |
| source_id | string | Source identifier |
| supplier_code | string | Supplier code |
| hotel_id | string | Hotel identifier |
| hotel_easygds_id | string | Hotel EasyGDS identifier |
| free_cancellation | boolean | Whether free cancellation is available for this room |
| cancellation_deadline | string | Room cancellation deadline (ISO 8601, nullable) |
| supplier_cancellation_deadline | string | Supplier cancellation deadline (ISO 8601) |
| cancellation_buffer | integer | Cancellation buffer in hours |
| images | array | Room image URLs |
| contents | object | Room description content |
| area | object | Room area (square_meters, square_feet) |
| occupancy | object | Room occupancy limits (adults, children, infants) |
| beds | object | Bed configuration (nullable) |
| attribute_ids | array | Room amenity/attribute identifiers |
| rate | object | Room rate details (see Section 6.7 Room Rate Object) |
| rates | array | Rate breakdown array |
| remainings | integer | Number of remaining rooms available |
| prebook_map_id | string | Pre-booking mapping identifier |
6.7 Room Rate Object
The rate object within each room contains detailed pricing and cancellation policy.
| Parameter | Type | Description |
|---|---|---|
| base_price | float | Base room price in supplier currency |
| net_price | float | Net price |
| gross_price | float | Gross price |
| price | float | Final price in supplier currency |
| tax | integer | Tax amount |
| currency | string | Rate currency code |
| board_basis | string | Board basis / meal plan description (e.g., "Room Only") |
| board_code | string | Board basis code (e.g., "RO") |
| board_basis_code | string | Normalized board basis code (e.g., "room-only") |
| non_refundable | boolean | Whether the rate is non-refundable |
| free_cancellation | boolean | Whether free cancellation applies |
| free_cancellation_deadline | string | Free cancellation deadline |
| cancellations | array | Cancellation policy periods with penalty amounts (see Section 6.8 Cancellation Object) |
| price_info | object | Price breakdown (see Section 6.11 Price Info Object) |
| currency_info | object | Currency conversion details |
| prices | array | Multi-level price breakdown |
| reward_info | object | Reward points information |
| remainings | integer | Remaining rooms at this rate |
| room_name | string | Room type name |
| room_type_id | string | Room type identifier |
| remarks | array | Special remarks or notes |
6.8 Cancellation Object
The cancellations array defines time-based cancellation penalty periods. Each period specifies a date range and the penalty amount charged if the booking is cancelled within that period. Periods are ordered chronologically.
| Parameter | Type | Description |
|---|---|---|
| from | string | Period start date (ISO 8601) |
| to | string | Period end date (ISO 8601) |
| utc_from | string | Period start date in UTC (ISO 8601) |
| utc_to | string | Period end date in UTC (ISO 8601) |
| amount | float | Cancellation penalty amount in supplier currency |
| price_info | object | Penalty price breakdown (see Section 6.11 Price Info Object) |
| currency_info | object | Currency conversion details (see Section 6.10 Currency Info Object) |
| prices | array | Multi-level penalty price breakdown |
| base_amount | float | Penalty base amount in converted currency |
| markup_amount | float | Penalty markup amount |
| discount_amount | float | Penalty discount amount |
| tax_amount | float | Penalty tax amount |
| vat_amount | float | Penalty VAT amount |
| total_amount | float | Penalty total amount in converted currency |
| supplier_base_amount | float | Penalty amount in supplier currency |
| supplier_total_amount | float | Penalty total in supplier currency |
Cancellation Policy Example:
The following example shows a 3-period cancellation policy:
| Period | Date Range | Penalty | Description |
|---|---|---|---|
| 1 | 2026-03-03 → 2026-03-25 14:58 | 0.00 MYR | Free cancellation period |
| 2 | 2026-03-25 14:58 → 2026-03-26 14:58 | 206.82 MYR | Partial penalty (1 night charge) |
| 3 | 2026-03-26 14:59 → 2026-03-26 23:59 | 1,034.16 MYR | Full penalty (no refund) |
Cancellation Sample:
{
"cancellations": [
{
"from": "2026-03-03T05:48:23.437431",
"to": "2026-03-25T14:58:00",
"amount": 0,
"utc_from": "2026-03-03T00:00:00",
"utc_to": "2026-03-25T14:58:00",
"price_info": {
"base_amount": 0.0,
"markup_amount": 0,
"tax_amount": 0,
"vat_amount": 0,
"discount_amount": 0,
"total_amount": 0.0,
"supplier_base_amount": 0,
"supplier_total_amount": 0
},
"currency_info": {
"rate": 3.1798671043,
"conversion": "MYR",
"original": "SGD",
"rounding": 2
},
"base_amount": 0.0,
"total_amount": 0.0,
"supplier_base_amount": 0,
"supplier_total_amount": 0
},
{
"from": "2026-03-25T14:58:00",
"to": "2026-03-26T14:58:00",
"amount": 65.04,
"utc_from": "2026-03-25T14:59:00",
"utc_to": "2026-03-26T14:58:00",
"price_info": {
"base_amount": 206.82,
"markup_amount": 0,
"tax_amount": 0,
"vat_amount": 0,
"discount_amount": 0,
"total_amount": 206.82,
"supplier_base_amount": 65.04,
"supplier_total_amount": 65.04
},
"currency_info": {
"rate": 3.1798671043,
"conversion": "MYR",
"original": "SGD",
"rounding": 2
},
"base_amount": 206.82,
"total_amount": 206.82,
"supplier_base_amount": 65.04,
"supplier_total_amount": 65.04
},
{
"from": "2026-03-26T14:59:00",
"to": "2026-03-26T23:59:00",
"amount": 325.22,
"utc_from": "2026-03-26T14:59:00",
"utc_to": "2026-03-26T23:59:00",
"price_info": {
"base_amount": 1034.16,
"markup_amount": 0,
"tax_amount": 0,
"vat_amount": 0,
"discount_amount": 0,
"total_amount": 1034.16,
"supplier_base_amount": 325.22,
"supplier_total_amount": 325.22
},
"currency_info": {
"rate": 3.1798671043,
"conversion": "MYR",
"original": "SGD",
"rounding": 2
},
"base_amount": 1034.16,
"total_amount": 1034.16,
"supplier_base_amount": 325.22,
"supplier_total_amount": 325.22
}
]
}
6.9 Product Type Object
| Parameter | Type | Description |
|---|---|---|
| id | string | Product type identifier |
| code | string | Product code (e.g., "hotel") |
| name | string | Product display name (e.g., "Hotel") |
| icon | string | Product icon identifier |
6.10 Currency Info Object
| Parameter | Type | Description |
|---|---|---|
| rate | float | Exchange rate |
| conversion | string | Target currency code (e.g., "MYR") |
| original | string | Source currency code (e.g., "SGD") |
| rounding | integer | Decimal rounding precision |
6.11 Price Info Object
| Parameter | Type | Description |
|---|---|---|
| base_amount | float | Base price amount |
| markup_amount | float | Markup amount applied |
| tax_amount | float | Tax amount |
| vat_amount | float | VAT amount |
| discount_amount | float | Discount amount |
| total_amount | float | Total amount after all adjustments |
| supplier_base_amount | float | Original supplier base amount |
| supplier_total_amount | float | Original supplier total amount |
| reward_points | float | Reward points earned (if applicable) |
| old_amount | float | Original amount before promotions (if applicable) |
6.12 Reward Info Object
| Parameter | Type | Description |
|---|---|---|
| reward_points | float | Total reward points earned |
| rate | float | Points conversion rate |
| currency_code | string | Currency code for points calculation |
| conversion_id | string | Conversion rule identifier (nullable) |
| is_enabled | boolean | Whether rewards are enabled for this booking |
6.13 Response Sample
{
"total": 1,
"result": [
{
"id": "d35036d1-1c44-4120-a6ca-36f1e39bc3c7",
"created_at": "2026-03-03T05:49:49.925846+00:00",
"updated_at": "2026-03-03T05:51:32.000741+00:00",
"deleted": false,
"booking_id": "82bd719f-99e4-4648-a304-ef4623cfe86b",
"package_id": null,
"product_id": "f20072987bfa43bfab8d60f584dbb5ea",
"product_ref": "18997",
"shopping_id": "e0381ba558704f7fa5d3d4713178d03e",
"shopping_item_id": "70a2299335644efa9462080f32b65115",
"status": "vouchered",
"free_cancellation_deadline": "2026-03-25T14:58:00+00:00",
"free_cancellation": true,
"data": {
"source_id": "apyacwgpawq",
"contract_id": "166",
"hotel_id": "109794",
"easygds_id": "18997",
"eps_id": "18997",
"is_has_refundable_rooms": true,
"supplier_code": "APItude",
"supplier_source": "APItude",
"currency": "SGD",
"is_client": false,
"name": "Shinagawa Prince Hotel",
"street_address": "4-10-30 Takanawa Minato-ku, Tokyo, Tokyo-to, 108-8611, JP",
"type": "hotel",
"star": 4.0,
"phone": "81-3-3440-1111",
"room_count": 1,
"pax_count": 2,
"night_count": 1,
"checkin_date": "2026-03-27T00:00:00",
"checkout_date": "2026-03-28T00:00:00",
"checkin_time": "midnight",
"checkout_time": "11:00 AM",
"free_cancellation": true,
"free_cancellation_deadline": "2026-03-25T14:58:00",
"cancellation_deadline": "2026-03-25T14:58:00",
"country_code": "MY",
"booking_ref": "gq-x102v0uezhfcv8z",
"rooms": [
{
"idx": 1,
"room_name": "Main Tower Twin Room (6th–16th Floors) Non-Smoking",
"room_type_id": "TWN.C2-2",
"name": "16th floor Twin Main tower",
"supplier_room_name": "Main Tower Twin Room (6th–16th Floors) Non-Smoking",
"easygds_id": "6e7f65703b104cd09dd4abf333ad7ff3",
"free_cancellation": true,
"cancellation_deadline": "2026-03-25T14:58:00",
"supplier_cancellation_deadline": "2026-03-25T14:58:00",
"cancellation_buffer": 0,
"source_id": "apyacwgpawq",
"supplier_code": "APItude",
"hotel_id": "109794",
"hotel_easygds_id": "18997",
"images": [],
"contents": {
"description": "Rooms come with a fridge and an en suite bathroom with a bathtub and shower. Free toiletries and a hairdryer are provided. Guests will also find a personal locker in the room."
},
"area": {
"square_meters": 21,
"square_feet": null
},
"occupancy": {
"adults": 2,
"children": 2,
"infants": null
},
"beds": null,
"remainings": 19,
"rate": {
"base_price": 292.7,
"board_basis": "Room Only",
"board_code": "RO",
"currency": "SGD",
"gross_price": 292.7,
"net_price": 292.7,
"price": 292.7,
"tax": 0,
"non_refundable": false,
"free_cancellation": true,
"free_cancellation_deadline": "2026-03-25 14:58",
"board_basis_code": "room-only",
"cancellations": [
{
"from": "2026-03-03T05:48:23.437431",
"to": "2026-03-25T14:58:00",
"amount": 0,
"utc_from": "2026-03-03T00:00:00",
"utc_to": "2026-03-25T14:58:00",
"price_info": {
"markup_amount": 0,
"discount_amount": 0,
"base_amount": 0.0,
"tax_amount": 0,
"vat_amount": 0,
"total_amount": 0.0,
"supplier_base_amount": 0,
"supplier_total_amount": 0
},
"currency_info": {
"rate": 3.1798671043,
"conversion": "MYR",
"original": "SGD",
"rounding": 2
},
"base_amount": 0.0,
"total_amount": 0.0,
"supplier_base_amount": 0,
"supplier_total_amount": 0
},
{
"from": "2026-03-25T14:58:00",
"to": "2026-03-26T14:58:00",
"amount": 65.04,
"utc_from": "2026-03-25T14:59:00",
"utc_to": "2026-03-26T14:58:00",
"price_info": {
"markup_amount": 0,
"discount_amount": 0,
"base_amount": 206.82,
"tax_amount": 0,
"vat_amount": 0,
"total_amount": 206.82,
"supplier_base_amount": 65.04,
"supplier_total_amount": 65.04
},
"currency_info": {
"rate": 3.1798671043,
"conversion": "MYR",
"original": "SGD",
"rounding": 2
},
"base_amount": 206.82,
"total_amount": 206.82,
"supplier_base_amount": 65.04,
"supplier_total_amount": 65.04
},
{
"from": "2026-03-26T14:59:00",
"to": "2026-03-26T23:59:00",
"amount": 325.22,
"utc_from": "2026-03-26T14:59:00",
"utc_to": "2026-03-26T23:59:00",
"price_info": {
"markup_amount": 0,
"discount_amount": 0,
"base_amount": 1034.16,
"tax_amount": 0,
"vat_amount": 0,
"total_amount": 1034.16,
"supplier_base_amount": 325.22,
"supplier_total_amount": 325.22
},
"currency_info": {
"rate": 3.1798671043,
"conversion": "MYR",
"original": "SGD",
"rounding": 2
},
"base_amount": 1034.16,
"total_amount": 1034.16,
"supplier_base_amount": 325.22,
"supplier_total_amount": 325.22
}
],
"price_info": {
"markup_amount": 0,
"discount_amount": 0,
"base_amount": 930.75,
"tax_amount": 0,
"vat_amount": 0,
"total_amount": 930.75,
"supplier_base_amount": 292.7,
"supplier_total_amount": 292.7,
"reward_points": 9308.0
},
"currency_info": {
"rate": 3.1798671043,
"conversion": "MYR",
"original": "SGD",
"rounding": 2
},
"reward_info": {
"reward_points": 9308.0,
"rate": 10.0,
"currency_code": "MYR",
"conversion_id": null,
"is_enabled": true
},
"remainings": 19,
"room_name": "Main Tower Twin Room (6th–16th Floors) Non-Smoking",
"room_type_id": "TWN.C2-2",
"remarks": [
"Accommodation tax (100 - 200 yen per person per night) will be separately collected at the hotel from Oct 1st, 2021. . Check-in hour 15:00-00:00.Car park YES (With additional debit notes).Check-out hour -11:00.Identification card at arrival.Single-Use Plastic Free."
]
}
}
],
"price_info": {
"base_amount": 930.75,
"markup_amount": 0,
"tax_amount": 0,
"vat_amount": 0,
"discount_amount": 0,
"total_amount": 930.75,
"supplier_base_amount": 292.7,
"supplier_total_amount": 292.7,
"reward_points": 9308.0,
"old_amount": 930.75
},
"reward_info": {
"reward_points": 9308.0,
"rate": 10.0,
"currency_code": "MYR",
"conversion_id": null,
"is_enabled": true
},
"currency_info": {
"rate": 3.1798671043,
"conversion": "MYR",
"original": "SGD",
"rounding": 2
},
"location": {
"point": {
"type": "Point",
"coordinates": [
139.73671,
35.62796
]
},
"country_code": "JP",
"city_codes": [
"TYO"
],
"city_code": "TYO"
},
"avatar": {
"caption": null,
"id": null,
"urls": {
"sm": "https://i.travelapi.com/lodging/1000000/20000/19000/18997/f43980b3_t.jpg",
"md": "https://i.travelapi.com/lodging/1000000/20000/19000/18997/f43980b3_b.jpg",
"lg": "https://i.travelapi.com/lodging/1000000/20000/19000/18997/f43980b3_z.jpg"
},
"file_ids": null,
"sm": "https://i.travelapi.com/lodging/1000000/20000/19000/18997/f43980b3_t.jpg",
"md": "https://i.travelapi.com/lodging/1000000/20000/19000/18997/f43980b3_b.jpg",
"lg": "https://i.travelapi.com/lodging/1000000/20000/19000/18997/f43980b3_z.jpg"
},
"ratings": {
"tripadvisor": null,
"liteapi": {
"count": 9664,
"overall": 3.95
},
"expedia": {
"count": 3544,
"overall": 4.2,
"cleanliness": 4.3,
"service": 4.3,
"comfort": 4.1,
"condition": 4.0,
"amenities": 4.1
}
},
"search_id": "80755bf5f3d4458202e6c6545d1e0510",
"package_id": null
},
"currency_info": {
"rate": 3.1798671043,
"conversion": "MYR",
"original": "SGD",
"rounding": 2
},
"product": {
"id": "f20072987bfa43bfab8d60f584dbb5ea",
"code": "hotel",
"name": "Hotel",
"icon": "hotel"
},
"pdf_url": "https://core.stg-services.easygds.com/api/bookings/products/pdf?bp_id=d35036d1-1c44-4120-a6ca-36f1e39bc3c7&token=ecbdc0c7d1b7a3584bdf576e2d18832514baf84dcf5698748583344cebb50731",
"error_message": null,
"search": {
"id": "80755bf5f3d4458202e6c6545d1e0510",
"trip_id": null,
"package_id": null,
"product_code": "hotel",
"progress": 1
}
}
]
}
Note: The response sample above is trimmed for readability. The actual response may contain additional fields such as selected_rooms (rooms with booking reference numbers like pvd_bk_ref and bk_ref), contents (hotel descriptions, amenities, policies, fees), amenity_ids, and expanded search with full payload details.
<a id="7-status-codes"></a>
7. Status Codes
<a id="71-booking-status"></a>
7.1 Booking Status
The status field in the booking object indicates the current state of the booking.
| Status | Description |
|---|---|
| processing | Booking is being processed after payment |
| success | Booking completed successfully and confirmed |
| failed | Booking failed due to payment or supplier error |
| canceled | Booking has been cancelled |
| quote | Booking created as a quote/estimate |
<a id="72-product-status"></a>
7.2 Product Status (Hotel Only)
The status field in the products array indicates the state of each booked hotel product.
| Status | Description |
|---|---|
| processing | Hotel booking is being processed |
| confirmed | Hotel booking successful, awaiting voucher generation |
| vouchered | Hotel voucher has been issued |
| failed | Hotel booking failed |
| canceled | Hotel reservation has been cancelled |
| refunded | Hotel cancelled and payment refunded |
<a id="73-payment-status"></a>
7.3 Payment Status
The status field in the payment object indicates the payment transaction state.
| Status | Description |
|---|---|
| processing | Payment being processed by gateway |
| success | Payment successfully completed |
| failed | Payment failed |
| refunded | Payment refunded to customer |
<a id="74-payment-line-status"></a>
7.4 Payment Line Status
The status field in payment.lines[] array indicates individual payment transaction attempts. Each payment line represents a single attempt to process payment through the gateway.
| Status | Description |
|---|---|
| success | Transaction completed successfully |
| failed | Transaction failed |
| processing | Transaction being processed |
<a id="8-error-codes"></a>
8. Error Codes
General Error Codes
| Error Code | HTTP Status | Description |
|---|---|---|
| InvalidCredentials | 401 | Invalid email or password |
| Unauthorized | 401 | Invalid or expired access token |
| AccountLocked | 403 | Account has been locked |
| AccountInactive | 403 | Account is not active |
| BookingNotFound | 404 | Booking code does not exist |
| InvalidBookingCode | 400 | Invalid booking code format |
| InternalServerError | 500 | Server error occurred |
Error Response Examples
Invalid Credentials
{
"error": "InvalidCredentials",
"message": "Invalid email or password"
}
Expired Token
{
"error": "Unauthorized",
"message": "Access token has expired"
}
Booking Not Found
{
"error": "BookingNotFound",
"message": "Booking with code DEMOP010156 not found"
}