Accommodation pricing guide
Understand how accommodation pricing works across endpoints, how to interpret different price components, and how to display prices accurately and transparently in your platform.
Overview
This guide explains the accommodation pricing model used in Demand API. It is structured to help you:
- Understand price components.
- Retrieve price data correctly from different endpoints.
- Display price information clearly and lawfully.
See the Extra charges guide for charges calculation and examples.
Key pricing concepts
When querying for availability or searching for accommodation, and also when previewing the order before processing the booking, the responses retrieve a product.price
object that:
- Displays the price breakdown with different fields and their values.
- Defines what the traveller will or might have to pay.
However, you cannot find here when or how the traveller must pay, for this information see the Payments section.
Before diving into endpoints, let’s clarify the pricing model and key price fields.
Price object fields
Field | Description | Usage |
---|---|---|
base | The core cost of a booking before any included or extra charges are added. | |
| The display price that must be shown to the traveller under local booker protection laws.
| Use the |
| The full cost the traveller is expected to pay, either through Booking.com or directly to the accommodation provider.
| Use the total price to show the full amount payable when booking, regardless of payment method. |
extra_charges | Additional costs that are applied to the base price. | See the Extra charges guide for details. |
| The portion of the
| Use
|
See the Usage best practices for more details.
Pricing comparison across endpoints
There are slightly different parameters in the accommodations/search and availability responses, and those offered in orders/preview response.
Field | /accommodations/search and /availability | /orders/preview |
---|---|---|
base | ✓ | ✓ |
book | ✓ | ✗ Not returned |
extra_charges | included , excluded , conditional | non_conditional , conditional |
total | ✓ | ✓ |
chargeable_online | ✗ | ✓ |
Retrieving price information
Use the following endpoints to access accommodation pricing information:
Endpoint | Use it to... | Best practice |
---|---|---|
/accommodations/search /accommodations/availability | Show upfront pricing, eligibility-based rates/deals. | In the request: include products and extra_charges in the extras field. |
/orders/preview | Before finalising the booking, review the detailed pricing information to ensure they are correct. | Display all non_conditional charges to your traveller before payment. |
Refer to the Search and availability , and Orders guides for specific instructions on how to make requests to these endoints so all extra charges are returned in the responses.
Example accommodations/availability response
Here's an example of an /accommodations/availability response, with the price
object breakdown, including extra_charges
:
{
...
"currency": "GBP",
"products": [
{
"id": "xxxxxxxxx_xxxxxxxxx_x_x_x",
"price": {
"base": 153.40,
"book": 167.21,
"extra_charges": {
"conditional": [...],
"excluded": [
{
"charge": 10,
"mode": "incalculable",
"percentage": null,
"total_amount": null,
"unit_amount": null
},
{
"charge": 22,
"mode": "percentage",
"percentage": 1.00,
"total_amount": 1.53,
"unit_amount": null
}
],
"included": [
{
"charge": 21,
"mode": "percentage",
"percentage": 9.00,
"total_amount": 13.81,
"unit_amount": null
}
]
},
"total": 168.74
}
}
]
}
In this example, you can see the following price components: Base
, book
and total
price, as well as conditional
, excluded
and included
extra charges.
Find the full explanation in the Pricing use cases section.
Example orders/preview response
The pricing breakdown returned by the /orders/preview endpoint includes the base
and total
prices, and also the chargeable_online
field.
"price": {
"base": {
"accommodation_currency": 100,
"booker_currency": null
},
"chargeable_online": {
"accommodation_currency": 100,
"booker_currency": null
},
"total": {
"accommodation_currency": 123,
"booker_currency": null
},
"extra_charges": {
"conditional": [],
"non_conditional": [
{
"charge": 142,
"chargeable_online": true,
"total_amount": {
"accommodation_currency": 6,
"booker_currency": null
}
},
{
"charge": 21,
"chargeable_online": false,
"total_amount": {
"accommodation_currency": 14.67,
"booker_currency": null
}
},
{
"charge": 22,
"chargeable_online": true,
"total_amount": {
"accommodation_currency": 11.41,
"booker_currency": null
}
}
]
}
},
- The
book
price is not visible, as this is no longer needed to be displayed before booking. - The
non_conditional
additional charges indicate the final charges that have been included in the total price and must be paid to proceeed the booking. chargeable_online: 100
means that 100 out of 123 of the total price, will be charged by Booking online.
See the specific Chargeable online use case for more details.
Prices returned in API responses may differ slightly across endpoints due to rounding, country-based rules, rate availability, and inventory timing.
Currency and rounding considerations
All amounts are displayed in both the accommodation_currency
and the booker_currency
.
- Small discrepancies may appear due to currency conversion or rounding logic.
- To prevent errors due to rounding:
- Authorise a small buffer (e.g. a few cents) during initial payment authorisation.
- Use consistent rounding rules across all steps.
If the currency is not defined in the search or availability request, the booker_currency
value in the response is null
.
Example with different currencies
In the following orders/preview response:
"total": {
"accommodation_currency": 92.00,
"booker_currency": 78.95
}
The traveller is located in England, hence the
booker currency
defaults to Pounds (GBR).The accommodation is located in Spain so the
accommodation currency
presents the amount in Euros (EUR).
Therefore all charges are displayed in both currencies.
Handling price discrepancies
Price values between accommodations/availability and /orders/preview responses may differ slightly due to:
Inventory changes – Availability and pricing may fluctuate in real time as rooms are booked or released.
Rate restrictions – Some rates are only available under specific conditions, such as non-refundable policies or minimum stay requirements.
Country-based pricing – Prices may vary depending on the country of the booker, and regulatory requirements.
- Example: Some countries display prices inclusive of all taxes and fees, while others show a breakdown of base price and additional fees.
Guest or date modifications – When changing the number of guests or reservation dates (using the /orders/modify endpoint) may result in a different
total
price.
If prices differ:
- Always rely on /orders/preview for the final, chargeable amount.
- Notify travellers about these variations.
Example of price discrepancy
Below are examples of two responses with minor price differences:
Here’s a sample response from the /accommodations/availability endpoint:
{
"price": {
"base": 8485200.18,
"book": 9622217.00,
"extra_charges": {
"conditional": [],
"excluded": [],
"included": [
{
"charge": 1,
"mode": "percentage",
"percentage": 5.00,
"total_amount": 424260.01,
"unit_amount": null
},
{
"charge": 21,
"mode": "percentage",
"percentage": 8.00,
"total_amount": 712756.81,
"unit_amount": null
}
]
},
"total": 9622217.00
}
}
In this case, the price discrepancy between the two endpoints is 0.20 cents.
Price | accommodations/availability | order/preview |
---|---|---|
Base price | 8485200.18 | 8485200.00 |
Total price | 9622217.00 | 9622216.80 |
How to handle price discrepancies
When you notice slight price differences between the /accommodations/availability and /orders/preview endpoints, we recommend:
Trust /orders/preview for final pricing
- This endpoint reflects the most accurate and chargeable price after applying all relevant rules, such as guest count, stay duration, and regional pricing requirements.
- It should be your single source of truth when confirming an order.
Show price as “estimated” during the selection flow
- If you display prices from /accommodations/availability, label them as estimated or starting from.
- This sets the right expectation for travellers and accommodates any minor variations later in the flow.
Use /orders/preview to validate before placing an order
- Before confirming a booking with /orders, send a final check via /orders/preview using the same parameters.
- This helps avoid surprises or failed orders due to price mismatches.
Explain the discrepancy to users (if relevant)
- If travellers notice a small price change, consider showing a brief explanation such as:
“Final price may vary slightly due to taxes, currency rounding, or policy conditions.”
Cache prices for short durations only
- Avoid storing or caching availability prices for too long. Inventory and pricing can change quickly, and using stale data may lead to mismatches.
Flag significant differences
- If you detect a large discrepancy (beyond expected rounding), log or alert your system to investigate further.
- This may indicate a configuration issue or regional pricing rule in effect.
Next steps
For best practices and full details on how charges are calculated or displayed, see: