Requests
Syntax
The TaxFeeInfo
message uses the following syntax:
<?xml
version="1.0"
encoding="UTF-8"?>
<TaxFeeInfo
timestamp=" timestamp
"
id=" message_ID
"
partner=" partner_key
">
<Property
action="[overlay]">
<ID> HotelID
</ID>
<Taxes>
<Tax>
<RoomTypes>
<RoomType
id=" RoomID_1
"/>
<RoomType
id=" RoomID_2
"/>
</RoomTypes>
<RatePlans>
<RatePlan
id=" PackageID_1
"/>
<RatePlan
id=" PackageID_2
"/>
</RatePlans>
<BookingDates>
<DateRange
start="YYYY-MM-DD"
end="YYYY-MM-DD"
days_of_week= "MTWHFSU_or_subset"
/>
</BookingDates>
<CheckinDates>
<DateRange
start="YYYY-MM-DD"
end="YYYY-MM-DD"
days_of_week= "MTWHFSU_or_subset"
/>
</CheckinDates>
<CheckoutDates>
<DateRange
start="YYYY-MM-DD"
end="YYYY-MM-DD"
days_of_week= "MTWHFSU_or_subset"
/>
</CheckoutDates>
<StayDates
application="[all|any|overlap]">
<DateRange
start="YYYY-MM-DD"
end="YYYY-MM-DD"
days_of_week= "MTWHFSU_or_subset"
/>
</StayDates>
<Type>[percent|amount|cumulative_percent]</Type>
<Basis>[room|person]</Basis>
<Period>[stay|night]</Period>
<Currency> currency_code
</Currency>
<Amount> tax_amount
</Amount>
<ApplicableNights
max=" integer
"
excluded=" integer
"/>
<LengthOfStay
min=" integer
"
max=" integer
"/>
<!--
Use
either
<Amount>
or
<Brackets>
-->
<Brackets
base_amount=" tax_amount
"/>
<Bracket
starts_at=" nightly_rate
"
amount=" tax_amount
"/>
</Brackets>
<AgeBrackets>
<AdultCharge
amount=" tax_amount
"/>
<ChildAgeBrackets>
<ChildAgeBracket
max_age=" max_age
"
amount=" tax_amount
"/>
</ChildAgeBrackets>
</AgeBrackets>
<UserCountries
type="[include|exclude]">
<Country
code=" country_code1
"/>
<Country
code=" country_code2
"/>
</UserCountries>
<!--"exclusive"
parameter
is
optional
-->
<Rank
exclusive="[true|false]">integer</Rank>
</Tax>
</Taxes>
<Fees>
<Fee>
<RoomTypes>
<RoomType
id=" RoomID_1
"/>
<RoomType
id=" RoomID_2
"/>
</RoomTypes>
<RatePlans>
<RatePlan
id=" PackageID_1
"/>
<RatePlan
id=" PackageID_2
"/>
</RatePlans>
<BookingDates>
<DateRange
start="YYYY-MM-DD"
end="YYYY-MM-DD"
days_of_week= "MTWHFSU_or_subset"
/>
</BookingDates>
<CheckinDates>
<DateRange
start="YYYY-MM-DD"
end="YYYY-MM-DD"
days_of_week= "MTWHFSU_or_subset"
/>
</CheckinDates>
<CheckoutDates>
<DateRange
start="YYYY-MM-DD"
end="YYYY-MM-DD"
days_of_week= "MTWHFSU_or_subset"
/>
</CheckoutDates>
<StayDates
application="[all|any|overlap]">
<DateRange
start="YYYY-MM-DD"
end="YYYY-MM-DD"
days_of_week= "MTWHFSU_or_subset"
/>
</StayDates>
<Type>[percent|amount|cumulative_percent]</Type>
<Basis>[room|person]</Basis>
<Period>[stay|night]</Period>
<Currency> currency_code
</Currency>
<Amount> fee_amount
</Amount>
<ApplicableNights
max=" integer
"
excluded=" integer
"/>
<LengthOfStay
min=" integer
"
max=" integer
"/>
<!--
Use
either
<Amount>
or
<Brackets>
-->
<Brackets
base_amount=" tax_amount
"/>
<Bracket
starts_at=" nightly_rate
"
amount=" tax_amount
"/>
</Brackets>
<AgeBrackets>
<AdultCharge
amount=" tax_amount
"/>
<ChildAgeBrackets>
<ChildAgeBracket
max_age=" max_age
"
amount=" tax_amount
"/>
</ChildAgeBrackets>
</AgeBrackets>
<UserCountries
type="[include|exclude]">
<Country
code=" country_code1
"/>
<Country
code=" country_code2
"/>
</UserCountries>
<!--"exclusive"
parameter
is
optional
-->
<Rank
exclusive="[true|false]">integer</Rank>
</Fee>
</Fees>
</Property>
</TaxFeeInfo>
Elements and attributes
The TaxFeeInfo
message has the following elements and
attributes:
a-z
, A-Z
, 0-9
, _
(underscore), and -
(dash). Note:
If you have a backend that provides feeds for
multiple accounts, this value needs to match the ID
attribute value specified in the <RequestorID>
element of your <OTA_HotelRateAmountNotifRQ>
and <OTA_HotelAvailNotifRQ>
messages for the same account.
overlay
is
supported, and the default is overlay
. Any previous Taxes
and Fees
for this property will be
cleared before this update is applied.<Tax>
elements.<RoomType>
specified. If <RoomTypes>
isn't specified, the
tax applies to all rooms.<RoomData>
element in a Transaction (Property Data)
message, and as
identified using its RoomID. (Its <RoomID>
value is also referenced by the InvTypeCode
attribute in OTA_HotelRateAmountNotifRQ
messages.)<RoomID>
in a Transaction
(Property Data)
message. The maximum number of characters allowed is
50.<RatePlans>
isn't specified, the tax
applies to all rate plans.<PackageData>
and
the RatePlanCode
value that is set under the <StatusApplicationControl>
attribute in both <OTA_HotelRateAmountNotifRQ>
and <OTA_HotelAvailNotifRQ>
messages.
The maximum number of characters allowed is 50.end
date. If start
isn't specified, the date
range is effectively unlimited in terms of a start date.start
date. If end
isn't specified, the date
range is effectively unlimited in terms of an end date.The days of the week that are allowed in the date range. If not specified, all days are allowed in the date range. Each character in the string specifies a day. For example, "MTWHF" specifies that weekdays are allowed in the date range.
Valid characters are:
-
M
for Monday -
T
for Tuesday -
W
for Wednesday -
H
for Thursday -
F
for Friday -
S
for Saturday -
U
for Sunday
Any character combination is valid.
end
date. If start
isn't specified, the date
range is effectively unlimited in terms of a start date.start
date. If end
isn't specified, the date
range is effectively unlimited in terms of an end date.The days of the week that are allowed in the date range. If not specified, all days are allowed in the date range. Each character in the string specifies a day. For example, "MTWHF" specifies that weekdays are allowed in the date range.
Valid characters are:
-
M
for Monday -
T
for Tuesday -
W
for Wednesday -
H
for Thursday -
F
for Friday -
S
for Saturday -
U
for Sunday
Any character combination is valid.
end
date. If start
isn't specified, the date
range is effectively unlimited in terms of a start date.start
date. If end
isn't specified, the date
range is effectively unlimited in terms of an end date.The days of the week that are allowed in the date range. If not specified, all days are allowed in the date range. Each character in the string specifies a day. For example, "MTWHF" specifies that weekdays are allowed in the date range.
Valid characters are:
-
M
for Monday -
T
for Tuesday -
W
for Wednesday -
H
for Thursday -
F
for Friday -
S
for Saturday -
U
for Sunday
Any character combination is valid.
A container for one or more date ranges that determine whether the tax is applied, such as to accommodate seasonal discounts.
Describes how the tax should be applied.
Valid values are:
-
all
: Applies the tax to each night in the itinerary if alldates in the itinerary overlap with the stay dates. -
any
: Applies the tax to all nights in the itinerary if any date in the itinerary overlaps with a date in the stay dates range. -
overlap
: Applies the tax only to those nights in the itinerary that overlap with a date in the stay dates range.Note :
overlap
is valid only when<Period>
is set tonight
.
This attribute must always be specified.
end
date. If start
isn't specified, the date
range is effectively unlimited in terms of a start date.start
date. If end
isn't specified, the date
range is effectively unlimited in terms of an end date.The days of the week that are allowed in the date range. If not specified, all days are allowed in the date range. Each character in the string specifies a day. For example, "MTWHF" specifies that weekdays are allowed in the date range.
Valid characters are:
-
M
for Monday -
T
for Tuesday -
W
for Wednesday -
H
for Thursday -
F
for Friday -
S
for Saturday -
U
for Sunday
Any character combination is valid.
Valid values are:
-
percent:
A percent of the total rate -
amount:
A flat amount to add to the final rate -
cumulative_percent:
A percent of the total rate, taxes, and fees accumulated prior to the calculation of this tax or fee. If this value is specified,<Rank>
must also be specified.
<Brackets>
and <AgeBrackets>
may not be specified with cumulative_percent
as a type.
Valid values are:
-
room:
The<Amount>
is applied to the room. -
person:
The<Amount>
is applied per person. This value only applies if<Type>
is set to amount.
Valid values are:
-
stay:
The<Amount>
is added to the total rate of the stay. -
night:
The<Amount>
is added per night of the stay.
Note:If <Currency>
isn't specified but the <Amount>
is specified then
the <Currency>
value defaults to base rate currency.
<Type>
is set to amountand <Period>
is set to night. Constrains the number of nights for which a tax can be applied.
Specify either max
or excluded
but not
both.
<ApplicableNights max="N">
indicates that nights
after the first N nights should be excluded.<ApplicableNights excluded="N">
indicates that the
first N nights should be excluded.<Bracket>
elements.
Defines a set of contiguous and non-overlapping tax brackets. For example: Indian GST slab taxes. This element is valid only when <Period>
is set to night
and <Amount>
is not specified.
starts_at
value.Defines the lower bound of a tax bracket. The upper bound is
specified in the subsequent bracket's starts_at
field.
There is no upper bound for the last bracket.
A tax bracket is active when the nightly rate is greater than or equal
to the bracket's starts_at
value, and strictly less than
the subsequent bracket's starts_at
value.
This value must be strictly greater than 0.
This element is valid only when <Brackets>
and <Amount>
are not specified, <Basis>
is set to person
and <Type>
is set to amount
.
<ChildAgeBracket>
elements.Defines the upper bound on a child's age. The lower bound is
specified in the preceding bracket's max_age
field + 1.
The upper and lower bounds are both inclusive. The lower bound for the
first bracket is 0.
max_age
must be in the range 0 to 17 (inclusive).
Valid values are include
and exclude
.
If the UserCountries type
is set as include
, the tax will only apply to users from the
listed countries.
Whereas if the UserCountries type
is exclude
, the tax will only apply to users outside the
listed countries.
If the UserCountries type
is unset, we will treat it as include
and the tax will only apply to users from the
listed countries.
DE
or FR
. Note that, for some
countries, the CLDR country code isn't the same as the 2-letter ISO
country code. Also, CLDR region codes are not supported.A rank that specifies the order of application for a tax or fee.
For example, a value of 2 means that the tax is applied second.
This element should always be specified if <Type>
is
set to cumulative_percent
. In general, this ordering is
applied across both taxes and fees.
<Rank>2</Rank>
Duplicate rank values are allowed among taxes and fees but this can result in undefined behavior where taxes and fees are applied in an arbitrary and cumulative manner.
Alternatively, use the "exclusive"
parameter within
the <Rank>
to indicate that all taxes and fees of
the same rank are applied to the rate. The default value is false
and all taxes and fees with the same rank are
applied to the rate in an arbitrary manner. "exclusive"
is optional.
If the exclusive
parameter is set to true
, only the first tax listed within the <Tax>
or the first fee listed within the <Fee>
are applied to the rate.
<Rank exclusive="true">1</Rank>
Taxes are applied first before fees; therefore, if
a tax and fee have the same rank and the fee has "exclusive"
set to true
, the tax still applies first. The best
practice is for taxes and fees to be listed in the order in which
they should be applied.
To include all taxes and fees of the same rank avoid setting exclusive
to true
.
Taxes and fees without ranks are applied prior to all ranked entries.
<Rank>
must be in the range 1 to 99 (inclusive).
<Fee>
elements.An individual fee that applies to the property.
All child elements of <Tax>
are also
supported for <Fee>
with the same syntax.
Examples
There is a limit of 300 taxes and fees per property. Refer to the "Delete taxes" example to remove taxes and fees from a property.
Basic message
A basic TaxFeeInfo
message:
<?xml
version="1.0"
encoding="UTF-8"?>
<TaxFeeInfo
timestamp="2024-05-18T16:20:00-04:00"
id="12345678"
partner="partner_key">
<Property>
<ID>Property_1</ID>
<Taxes>
<Tax>
<Type>percent</Type>
<Basis>room</Basis>
<Period>stay</Period>
<Amount>10.00</Amount>
</Tax>
</Taxes>
<Fees>
<Fee>
<Type>amount</Type>
<Basis>person</Basis>
<Period>night</Period>
<Currency>USD</Currency>
<Amount>5.00</Amount>
</Fee>
</Fees>
</Property>
</TaxFeeInfo>
Delete taxes
Delete all property-level taxes and fees for the specified hotel:
<?xml
version="1.0"
encoding="UTF-8"?>
<TaxFeeInfo
timestamp="2024-06-16T16:20:00-04:00"
id="12345678"
partner="partner_key">
<Property
action="overlay"/>
<ID>Property_1</ID>
</Property>
</TaxFeeInfo>
Slab tax
Indian GST slab tax, applied based on nightly rates. The tax brackets are:
- No tax if the nightly rate is less than or equal to 1000.
- 12% tax if the nightly rate is greater than 1000 and less than or equal to 7500.
- 18% tax if the nightly rate is greater than 7500.
<?xml
version="1.0"
encoding="UTF-8"?>
<TaxFeeInfo
timestamp="2024-05-18T16:20:00-04:00"
id="12345678"
partner="partner_key">
<Property>
<ID>Property_1</ID>
<Taxes>
<Tax>
<Type>percent</Type>
<Basis>room</Basis>
<Period>night</Period>
<Brackets
base_amount="0">
<Bracket
starts_at="1000.01"
amount="12"/>
<Bracket
starts_at="7500.01"
amount="18"/>
</Brackets>
</Tax>
</Taxes>
</Property>
</TaxFeeInfo>
Age based taxes
Taxes applied based on the ages of the occupants:
- $20 tax for adult occupants.
- $10 tax for children between the ages of 11 and 17.
- $5 tax for children between the ages of 0 and 10.
<?xml
version="1.0"
encoding="UTF-8"?>
<TaxFeeInfo
timestamp="2024-05-18T16:20:00-04:00"
id="12345678"
partner="partner_key">
<Property>
<ID>Property_1</ID>
<Taxes>
<Tax>
<Type>amount</Type>
<Basis>person</Basis>
<Period>night</Period>
<AgeBrackets>
<AdultCharge
amount="20"/>
<ChildAgeBrackets>
<ChildAgeBracket
max_age="10"
amount="5"/>
<ChildAgeBracket
max_age="17"
amount="10"/>
</ChildAgeBrackets>
</AgeBrackets>
</Tax>
</Taxes>
</Property>
</TaxFeeInfo>
Overlapping stay dates ranges
When multiple stay date ranges are defined that are overlapping with each other, then the given stay date only needs to satisfy one of those ranges and not all of them. The stay date ranges must be specified in a single start and end range.
<?xml
version="1.0"
encoding="UTF-8"?>
<TaxFeeInfo
timestamp="2025-03-12T10:59:49+01:00"
id="12345678"
partner="partner_key">
<Property
action="overlay">
<ID>987654</ID>
<Taxes>
<Tax>
<Type>amount</Type>
<Basis>person</Basis>
<Period>night</Period>
<RoomTypes>
<RoomType
id="RoomID_1"/>
<RoomType
id="RoomID_2"/>
</RoomTypes>
<StayDates
application="any">
<DateRange
start="2025-06-16"/>
</StayDates>
<Currency>USD</Currency>
<Amount>50</Amount>
</Tax>
</Taxes>
<Fees>
<Fee>
<Type>amount</Type>
<Basis>room</Basis>
<Period>stay</Period>
<StayDates
application="any">
<DateRange
start="2025-03-12"
end="2025-03-18"/>
</StayDates>
<Currency>USD</Currency>
<Amount>200</Amount>
</Fee>
<Fee>
<Type>amount</Type>
<Basis>room</Basis>
<Period>stay</Period>
<StayDates
application="any">
<DateRange
start="2025-03-19"/>
</StayDates>
<Currency>USD</Currency>
<Amount>300</Amount>
</Fee>
</Fees>
</Property>
</TaxFeeInfo>
Multiple taxes and fees with rank exclusive
The following is an example with multiple taxes and fees with exclusive="true"
and different ranks. Consider the following taxes and
fees that should be applied to the rate:
- A 5% occupancy tax with rank 1
exclusive="true"
. - A 10 USD room service tax with rank 1.
- A 50 USD cleaning fee with rank 2
exclusive="true"
. - A 2% amenities fee with rank 3.
The chronological order in which the taxes and fees are applied based on the <Rank>
are:
- The occupancy tax with
exclusive="true"
and rank 1 is applied first. - The room service tax with rank 1 won't be applied because the previous occupancy tax is exclusive.
- The cleaning fee with
exclusive="true"
and rank 2 is applied next. - The amenities fee with rank 3 is applied after the cleaning fee with rank 2.
<?xml
version="1.0"
encoding="UTF-8"?>
<TaxFeeInfo
timestamp="2024-02-29T12:00:00Z"
id="tax-fee-id"
partner="partner_key">
<Property
action="overlay">
<ID>765432</ID>
<Taxes>
<Tax>
<Type>percent</Type>
<Amount>5</Amount>
<Period>stay</Period>
<Basis>room</Basis>
<Rank
exclusive="true">1</Rank>
</Tax>
<Tax>
<Type>amount</Type>
<Amount>10</Amount>
<Period>night</Period>
<Basis>room</Basis>
<Currency>USD</Currency>
<Rank>1</Rank>
</Tax>
</Taxes>
<Fees>
<Fee>
<Type>amount</Type>
<Amount>50</Amount>
<Period>night</Period>
<Basis>room</Basis>
<Currency>USD</Currency>
<Rank
exclusive="true">2</Rank>
</Fee>
<Fee>
<Type>percent</Type>
<Amount>2</Amount>
<Period>stay</Period>
<Basis>room</Basis>
<Rank>3</Rank>
</Fee>
</Fees>
</Property>
</TaxFeeInfo>
Responses
Syntax
The TaxFeeInfoResponse
message uses the following syntax:
<?xml
version="1.0"
encoding="UTF-8"?>
<TaxFeeInfoResponse
timestamp=" timestamp
"
id=" message_ID
"
partner=" partner_key
">
<!--
Either
Success
or
Issues
will
be
populated.
-->
<Success/>
<Issues>
<Issue
code=" issue_code
"
status=" issue_type
"> issue_description
</Issue>
</Issues>
</TaxFeeInfoResponse>
Elements and attributes
The TaxFeeInfoResponse
message has the following
elements and attributes:
Element / @Attribute | Occurrences | Type | Description |
---|---|---|---|
TaxFeeInfoResponse
|
1 | Complex element | The root element indicating the success or issues for a received TaxFeeInfo request message. |
TaxFeeInfoResponse / @timestamp
|
1 | DateTime | The creation date and time of this message. |
TaxFeeInfoResponse / @id
|
1 | string | The unique identifier from the associated TaxFeeInfo message. |
TaxFeeInfoResponse / @partner
|
1 | string | The partner account for this message. |
TaxFeeInfoResponse / Success
|
0..1 | Success | Indicates that the TaxFeeInfo message was processed successfully
without warnings, errors, or failures. Either |
TaxFeeInfoResponse / Issues
|
0..1 | Issues | A container for one or more issues encountered while processing the TaxFeeInfo
message. Either |
TaxFeeInfoResponse / Issues / Issue
|
1..n | Issue | The description of a warning, error, or failure encountered while processing the TaxFeeInfo message. Details on these issues can be found in Feed Status Error Messages . |
TaxFeeInfoResponse / Issues / Issue / @code
|
1 | integer | The identifier for the issue. |
TaxFeeInfoResponse / Issues / Issue / @status
|
1 | enum | The type of issue encountered. Valid values are |
Examples
Success
The following is a response to a successfully processed TaxFeeInfo
message.
<?xml
version="1.0"
encoding="UTF-8"?>
<TaxFeeInfoResponse
timestamp="2024-05-18T16:20:00-04:00"
id="12345678"
partner="partner_key">
<Success/>
</TaxFeeInfoResponse>
Issues
The following is a response to a TaxFeeInfo
message not processed due to
errors.
<?xml
version="1.0"
encoding="UTF-8"?>
<TaxFeeInfoResponse
timestamp="2024-05-18T16:20:00-04:00"
id="12345678"
partner="partner_key">
<Issues>
<Issue
code="1001"
status="error">Example</Issue>
</Issues>
</TaxFeeInfoResponse>