# Rates

## What is Rates?

**Rates** is an update method where the SiteMinder Platform actively sends room pricing information to the booking channel. This integration ensures that the booking channel receive synchronized rate updates in real-time, maintaining accurate pricing and maximizing revenue opportunities.

The API supports two pricing models:

* **Per Day Pricing (PDP)**: Base rates are set for each individual day, allowing different prices on different days. Rate updates specify rates for each date within the defined range, enabling precise daily rate management.
* **Occupancy Based Pricing (OBP)**: Rates vary based on the number of occupants in the room. Rate updates include pricing for various occupancy levels (single, double, triple, etc.), providing detailed pricing based on the number of guests.

{% hint style="warning" %}
**Pricing Model Configuration**: The pricing model (PDP or OBP) is configured at the booking channel level and applies to all properties connected to your integration. You cannot have some properties using Per Day Pricing while others use Occupancy Based Pricing.

**For partners migrating from PDP to OBP**: Your channel must provide the **Maximum Occupancy** for each room and rate code combination via [Rooms and Rates](/siteconnect-api/reference/rooms-and-rates.md) for all connected properties. This data is required for an initial setup of the Maximum Occupancy values in our system.
{% endhint %}

## Integration Requirements

Understand the essential requirements for API integration, including connectivity, authentication, message formats, and security protocols.

<table data-header-hidden><thead><tr><th width="199.954833984375">Category</th><th>Requirement</th></tr></thead><tbody><tr><td><strong>Web Service Endpoint</strong></td><td><ul><li>The booking channel will provide a single global endpoint for all hotels for SiteMinder to push <code>OTA_HotelRateAmountNotifRQ</code> messages and receive <code>OTA_HotelRateAmountNotifRS</code> responses indicating success or failure.</li><li>The endpoint must use a registered domain name.</li><li>Direct IP addresses are not supported and cannot be used as endpoints.</li></ul></td></tr><tr><td><strong>Authentication</strong></td><td><ul><li>The booking channel will provide a single username/password for all hotels.</li><li>SiteMinder will include authentication credentials within the <strong>SOAP Security header</strong> of each <code>OTA_HotelRateAmountNotifRQ</code>.</li><li>Credentials must follow a strong password policy: minimum of 12 characters, including a mix of uppercase and lowercase letters, numbers, and at least one special character (e.g., <code>!</code> <code>@</code> <code>#</code> <code>?</code> <code>]</code>).</li><li>Do not use <code>&#x3C;</code> <code>></code> <code>&#x26;</code> <code>"</code> <code>'</code> as they can cause issues with the Web Service.</li></ul></td></tr><tr><td><strong>Message Structure</strong></td><td><ul><li>All messages must adhere to the SOAP message format.</li><li>OTA message must be encapsulated within the SOAP Body.</li><li>Requests must include a SOAP Security Header for authentication.</li><li>Responses must be returned in a SOAP envelope with empty SOAP Header.</li></ul></td></tr><tr><td><strong>Content-Type</strong></td><td><code>text/xml; charset=utf-8</code></td></tr><tr><td><strong>Version</strong></td><td><code>SOAP 1.1</code></td></tr><tr><td><strong>Protocol &#x26; Security</strong></td><td><ul><li>All communication must occur over <strong>HTTPS</strong> using <strong>TLS 1.2 or higher</strong>.</li><li>Non-secure (HTTP) connections are <strong>not permitted</strong>.</li><li>Communication is synchronous request/response pairs.</li><li>Each message is atomic - processed entirely or not at all.</li><li>SiteMinder sends requests over <strong>port 443</strong>.</li></ul></td></tr><tr><td><strong>IP Whitelisting</strong></td><td><p><strong>Pre-Production IP addresses:</strong><br></p><p><code>52.13.134.140</code></p><p><code>34.213.128.113</code></p><p><code>35.164.250.223</code><br><br><strong>Production IP addresses will be provided during go-live.</strong></p></td></tr></tbody></table>

## Message Exchange Flow

When SiteMinder needs to update room pricing, it sends updates to your booking channel using a synchronous SOAP/HTTPS exchange. Each update triggers a simple request-response cycle.

1. **Rates Update (SiteMinder to booking channel)**: `OTA_HotelRateAmountNotifRQ`\
   Delivers rate values for specific room types and rate plans across defined date ranges. Rates can be configured as Per Day Pricing (PDP) with fixed amounts, or Occupancy Based Pricing (OBP) with rates varying by guest count.
2. **Confirmation Response (booking channel to SiteMinder)**: `OTA_HotelRateAmountNotifRS`\
   Confirms successful receipt and processing or reports validation errors.

## Security Header

The Security Header is a mandatory SOAP header that authenticates every request from SiteMinder to your booking channel endpoint. It contains the username and password credentials that you provide to the SiteMinder during integration setup.

**Key Requirements:**

* **Validation**: Your endpoint will validate these credentials on every request.
* **Scope**: One set of credentials is used for all properties in your integration.
* **Security**: Credentials are transmitted as plain text within the HTTPS encrypted channel.
* **Response**: Invalid credentials will return a SOAP fault with appropriate error code.

{% tabs %}
{% tab title="Rates Update" %}
Requests must include a SOAP Security Header for authentication.

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header>
		<wsse:Security SOAP-ENV:mustUnderstand="1"
			xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
			<wsse:UsernameToken>
				<wsse:Username>USERNAME</wsse:Username>
				<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password>
			</wsse:UsernameToken>
		</wsse:Security>
	</SOAP-ENV:Header>
	<SOAP-ENV:Body>
		<OTA_HotelRateAmountNotifRQ
			xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
			<!-- ... other elements and attributes have been omitted for brevity ... -->
		</OTA_HotelRateAmountNotifRQ>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}

{% tab title="Confirmation Response" %}
Responses must be returned in a SOAP envelope with an empty SOAP Header.

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_HotelRateAmountNotifRS
			xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
			<Success/>
			<!-- ... other elements and attributes have been omitted for brevity ... -->
		</OTA_HotelRateAmountNotifRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}
{% endtabs %}

## Multiplicity

In the SOAP Specification tables below **M** refers to the number of instances or occurrences of an element or attribute that are allowed or required in a given context. It defines how many times a particular component (element or attribute) can appear within a specific structure.

<table><thead><tr><th width="94">M</th><th>Definition</th></tr></thead><tbody><tr><td><strong>1</strong></td><td>The element or attribute must be present exactly once.</td></tr><tr><td><strong>0..1</strong></td><td>The element or attribute is optional; it can be present zero or one time.</td></tr><tr><td><strong>0..n</strong></td><td>The element or attribute can be present zero or more times, with no upper limit (where <strong>n</strong> represents an infinite number of occurrences).</td></tr><tr><td><strong>1..n</strong></td><td>The element or attribute must be present at least once and can be present any number of times, with no upper limit.</td></tr><tr><td><strong>n..m</strong></td><td>Specific range, the element or attribute must be present at least <strong>n</strong> times and no more than <strong>m</strong> times (where <strong>n</strong> and <strong>m</strong> are specific numbers).</td></tr></tbody></table>

## **1. Rates Update**

Each Rate message contains a single `RateAmountMessages` element which indicates the hotel to update using the `RateAmountMessages` / `HotelCode` attribute. The `RateAmountMessages` / `RateAmountMessage` elements will contain the updates to process over a date range. There can be several `RateAmountMessage` updates per request, however, each request will be limited to one hotel and one room type.

### Per Day Pricing (PDP)

PDP refers to a pricing model where rates are set for each individual day. Under this model, the rate for a room type is determined on a daily basis, allowing for different prices on different days. The rate updates for PDP will specify rates for each date within the defined range, allowing for precise daily rate management. The below functionalities are supported:

* Rates <mark style="color:red;">\*</mark>
* Included Occupancy
* Single Guest Discount
* Extra Adult Rate
* Extra Child Rate
* Inclusions

{% tabs %}
{% tab title="Base Rates" %}
Example of a Rates XML that **does not** support any additional rate features.\
\
Note the absence of the **@NumberOfGuests** attribute. By default, SiteConnect assumes the **Included Occupancy** for incoming rates is set on the Booking Channel side.

**@NumberOfGuests** attribute is **ONLY** present if you're using our **Included Occupancy** and/or **Single Guest Discount** features and the hotel configures the Included Occupancy / Single Guest Discount value(s) within the 'Channel Settings' for your particular channel.

```xml
<OTA_HotelRateAmountNotifRQ xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2025-07-06T15:27:41+00:00" Version="1.0">
	<RateAmountMessages HotelCode="HOTELCODE">
		<RateAmountMessage>
			<StatusApplicationControl End="2025-10-05" InvTypeCode="SGL" RatePlanCode="BAR" Start="2025-10-05"/>
			<Rates>
				<Rate>
					<BaseByGuestAmts>
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="300.00" CurrencyCode="EUR"/> <!-- Base Rate -->
					</BaseByGuestAmts>
					<RateDescription>
						<Text>Contemporary 1 Bedroom Apartment with private balcony.</Text> <!-- Inclusions -->
					</RateDescription>
				</Rate>
			</Rates>
		</RateAmountMessage>
	</RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
```

{% endtab %}

{% tab title="Included Occupancy" %}
Once **Included Occupancy** is enabled, it will be a mandatory field for the hotelier to fill in while mapping the room. **@NumberOfGuests** attribute will be present indicating the base included occupancy for the rate.

```xml
<OTA_HotelRateAmountNotifRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2025-07-06T15:27:41+00:00" Version="1.0">
	<RateAmountMessages HotelCode="HOTELCODE">
		<RateAmountMessage>
			<StatusApplicationControl End="2025-10-05" InvTypeCode="SGL" RatePlanCode="BAR" Start="2025-10-05"/>
			<Rates>
				<Rate>
					<BaseByGuestAmts>
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="300.00" CurrencyCode="EUR" NumberOfGuests="3"/> <!-- Included Occupancy -->
					</BaseByGuestAmts>
					<RateDescription>
						<Text>Contemporary 1 Bedroom Apartment with private balcony.</Text> <!-- Inclusions -->
					</RateDescription>
				</Rate>
			</Rates>
		</RateAmountMessage>
	</RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
```

{% endtab %}

{% tab title="Single Guest Discount" %}
**@NumberOfGuests="1"** stands for a **'Single Guest Discount'** and does NOT represent **'Included Occupancy'**. the below XML only shows that 100 EUR discount is applied for a single guest occupancy, without specifying 'Included Occupancy' for this particular room rate.

The absence of **@NumberOfGuests** in one of BaseByGuestAmt elements indicates that the **'Included Occupancy'** feature is not supported.

```xml
<OTA_HotelRateAmountNotifRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2025-07-06T15:27:41+00:00" Version="1.0">
	<RateAmountMessages HotelCode="HOTELCODE">
		<RateAmountMessage>
			<StatusApplicationControl End="2025-10-05" InvTypeCode="SGL" RatePlanCode="BAR" Start="2025-10-05"/>
			<Rates>
				<Rate>
					<BaseByGuestAmts>
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="200.00" CurrencyCode="EUR" NumberOfGuests="1"/> <!-- Single Guest Discount -->
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="300.00" CurrencyCode="EUR"/> <!-- Base Rate -->
					</BaseByGuestAmts>
					<RateDescription>
						<Text>Contemporary 1 Bedroom Apartment with private balcony.</Text> <!-- Inclusions -->
					</RateDescription>
				</Rate>
			</Rates>
		</RateAmountMessage>
	</RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
```

{% endtab %}

{% tab title="Both Included Occ. and Single Gst Dsct" %}
Both fields, **Included Occupancy** and **Single Guest Discount fields** are enabled in SiteMinder for the hotel to add the values during the mapping.

```xml
<OTA_HotelRateAmountNotifRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2025-07-06T15:27:41+00:00" Version="1.0">
	<RateAmountMessages HotelCode="HOTELCODE">
		<RateAmountMessage>
			<StatusApplicationControl End="2025-10-05" InvTypeCode="SGL" RatePlanCode="BAR" Start="2025-10-05"/>
			<Rates>
				<Rate>
					<BaseByGuestAmts>
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="200.00" CurrencyCode="EUR" NumberOfGuests="1"/> <!-- Single Guest Discount -->
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="300.00" CurrencyCode="EUR" NumberOfGuests="3"/> <!-- Included Occupancy -->
					</BaseByGuestAmts>
					<RateDescription>
						<Text>Contemporary 1 Bedroom Apartment with private balcony.</Text> <!-- Inclusions -->
					</RateDescription>
				</Rate>
			</Rates>
		</RateAmountMessage>
	</RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
```

{% endtab %}

{% tab title="With Additional Guest Amounts" %}
These features can also be supported individually. For instance:

* If your channel supports **Extra Adult Rate only**, the XML would consist of a single AdditionalGuestAmount element containing @AgeQualifyingCode="10" (value for Adult).
* If your channel supports **Extra Child Rate only**, the XML would consist of a single AdditionalGuestAmount element containing @AgeQualifyingCode="8" (value for Child).

```xml
<OTA_HotelRateAmountNotifRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2025-07-06T15:27:41+00:00" Version="1.0">
	<RateAmountMessages HotelCode="HOTELCODE">
		<RateAmountMessage>
			<StatusApplicationControl End="2025-10-05" InvTypeCode="SGL" RatePlanCode="BAR" Start="2025-10-05"/>
			<Rates>
				<Rate>
					<BaseByGuestAmts>
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="300.00" CurrencyCode="EUR"/> <!-- Base Rate -->
					</BaseByGuestAmts>
					<AdditionalGuestAmounts>
						<AdditionalGuestAmount AgeQualifyingCode="10" Amount="100" CurrencyCode="EUR"/> <!-- Extra Adult Rate -->
						<AdditionalGuestAmount AgeQualifyingCode="8" Amount="50" CurrencyCode="EUR"/> <!-- Extra Child Rate -->
					</AdditionalGuestAmounts>
					<RateDescription>
						<Text>Contemporary 1 Bedroom Apartment with private balcony.</Text> <!-- Inclusions -->
					</RateDescription>
				</Rate>
			</Rates>
		</RateAmountMessage>
	</RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
```

{% endtab %}

{% tab title="All 4 Rate fields combined" %}

```xml
<OTA_HotelRateAmountNotifRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2025-07-06T15:27:41+00:00" Version="1.0">
	<RateAmountMessages HotelCode="HOTELCODE">
		<RateAmountMessage>
			<StatusApplicationControl End="2025-10-05" InvTypeCode="SGL" RatePlanCode="BAR" Start="2025-10-05"/>
			<Rates>
				<Rate>
					<BaseByGuestAmts>
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="200.00" CurrencyCode="EUR" NumberOfGuests="1"/><!-- Single Guest Discount -->
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="300.00" CurrencyCode="EUR" NumberOfGuests="3"/><!-- Included Occupancy -->
					</BaseByGuestAmts>
					<AdditionalGuestAmounts>
						<AdditionalGuestAmount AgeQualifyingCode="10" Amount="100" CurrencyCode="EUR"/> <!-- Extra Adult Rate -->
						<AdditionalGuestAmount AgeQualifyingCode="8" Amount="50" CurrencyCode="EUR"/> <!-- Extra Child Rate -->
					</AdditionalGuestAmounts>
					<RateDescription>
						<Text>Contemporary 1 Bedroom Apartment with private balcony.</Text> <!-- Inclusions -->
					</RateDescription>
				</Rate>
			</Rates>
		</RateAmountMessage>
	</RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
```

{% endtab %}
{% endtabs %}

### Occupancy Based Pricing (OBP)

OBP is a pricing model where rates vary based on the number of occupants in the room. Under this model, the rate changes depending on the number of guests staying in the room. The Rate updates for OBP will include rates for various occupancy levels, providing detailed pricing based on the number of guests. The below functionalities are supported:

* Rates <mark style="color:red;">\*</mark>
* Included Occupancy <mark style="color:red;">\*</mark>
* Maximum Occupancy <mark style="color:red;">\*</mark>
* Single Guest Discount \*
* Extra Adult Rate <mark style="color:red;">\*</mark>
* Extra Child Rate
* Inclusions

{% hint style="success" %}
**Default Included Occupancy**: If no Included Occupancy value is set by the property, the SiteMinder assumes a default included occupancy of 2 guests.
{% endhint %}

{% tabs %}
{% tab title="OBP Rates" %}
If **Occupancy Based Pricing** is enabled, the `AdditionalGuestAmount` for `AgeQualifyingCode=”10”` is no longer included in the XML.

`AdditionalGuestAmount` will only contain `AgeQualifyingCode=”8”` if your integration supports **Extra Child Rate**.

```xml
<OTA_HotelRateAmountNotifRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<RateAmountMessages HotelCode="HOTELCODE">
		<RateAmountMessage>
			<StatusApplicationControl End="2024-10-05" InvTypeCode="SGL" RatePlanCode="BAR" Start="2024-10-05"/>
			<Rates>
				<Rate>
					<BaseByGuestAmts>
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="100.00" CurrencyCode="EUR" NumberOfGuests="1"/>
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="200.00" CurrencyCode="EUR" NumberOfGuests="2"/>
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="300.00" CurrencyCode="EUR" NumberOfGuests="3"/>
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="400.00" CurrencyCode="EUR" NumberOfGuests="4"/>
						<!-- Additional BaseByGuestAmt elements -->
					</BaseByGuestAmts>
					<AdditionalGuestAmounts>
						<AdditionalGuestAmount AgeQualifyingCode="8" Amount="50" CurrencyCode="EUR"/> <!-- Extra Child Rate -->
					</AdditionalGuestAmounts>
					<RateDescription>
						<Text>Contemporary 1 Bedroom Apartment with private balcony.</Text> <!-- Inclusions -->
					</RateDescription>
				</Rate>
			</Rates>
		</RateAmountMessage>
	</RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
```

{% endtab %}

{% tab title="Undefined Settings" %}
**Uniform Rates for Undefined Settings**: If the property has not set values for Included Occupancy, Single Guest Discount, or Extra Adult Rate, the SiteMinder will apply the same rate for all occupancy levels.

```xml
<OTA_HotelRateAmountNotifRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<RateAmountMessages HotelCode="HOTELCODE">
		<RateAmountMessage>
			<StatusApplicationControl End="2024-10-05" InvTypeCode="SGL" RatePlanCode="BAR" Start="2024-10-05"/>
			<Rates>
				<Rate>
					<BaseByGuestAmts>
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="200.00" CurrencyCode="EUR" NumberOfGuests="1"/>
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="200.00" CurrencyCode="EUR" NumberOfGuests="2"/>
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="200.00" CurrencyCode="EUR" NumberOfGuests="3"/>
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="200.00" CurrencyCode="EUR" NumberOfGuests="4"/>
						<!-- Additional BaseByGuestAmt elements -->
					</BaseByGuestAmts>
					<AdditionalGuestAmounts>
						<AdditionalGuestAmount AgeQualifyingCode="8" Amount="50" CurrencyCode="EUR"/> <!-- Extra Child Rate -->
					</AdditionalGuestAmounts>
					<RateDescription>
						<Text>Contemporary 1 Bedroom Apartment with private balcony.</Text> <!-- Inclusions -->
					</RateDescription>
				</Rate>
			</Rates>
		</RateAmountMessage>
	</RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
```

{% endtab %}
{% endtabs %}

### Migrate from PDP to OBP <a href="#migrate-from-pdp-to-obp" id="migrate-from-pdp-to-obp"></a>

Existing partners transitioning from Per Day Pricing to Occupancy Based Pricing:

**Maximum Occupancy Requirement**: Your channel must provide the Maximum Occupancy for each room and rate code combination via `OTA_HotelAvailRS` for all connected properties. This data is required for an initial setup of the Maximum Occupancy values in our system.

**Migration Process**: The switch from PDP to OBP occurs **instantaneously for all properties** on your channel simultaneously. Your endpoint must support **both PDP and OBP message formats** to handle the cutover, potential rollbacks, and the verification period. Only disable PDP parsing after Partner Integrations confirms migration stability across all properties.

<table><thead><tr><th width="268">Element/Attribute</th><th width="108">Type</th><th width="60" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><code>OTA_HotelRateAmountNotifRS</code></td><td>Element</td><td align="center">1</td><td>Root element for the request.</td></tr><tr><td><code>@xmlns</code></td><td>String</td><td align="center">1</td><td>Defines the XML namespace for the request. Will be set to <code>http://www.opentravel.org/OTA/2003/05</code></td></tr><tr><td><code>@EchoToken</code></td><td>String</td><td align="center">1</td><td>Unique identifier for the request, used to match requests and responses.</td></tr><tr><td><code>@TimeStamp</code></td><td>DateTime</td><td align="center">1</td><td>Time when the request was generated.</td></tr><tr><td><code>@Version</code></td><td>String</td><td align="center">1</td><td>Specifies the API version. Will be set to <code>1.0</code>.</td></tr><tr><td><code>RateAmountMessages</code></td><td>Element</td><td align="center">1</td><td>Container for rate status messages.</td></tr><tr><td><code>@HotelCode</code></td><td>String</td><td align="center">1</td><td>Identifier for the hotel.</td></tr><tr><td><code>RateAmountMessage</code></td><td>Element</td><td align="center">1..n</td><td>Single rate status message.</td></tr><tr><td><code>StatusApplicationControl</code></td><td>Element</td><td align="center">1</td><td>Contains date and room identification information.</td></tr><tr><td><code>@Start</code></td><td>Date</td><td align="center">1</td><td>The start date for which the update is being set. This date is inclusive.</td></tr><tr><td><code>@End</code></td><td>Date</td><td align="center">1</td><td>The end date for which the update is being set. This date is inclusive.</td></tr><tr><td><code>@InvTypeCode</code></td><td>Integer</td><td align="center">1</td><td>Identifies the room.</td></tr><tr><td><code>@RatePlanCode</code></td><td>Element</td><td align="center">0..1</td><td>Identifies the rate.</td></tr><tr><td><code>Rates</code></td><td>String</td><td align="center">1</td><td>Container for rate information.</td></tr><tr><td><code>Rate</code></td><td>String</td><td align="center">1</td><td>Contains individual rate information.</td></tr><tr><td><code>BaseByGuestAmts</code></td><td>Element</td><td align="center">1</td><td>Base charge for a given number of guests.</td></tr><tr><td><code>BaseByGuestAmt</code></td><td>Element</td><td align="center">1..n</td><td>Contains individual rate amounts.</td></tr><tr><td><code>@AmountAfterTax</code></td><td>Decimal</td><td align="center">1</td><td>Positive decimal value for the rate amount after tax.</td></tr><tr><td><code>@NumberOfGuests</code></td><td>Integer</td><td align="center">0..1</td><td>Number of guests in the room. <strong>Mandatory for OBP</strong>.</td></tr><tr><td><code>@AgeQualifyingCode</code></td><td>Element</td><td align="center">0..1</td><td><p>Age qualification code for the rate:</p><p><code>10</code> Adult</p><p><strong>Mandatory for OBP</strong>.</p></td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">0..1</td><td>Use ISO 4217 currency codes.</td></tr><tr><td><code>AdditionalGuestAmounts</code></td><td>Element</td><td align="center">0..1</td><td>Additional charges for extra guests based on age qualification.</td></tr><tr><td><code>AdditionalGuestAmount</code></td><td>Element</td><td align="center">0..2</td><td>Contains details of extra guest charges.</td></tr><tr><td><code>@AgeQualifyingCode</code></td><td>String</td><td align="center">1</td><td><p>Age qualification code for the extra guest charge:</p><p><code>10</code> Adult (only for PDP)</p><p><code>8</code> Child</p></td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">1</td><td>Extra charge amount.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">0..1</td><td>Use ISO 4217 currency codes.</td></tr><tr><td><code>RateDescription</code></td><td>Element</td><td align="center">0..1</td><td>Description of what the rate includes.</td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">1</td><td>Inclusion text (maximum 255 characters).</td></tr></tbody></table>

## 2. **Confirmation Response**

{% tabs %}
{% tab title="Success" %}

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_HotelRateAmountNotifRS
			xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
			<Success/>
		</OTA_HotelRateAmountNotifRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}

{% tab title="Authentication Error" %}

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_HotelRateAmountNotifRS
			xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
			<Errors>
				<Error Type="4" Code="448">Invalid Username and/or Password</Error>
			</Errors>
		</OTA_HotelRateAmountNotifRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}

{% tab title="Incorrect HotelCode" %}

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_HotelRateAmountNotifRS
			xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
			<Errors>
				<Error Type="6" Code="392">Hotel not found for HotelCode=XXXXXX</Error>
			</Errors>
		</OTA_HotelRateAmountNotifRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}

{% tab title="Invalid Included Occupancy" %}

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_HotelRateAmountNotifRS
			xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
			<Errors>
				<Error Type="12" Code="137">Invalid included occupancy</Error>
			</Errors>
		</OTA_HotelRateAmountNotifRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_HotelRateAmountNotifRS
			xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
			<Errors>
				<Error Type="12" Code="137">Invalid included occupancy: expecting 2</Error>
			</Errors>
		</OTA_HotelRateAmountNotifRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}

{% tab title="Invalid number of adults" %}

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_HotelRateAmountNotifRS
			xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
			<Errors>
				<Error Type="12" Code="397">Invalid number of adults</Error>
			</Errors>
		</OTA_HotelRateAmountNotifRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_HotelRateAmountNotifRS
			xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
			<Errors>
				<Error Type="12" Code="397">Invalid number of adults: expecting 5</Error>
			</Errors>
		</OTA_HotelRateAmountNotifRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}
{% endtabs %}

<table><thead><tr><th width="269">Element / @Attribute</th><th width="108">Type</th><th width="59" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><code>OTA_HotelRateAmountNotifRS</code></td><td>Element</td><td align="center">1</td><td>Root element for the response.</td></tr><tr><td><code>@xmlns</code></td><td>String</td><td align="center">1</td><td>Defines the XML namespace for the request. Will be set to <code>http://www.opentravel.org/OTA/2003/05</code></td></tr><tr><td><code>@EchoToken</code></td><td>String</td><td align="center">1</td><td>Unique identifier for the request, used to match requests and responses.</td></tr><tr><td><code>@TimeStamp</code></td><td>DateTime</td><td align="center">1</td><td>Time when the response was generated.</td></tr><tr><td><code>@Version</code></td><td>String</td><td align="center">1</td><td>Specifies the API version. Must be set to <code>1.0</code>.</td></tr><tr><td><code>Success</code></td><td>Element</td><td align="center">0..1</td><td>Indicates successful processing of the request.</td></tr><tr><td><code>Errors</code></td><td>Element</td><td align="center">0..1</td><td>Indicates an error occurred during the processing of the request.</td></tr><tr><td><code>Error</code></td><td>Element</td><td align="center">1..n</td><td>Single error information containing free text.</td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td>Type of error. Refer to <a href="/pages/eTWh81Gq6djsnm0unSR4">Error Warning Types (EWT)</a>.</td></tr><tr><td><code>@Code</code></td><td>Integer</td><td align="center">0..1</td><td>Code representing the error. Refer to <a href="/pages/4gDxPCSFeyblWHTelhiH">Error Codes (ERR)</a>.</td></tr></tbody></table>

## Common Questions

<details>

<summary>What is the difference between Per Day Pricing (PDP) and Occupancy Based Pricing (OBP)?</summary>

**Per Day Pricing (PDP):**

* Rates set for each individual day
* Base rate applies to default occupancy (configured on booking channel)
* Optional Included Occupancy via `NumberOfGuests` attribute
* Extra guest charges via `AdditionalGuestAmounts` (both adults and children)
* Single Guest Discount shown as `NumberOfGuests="1"`

**Occupancy Based Pricing (OBP):**

* Rates vary based on number of guests
* Separate rate for **each occupancy level** from 1 to Maximum Occupancy
* `NumberOfGuests` attribute **mandatory** for all rates
* Extra Adult Rate **not used** (adult rates already included for each occupancy)
* Only Extra Child Rate in `AdditionalGuestAmounts`

**How to identify:**

* **PDP:** May have single `BaseByGuestAmt` or include `NumberOfGuests` for Included Occupancy
* **OBP:** Multiple consecutive `BaseByGuestAmt` elements (1, 2, 3, 4...) up to Maximum Occupancy

</details>

<details>

<summary>How often will I receive rate updates?</summary>

**Update Frequency:**

* Rate updates sent every **2 minutes** in coordination with ARI updates
* Only changed values for specific room/rate/date combinations are sent
* Maximum payload: **210 days** per message

**Important Dependency:** Rate updates are sent **after** successful processing of availability and restrictions. If availability/restriction updates fail, rate updates will be queued until resolved.

**Update Trigger:** When rates change, all rate components are included:

* Base rates for all occupancy levels (OBP) or base rate with optional Included Occupancy (PDP)
* Extra guest rates (if configured)
* Inclusions text (if configured)

</details>

<details>

<summary>Why am I receiving availability and restrictions updates but not rate updates?</summary>

This is **expected behaviour**. SiteConnect sends updates in a specific order:

**Update Sequence:**

1. **First:** Availability and Restrictions updates sent
2. **Then:** Rate updates sent **only after** successful availability/restrictions response

**Action:** Verify your endpoint is successfully processing and responding to availability/restrictions updates before expecting rate updates.

</details>

<details>

<summary>What does Included Occupancy mean?</summary>

**Included Occupancy** is the number of guests covered by the base rate.

**For PDP (Per Day Pricing):**

* Indicated by `NumberOfGuests` attribute on base rate element
* Example: `NumberOfGuests="2"` means base price covers 2 guests
* If more guests allowed, extra charges can be added via `AdditionalGuestAmounts`
* Single Guest Discount can be applied with `NumberOfGuests="1"`

**For OBP (Occupancy Based Pricing):**

* Every rate has `NumberOfGuests` attribute (mandatory)
* Each occupancy level (1, 2, 3...) has its own complete rate
* No "included occupancy" concept - each occupancy is explicitly priced

**Default Behavior:**

* **PDP:** If `NumberOfGuests` not present, booking channel uses its own default
* **OBP:** If hotel doesn't configure Included Occupancy, SiteMinder defaults to 2 guests as the base

</details>

<details>

<summary>What's the difference between NumberOfGuests="1" and Included Occupancy?</summary>

This depends on whether you're receiving PDP or OBP rates:

**In PDP Messages:**

* `NumberOfGuests="1"` = **Single Guest Discount** (reduced rate for solo travellers)
* `NumberOfGuests="2"` or higher = **Included Occupancy** (base rate for that number of guests)
* If only one `BaseByGuestAmt` without `NumberOfGuests` = base rate with no occupancy specification

**Example PDP with both:**

```xml
<BaseByGuestAmt NumberOfGuests="1" AmountAfterTax="200"/> <!-- Single Guest Discount -->
<BaseByGuestAmt NumberOfGuests="3" AmountAfterTax="300"/> <!-- Included Occupancy -->
```

This means: Rate for 1 guest is 200, rate for 3+ guests is 300, extra charges may apply for 4+ guests.

**In OBP Messages:**

* `NumberOfGuests="1"` = **Rate for 1 guest** (part of occupancy-based pricing)
* All occupancy levels explicitly provided (1, 2, 3, 4...)
* No "discount" concept - each occupancy has its own rate

**Example OBP:**

```xml
<BaseByGuestAmt NumberOfGuests="1" AmountAfterTax="100"/> <!-- Rate for 1 guest -->
<BaseByGuestAmt NumberOfGuests="2" AmountAfterTax="200"/> <!-- Rate for 2 guests -->
<BaseByGuestAmt NumberOfGuests="3" AmountAfterTax="300"/> <!-- Rate for 3 guests -->
```

</details>

<details>

<summary>What happens if the Maximum Occupancy in SiteMinder doesn't match my channel's settings?</summary>

You must return an **"Invalid number of adults"** error when there's a mismatch.

**Expected Behavior:**

* SiteMinder sends rates for 1 to Maximum Occupancy (consecutive)
* Number of `BaseByGuestAmt` elements = Maximum Occupancy value
* Your channel must validate this matches your configured Maximum Occupancy

**Error Response Examples:**

```xml
<Error Type="12" Code="397">Invalid number of adults</Error>
<!-- OR with expected value -->
<Error Type="12" Code="397">Invalid number of adults: expecting 5</Error>
```

**Impact of Mismatched Maximum Occupancy:**

* If hotel **reduces** max occupancy (5 to 4): Rates for 5 guests no longer sent, potentially causing booking issues for 5-guest reservations
* If hotel **increases** max occupancy (4 to 5): Your channel receives new rate for 5 guests

</details>

<details>

<summary>How many occupancy rates can I receive in an OBP message?</summary>

You will receive **one rate for each occupancy level** from 1 to the Maximum Occupancy.

**Number of Rates:**

* Determined by `MaxOccupancy` value provided in your Rooms and Rates response
* Valid range: 1 to 50
* Always consecutive: 1, 2, 3, 4... up to max

**Examples:**

* `MaxOccupancy="3"` → 3 rates (for 1, 2, and 3 guests)
* `MaxOccupancy="6"` → 6 rates (for 1, 2, 3, 4, 5, and 6 guests)

**Message Size Considerations:** Higher Maximum Occupancy values result in larger messages. Plan your parsing logic to handle up to 50 `BaseByGuestAmt` elements per rate update.

</details>

<details>

<summary>How does SiteConnect sync Extra Adult Rate, Extra Child Rate, and Single Guest Discount in an PDP?</summary>

**Sync Behavior:**

* These values are **rate plan level settings** (not date-specific)
* Once configured, a **full sync is sent** for the entire rate plan
* All dates for that room/rate combination receive the same extra guest rates and discount

**Update Trigger:**

* When hotel first configures these values
* When hotel changes these values
* During regular rate updates (included with base rates)

**In Messages:**

* **Extra Adult/Child Rates:** Sent in `AdditionalGuestAmounts` section
* **Single Guest Discount:** Sent as `BaseByGuestAmt` with `NumberOfGuests="1"`
* Applied across all dates in the message date range

**Example:** If a hotel sets Extra Adult Rate to 50 EUR for a rate plan, all future rate updates for that rate plan will include `<AdditionalGuestAmount AgeQualifyingCode="10" Amount="50" CurrencyCode="EUR"/>` regardless of the date range.

</details>

<details>

<summary>I added a Single Guest Discount and stopped receiving rate updates. Why?</summary>

This occurs when the Single Guest Discount results in a **negative rate**.

**Example Problem:**

* Base rate: 50 EUR
* Single Guest Discount: 60 EUR
* **Result:** 50 - 60 = **-10 EUR** (negative rate)

**System Behavior:**

* SiteMinder detects the negative rate
* Rate updates for that room-rate combination **stop being sent**
* Error prevents invalid pricing from reaching your channel

**Resolution:**

* Hotel must adjust the Single Guest Discount to be **less than** the base rate
* Once corrected, rate updates will resume

**Best practice:** Validate that Single Guest Discount ≤ Base Rate in your channel's hotel management interface

</details>

<details>

<summary>Are rates received from SiteConnect inclusive or exclusive of taxes?</summary>

All rates are sent in the `AmountAfterTax` attribute, but the **actual tax inclusion depends on hotel configuration**.

**What SiteConnect Sends:**

* Attribute: `AmountAfterTax` (always used)
* Value: Daily rate amount as configured by hotel
* No explicit tax flag to indicate inclusive vs. exclusive

**Common Practice:**

* Most hotels load **all-inclusive rates** (required by major channels like Booking.com, Expedia)
* Your channel can handle rates on your extranet as you see fit

**Critical:** Hotel must be informed and agree on how rates are interpreted

**Recommendation:**

* Document your channel's rate handling policy clearly
* Communicate this to hotels during onboarding
* Consider adding a toggle in your extranet if you support both models

</details>

<details>

<summary>We only support one currency. Can we work without receiving CurrencyCode?</summary>

Yes, you can request to have `CurrencyCode` disabled.

**Default Behavior:**

* SiteConnect sends `CurrencyCode` attribute by default
* Uses ISO 4217 currency codes (EUR, USD, GBP, etc.)
* Allows properties to select currency to send

**Single Currency Channels:**

* Request Partner Integrations team to disable `CurrencyCode`
* This is a **channel-level setting** (applies to all properties)
* Rate messages will be sent without the `CurrencyCode` attribute
* Your channel assumes your supported currency

**Multi-Currency Support:**

* If you support multiple currencies, keep `CurrencyCode` enabled
* Each hotel can configure their preferred currency in SiteMinder
* Only one currency per request (never mixed)

</details>

<details>

<summary>Will I receive both PDP and OBP messages during migration to Occupancy Based Pricing?</summary>

Yes, your channel must support both message formats during the migration period.

**Migration Switch:**

* PDP to OBP migration happens **simultaneously for all properties** on your channel
* The switch occurs **instantaneously** - all properties convert at once
* Your endpoint must process both PDP and OBP messages to ensure continuity

**Why Both Formats:**

* Handle the instantaneous cutover moment
* Support potential rollback to PDP if issues occur
* Maintain service during the verification period

**When to Disable PDP:** Only after SiteMinder Partner Integrations confirms:

* All properties successfully receiving OBP updates
* Verification period completed without issues
* Migration is stable with no rollback required

**How to Detect Format:**

* **OBP:** Multiple consecutive `BaseByGuestAmt` with `NumberOfGuests="1"`, `"2"`, `"3"`...
* **PDP:** Single or non-consecutive `BaseByGuestAmt` elements

</details>

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support/integration-support.md).
{% endhint %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://developer.siteminder.com/siteconnect-api/reference/rates.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
