## Requests

### Syntax

The `OTA_HotelRateAmountNotifRQ` message uses the following syntax:

    <?xml version="1.0" encoding="UTF-8"?>
    <OTA_HotelRateAmountNotifRQ xmlns="http://www.opentravel.org/OTA/2003/05"
                                EchoToken="message_ID"
                                TimeStamp="timestamp"
                                Version="3.0"
                                NotifType="[Overlay|Delta|Remove]"
                                NotifScopeType="[ProductRate]">
      <POS>
        <Source>
          <RequestorID ID="partner_key"/>
        </Source>
      </POS>
      <RateAmountMessages HotelCode="HotelID">
        <RateAmountMessage>
          <StatusApplicationControl Start="YYYY-MM-DD"
                                    End="YYYY-MM-DD"
                                    Mon="boolean_value"
                                    Tue="boolean_value"
                                    Weds="boolean_value"
                                    Thur="boolean_value"
                                    Fri="boolean_value"
                                    Sat="boolean_value"
                                    Sun="boolean_value"
                                    InvTypeCode="RoomID"
                                    RatePlanCode="PackageID"
                                    RatePlanType="[26]" />
          <Rates>
            <Rate>
              <BaseByGuestAmts>
                <BaseByGuestAmt AmountBeforeTax="float"
                                AmountAfterTax="float"
                                CurrencyCode="currency"
                                NumberOfGuests="integer"/>
              </BaseByGuestAmts>
              <AdditionalGuestAmounts>
                <AdditionalGuestAmount Amount="float"
                                       AgeQualifyingCode="[10|8]"
                                       MaxAge="integer"/>
              </AdditionalGuestAmounts>
            </Rate>
          </Rates>
        </RateAmountMessage>
      </RateAmountMessages>
    </OTA_HotelRateAmountNotifRQ>

> [!IMPORTANT]
> **Key Point:** It is recommended that you limit the size of `<RateAmountMessages>` to 5MB with a limit of 400 files per second upload rate.

### Elements and attributes

The `OTA_HotelRateAmountNotifRQ` message has the following elements and
attributes:

| Element / @Attribute | Occurrences | Type | Description |
|---|---|---|---|
| OTA_HotelRateAmountNotifRQ | 1 | Complex element | The root element for a rates message. |
| OTA_HotelRateAmountNotifRQ / @xmlns | 0..1 | string (URI) | The XML namespace. |
| OTA_HotelRateAmountNotifRQ / @EchoToken | 1 | string | A unique identifier for this request message. This value is returned in the response message. Allowed characters are `a-z`, `A-Z`, `0-9`, `_ (underscore)`, and `- (dash)`. |
| OTA_HotelRateAmountNotifRQ / @TimeStamp | 1 | [DateTime](https://developers.google.com/hotels/hotel-prices/xml-reference/datetime#DateTime) | The creation date and time of this message. |
| OTA_HotelRateAmountNotifRQ / @Version | 1 | decimal | The OpenTravel message version. |
| OTA_HotelRateAmountNotifRQ / @NotifType | 0..1 | enum | The type of notification to apply to every `<RateAmountMessage>`. Valid values are: To understand how these attributes work, check out the [examples](https://developers.google.com/hotels/hotel-prices/xml-reference/ari-rate#notiftype-examples). - `Overlay:` Delete all of the per-occupancy rates for the room type, rate plan, and dates specified in `<StatusApplicationControl>` and replace them with new rates. - `Remove:` Delete all of the existing per-occupancy rates for the room type, rate plan, and dates specified in `<StatusApplicationControl>`. - `Delta:` (the default if `NotifType` isn't specified) Add or update the existing per-occupancy rates for the room type, rate plan, and dates specified in `<StatusApplicationControl>`. |
| OTA_HotelRateAmountNotifRQ / @NotifScopeType | 0..1 | enum | The scope of the `NotifType` to apply to every `<RateAmountMessage>`. Valid values are: - `ProductRate:` (the default if `NotifScopeType` isn't specified) The `NotifType` applies to products---combinations of room type (`InvTypeCode`) and rate plan (`RatePlanCode`). |
| OTA_HotelRateAmountNotifRQ / POS | 0..1 | POS | A container for specifying the partner account for this message (typically used if your backend provides price feeds for multiple partner accounts). |
| OTA_HotelRateAmountNotifRQ / POS / Source | 1 | Source | Required if `<POS>` is present. A container for the `<RequestorID>`. |
| OTA_HotelRateAmountNotifRQ / POS / RequestorID | 1 | RequestorID | Required if `<POS>` is present. Defines the partner account. |
| OTA_HotelRateAmountNotifRQ / POS / RequestorID / @ID | 1 | string | The partner account for this message. This string value is the "Partner key" value listed on the [Account settings page](https://hotelcenter.google.com/accountsettings/basicsettings?a) in Hotel Center. **Note:** If you have a backend that provides feeds for multiple accounts, this value needs to match the `partner` attribute value of your Transaction (Property Data) message and the `ID` attribute value in the `<RequestorID>` element of your `<OTA_HotelAvailNotifRQ>` message for the same account. |
| OTA_HotelRateAmountNotifRQ / RateAmountMessages | 1 | RateAmountMessages | A collection of `<RateAmountMessage>` elements that define rates. |
| OTA_HotelRateAmountNotifRQ / RateAmountMessages / @HotelCode | 1 | string | The unique identifier for the property. This value must match the Hotel ID specified using [\<id\> in the \<listing\>](https://developers.google.com/hotels/hotel-prices/xml-reference/hotel-list-feed#listing) element in the Hotel List Feed. The Hotel ID is also listed in [Hotel Center](https://hotelcenter.google.com). |
| OTA_HotelRateAmountNotifRQ / RateAmountMessages / RateAmountMessage | 1..n | RateAmountMessage | A container for setting prices for a room rate (a room type and rate plan combination across a date range). |
| OTA_HotelRateAmountNotifRQ / RateAmountMessages / RateAmountMessage / StatusApplicationControl | 1 | StatusApplicationControl | Defines the date range, as well as the identifiers for the room type (`InvTypeCode`) and rate plan (`RatePlanCode`). |
| OTA_HotelRateAmountNotifRQ / RateAmountMessages / RateAmountMessage / StatusApplicationControl / @Start | 1 | [Date](https://developers.google.com/hotels/hotel-prices/xml-reference/datetime#Date) | The starting date (based on the property's time zone), inclusive, of the date range. |
| OTA_HotelRateAmountNotifRQ / RateAmountMessages / RateAmountMessage / StatusApplicationControl / @End | 1 | [Date](https://developers.google.com/hotels/hotel-prices/xml-reference/datetime#Date) | The ending date (based on the property's time zone), inclusive, of the date range. Must be equal or greater than the `start` value. If `start` and `end` are equal, the update applies to that date. Note that Google supports up to three years of data. |
| OTA_HotelRateAmountNotifRQ / RateAmountMessages / RateAmountMessage / StatusApplicationControl / @Mon | 0..1 | boolean | Set to `true` or `1` to explicitly include Mondays. If set to `true`, other days of the week that aren't explicitly set to `true` are excluded (in effect, they are filtered out from the dates within the `Start` and `End`). |
| OTA_HotelRateAmountNotifRQ / RateAmountMessages / RateAmountMessage / StatusApplicationControl / @Tue | 0..1 | boolean | Set to `true` or `1` to explicitly include Tuesdays. If set to `true`, other days of the week that aren't explicitly set to `true` are excluded (in effect, they are filtered out from the dates within the `Start` and `End`). |
| OTA_HotelRateAmountNotifRQ / RateAmountMessages / RateAmountMessage / StatusApplicationControl / @Weds | 0..1 | boolean | Set to `true` or `1` to explicitly include Wednesdays. If set to `true`, other days of the week that aren't explicitly set to `true` are excluded (in effect, they are filtered out from the dates within the `Start` and `End`). |
| OTA_HotelRateAmountNotifRQ / RateAmountMessages / RateAmountMessage / StatusApplicationControl / @Thur | 0..1 | boolean | Set to `true` or `1` to explicitly include Thursdays. If set to `true`, other days of the week that aren't explicitly set to `true` are excluded (in effect, they are filtered out from the dates within the `Start` and `End`). |
| OTA_HotelRateAmountNotifRQ / RateAmountMessages / RateAmountMessage / StatusApplicationControl / @Fri | 0..1 | boolean | Set to `true` or `1` to explicitly include Fridays. If set to `true`, other days of the week that aren't explicitly set to `true` are excluded (in effect, they are filtered out from the dates within the `Start` and `End`). |
| OTA_HotelRateAmountNotifRQ / RateAmountMessages / RateAmountMessage / StatusApplicationControl / @Sat | 0..1 | boolean | Set to `true` or `1` to explicitly include Saturdays. If set to `true`, other days of the week that aren't explicitly set to `true` are excluded (in effect, they are filtered out from the dates within the `Start` and `End`). |
| OTA_HotelRateAmountNotifRQ / RateAmountMessages / RateAmountMessage / StatusApplicationControl / @Sun | 0..1 | boolean | Set to `true` or `1` to explicitly include Sundays. If set to `true`, other days of the week that aren't explicitly set to `true` are excluded (in effect, they are filtered out from the dates within the `Start` and `End`). |
| OTA_HotelRateAmountNotifRQ / RateAmountMessages / RateAmountMessage / StatusApplicationControl / @InvTypeCode | 1 | string | The unique identifier for the inventory (room type). This value maps to `<RoomID>` in a Transaction (Property Data) message. |
| OTA_HotelRateAmountNotifRQ / RateAmountMessages / RateAmountMessage / StatusApplicationControl / @RatePlanCode | 1 | string | A unique identifier for the rate plan. This identifier maps to the `<PackageID>` in a Transaction (Property Data) message. The rate plan is further defined and referred to in `<StatusApplicationControl>` in both `<OTA_HotelRateAmountNotifRQ>` and `<OTA_HotelAvailNotifRQ>` messages. |
| OTA_HotelRateAmountNotifRQ / RateAmountMessages / RateAmountMessage / StatusApplicationControl / @RatePlanType | 0..1 | string | An identifier that indicates the type of ARI pricing model that applies to this pricing update. This should only be specified, using a value of `26`, when using the [LOS-based pricing model](https://developers.google.com/hotels/hotel-prices/dev-guide/ari-rate-message#los-based_pricing). Exclusion of this attribute indicates this is a [per-date pricing](https://developers.google.com/hotels/hotel-prices/dev-guide/ari-rate-message#per-date_pricing) update. |
| OTA_HotelRateAmountNotifRQ / RateAmountMessages / RateAmountMessage / Rates | 0..1 | Rates | Container for a collection of `<Rate>` elements. If `NotifType` is `"Remove"`, this element must not be specified. Otherwise, this element must be specified exactly once. |
| OTA_HotelRateAmountNotifRQ / RateAmountMessages / RateAmountMessage / Rates / Rate | 1 | Rate | Container for a collection of `<BaseByGuestAmts>` elements. |
| OTA_HotelRateAmountNotifRQ / RateAmountMessages / RateAmountMessage / Rates / Rate / @RateTimeUnit | 0..1 | String | The unit by which length of stay is specified. The only supported value is `"Day"`, meaning the length of stay will be specified in days. To use [LOS-based pricing](https://developers.google.com/hotels/hotel-prices/dev-guide/ari-rate-message#pricing_models), `RateTimeUnit` and `UnitMultiplier` must be specified. Otherwise, neither should be specified. |
| OTA_HotelRateAmountNotifRQ / RateAmountMessages / RateAmountMessage / Rates / Rate / @UnitMultiplier | 0..1 | Integer | The number of `RateTimeUnits` which compose the length of stay for this rate. For example, if `RateTimeUnits` value is `"Day"`, a `UnitMultiplier` of 5 indicates that the rate(s) specified under this `Rate` object apply to each night of a 5 night stay. The occupancy rate(s) specified under this `Rate` object will be multiplied by the `UnitMultiplier` (length of stay) to arrive at the total price for the stay. To use [LOS-based pricing](https://developers.google.com/hotels/hotel-prices/dev-guide/ari-rate-message#pricing_models), `RateTimeUnit` and `UnitMultiplier` must be specified. Otherwise, neither should be specified. |
| OTA_HotelRateAmountNotifRQ / RateAmountMessages / RateAmountMessage / Rates / Rate / BaseByGuestAmts | 1 | BaseByGuestAmts | Container for a collection of base charges. |
| OTA_HotelRateAmountNotifRQ / RateAmountMessages / RateAmountMessage / Rates / Rate / BaseByGuestAmts / BaseByGuestAmt | 1..n | BaseByGuestAmt | Specifies room prices in a specified currency. The price can be per-occupancy by using multiple `<BaseByGuestAmt>` elements, each with a different value for `NumberOfGuests`. Otherwise, the price is applicable for a maximum number of occupants defined by `NumberOfGuests`. |
| OTA_HotelRateAmountNotifRQ / RateAmountMessages / RateAmountMessage / Rates / Rate / BaseByGuestAmts / BaseByGuestAmt / @AmountBeforeTax | 0..1 | float | The daily price of the room rate before taxes and fees. Both `AmountBeforeTax` and `AmountAfterTax` can be specified. If `AmountBeforeTax` isn't specified, `AmountAfterTax` must be specified. If `AmountBeforeTax` is specified and `AmountAfterTax` isn't specified, then taxes and fees must be specified in a `<TaxFeeInfo>` message. If you are using promotions, the discount is applied to `AmountBeforeTax`; percentage discounts are also applied to `AmountAfterTax`. Since this does not work with some tax structures, we strongly recommend only specifying `AmountBeforeTax` here and using `<TaxFeeInfo>` to specify taxes and fees. |
| OTA_HotelRateAmountNotifRQ / RateAmountMessages / RateAmountMessage / Rates / Rate / BaseByGuestAmts / BaseByGuestAmt / @AmountAfterTax | 0..1 | float | The daily price of the room rate after including applicable taxes and fees. If `AmountAfterTax` is specified, separate per-property `<TaxFeeInfo>` messages don't need to be sent. This attribute can be used in combination with `AmountBeforeTax` to provide both base and total rates that can be shown to users in certain regions. **Warning:** If you are using promotions, we strongly recommend against using `AmountAfterTax` amounts. If you want to use discounts, specify taxes and fees by using the `<TaxFeeInfo>` message. Your discounts will then be applied to `AmountBeforeTax` amounts. **Note:** If `AmountBeforeTax` isn't specified, `AmountAfterTax` must be specified. |
| OTA_HotelRateAmountNotifRQ / RateAmountMessages / RateAmountMessage / Rates / Rate / BaseByGuestAmts / BaseByGuestAmt / @CurrencyCode | 1 | enum | The ISO 4217 (3) alpha character code for a specific monetary unit. Refer to the list of [supported currencies](https://developers.google.com/hotels/hotel-prices/dev-guide/currency-codes). |
| OTA_HotelRateAmountNotifRQ / RateAmountMessages / RateAmountMessage / Rates / Rate / BaseByGuestAmts / BaseByGuestAmt / @NumberOfGuests | 0..1 | integer | Maximum number of guests that can be accommodated by this rate. Defaults to 2 guests if not provided. Note that if `<AdditionalGuestAmounts>` contains charges for children, `NumberOfGuests` refers only to **adults** . If `<AdditionalGuestAmounts>` is unspecified, or does not contain charges for children, `NumberOfGuests` refers to the total number of occupants including both adults and children. |
| OTA_HotelRateAmountNotifRQ / RateAmountMessages / RateAmountMessage / Rates / Rate / AdditionalGuestAmounts | 0..1 | AdditionalGuestAmounts | Container for a collection of charges for additional guests. This syntax is useful if additional guest or child rates change based on the date. Consider using the more efficient `https://developers.google.com/hotels/hotel-prices/xml-reference/ari-extra-guest-charges` message if these amounts can be defined statically at the property level. Additional guest amounts are applied as follows: - They are applied on top of the base occupancy rate. The base occupancy rate is the highest occupancy rate, specified in `<BaseByGuestAmts>`, that is less than or equal to the number of adults in a user search. - They are applied as long as the occupancy in a user search is within the room's capacity. - `<AdditionalGuestAmounts>` always replace previously specified additional amounts with new ones when the `NotifType` is either **Delta** or **Overlay**. - `<AdditionalGuestAmounts>` may be sent independently of base rates only when `NotifType` is **Delta** . `<BaseByGuestAmts>`must be specified when `NotifType` is `Overlay`. - An empty `<AdditionalGuestAmounts>` element with `NotifType` set to `Delta` removes existing additional amounts without affecting base rates. - They are applied using the currency specified in `<BaseByGuestAmt>`. For example, suppose that base rates are specified for 1 and 2 adults. - If a user searches for 3 adults, the double occupancy rate would be selected as the base rate, and an additional guest amount for 1 adult would be applied on top of it. - If the user searches for 1 adult and 2 children, the single occupancy rate would be selected as the base rate, and additional amounts would be applied on top of it, for the two children. |
| OTA_HotelRateAmountNotifRQ / RateAmountMessages / RateAmountMessage / Rates / Rate / AdditionalGuestAmounts / AdditionalGuestAmount | 0..n | AdditionalGuestAmount | Specifies prices based on the type of guest, specified through `AgeQualifyingCode` and, if applicable, the guest's age specified through `MaxAge`. |
| OTA_HotelRateAmountNotifRQ / RateAmountMessages / RateAmountMessage / Rates / Rate / AdditionalGuestAmounts / AdditionalGuestAmount / @AgeQualifyingCode | 1 | enum | Defines the type of additional guest, either adult or child. Valid options are: - `10:` Adult. - `8:` Child. `AgeQualifyingCode` can be set to `10` for at most one `AdditionalGuestAmount` element. `MaxAge` must be specified when `AgeQualifyingCode` is `8`. |
| OTA_HotelRateAmountNotifRQ / RateAmountMessages / RateAmountMessage / Rates / Rate / AdditionalGuestAmounts / AdditionalGuestAmount / @MaxAge | 0..1 | integer | `MaxAge` must be specified when `AgeQualifyingCode` is `8`. It must not be specified when `AgeQualifyingCode` is `10`. `MaxAge` should be an integer between `0` and `17.` Specifying a value of `0` disables child occupants. Values greater than `17` will be treated as the maximum accepted value of `17`. Multiple child age ranges can be specified through separate `AdditionalGuestAmount` elements. Age ranges must be contiguous and non-overlapping. |
| OTA_HotelRateAmountNotifRQ / RateAmountMessages / RateAmountMessage / Rates / Rate / AdditionalGuestAmounts / AdditionalGuestAmount / @Amount | 1 | float | Amount before taxes and fees added to the base rate for each additional guest. Taxes and fees that depend on occupants' ages must be specified through the `<AgeBrackets>` element in a `<TaxFeeInfo>` message. |

### Examples

This section provides code examples that highlight how to:

- [Set up base rates and total rates](https://developers.google.com/hotels/hotel-prices/xml-reference/ari-rate#setup-examples)
- [Add, overlay, and remove rates](https://developers.google.com/hotels/hotel-prices/xml-reference/ari-rate#notiftype-examples)
- [Add, overlay, and remove additional guest amounts](https://developers.google.com/hotels/hotel-prices/xml-reference/ari-rate#additional-guest-examples)
- [Set up LOS-based rates](https://developers.google.com/hotels/hotel-prices/xml-reference/ari-rate#los-examples)
- [Add, overlay, and remove LOS-based rates](https://developers.google.com/hotels/hotel-prices/xml-reference/ari-rate#notiftype-los-examples)

> [!IMPORTANT]
> **Key Point:** Use `StatusApplicationControl` to set per-occupancy rates for the room type, rate plan, and date range (with a limit of three years). You can set `NotifType` to `Delta` to add or update these existing per-occupancy rates (and target specific dates).

When you set the `add`, `overlay`, or `remove` values, the date ranges can
the same or different depending on your goals. For example, you can use
`overlay` to set only a few weeks for the December holidays rather than the
entire range set for the "Add rate" message. This will replace the occupancy
rates for only this period.

#### Per-date pricing

For a given room and rate plan there can be a maximum of 50 occupancy rates per
property. If the rates are same for all occupancies, you should just send the
maximum occupancies with the required price. By doing this, Google infers that
the lower occupancies also receives the same base rate.

##### Set up base rates and total rates

### Example 1

Base rate (without taxes or fees) for default occupancy (double). In this
model, taxes and fees for the property must be defined using a
`<TaxFeeInfo>` message. The base rate will be more
prominent for users searching from certain regions.

```
<?xml version="1.0" encoding="UTF-8"?>
<OTA_HotelRateAmountNotifRQ xmlns="http://www.opentravel.org/OTA/2003/05"
                            EchoToken="12345678"
                            TimeStamp="2020-05-19T20:50:37-05:00"
                            Version="3.0">
  <RateAmountMessages HotelCode="Property_1">
    <RateAmountMessage>
      <StatusApplicationControl Start="2020-05-18"
                                End="2020-05-23"
                                InvTypeCode="RoomID_1"
                                RatePlanCode="PackageID_1"/>
      <Rates>
        <Rate>
          <BaseByGuestAmts>
            <BaseByGuestAmt AmountBeforeTax="100.00"
                            CurrencyCode="USD"/>
          </BaseByGuestAmts>
        </Rate>
      </Rates>
    </RateAmountMessage>
  </RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
```

### Example 2

Base and total rate for default occupancy (double). In this model, taxes
and fees shouldn't be defined separately using `<TaxFeeInfo>`
messages. The base rate will be more prominent for users searching from
certain regions.

```
<?xml version="1.0" encoding="UTF-8"?>
<OTA_HotelRateAmountNotifRQ xmlns="http://www.opentravel.org/OTA/2003/05"
                            EchoToken="12345678"
                            TimeStamp="2020-05-19T20:50:37-05:00"
                            Version="3.0">
  <RateAmountMessages HotelCode="Property_1">
    <RateAmountMessage>
      <StatusApplicationControl Start="2020-05-18"
                                End="2020-05-23"
                                InvTypeCode="RoomID_1"
                                RatePlanCode="PackageID_1"/>
      <Rates>
        <Rate>
          <BaseByGuestAmts>
            <BaseByGuestAmt AmountBeforeTax="100.00"
                            AmountAfterTax="110.00"
                            CurrencyCode="USD"/>
          </BaseByGuestAmts>
        </Rate>
      </Rates>
    </RateAmountMessage>
  </RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
```

### Example 3

Total rate (with taxes and fees) for multiple occupancies. In this model,
taxes and fees shouldn't be defined separately using `<TaxFeeInfo>`
messages.

```
<?xml version="1.0" encoding="UTF-8"?>
<OTA_HotelRateAmountNotifRQ xmlns="http://www.opentravel.org/OTA/2003/05"
                            EchoToken="12345678"
                            TimeStamp="2020-05-19T20:50:37-05:00"
                            Version="3.0">
  <RateAmountMessages HotelCode="Property_1">
    <RateAmountMessage>
      <StatusApplicationControl Start="2020-05-18"
                                End="2020-05-23"
                                InvTypeCode="RoomID_1"
                                RatePlanCode="PackageID_1"/>
      <Rates>
        <Rate>
          <BaseByGuestAmts>
            <BaseByGuestAmt AmountAfterTax="100.00"
                            CurrencyCode="USD"
                            NumberOfGuests="1"/>
            <BaseByGuestAmt AmountAfterTax="110.00"
                            CurrencyCode="USD"
                            NumberOfGuests="2"/>
            <BaseByGuestAmt AmountAfterTax="120.00"
                            CurrencyCode="USD"
                            NumberOfGuests="3"/>
          </BaseByGuestAmts>
        </Rate>
      </Rates>
    </RateAmountMessage>
  </RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
```

### Example 4

Base and total rate for multiple room types and rate plans across
different date ranges.

```
<?xml version="1.0" encoding="UTF-8"?>
<OTA_HotelRateAmountNotifRQ xmlns="http://www.opentravel.org/OTA/2003/05"
                            EchoToken="12345678"
                            TimeStamp="2020-05-19T20:50:37-05:00"
                            Version="3.0">
  <RateAmountMessages HotelCode="Property_1">
    <RateAmountMessage>
      <StatusApplicationControl Start="2020-05-18"
                                End="2020-05-23"
                                InvTypeCode="RoomID_1"
                                RatePlanCode="PackageID_1"/>
      <Rates>
        <Rate>
          <BaseByGuestAmts>
            <BaseByGuestAmt AmountBeforeTax="100.00"
                            AmountAfterTax="110.00"
                            CurrencyCode="USD"
                            NumberOfGuests="2"/>
          </BaseByGuestAmts>
        </Rate>
      </Rates>
    </RateAmountMessage>
    <RateAmountMessage>
      <StatusApplicationControl Start="2020-05-01"
                                End="2020-05-31"
                                InvTypeCode="RoomID_2"
                                RatePlanCode="PackageID_2"/>
      <Rates>
        <Rate>
          <BaseByGuestAmts>
            <BaseByGuestAmt AmountBeforeTax="200.00"
                            AmountAfterTax="220.00"
                            CurrencyCode="USD"
                            NumberOfGuests="2"/>
          </BaseByGuestAmts>
        </Rate>
      </Rates>
    </RateAmountMessage>
  </RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
```

##### Add, overlay, and remove rates

There is a limit of 5000 products---room type and package
combinations--- per property. Use the `Overlay` or `Remove` notification
types to remove previously defined products.

### Add rates

Set `NotifType` to `Delta` to add per-occupancy rates for
RoomID_1 and PackageID_1 between 2021-10-20 and 2021-12-31. Note that
Google supports up to three years of data.

```
<?xml version="1.0" encoding="UTF-8"?>
<OTA_HotelRateAmountNotifRQ xmlns="http://www.opentravel.org/OTA/2003/05"
                            EchoToken="12345678"
                            TimeStamp="2021-10-20T20:50:37-05:00"
                            Version="3.0"
                            NotifType="Delta"
                            NotifScopeType="ProductRate">
  <RateAmountMessages HotelCode="Property_1">
    <RateAmountMessage>
      <StatusApplicationControl Start="2021-10-20"
                                End="2021-12-31"
                                InvTypeCode="RoomID_1"
                                RatePlanCode="PackageID_1"/>
      <Rates>
        <Rate>
          <BaseByGuestAmts>
            <BaseByGuestAmt AmountBeforeTax="100.00"
                            CurrencyCode="USD"
                            NumberOfGuests="1"/>
            <BaseByGuestAmt AmountBeforeTax="110.00"
                            CurrencyCode="USD"
                            NumberOfGuests="2"/>
            <BaseByGuestAmt AmountBeforeTax="120.00"
                            CurrencyCode="USD"
                            NumberOfGuests="3"/>
          </BaseByGuestAmts>
        </Rate>
      </Rates>
    </RateAmountMessage>
  </RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
```

### Overlay rates

Set `NotifType` to `Overlay` to delete all per-occupancy
rates for RoomID_1 and PackageID_1 between 2021-10-20 and 2021-12-31
and replace them with the newly specified per-occupancy rates.

For example, if this message was sent after the "Add rates" message, the
occupancy 1, 2, and 3 rates would be deleted, and only the new occupancy 1
rate would be stored. You can also set a shorter date range
(e.g.: 2021-12-20 and 2021-12-31) to replace only some of the occupancy
rates on certain dates, such as for holidays.

```
<?xml version="1.0" encoding="UTF-8"?>
<OTA_HotelRateAmountNotifRQ xmlns="http://www.opentravel.org/OTA/2003/05"
                            EchoToken="12345678"
                            TimeStamp="2021-10-20T20:50:37-05:00"
                            Version="3.0"
                            NotifType="Overlay"
                            NotifScopeType="ProductRate">
  <RateAmountMessages HotelCode="Property_1">
    <RateAmountMessage>
      <StatusApplicationControl Start="2021-10-20"
                                End="2021-12-31"
                                InvTypeCode="RoomID_1"
                                RatePlanCode="PackageID_1"/>
      <Rates>
        <Rate>
          <BaseByGuestAmts>
            <BaseByGuestAmt AmountBeforeTax="200.00"
                            CurrencyCode="USD"
                            NumberOfGuests="1"/>
          </BaseByGuestAmts>
        </Rate>
      </Rates>
    </RateAmountMessage>
  </RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
```

### Remove rates

Set `NotifType` to `Remove`to delete all per-occupancy
rates for RoomID_1 and PackageID_1 between 2021-10-20 and 2021-12-31.

For example, if this message was sent after either of the other example
messages, no per-occupancy rates would be stored.

```
<?xml version="1.0" encoding="UTF-8"?>
<OTA_HotelRateAmountNotifRQ xmlns="http://www.opentravel.org/OTA/2003/05"
                            EchoToken="12345678"
                            TimeStamp="2021-10-20T20:50:37-05:00"
                            Version="3.0"
                            NotifType="Remove"
                            NotifScopeType="ProductRate">>
  <RateAmountMessages HotelCode="Property_1">
    <RateAmountMessage>
      <StatusApplicationControl Start="2021-10-20"
                                End="2021-12-31"
                                InvTypeCode="RoomID_1"
                                RatePlanCode="PackageID_1"/>
    </RateAmountMessage>
  </RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
```

##### Add, overlay, and remove additional guest amounts

### Add amounts

Set `NotifType` to `Delta` to add base rates for
occupancy 1 and 2, and additional guest amounts, for RoomID_1 and
PackageID_1 between 2021-10-20 and 2021-12-31.

Additional guest amounts will be applied on top of a base rate which will
be determined by the occupancy in a user search. The user specified
occupancy must be within RoomID_1's capacity.

In this example, additional guest amounts will be applied as:

- $5 for children in the age range 0 to 10 (inclusive).
- $10 for children in the age range 11 to 17 (inclusive).
- $20 for adults.

```
<?xml version="1.0" encoding="UTF-8"?>
<OTA_HotelRateAmountNotifRQ xmlns="http://www.opentravel.org/OTA/2003/05"
                            EchoToken="12345678"
                            TimeStamp="2021-10-20T20:50:37-05:00"
                            Version="3.0"
                            NotifType="Delta"
                            NotifScopeType="ProductRate">
  <RateAmountMessages HotelCode="Property_1">
    <RateAmountMessage>
      <StatusApplicationControl Start="2021-10-20"
                                End="2021-12-31"
                                InvTypeCode="RoomID_1"
                                RatePlanCode="PackageID_1"/>
      <Rates>
        <Rate>
          <BaseByGuestAmts>
            <BaseByGuestAmt AmountBeforeTax="100.00"
                            CurrencyCode="USD"
                            NumberOfGuests="1"/>
            <BaseByGuestAmt AmountBeforeTax="110.00"
                            CurrencyCode="USD"
                            NumberOfGuests="2"/>
          </BaseByGuestAmts>
          <AdditionalGuestAmounts>
            <AdditionalGuestAmount Amount="5.00" AgeQualifyingCode="8" MaxAge="10" />
            <AdditionalGuestAmount Amount="10.00" AgeQualifyingCode="8" MaxAge="17" />
            <AdditionalGuestAmount Amount="20.00" AgeQualifyingCode="10" />
          </AdditionalGuestAmounts>
        </Rate>
      </Rates>
    </RateAmountMessage>
  </RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
```

### Overlay amounts

Set `NotifType` to `Overlay` to delete all per-occupancy
rates and all additional guest amounts for RoomID_1 and PackageID_1
between 2021-10-20 and 2021-12-31 and replace them with the newly
specified per-occupancy rates and additional amounts.

For example, if this message was sent after the "Add rates" message, the
base occupancy 1 and 2 rates would be deleted, and only the new base
occupancy 1 rate would be stored. The previous set of additional guest
amounts would be deleted, and only the new set of amounts would be stored.
Additional guest amounts would now use the new occupancy 1 rate as the
base rate. Note that after this update, there are no additional guest
charges defined for children.

```
<?xml version="1.0" encoding="UTF-8"?>
<OTA_HotelRateAmountNotifRQ xmlns="http://www.opentravel.org/OTA/2003/05"
                            EchoToken="12345678"
                            TimeStamp="2021-10-20T20:50:37-05:00"
                            Version="3.0"
                            NotifType="Overlay"
                            NotifScopeType="ProductRate">
  <RateAmountMessages HotelCode="Property_1">
    <RateAmountMessage>
      <StatusApplicationControl Start="2021-10-20"
                                End="2021-12-31"
                                InvTypeCode="RoomID_1"
                                RatePlanCode="PackageID_1"/>
      <Rates>
        <Rate>
          <BaseByGuestAmts>
            <BaseByGuestAmt AmountBeforeTax="200.00"
                            CurrencyCode="USD"
                            NumberOfGuests="1"/>
          </BaseByGuestAmts>
          <AdditionalGuestAmounts>
            <AdditionalGuestAmount Amount="30.00" AgeQualifyingCode="10" />
          </AdditionalGuestAmounts>
        </Rate>
      </Rates>
    </RateAmountMessage>
  </RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
```

### Remove amounts

Set `NotifType` to `Delete` to delete all per-occupancy
base rates, and all additional guest amounts for RoomID_1 and PackageID_1
between 2021-10-20 and 2021-12-31.

For example, if this message was sent after either of the other example
messages, no per-occupancy base rates, or additional guest amounts would
be stored.

```
<?xml version="1.0" encoding="UTF-8"?>
<OTA_HotelRateAmountNotifRQ xmlns="http://www.opentravel.org/OTA/2003/05"
                            EchoToken="12345678"
                            TimeStamp="2021-10-20T20:50:37-05:00"
                            Version="3.0"
                            NotifType="Remove"
                            NotifScopeType="ProductRate">>
  <RateAmountMessages HotelCode="Property_1">
    <RateAmountMessage>
      <StatusApplicationControl Start="2021-10-20"
                                End="2021-12-31"
                                InvTypeCode="RoomID_1"
                                RatePlanCode="PackageID_1"/>
    </RateAmountMessage>
  </RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
```

### Remove only additional guest amounts

Set `NotifType` to `Delta` with an empty
`<AdditionalGuestAmounts>` element to delete all
additional guest amounts for RoomID_1 and PackageID_1 without affecting
base rates between 2021-10-20 and 2021-12-31.

For example, if this message was sent after either of the other example
messages, only the base amounts would be stored.

```
<?xml version="1.0" encoding="UTF-8"?>
<OTA_HotelRateAmountNotifRQ xmlns="http://www.opentravel.org/OTA/2003/05"
                            EchoToken="12345678"
                            TimeStamp="2021-10-20T20:50:37-05:00"
                            Version="3.0"
                            NotifType="Delta"
                            NotifScopeType="ProductRate">
  <RateAmountMessages HotelCode="Property_1">
    <RateAmountMessage>
      <StatusApplicationControl Start="2021-10-20"
                                End="2021-12-31"
                                InvTypeCode="RoomID_1"
                                RatePlanCode="PackageID_1"/>
      <Rates>
        <Rate>
          <AdditionalGuestAmounts/>
        </Rate>
      </Rates>
    </RateAmountMessage>
  </RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
```

#### LOS-based pricing

##### Set up LOS-based rates

### Example 1

Set rates for 1, 2, and 3 night stays starting on 2020-05-18. The
total rate for 1, 2 and 3 night stays in this example would be $100,
$180 and $240 respectively.

```
<?xml version="1.0" encoding="UTF-8"?>
<OTA_HotelRateAmountNotifRQ xmlns="http://www.opentravel.org/OTA/2003/05"
                            EchoToken="12345678"
                            TimeStamp="2020-05-19T20:50:37-05:00"
                            Version="3.0">
  <RateAmountMessages HotelCode="Property_1">
    <RateAmountMessage>
      <StatusApplicationControl Start="2020-05-18"
                                End="2020-05-18"
                                InvTypeCode="RoomID_1"
                                RatePlanCode="PackageID_1"
                                RatePlanType="26"/>
      <Rates>
        <Rate UnitMultiplier="1" RateTimeUnit="Day">
          <BaseByGuestAmts>
            <BaseByGuestAmt AmountBeforeTax="100.00"
                            CurrencyCode="USD"
                            NumberOfGuests="2"/>
          </BaseByGuestAmts>
        </Rate>
        <Rate UnitMultiplier="2" RateTimeUnit="Day">
          <BaseByGuestAmts>
            <BaseByGuestAmt AmountBeforeTax="90.00"
                            CurrencyCode="USD"
                            NumberOfGuests="2"/>
          </BaseByGuestAmts>
        </Rate>
        <Rate UnitMultiplier="3" RateTimeUnit="Day">
          <BaseByGuestAmts>
            <BaseByGuestAmt AmountBeforeTax="80.00"
                            CurrencyCode="USD"
                            NumberOfGuests="2" />
          </BaseByGuestAmts>
        </Rate>
      </Rates>
    </RateAmountMessage>
  </RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
```

> [!NOTE]
> **Note:** For a single hotel, you shouldn't send rates using both the LOS-based method and the ARI Nightly method (OTA_HotelRateAmountNotifRQ message). The best practice is to use one method for all hotels per Hotel Center account instead of using different pricing methods for different hotels. Doing this helps you avoid problems and makes troubleshooting and debugging easier.

##### Add, overlay, and remove LOS-based rates

### Add length(s) of stay

With LOS-based pricing, a `Delta` operation allows rates to be
incrementally updated for the check-in date ranges indicated in
`<StatusApplicationControl>` and for all lengths of stay
indicated by each child `Rate` element's
`UnitMultiplier`.

For each applicable check-in date and length of stay, all occupancy
rates must be specified.

```
<?xml version="1.0" encoding="UTF-8"?>
<OTA_HotelRateAmountNotifRQ xmlns="http://www.opentravel.org/OTA/2003/05"
                            EchoToken="12345678"
                            TimeStamp="2020-05-19T20:50:37-05:00"
                            Version="3.0"
                            NotifType="Delta"
                            NotifScopeType="ProductRate">
  <RateAmountMessages HotelCode="Property_1">
    <RateAmountMessage>
      <StatusApplicationControl Start="2020-05-18"
                                End="2020-05-18"
                                InvTypeCode="RoomID_1"
                                RatePlanCode="PackageID_1"
                                RatePlanType="26"/>
      <Rates>
        <Rate UnitMultiplier="3" RateTimeUnit="Day">
          <BaseByGuestAmts>
            <BaseByGuestAmt AmountBeforeTax="80.00"
                            CurrencyCode="USD"
                            NumberOfGuests="2"/>
          </BaseByGuestAmts>
        </Rate>
      </Rates>
    </RateAmountMessage>
  </RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
```

### Overlay length(s) of stay

With LOS-based pricing, an `Overlay` operation
replaces the rates for all lengths of stay of the product and check-in date
range indicated in `<StatusApplicationControl>`.

With this message, per-occupancy rates for all lengths of stay on the
specified arrival dates will be removed and replaced by a double-occupancy
rate that is only defined for length of stay 3.

```
<?xml version="1.0" encoding="UTF-8"?>
<OTA_HotelRateAmountNotifRQ xmlns="http://www.opentravel.org/OTA/2003/05"
                            EchoToken="12345678"
                            TimeStamp="2020-05-19T20:50:37-05:00"
                            Version="3.0"
                            NotifType="Overlay"
                            NotifScopeType="ProductRate">
  <RateAmountMessages HotelCode="Property_1">
    <RateAmountMessage>
      <StatusApplicationControl Start="2020-05-18"
                                End="2020-05-18"
                                InvTypeCode="RoomID_1"
                                RatePlanCode="PackageID_1"
                                RatePlanType="26"/>
      <Rates>
        <Rate UnitMultiplier="3" RateTimeUnit="Day">
          <BaseByGuestAmts>
            <BaseByGuestAmt AmountBeforeTax="80.00"
                            CurrencyCode="USD"
                            NumberOfGuests="2"/>
          </BaseByGuestAmts>
        </Rate>
      </Rates>
    </RateAmountMessage>
  </RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
```

### Remove length(s) of stay

With LOS-based pricing, a `Remove` operation removes the rates
for all lengths of stay of the product and check-in date range indicated in
`<StatusApplicationControl>`.

```
<?xml version="1.0" encoding="UTF-8"?>
<OTA_HotelRateAmountNotifRQ xmlns="http://www.opentravel.org/OTA/2003/05"
                            EchoToken="12345678"
                            TimeStamp="2021-10-20T20:50:37-05:00"
                            Version="3.0"
                            NotifType="Remove"
                            NotifScopeType="ProductRate">
  <RateAmountMessages HotelCode="Property_1">
    <RateAmountMessage>
      <StatusApplicationControl Start="2021-10-20"
                                End="2021-12-31"
                                InvTypeCode="RoomID_1"
                                RatePlanCode="PackageID_1"
                                RatePlanType="26"/>
    </RateAmountMessage>
  </RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
```

## Responses

### Syntax

The `OTA_HotelRateAmountNotifRS` message uses the following syntax:

    <?xml version="1.0" encoding="UTF-8"?>
    <OTA_HotelRateAmountNotifRS xmlns="http://www.opentravel.org/OTA/2003/05"
                                TimeStamp="timestamp"
                                EchoToken="echo_token"
                                Version="3.0">
      <!-- Either Success or Errors will be populated. -->
      <Success/>
      <Errors>
        <Error Type="12" Status="NotProcessed" ShortText="issue_code">issue_description</Error>
      </Errors>
    </OTA_HotelRateAmountNotifRS>

### Elements and attributes

The `OTA_HotelRateAmountNotifRS` message has the following
elements and attributes:

| Element / @Attribute | Occurrences | Type | Description |
|---|---|---|---|
| OTA_HotelRateAmountNotifRS | 1 | Complex element | The root element for a response to an availability message. |
| OTA_HotelRateAmountNotifRS / @TimeStamp | 1 | [DateTime](https://developers.google.com/hotels/hotel-prices/xml-reference/datetime#DateTime) | The creation date and time of this message. |
| OTA_HotelRateAmountNotifRS / @EchoToken | 1 | string | The unique identifier from the associated `OTA_HotelRateAmountNotifRQ` message. |
| OTA_HotelRateAmountNotifRS / Success | 0..1 | Success | Indicates that the `OTA_HotelRateAmountNotifRQ` message was processed successfully. Either `<Success>` or `<Errors>` is present in each message. |
| OTA_HotelRateAmountNotifRS / Errors | 0..1 | Errors | A container for one or more issues encountered while processing the `OTA_HotelRateAmountNotifRQ` message. Either `<Success>` or `<Errors>` is present in each message. |
| OTA_HotelRateAmountNotifRS / Errors / Error | 1..n | Error | The description of an error encountered while processing the `OTA_HotelRateAmountNotifRQ` message. Details on these errors can be found in [Feed Status Error Messages](https://developers.google.com/hotels/hotel-prices/dev-guide/feed-status-errors). |
| OTA_HotelRateAmountNotifRS / Errors / Error / @Type | 1 | integer | The OpenTravel Alliance EWT (Error Warning Type) associated with the error. Only the value `12 (Processing exception)` is used. |
| OTA_HotelRateAmountNotifRS / Errors / Error / @Code | 1 | integer | The OpenTravel Alliance ERR (Error Code) associated with the error. Only the value `450 (Unable to process)` is used. |
| OTA_HotelRateAmountNotifRS / Errors / Error / @Code | 1 | enum | The status of the original request. Only the value `NotProcessed` is used. |
| OTA_HotelRateAmountNotifRS / Errors / Error / @ShortText | 1 | string | The Google identifier for the issue. Details on these errors can be found in [Feed Status Error Messages](https://developers.google.com/hotels/hotel-prices/dev-guide/feed-status-errors). |

### Examples

### Success

The following is a response to a successfully processed
OTA_HotelRateAmountNotifRQ message.

```
<?xml version="1.0" encoding="UTF-8"?>
<OTA_HotelRateAmountNotifRS xmlns="http://www.opentravel.org/OTA/2003/05"
                       EchoToken="12345678"
                       TimeStamp="2021-10-20T20:50:37-05:00"
                       Version="3.0">
  <Success/>
</OTA_HotelRateAmountNotifRS>
```

### Errors

The following is a response to a OTA_HotelRateAmountNotifRQ message not
processed due to errors.

```
<?xml version="1.0" encoding="UTF-8"?>
<OTA_HotelRateAmountNotifRS xmlns="http://www.opentravel.org/OTA/2003/05"
                       EchoToken="12345678"
                       TimeStamp="2021-10-20T20:50:37-05:00"
                       Version="3.0">
  <Errors>
    <Error Type="12" Code="450" Status="NotProcessed" ShortText="8001">Example</Error>
  </Errors>
</OTA_HotelRateAmountNotifRS>
```