# Update LOS pricing rates

Use the `los_pricing` endpoint to set pricing for your inventory using the Length of Stay (LOS) pricing model.

LOS pricing must be enabled first
Before using this API, LOS pricing must be enabled for your property.
For more information on pricing models, see [Pricing Models](/connectivity/docs/pricing-models).

## Usage recommendations

1. **Specify availability in advance**: Provide availability for at least 12 months ahead.
2. **Use Delta Updates Only**: Send only changes using the [roomRateAvailability API](/connectivity/docs/b_xml-roomrateavailability), not full refreshes.
3. **Single Hotel Per Request**: All updates must belong to one hotel only.
4. **Monthly Batching**: Break down updates by month: one month per request.
5. **Room-Rate Grouping**: Multiple room-rates can be grouped in the same request for the same hotel and month.


## Endpoint


```http
POST https://supply-xml.booking.com/hotels/csv/los_pricing
```

## What is LOS pricing?

LOS (Length of Stay) pricing allows you to provide specific pricing for every possible length of stay (up to 90 nights) and occupancy level, based on the check-in date. Instead of providing per-night pricing and having Booking.com calculate the total, you specify the exact price for each stay duration.

### Advantages of LOS pricing

- **Precise control**: Set exact prices for specific stay lengths rather than relying on per-night calculations
- **Flexible availability**: Control which stay lengths are available by setting prices to 0 for unavailable durations
- **Extended planning**: Set prices up to 729 days in advance
- **Occupancy-based**: Different prices for different numbers of guests


## Request

### Headers

| Header | Description | Type | Required | Notes |
|  --- | --- | --- | --- | --- |
| `Accept-Version` | Specify the version number to get the API functionality specific to that version | string | Optional | Currently supports version `1.1` (default). |
| `Content-Type` | Request content type | string | Required | Must be `application/csv` |
| `Content-Length` | Number of character bytes in POST data | integer | Required | Must include extra bytes from URL encoding (escape sequences) |


### Request body

The request body must be URL-encoded CSV data submitted as a form value named "CSV".

#### CSV format

Each row in the CSV represents pricing for a specific check-in room, rate , date, and occupancy combination:


```
{checkin},{occupancy},{room_id},{rate_id},{currency_code},{1_night},{2_nights},{3_nights},...,{90_nights}
```

#### CSV fields

| Field | Description | Type | Required | Notes |
|  --- | --- | --- | --- | --- |
| `checkin` | Check-in date | date | Required | Format: `YYYY-MM-DD`. Can be up to 729 days in the future or 1 day in the past (Central European Time) |
| `occupancy` | Number of adult guests | integer | Required | Must not exceed `MaxAdultOccupancy` of the room type. Using `MaxOccupancy` returns a warning |
| `room_id` | Booking.com room type ID | integer | Required | Must be an active room for the authenticated property |
| `rate_id` | Booking.com rate plan ID | integer | Required | Must be an active rate for the specified room |
| `currency_code` | ISO 4217 [currency code](/connectivity/docs/b_xml-countrycurrencies) | string | Required | Must match the property's configured currency |
| `1_night` | Price for 1-night stay | decimal | Required | Format: `###.##` (max 2 decimal places). Set to `0` to make unavailable |
| ... | Prices for additional nights | decimal | Optional | Continue up to 90 nights. Price is the total price for staying for N nights. Omitted nights default to `0` (unavailable) |
| `90_nights` | Total Price for 90-night stay | decimal | Optional | Format: `###.##` (max 2 decimal places). Maximum supported length of stay |


#### URL encoding

The CSV data must be URL-encoded with the following escape sequences:

| Character | Encoding | Description |
|  --- | --- | --- |
| `,` (comma) | `%2C` | Field separator |
| `\n` (line feed) | `%0A` | Row separator |


Content-Length calculation
The `Content-Length` header must include the full character count including extra bytes from escape sequences (e.g., `%2C` counts as 3 characters, not 1).

### Request examples

#### Example 1: Basic LOS pricing update

Setting prices for room 1444301, rate 23543, for 2 guests checking in on 2025-12-20:

**Unencoded CSV:**


```csv
2025-12-20,2,1444301,23543,EUR,100,210,270,390,550,580,650,820
```

**URL-encoded request:**


```http
POST https://supply-xml.booking.com/hotels/csv/los_pricing
Content-Type: application/csv
Content-Length: 89

CSV=2025-12-20%2C2%2C1444301%2C23543%2CEUR%2C100%2C210%2C270%2C390%2C550%2C580%2C650%2C820
```

This sets:

- 1 night: €100
- 2 nights: €210
- 3 nights: €270
- 4 nights: €390
- 5 nights: €550
- 6 nights: €580
- 7 nights: €650
- 8 nights: €820
- 9+ nights: €0 (unavailable)


#### Example 2: LOS pricing with unavailable lengths

Making 3-night and 7-night stays unavailable:

**Unencoded CSV:**


```csv
2025-12-20,2,1444301,23543,EUR,100,210,0,390,550,580,0,820
```

**URL-encoded request:**


```http
POST https://supply-xml.booking.com/hotels/csv/los_pricing
Content-Type: application/csv
Content-Length: 85

CSV=2025-12-20%2C2%2C1444301%2C23543%2CEUR%2C100%2C210%2C0%2C390%2C550%2C580%2C0%2C820
```

Guests cannot book 3-night or 7-night stays for this check-in date.

#### Example 3: Multiple rows (different dates and rates)

**Unencoded CSV:**


```csv
2025-03-15,2,1000201,58848,EUR,100,200,300,400,500,600,700,800,900,1000,1100,1200,1300,1400,1500,1600,1700,1800,1900,2000,2100,2200,2300,2400,2500,2600,2700,2800,2900,3000,3100
2025-03-16,2,1000201,58848,EUR,100,200,300,400,500,600,700,800,900,1000,1100,1200,1300,1400,1500,1600,1700,1800,1900,2000,2100,2200,2300,2400,2500,2600,2700,2800,2900,3000,3100
2025-03-15,2,1000201,50587,EUR,100,200,300,400,500,600,700,800,900,1000,1100,1200,1300,1400,1500,1600,1700,1800,1900,2000,2100,2200,2300,2400,2500,2600,2700,2800,2900,3000,3100
```

**URL-encoded request:**


```http
POST https://supply-xml.booking.com/hotels/csv/los_pricing
Content-Type: application/csv
Content-Length: 721

CSV=2025-03-15%2C2%2C1000201%2C58848%2CEUR%2C100%2C200%2C300%2C400%2C500%2C600%2C700%2C800%2C900%2C1000%2C1100%2C1200%2C1300%2C1400%2C1500%2C1600%2C1700%2C1800%2C1900%2C2000%2C2100%2C2200%2C2300%2C2400%2C2500%2C2600%2C2700%2C2800%2C2900%2C3000%2C3100%0A2025-03-16%2C2%2C1000201%2C58848%2CEUR%2C100%2C200%2C300%2C400%2C500%2C600%2C700%2C800%2C900%2C1000%2C1100%2C1200%2C1300%2C1400%2C1500%2C1600%2C1700%2C1800%2C1900%2C2000%2C2100%2C2200%2C2300%2C2400%2C2500%2C2600%2C2700%2C2800%2C2900%2C3000%2C3100%0A2025-03-15%2C2%2C1000201%2C50587%2CEUR%2C100%2C200%2C300%2C400%2C500%2C600%2C700%2C800%2C900%2C1000%2C1100%2C1200%2C1300%2C1400%2C1500%2C1600%2C1700%2C1800%2C1900%2C2000%2C2100%2C2200%2C2300%2C2400%2C2500%2C2600%2C2700%2C2800%2C2900%2C3000%2C3100%0A
```

## Response

This section contains examples of successful and unsuccessful responses. For a detailed description of all possible errors and warnings, see [Troubleshooting B.XML availability error responses](/connectivity/docs/b_xml-availability-troubleshooting).

### Response body

The response is returned in CSV format.

#### Success response format


```csv
method,status,ticket_id
los_pricing,ok,{unique_ticket_id}
```

#### Error response format


```csv
method,fault_code,fault_message
los_pricing,{http_error_code},{error_description}
{error_code},{error_message}
```

| Field | Description | Type | Notes |
|  --- | --- | --- | --- |
| `method` | API method name | string | Always `los_pricing` |
| `status` | Request status | string | `ok` for success |
| `fault_code` | HTTP error code | integer | Only present in error responses. Same meaning as HTTP status codes |
| `fault_message` | Error description | string | Only present in error responses |
| `ticket_id` | Unique request identifier | string | RUID. Use for tracking and support requests |


### Response examples

#### Success response


```csv
method,status,ticket_id
los_pricing,ok,abcdef0123456789
```

#### Error response


```csv
method,fault_code,fault_message
los_pricing,400,file contained some invalid records
OCCUPANCY_EXCEEDS_MAX_PERSONS,Room '1234' has a maximum occupancy of '6'. You cannot set price for higher occupancy for rate '4567'.
```

## Additional information

### LOS pricing rules

Required fields
Each row must include:

- Check-in date
- Occupancy
- Room ID
- Rate ID
- Currency code
- At least one night price (additional nights are optional)


Default pricing behavior
There is no way to express a default per-night price. Each length of stay must have an explicit price or be set to 0 (unavailable).

Maximum nights limit
Maximum number of nights is 90. If you provide more than 90 nights, the remaining nights are ignored and only the first 90 nights are considered.

Price limits
The maximum price you can set is €50,000 (or equivalent) per stay. If you try to set a higher price, the API rejects the price update request.

### Setting availability for child rates

While setting up availability using rate IDs that are configured as [child rates](/connectivity/docs/room-type-and-rate-plan-management/managing-rate-plans#create-a-rate-relation), make sure the request doesn't set values for fields that are [configured to inherit from the parent rate plan](/connectivity/docs/room-type-and-rate-plan-management/managing-rate-plans/#parentrate).

For example, if you try to set `price` when [`FollowsPrice` is set](/connectivity/docs/room-type-and-rate-plan-management/managing-rate-plans/#followsprice), the API returns an error.

To resolve the error, specify a rate plan ID that is either configured as a parent rate, or a child rate that does not have the following restrictions: `FollowsPrice`

### Date range limits

- Accepts dates up to 729 days in the future from the request date
- Accepts past date updates up to 1 day in the past (follows Central European Time (CET) timezone)
- Updates more than 1 day in the past return a `NOT_A_VALID_DATE` error


### Duplicate handling

The API does not accept duplicate date updates for the same room/rate/date/occupancy combination. The API returns a `WARN_DUPLICATE_DATES` warning if duplicates are detected.