Using Flexible child rates, you can set up more advanced forms of pricing for children:
- Prices per child or staggered pricing (within the same age range or age bucket)
- Prices on the roomrate and roomrate-date (inventory) level
- Fixed and percentage-based prices: Properties on the OBP (Occupancy-based pricing) or LOS (length-of-stay) model cannot make use of percentage-based children pricing. This restriction does not apply to the new adult percentage.
→ To set up or update a property's children policy, see managing a children policy.
→ To see an example of how to use percentage-based pricing, see Request body example: age buckets (roomrate with percentage)
You can set and update children pricing in one of the following two ways:
- Roomrate level: This enables you to set prices for children before pushing inventory (availability).
- Roomrate-date level: This enables you to set prices for children when you push inventory (availability).
Both support percentage-based and staggered (per-child) pricing. However, keep in mind that children prices set on the roomrate-date level overwrite the prices set on the roomrate level (if applicable).
Managing children pricing on the roomrate level includes:
POST https://supply-xml.booking.com/hotels/ota/OTA_HotelProductNotifThe POST /ota/OTA_HotelProductNotif endpoint enables you to send children prices in the following ways:
- Using (property-level) age buckets
- Using age ranges (they must correspond with the age ranges of existing age buckets)
- Using staggered pricing (either with age buckets or age ranges)
You need to enable feature Flexible children prices from the Feature management page.
When creating a roomrate you set ProductNotifType to New. If you want to update a roomrate, you set ProductNotifType to Overlay. If the roomrate already exists, you must set ProductNotifType to Overlay when setting up children prices.
| Element | Attribute | Description | Type | Required/Optional | Notes |
|---|---|---|---|---|---|
OTA_HotelProductNotifRQ | Contains the HotelProducts array. | object | required | ||
> HotelProducts | Contains the HotelProduct objects. | array | required | ||
HotelCode | Specifies the unique ID of the property you create roomrates for. | integer | required | ||
>> HotelProduct | Contains the roomrate information. | object | required | ||
ProductNotifType | Specifies whether the request is to create a roomrate (New) or modify an existing one (Overlay). | enum | required | Possible values are New and Overlay. You must use New to create a roomrate. | |
>>> RoomTypes | Contains a RoomType object. | object | required | ||
>>>> RoomType | Contains the room type information. | object | required | ||
RoomTypeCode | Specifies the room type id. | integer | required | ||
>>> RatePlans | Contains a RatePlan object. | object | required | ||
>>>> RatePlan | Contains the rate plan information. | object | required | ||
RatePlanCode | Specifies the rate plan id. | integer | required | ||
>>> AdditionalGuestAmounts | Contains the AdditionalGuestAmount elements. | array | required | ||
>>>> AdditionalGuestAmount | Contains the children pricing details. | object | required | ||
AgeQualifyingCode | Specifies that the prices are for children. | integer | required | You must use 8 to signal that the prices are for children only. Note that you cannot set adult prices here, but only within the BaseByGuestAmts object (see example). | |
AgeBucketID | Specifies the ID of the property-level age bucket. | integer | required* | Use either AgeBucketID or MinAge/MaxAge. The range must match an existing age bucket. | |
MinAge | Specifies the beginning of an age range. | integer | required* | Use either AgeBucketID or MinAge/MaxAge. The range must match an existing age bucket. | |
MaxAge | Specifies the end of an age range and is inclusive. | integer | required* | Use either AgeBucketID or MinAge/MaxAge. The range must match an existing age bucket. | |
Amount | Specifies the price for a child within a certain age bucket. | integer | required* | The price cannot exceed the adult price for the roomrate. You must use either Amount and DecimalPlaces, Percent, or AdultPercent alone. | |
DecimalPlaces | Specifies the number of decimal places to apply to Amount. | integer | optional | The default value is 0, which means the value of Amount is without a decimal point. | |
Percent | Specifies the price for the child as a percentage of the adult price. | float | required* | Format: ###.## (max 2 decimal places). The valid range is greater than 0.0 and up to 100.0. When you set the price for children to 100% of the adult price, there are two key consequences: first, children are charged the full adult rate; second, children are counted as adults in the availability search. As a result, if guests search for accommodations for 2 adults and 1 child, rooms that can accommodate 2 adults and 1 child might still be excluded from the search results, since children are counted as adults. Cannot be used for OBP or LOS room rates — use AdultPercent instead. You must use either Amount and DecimalPlaces, Percent, or AdultPercent alone. | |
AdultPercent | Specifies the price for the child as a percentage of the adult price. Unlike Percent, this can be used for OBP and LOS room rates. | float | required* | Format: ###.## (max 2 decimal places). The valid range is greater than 0.0 and up to 100.0. You must use either Amount and DecimalPlaces, Percent, or AdultPercent alone. | |
AdditionalGuestNumber | Specifies the order of prices within the same age bucket. | integer | optional | Set different prices per child in the same age bucket (e.g., 1st child: 5000, 2nd: 2500, 3rd: free). Default 0 = same price for all. |
The following is an example of the request body with fixed amounts:
<OTA_HotelProductNotifRQ>
<HotelProducts HotelCode="64231">
<HotelProduct ProductNotifType="New">
<RoomTypes>
<RoomType RoomTypeCode="6423112"/>
</RoomTypes>
<RatePlans>
<RatePlan RatePlanCode="12483478"/>
</RatePlans>
<AdditionalGuestAmounts>
<AdditionalGuestAmount AgeQualifyingCode="8" AgeBucketID="1" Amount="0" DecimalPlaces="2"/>
<AdditionalGuestAmount AgeQualifyingCode="8" AgeBucketID="2" Amount="2500" DecimalPlaces="2"/>
<AdditionalGuestAmount AgeQualifyingCode="8" AgeBucketID="3" Amount="4500" DecimalPlaces="2"/>
</AdditionalGuestAmounts>
</HotelProduct>
</HotelProducts>
</OTA_HotelProductNotifRQ>
The following is an example of the request body with percentage:
<OTA_HotelProductNotifRQ>
<HotelProducts HotelCode="64231">
<HotelProduct ProductNotifType="New">
<RoomTypes>
<RoomType RoomTypeCode="6423112"/>
</RoomTypes>
<RatePlans>
<RatePlan RatePlanCode="12483478"/>
</RatePlans>
<AdditionalGuestAmounts>
<AdditionalGuestAmount AgeQualifyingCode="8" AgeBucketID="1" Percentage="50"/>
<AdditionalGuestAmount AgeQualifyingCode="8" AgeBucketID="2" Percentage="30"/>
<AdditionalGuestAmount AgeQualifyingCode="8" AgeBucketID="3" Percentage="20"/>
</AdditionalGuestAmounts>
</HotelProduct>
</HotelProducts>
</OTA_HotelProductNotifRQ>
The following is an incomplete example of the request body:
<OTA_HotelProductNotifRQ>
<HotelProducts HotelCode="64231">
<HotelProduct ProductNotifType="New">
<RoomTypes>
<RoomType RoomTypeCode="6423112"/>
</RoomTypes>
<RatePlans>
<RatePlan RatePlanCode="12483478"/>
</RatePlans>
<AdditionalGuestAmounts>
<AdditionalGuestAmount AgeQualifyingCode="8" MinAge="0" MaxAge="3" Amount="0" DecimalPlaces="2"/>
<AdditionalGuestAmount AgeQualifyingCode="8" MinAge="4" MaxAge="12" Amount="2500" DecimalPlaces="2"/>
<AdditionalGuestAmount AgeQualifyingCode="8" MinAge="13" MaxAge="17" Amount="4500" DecimalPlaces="2"/>
</AdditionalGuestAmounts>
</HotelProduct>
</HotelProducts>
</OTA_HotelProductNotifRQ>
The following is an incomplete example of the request body:
<OTA_HotelProductNotifRQ>
<HotelProducts HotelCode="64231">
<HotelProduct ProductNotifType="New">
<RoomTypes>
<RoomType RoomTypeCode="6423112"/>
</RoomTypes>
<RatePlans>
<RatePlan RatePlanCode="12483478"/>
</RatePlans>
<AdditionalGuestAmounts>
<AdditionalGuestAmount AgeQualifyingCode="8" MinAge="0" MaxAge="3" AdditionalGuestNumber="1" Amount="0" DecimalPlaces="2"/>
<AdditionalGuestAmount AgeQualifyingCode="8" MinAge="0" MaxAge="3" AdditionalGuestNumber="2" Amount="500" DecimalPlaces="2"/>
<AdditionalGuestAmount AgeQualifyingCode="8" MinAge="0" MaxAge="3" AdditionalGuestNumber="3" Amount="1000" DecimalPlaces="2"/>
<AdditionalGuestAmount AgeQualifyingCode="8" MinAge="4" MaxAge="12" AdditionalGuestNumber="1" Amount="2000" DecimalPlaces="2"/>
<AdditionalGuestAmount AgeQualifyingCode="8" MinAge="4" MaxAge="12" AdditionalGuestNumber="2" Amount="2500" DecimalPlaces="2"/>
<AdditionalGuestAmount AgeQualifyingCode="8" MinAge="4" MaxAge="12" AdditionalGuestNumber="3" Amount="3000" DecimalPlaces="2"/>
<AdditionalGuestAmount AgeQualifyingCode="8" MinAge="13" MaxAge="17" AdditionalGuestNumber="1" Amount="4000" DecimalPlaces="2"/>
<AdditionalGuestAmount AgeQualifyingCode="8" MinAge="13" MaxAge="17" AdditionalGuestNumber="2" Amount="4500" DecimalPlaces="2"/>
<AdditionalGuestAmount AgeQualifyingCode="8" MinAge="13" MaxAge="17" AdditionalGuestNumber="3" Amount="5000" DecimalPlaces="2"/>
</AdditionalGuestAmounts>
</HotelProduct>
</HotelProducts>
</OTA_HotelProductNotifRQ>
The following is a successful response body example:
<OTA_HotelProductNotifRS>
<Success />
</OTA_HotelProductNotifRS>| Element | Description | Type | Notes |
|---|---|---|---|
OTA_HotelProductNotifRS | Contains the response data. | object | |
> success | Indicates the success of the request. | object | |
ruid | Specifies the unique ID of the request. | string | Send to Booking.com support to help diagnose issues. |
POST https://supply-xml.booking.com/hotels/xml/roomratesThe POST /xml/roomrates endpoint enables you to retrieve existing children prices per property on the roomrate level.
You need to enable feature Flexible children prices from the Feature management page.
| Parameter | Attribute | Description | Type | Required/Optional | Notes |
|---|---|---|---|---|---|
request | Contains the request elements. | object | required | ||
> hotel_id | Specifies the unique ID of the property. | integer | required |
<request>
<hotel_id>6238539</hotel_id>
</request>
The following is a successful response body example:
<rooms>
<room id="696334301" hotel_id="6963343" hotel_name="hotel_name" max_children="0" room_name="Two-Bedroom House">
<rates>
<rate id="7473" fixed_occupancy="4" max_persons="4" policy="General" policy_id="104557280" rate_name="Ashling - 4NIGHTSP">
...
<pricing type="RLO">
<additional_guests>
<price type="child" additional_guest_number="1" from_age="1" to_age="5" age_bucket_id="1" additional="44"/>
<price type="child" additional_guest_number="2" from_age="1" to_age="5" age_bucket_id="1" percentage="33"/>
</additional_guests>
</pricing>
</rate>
</rates>
</room>
</rooms>
(Children pricing fields only.)
| Parameter | Attribute | Description | Type | Notes |
|---|---|---|---|---|
>>>>> additional_guests | Contains the price elements for children. | array | ||
>>>>>> price | Contains the children pricing details. | object | ||
type | Specifies that the prices are for children. | string | You must use child to signal that the prices are for children only. | |
additional_guest_number | Specifies the order of prices within the same age bucket. | integer | Set different prices per child in the same age bucket (e.g., 1st child: 5000, 2nd: 2500, 3rd: free). Default 0 = same price for all. | |
age_bucket_id | Specifies the ID of the property-level age bucket. | integer | ||
from_age | Specifies the beginning of an age range. | integer | ||
to_age | Specifies the end of an age range and is inclusive. | integer | ||
additional | Specifies the fixed price for a child within a certain age bucket. | integer | ||
percentage | Specifies the price for the child as a percentage of the adult price. | float | Format: ###.## (max 2 decimal places). Value greater than 0.0 and up to 100.0. |
POST https://supply-xml.booking.com/hotels/ota/OTA_HotelProductNotifThe POST /ota/OTA_HotelProductNotif endpoint enables you to remove children prices by sending an empty AdditionalGuestAmounts object.
| Element | Attribute | Description | Type | Required/Optional | Notes |
|---|---|---|---|---|---|
OTA_HotelProductNotifRQ | Contains the HotelProducts array. | object | required | ||
> HotelProducts | Contains the HotelProduct objects. | array | required | ||
HotelCode | Specifies the unique ID of the property you create roomrates for. | integer | required | ||
>> HotelProduct | Contains the roomrate information. | object | required | ||
ProductNotifType | Specifies whether the request is to create a roomrate (New) or modify an existing one (Overlay). | enum | required | Possible values are New and Overlay. Use Overlay to update an existing roomrate. | |
>>> RoomTypes | Contains a RoomType object. | object | required | ||
>>>> RoomType | Contains the room type information. | object | required | ||
RoomTypeCode | Specifies the room type id. | integer | required | ||
>>> RatePlans | Contains a RatePlan object. | object | required | ||
>>>> RatePlan | Contains the rate plan information. | object | required | ||
RatePlanCode | Specifies the rate plan id. | integer | required | ||
>>> AdditionalGuestAmounts | Contains the AdditionalGuestAmount elements. | array | required |
<OTA_HotelProductNotifRQ>
<HotelProducts HotelCode="64231">
<HotelProduct ProductNotifType="New">
<RoomTypes>
<RoomType RoomTypeCode="6423112"/>
</RoomTypes>
<RatePlans>
<RatePlan RatePlanCode="12483478"/>
</RatePlans>
<AdditionalGuestAmounts>
</AdditionalGuestAmounts>
</HotelProduct>
</HotelProducts>
</OTA_HotelProductNotifRQ>
The following is a successful response body example:
<ok></ok>
| Element | Description | Type | Notes |
|---|---|---|---|
OTA_HotelProductNotifRS | Contains the response data. | object | |
> success | Indicates the success of the request. | object | |
ruid | Specifies the unique ID of the request. | string | Send to Booking.com support to help diagnose issues. |
You can send and update children prices on the roomrate-date level:
POST https://supply-xml.booking.com/hotels/ota/OTA_HotelRateAmountNotifThe POST /ota/OTA_HotelRateAmountNotif enables you to send children prices in the following ways:
- Using (property-level) age buckets
- Using age ranges (they must correspond with the age ranges of existing age buckets)
- Using staggered pricing (either with age buckets or age ranges)
Children pricing parameters only. Include adult prices in the request to avoid removing them due to overlay logic.
| Parameter | Attribute | Description | Type | Required/Optional | Notes |
|---|---|---|---|---|---|
>>> AdditionalGuestAmounts | Contains the AdditionalGuestAmount elements. | array | required | ||
>>>> AdditionalGuestAmount | Contains the children pricing details. | object | required | ||
AgeQualifyingCode | Specifies that the prices are for children. | integer | required | You must use 8 to signal that the prices are for children only. Note that you cannot set adult prices here, but only within the BaseByGuestAmts object (see example). | |
AgeBucketID | Specifies the ID of the property-level age bucket. | integer | required* | Use either AgeBucketID or MinAge/MaxAge. The range must match an existing age bucket. | |
MinAge | Specifies the beginning of an age range. | integer | required* | Use either AgeBucketID or MinAge/MaxAge. The range must match an existing age bucket. | |
MaxAge | Specifies the end of an age range and is inclusive. | integer | required* | Use either AgeBucketID or MinAge/MaxAge. The range must match an existing age bucket. | |
Amount | Specifies the fixed price for a child within a certain age bucket. | integer | required* | The price cannot exceed the adult price for the roomrate. Use DecimalPlaces to set the decimal precision. You must use either Amount, Percent, or AdultPercent alone. | |
DecimalPlaces | Specifies the number of decimal places to apply to Amount. | integer | optional | The default value is 0, which means the value of Amount is without a decimal point. | |
Percent | Specifies the price for the child as a percentage of the adult price. | float | required* | Format: ###.## (max 2 decimal places). The valid range is greater than 0.0 and up to 100.0. Cannot be used for OBP or LOS room rates — use AdultPercent instead. You must use either Amount, Percent, or AdultPercent alone. | |
AdultPercent | Specifies the price for the child as a percentage of the adult price. Unlike Percent, this can be used for OBP and LOS room rates. | float | required* | Format: ###.## (max 2 decimal places). The valid range is greater than 0.0 and up to 100.0. You must use either Amount, Percent, or AdultPercent alone. | |
AdditionalGuestNumber | Specifies the order of prices within the same age bucket. | integer | optional | Set different prices per child in the same age bucket (e.g., 1st child: 5000, 2nd: 2500, 3rd: free). Default 0 = same price for all. |
<OTA_HotelRateAmountNotifRQ>
<RateAmountMessages>
<RateAmountMessage LocatorID="1">
<StatusApplicationControl End="2021-12-31" InvTypeCode="330955005" RatePlanCode="11272836" Start="2021-10-31"/>
<Rates>
<Rate>
<BaseByGuestAmts>
<BaseByGuestAmt AmountAfterTax="9000" CurrencyCode="EUR" DecimalPlaces="2" NumberOfGuests="1"/>
<BaseByGuestAmt AmountAfterTax="10000" CurrencyCode="EUR" DecimalPlaces="2" NumberOfGuests="2"/>
<BaseByGuestAmt AmountAfterTax="15000" CurrencyCode="EUR" DecimalPlaces="2" NumberOfGuests="3"/>
<BaseByGuestAmt AmountAfterTax="20000" CurrencyCode="EUR" DecimalPlaces="2" NumberOfGuests="4"/>
</BaseByGuestAmts>
<AdditionalGuestAmounts>
<AdditionalGuestAmount AgeQualifyingCode="8" AgeBucketID="1" Amount="0" DecimalPlaces="2"/>
<AdditionalGuestAmount AgeQualifyingCode="8" AgeBucketID="2" Amount="2500" DecimalPlaces="2"/>
<AdditionalGuestAmount AgeQualifyingCode="8" AgeBucketID="3" Amount="4500" DecimalPlaces="2"/>
</AdditionalGuestAmounts>
</Rate>
</Rates>
</RateAmountMessage>
</RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
<OTA_HotelRateAmountNotifRQ>
<RateAmountMessages>
<RateAmountMessage LocatorID="1">
<StatusApplicationControl End="2021-12-31" InvTypeCode="330955005" RatePlanCode="11272836" Start="2021-10-31"/>
<Rates>
<Rate>
<BaseByGuestAmts>
<BaseByGuestAmt AmountAfterTax="9000" CurrencyCode="EUR" DecimalPlaces="2" NumberOfGuests="1"/>
<BaseByGuestAmt AmountAfterTax="10000" CurrencyCode="EUR" DecimalPlaces="2" NumberOfGuests="2"/>
<BaseByGuestAmt AmountAfterTax="15000" CurrencyCode="EUR" DecimalPlaces="2" NumberOfGuests="3"/>
<BaseByGuestAmt AmountAfterTax="20000" CurrencyCode="EUR" DecimalPlaces="2" NumberOfGuests="4"/>
</BaseByGuestAmts>
<AdditionalGuestAmounts>
<AdditionalGuestAmount AgeQualifyingCode="8" MinAge="0" MaxAge="3" Amount="0" DecimalPlaces="2"/>
<AdditionalGuestAmount AgeQualifyingCode="8" MinAge="4" MaxAge="12" Amount="2500" DecimalPlaces="2"/>
<AdditionalGuestAmount AgeQualifyingCode="8" MinAge="13" MaxAge="17" Amount="4500" DecimalPlaces="2"/>
</AdditionalGuestAmounts>
</Rate>
</Rates>
</RateAmountMessage>
</RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
<OTA_HotelRateAmountNotifRQ>
<RateAmountMessages>
<RateAmountMessage LocatorID="1">
<StatusApplicationControl End="2021-12-31" InvTypeCode="330955018" RatePlanCode="11272836" Start="2021-10-31"/>
<Rates>
<Rate>
<BaseByGuestAmts>
<BaseByGuestAmt AmountAfterTax="9000" CurrencyCode="EUR" DecimalPlaces="2" NumberOfGuests="1"/>
<BaseByGuestAmt AmountAfterTax="10000" CurrencyCode="EUR" DecimalPlaces="2" NumberOfGuests="2"/>
<BaseByGuestAmt AmountAfterTax="15000" CurrencyCode="EUR" DecimalPlaces="2" NumberOfGuests="3"/>
<BaseByGuestAmt AmountAfterTax="20000" CurrencyCode="EUR" DecimalPlaces="2" NumberOfGuests="4"/>
</BaseByGuestAmts>
<AdditionalGuestAmounts>
<AdditionalGuestAmount AgeQualifyingCode="8" AgeBucketID="1" AdditionalGuestNumber="1" Amount="0" DecimalPlaces="2"/>
<AdditionalGuestAmount AgeQualifyingCode="8" AgeBucketID="1" AdditionalGuestNumber="2" Amount="500" DecimalPlaces="2"/>
<AdditionalGuestAmount AgeQualifyingCode="8" AgeBucketID="1" AdditionalGuestNumber="3" Amount="1000" DecimalPlaces="2"/>
<AdditionalGuestAmount AgeQualifyingCode="8" AgeBucketID="2" AdditionalGuestNumber="1" Amount="2000" DecimalPlaces="2"/>
<AdditionalGuestAmount AgeQualifyingCode="8" AgeBucketID="2" AdditionalGuestNumber="2" Amount="2500" DecimalPlaces="2"/>
<AdditionalGuestAmount AgeQualifyingCode="8" AgeBucketID="2" AdditionalGuestNumber="3" Amount="3000" DecimalPlaces="2"/>
<AdditionalGuestAmount AgeQualifyingCode="8" AgeBucketID="3" AdditionalGuestNumber="1" Amount="4000" DecimalPlaces="2"/>
<AdditionalGuestAmount AgeQualifyingCode="8" AgeBucketID="3" AdditionalGuestNumber="2" Amount="4500" DecimalPlaces="2"/>
<AdditionalGuestAmount AgeQualifyingCode="8" AgeBucketID="3" AdditionalGuestNumber="3" Amount="5000" DecimalPlaces="2"/>
</AdditionalGuestAmounts>
</Rate>
</Rates>
</RateAmountMessage>
</RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
The following is a successful response body example:
<OTA_HotelRateAmountNotifRS>
<Success />
</OTA_HotelRateAmountNotifRS>
| Element | Description | Type | Notes |
|---|---|---|---|
OTA_HotelRateAmountNotifRS | Contains the response data. | object | |
> success | Indicates whether the request was successful. | object | |
ruid | Specifies the unique ID of the request. | string | Send to Booking.com support to help diagnose issues. |
POST https://supply-xml.booking.com/hotels/xml/availabilityThe POST /xml/availability enables you to send children pricing in the following ways:
- Using (property-level) age buckets
- Using age ranges (they must correspond with the age ranges of existing age buckets)
- Using staggered pricing (either with age buckets or age ranges)
Children pricing parameters only. Include adult prices in the request to avoid removing them due to overlay logic.
| Parameter | Attribute | Description | Type | Required/Optional | Notes |
|---|---|---|---|---|---|
>>> additional_guests | Contains the price elements for children. | array | required | ||
>>>> price | Contains the children pricing details. | object | required | ||
type | Specifies that the prices are for children. | string | required | You must use child to signal that the prices are for children. Note that you cannot set adult prices here, but only within the price object nested within the date object (see example). | |
additional_guest_number | Specifies the order of prices within the same age bucket. | integer | optional | Set different prices per child in the same age bucket (e.g., 1st child: 5000, 2nd: 2500, 3rd: free). Default 0 = same price for all. | |
age_bucket_id | Specifies the ID of the property-level age bucket. | integer | required* | Use either age_bucket_id or from_age/to_age. The range must match an existing age bucket. | |
from_age | Specifies the beginning of an age range. | integer | required* | Use either age_bucket_id or from_age/to_age. The range must match an existing age bucket. | |
to_age | Specifies the end of an age range and is inclusive. | integer | required* | Use either age_bucket_id or from_age/to_age. The range must match an existing age bucket. | |
additional | Specifies the fixed price for a child within a certain age bucket. | float | required* | Format: ###.## (max 2 decimal places). The price cannot exceed the adult price for the roomrate. You must use either additional, percentage, or adult_percentage. | |
percentage | Specifies the price for the child as a percentage of the adult price. | float | required* | Format: ###.## (max 2 decimal places). The valid range is greater than 0.0 and up to 100.0. Cannot be used for OBP or LOS room rates — use adult_percentage instead. You must use either additional, percentage, or adult_percentage. | |
adult_percentage | Specifies the price for the child as a percentage of the adult price. Unlike percentage, this can be used for OBP and LOS room rates. | float | required* | Format: ###.## (max 2 decimal places). The valid range is greater than 0.0 and up to 100.0. You must use either additional, percentage, or adult_percentage. |
<request>
<room id="330955005">
<date from="2021-10-31" to="2021-12-31">
<roomstosell>5</roomstosell>
<currencycode>EUR</currencycode>
<rate id="11272836"/>
<price numberofguests="1">90.00</price>
<price numberofguests="2">100.00</price>
<price numberofguests="3">150.00</price>
<price numberofguests="4">200.00</price>
<additional_guests>
<price type="child" age_bucket_id="1" additional="0"></price>
<price type="child" age_bucket_id="2" additional="25.00"></price>
<price type="child" age_bucket_id="3" additional="45.00"></price>
</additional_guests>
</date>
</room>
</request>
<request>
<room id="330955005">
<date from="2021-10-31" to="2021-12-31">
<roomstosell>5</roomstosell>
<currencycode>EUR</currencycode>
<rate id="11272836"/>
<price numberofguests="1">90.00</price>
<price numberofguests="2">100.00</price>
<price numberofguests="3">150.00</price>
<price numberofguests="4">200.00</price>
<additional_guests>
<price type="child" from_age="0" to_age="3" additional="0"></price>
<price type="child" from_age="4" to_age="12" additional="25.00"></price>
<price type="child" from_age="13" to_age="17" additional="45.00"></price>
</additional_guests>
</date>
</room>
</request>
<request>
<room id="330955018">
<date from="2021-10-31" to="2021-12-31">
<roomstosell>5</roomstosell>
<currencycode>EUR</currencycode>
<rate id="11272836"/>
<price numberofguests="1">90.00</price>
<price numberofguests="2">100.00</price>
<price numberofguests="3">150.00</price>
<price numberofguests="4">200.00</price>
<additional_guests>
<price type="child" age_bucket_id="1" additional_guest_number="1" additional="0.00"></price>
<price type="child" age_bucket_id="1" additional_guest_number="2" additional="5.05"></price>
<price type="child" age_bucket_id="1" additional_guest_number="3" additional="10.10"></price>
<price type="child" age_bucket_id="2" additional_guest_number="1" additional="20.20"></price>
<price type="child" age_bucket_id="2" additional_guest_number="2" additional="25.25"></price>
<price type="child" age_bucket_id="2" additional_guest_number="3" additional="30.30"></price>
<price type="child" age_bucket_id="3" additional_guest_number="1" additional="40.40"></price>
<price type="child" age_bucket_id="3" additional_guest_number="2" additional="45.45"></price>
<price type="child" age_bucket_id="3" additional_guest_number="3" additional="50.50"></price>
</additional_guests>
</date>
</room>
</request>
The following is a successful response body example:
<ok></ok>
| Element | Description | Type | Notes |
|---|---|---|---|
ok | Indicates whether the request was successful. | object | |
ruid | Specifies the unique ID of the request. | string | Send to Booking.com support to help diagnose issues. |
POST https://supply-xml.booking.com/hotels/xml/roomrateavailabilityThe POST /xml/roomrateavailability enables you to retrieve existing children prices per property on the roomrate-date (inventory) level.
You need to enable feature Flexible children prices from the Feature management page.
| Parameter | Attribute | Description | Type | Required/Optional | Notes |
|---|---|---|---|---|---|
request | Contains the request elements. | object | required | ||
> hotel_id | Specifies the unique ID of the property. | integer | required | ||
> start_date | Specifies the starting point (date) from when you want to retrieve inventory details. | date | required | ||
> number_of_days | Specifies the amount of days, starting from start_date, for which you want to retrieve inventory details. | integer | required | ||
> room_level | Indicates whether you want to retrieve inventory on the room level or rate level. | boolean | optional | Default value is 0, with 0 being rate level and 1 being room level. | |
> room_id | Specifies the room type ID if you want to filter by room type. | integer | optional |
<request>
<hotel_id>367456</hotel_id>
<number_of_days>20</number_of_days>
<start_date>2021-09-19</start_date>
<room_level>1</room_level>
<room_id>12302</room_id>
</request>
The following is a successful response body example:
<result>
<room room_id="696334301">
<date booked="1" cancelled="0" min_contracted_rooms="0" min_contracted_rooms_until="0" rooms_to_sell="3" value="2021-08-02">
<rate booked="1" cancelled="0" closed="0" closed_on_arrival="0" closed_on_depart="0" exact_stay_arrival="0" length_of_stay="" max_advance_res="" max_stay_arrival="0" max_stay_through="0" min_advance_res="" min_contracted_rooms="0" min_contracted_rooms_until="0" min_stay_arrival="0" min_stay_through="2" policygroup="" price="774" price_single="0" rate_id="7473">
<additional_guests>
<price type="child" additional_guest_number="1" from_age="1" to_age="5" age_bucket_id="1" additional="100"/>
<price type="child" additional_guest_number="2" from_age="1" to_age="5" age_bucket_id="1" percentage="10"/>
</additional_guests>
</rate>
</date>
</room>
</result>
(Children pricing fields only.)
| Element | Attribute | Description | Type | Notes |
|---|---|---|---|---|
>>>> additional_guests | Contains the price elements for children. | array | ||
>>>>> price | Contains the children pricing details. | object | ||
type | Specifies that the prices are for children. | string | ||
additional_guest_number | Specifies the order of prices within the same age bucket. | integer | Set different prices per child in the same age bucket (e.g., 1st child: 5000, 2nd: 2500, 3rd: free). Default 0 = same price for all. | |
age_bucket_id | Specifies the ID of the property-level age bucket. | integer | ||
from_age | Specifies the beginning of an age range. | integer | ||
to_age | Specifies the end of an age range and is inclusive. | integer | ||
additional | Specifies the fixed price for a child within a certain age bucket. | integer | ||
percentage | Specifies the price for the child as a percentage of the adult price. | float | Format: ###.## (max 2 decimal places). Value greater than 0.0 and up to 100.0. |
You can remove children pricing in one of the following two ways:
POST https://supply-xml.booking.com/hotels/ota/OTA_HotelRateAmountNotifThe POST /ota/OTA_HotelRateAmountNotif endpoint also enables you to remove children pricing by sending an empty AdditionalGuestAmounts object.
Children pricing parameters only. Include adult prices in the request to avoid removing them due to overlay logic.
| Parameter | Attribute | Description | Type | Required/Optional | Notes |
|---|---|---|---|---|---|
>>> AdditionalGuestAmounts | Must be empty to remove existing children prices. | array | required |
<OTA_HotelRateAmountNotifRQ>
<RateAmountMessages>
<RateAmountMessage LocatorID="1">
<StatusApplicationControl Start="2021-11-17" End="2021-12-18" RatePlanCode="7473" InvTypeCode="696334301"/>
<Rates>
<Rate>
<BaseByGuestAmts>
<BaseByGuestAmt AmountAfterTax="16900" DecimalPlaces="2" CurrencyCode="EUR"/>
</BaseByGuestAmts>
<AdditionalGuestAmounts>
</AdditionalGuestAmounts>
</Rate>
</Rates>
</RateAmountMessage>
</RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
The following is a successful response body example:
<OTA_HotelRateAmountNotifRS>
<Success />
</OTA_HotelRateAmountNotifRS>
| Element | Description | Type | Notes |
|---|---|---|---|
OTA_HotelRateAmountNotifRS | Contains the response data. | object | |
> success | Indicates whether the request was successful. | object | |
ruid | Specifies the unique ID of the request. | string | Send to Booking.com support to help diagnose issues. |
POST https://supply-xml.booking.com/hotels/xml/availabilityThe POST /xml/availability endpoint also enables you to remove children pricing by sending an empty additional_guests object.
Children pricing parameters only. Include adult prices in the request to avoid removing them due to overlay logic.
| Parameter | Attribute | Description | Type | Required/Optional | Notes |
|---|---|---|---|---|---|
>>> additional_guests | Must be empty to remove existing children prices. | array | required |
<request>
<hotel_id>1719757</hotel_id>
<version>1.0</version>
<room id="696334301">
<date from="2021-08-02" to="2021-08-10">
<rate id="7473" />
<price>774.00</price>
<additional_guests>
</additional_guests>
</date>
</room>
</request>
The following is a successful response body example:
<ok></ok>
| Element | Description | Type | Notes |
|---|---|---|---|
ok | Indicates whether the request was successful. | object | |
ruid | Specifies the unique ID of the request. | string | Send to Booking.com support to help diagnose issues. |
The following tables list errors related to children pricing. Errors returned by OTA_HotelProductNotif use a numeric Code attribute in the response (OTA error code); the ShortText attribute contains the error message. Errors returned by OTA_HotelRateAmountNotif and /xml/availability use a named Code attribute.
| Error code | Message | Notes |
|---|---|---|
400 | FCR: You need to set additional guest Amount, Percent or AdultPercent | None of the required price fields (Amount, Percent, or AdultPercent) are present in AdditionalGuestAmount. |
44 | Either Percent, Adult Percent or Amount should exist, and only one should be defined | Multiple price fields are set, or none are set in AdditionalGuestAmount. Only one of Amount, Percent, or AdultPercent can be used per entry. |
44 | Cannot use percentage when setting children prices for OBP or LOS room rates | Percent is not supported for OBP or LOS room rates. Use AdultPercent instead. |
497 | Please define a to and from ages that match an age bucket | MinAge and MaxAge do not match an existing age bucket in the property's children policy. |
497 | ageBandId must be 1, 2, 3, or 4 | AgeBucketID is outside the valid range. |
497 | Prices length cannot be 0 | At least one price entry must be included in the request. |
497 | The dates of the guest prices cannot overlap for the same roomId and rateId | Multiple price entries for the same room rate have overlapping date ranges. |
497 | Please check if date is not in the past or more than 4 years in the future | The requested date range is outside the allowed window. |
497 | Invalid additionalGuestNumber. It should be a non negative number up to 10 | AdditionalGuestNumber must be between 0 and 10 (inclusive). |
497 | There's no support for negative prices | Amount must be greater than or equal to 0. |
497 | Max Price Value is 9999999999.9999 | Amount exceeds the maximum allowed value. |
497 | Percentage should be between [0.0, 100.0] | Percent or AdultPercent must be between 0 and 100 (exclusive of 0). |
497 | There's no support for percentage price zero | Percent or AdultPercent cannot be 0. |
497 | Price Type Adult Percentage cannot be mixed with other price types for the same [age band] | AdultPercent cannot be combined with Percent or Amount entries for the same age bucket. |
497 | Price Type Adult Percentage cannot be used with date | AdultPercent is a roomrate-level setting and cannot be used with date-range pricing. |
497 | Price Type Adult Percentage can only be used with guest number 0 | When using AdultPercent, AdditionalGuestNumber must be 0. |
497 | The dates of the prices cannot overlap for the same guestNumber and ageBucket | Overlapping date ranges exist within the same age bucket and guest number combination. |
| Error code | Message | Notes |
|---|---|---|
ADDITIONAL_PRICE_TYPE_CAN_BE_CHILDREN_ONLY | Additional guest type can only be child | AgeQualifyingCode must be 8 (child). Adult pricing is not supported here. |
CANT_SET_PERCENTAGE_FOR_OBP_LOS | Cannot set percentage for OBP/LOS room-rate | Percentage pricing is not supported for OBP or LOS room rates on the roomrate-date level. |
INVALID_GUEST_AGE_BAND | Please define a to and from ages that match an age bucket | MinAge/MaxAge range does not correspond to any existing age bucket in the property's children policy. |
INVALID_GUEST_AGE_BAND_ID | ageBandId must be 1, 2, 3, or 4 | AgeBucketID is outside the valid range (1–4). |
INVALID_ADDITIONAL_PRICES | Prices length cannot be 0 | At least one price entry must be included in the request. |
ADDITIONAL_GUEST_PRICE_DATES_OVERLAP | The dates of the guest prices cannot overlap for the same roomId and rateId | Multiple price entries for the same room rate have overlapping date ranges. |
PROVIDED_DATES_OUTSIDE_ALLOWED_RANGE | Please check if date is not in the past or more than 4 years in the future | The requested date range is outside the allowed window. |
INVALID_ADDITIONAL_GUEST_NUMBER | Invalid additionalGuestNumber. It should be a non negative number up to 10 | AdditionalGuestNumber must be between 0 and 10 (inclusive). |
PRICE_LESS_THAN_0 | There's no support for negative prices | Amount must be greater than or equal to 0. |
PRICE_GREATER_THAN_10_DIGITS | Max Price Value is 9999999999.9999 | Amount exceeds the maximum allowed value. |
PRICE_PERCENTAGE_IS_BIGGER_THAN_100 | Percentage should be between [0.0, 100.0] | Percent must be between 0 and 100. |
PRICE_PERCENTAGE_IS_ZERO | There's no support for percentage price zero | Percent cannot be 0. |
PRICE_DATES_OVERLAP | The dates of the prices cannot overlap for the same guestNumber and ageBucket | Overlapping date ranges exist within the same age bucket and guest number combination. |
| Warning code | Message | Notes |
|---|---|---|
WARN_UNPROCESSED_ADDITIONAL_GUEST | Additional guest updates weren't processed. Please try again later | Temporary processing failure. Retry the request. |
Before you go live with your API integration, you'll need to meet certain requirements. For more information, see Going Live.