Stay organized with collections Save and categorize content based on your preferences.
This page provides a reference to add structured data markups to your hotels' pricing data.
OverviewHotel price structured data is used to explain, validate and display in detail the hotel prices listed on your website regardless of the user interface. This also includes base price, rates, rooms, fees & taxes and pricing related fields.
Google recommends partners to annotate their webpages with standardized structured data that are machine readable for crawlers; provided by schema.org, to accurately scrape prices from your webpages.
This allows for scaling price accuracy validations through improving the reliability of crawlers. The benefit to you is an increase in the number of price accuracy validations and the ability to debug price accuracy issues directly, and also to have a consistent price accuracy score.
Key Point: It is important to ensure that you have updated structured data values in your website that match with the values shown to users in your UI in order to provide reliable information and also to conform with Google's Price Accuracy Policy. Note: For general questions about scraping and indexing check the Google Search crawling and indexing FAQ.If you're new to structured data, learn more about Structured data vocabulary and format.
Google Hotels recommends JSON-LD
format to annotate your webpages. Refer to Supported formats to learn more about other acceptable formats. This documentation provides detailed reference content specific to structured data implementation in Hotels.
Hotel
structured data is used to annotate hotel-specific fields in your web page. Hotel
structured data has the following properties:
name
and address
properties
makesOffer
property
Hotel priceSpecification
property
hasMerchantReturnPolicy
property
eligibleCustomerType
property
HotelRoom
structured data is used to annotate room-specific fields in your web page.
HotelRoom
structured data has the following properties:
offers
property
bed
and occupancy
properties
HotelRoom priceSpecification
property
includesObject
property
availability
property
amenityFeature
property
name
and address
properties
name
and address
properties are used to annotate the hotel's name and location. The following are the name
and address
properties:
"@type": "Hotel",
"name": "hotel-name",
"identifier": "hotel-id-1234",
"address": {
"@type": "PostalAddress",
"addressCountry": "XX",
"addressLocality": "City Name",
"addressRegion": "State Name",
"postalCode": "01234",
"streetAddress": "1234 Main St."
},
Syntax
The name
and address
properties uses the following syntax:
{
"@context": "https://schema.org",
"@type": "Hotel",
"name": "hotel-name",
"identifier": "hotel-id-1234",
"address": {
"@type": "PostalAddress",
"addressCountry": "XX",
"addressLocality": "City Name",
"addressRegion": "State Name",
"postalCode": "01234",
"streetAddress": "1234 Main St."
},
"makesOffer": {
"@type": ["Offer", "LodgingReservation"]
...
}
}
Key Point: PostalAddress
types such as addressCountry
, postalCode
, streetAddress
and other fields are mandatory if you choose to specify the address
property. Properties
The following are the name
and address
properties:
The partners' hotel ID.
Identifier must be a unique string per hotel, and should exactly match with the string used in the price feed.
Hotel.address Optional PostalAddress The address or location of the hotel. Examples Name & addressThe following is a basic example of adding name
and address
annotations:
{
"@context": "https://schema.org",
"@type": "Hotel",
"name": "Mountain Hotel",
"identifier": "hotel-id-1234",
"address": {
"@type": "PostalAddress",
"addressCountry": "AT",
"addressLocality": "Innsbruck",
"addressRegion": "Tyrol",
"postalCode": "6020",
"streetAddress": "Technikerstrasse 21"
},
"makesOffer": {
"@type": ["Offer", "LodgingReservation"],
"checkinTime": "2023-03-10 15:00:00",
"checkoutTime": "2023-03-16 10:00:00",
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": 1222.74,
"priceCurrency": "USD"
}
}
}
makesOffer
property
makesOffer
annotations are used to markup your hotel itineraries.
"makesOffer": {
"@type": ["Offer", "LodgingReservation"],
"checkinTime": "YYYY-MM-DD[THH:mm:ss]",
"checkoutTime": "YYYY-MM-DD[THH:mm:ss]",
"availability": "https://schema.org/InStock",
...
}
Syntax
The makesOffer
property uses the following syntax:
{
"@context": "https://schema.org",
"@type": "Hotel",
"name": "hotel-name",
"identifier": "hotel-id-1234",
"address": { ... },
"makesOffer": {
"@type": ["Offer", "LodgingReservation"],
"checkinTime": "YYYY-MM-DD[THH:mm:ss]",
"checkoutTime": "YYYY-MM-DD[THH:mm:ss]",
"availability": "https://schema.org/InStock",
"priceSpecification": { ... }
}
}
Key Point: Multiple hotel-level offers can be included in the makesOffer
property. The Google-displayed rate should be listed first. The price amount specified includes all applicable taxes and fees. Properties
The following are the makesOffer
properties:
The hotel offer(s) for the given itinerary.
The makesOffer
property can contain an array of offers.
The check-in time in the user's timezone. If your timezone is not mentioned then the hotel timezone is considered.
LodgingReservation.checkoutTime Required DateTimeThe check-out time in the user's timezone. If your timezone is not mentioned then the hotel timezone is considered.
Key Point: The @type value for all offers should be an array containing bothOffer
and LodgingReservation
. Example makesOffer
The following is a basic example to annotate your hotel offers. You can specify multiple offers for an itinerary but you should specify the Google-displayed rate first followed by other rates. The price amount specified includes all applicable taxes.
{
"@context": "https://schema.org",
"@type": "Hotel",
"name": "Mountain Hotel",
"identifier": "hotel-id-1234",
"address": { ... },
"makesOffer": [
{
"@type": ["Offer", "LodgingReservation"],
"checkinTime": "2023-03-10 15:00:00",
"checkoutTime": "2023-03-16 10:00:00",
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": 1222.74,
"priceCurrency": "USD"
}
},
{
"@type": ["Offer", "LodgingReservation"],
"checkinTime": "2023-03-10 15:00:00",
"checkoutTime": "2023-03-16 10:00:00",
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": 1200.74,
"priceCurrency": "USD"
}
}
]
}
Hotel priceSpecification
property
This property is used to annotate pricing information for your hotel or hotel rooms. There are two additional properties that are required to annotate your prices and taxes. You should use CompoundPriceSpecification to specify the total pricing information such as base rate, taxes and discounts. Use UnitPriceSpecification to specify additional taxes or special types of charges such as ResortFee
, GenericTax
and ServiceFee
. priceSpecification
property is bundled with the Offer
property.
potentialAction
property is used when the user has to pay any outstanding amount or other charges at the hotel during check-in.
{
...
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": "float",
"priceCurrency": "currency",
"priceComponent": [
{
"@type": "UnitPriceSpecification",
"name": "GenericTax",
"price": "float",
"priceCurrency": "currency"
},
...
]
}
}
Syntax
The Hotel priceSpecification
property uses the following syntax:
{
"@context": "https://schema.org",
"@type": "Hotel",
...
"makesOffer": {
"@type": ["Offer", "LodgingReservation"],
...
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": "float",
"priceCurrency": "currency",
"priceComponent": [
{
"@type": "UnitPriceSpecification",
"name": "",
"price": "float",
"priceCurrency": "currency"
},
{
"@type": "UnitPriceSpecification",
"name": "GenericTax",
"price": "float",
"priceCurrency": "currency",
"priceComponentType": "GenericTax",
"potentialAction": {
"@type": "https://schema.org/PayAction",
"recipient": {
"@type": "OnlineBusiness",
"name": "name-of-the-business"
}
}
},
{
"@type": "UnitPriceSpecification",
"name": "Discount",
"price": "float",
"priceCurrency": "currency",
"priceComponentType": "Discount"
}
]
}
}
}
Microdata
<div itemscope itemtype="https://schema.org/Hotel">
<meta itemprop="name" content="hotel-name"/>
...
<div itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation" itemprop="makesOffer">
...
<div itemscope itemtype="https://schema.org/CompoundPriceSpecification" itemprop="priceSpecification">
<meta itemprop="price" content="float"/>
<meta itemprop="priceCurrency" content="currency"/>
<div itemscope itemtype="https://schema.org/UnitPriceSpecification" itemprop="priceComponent">
<meta itemprop="name" content=""/>
<meta itemprop="price" content="float"/>
<meta itemprop="priceCurrency" content="currency"/>
</div>
<div itemscope itemtype="https://schema.org/UnitPriceSpecification" itemprop="priceComponent">
<meta itemprop="name" content="GenericTax" />
<meta itemprop="price" content="float"/>
<meta itemprop="priceCurrency" content="currency"/>
<meta itemprop="priceComponentType" content="GenericTax"/>
</div>
<div itemscope itemtype="https://schema.org/UnitPriceSpecification" itemprop="priceComponent">
<meta itemprop="name" content="Discount"/>
<meta itemprop="price" content="float"/>
<meta itemprop="priceCurrency" content="currency"/>
<meta itemprop="priceComponentType" content="Discount"/>
</div>
</div>
</div>
</div>
Properties
The following are the hotel priceSpecification
properties:
The total price including taxes and fees for the hotel.
Google rate should always be annotated on your landing page along with your complete rate details. Annotating rate details lets you complete price accuracy checks. Google accepts both hotel-level and room-level prices.
Hotel.Offer.priceSpecification.priceCurrency Required currency A three-letter currency code for the specified price. Eg:"USD"
. Hotel.Offer.priceSpecification.priceComponent Optional UnitPriceSpecification[]
The total price breakdown including taxes and fees for the hotel. There are two types of price structured data:
CompoundPriceSpecification
provides price breakdowns to include the following:
Base rate: The basic price per night
Per-stay taxes: The price per night with taxes.
Per-occupant charges: The price per night per occupancy.
Discount: The deduction amount.
UnitPriceSpecification
is used to specify the type of charges. You should include PriceComponentTypeEnumeration
values for specifying additional charges.
The values for PriceComponentTypeEnumeration
are:
Discount
: The generic discount towards the price.
ResortFee
: It is an additional charge that has to be paid at the hotel. It can vary based on the type of lodging property.
GenericTax
: It is an additional miscellaneous tax.
ServiceFee
: It is an additional fee that is charged by the booking channel.
TransferFee
: It is a de-facto mandatory fee for transportation to the hotel, collected either by the hotel or booking channel.
You must set the values in the priceComponentType
property. All values are required if you choose to include UnitPriceSpecification
and it must be specified in the UnitPriceSpecification
property.
The hotel point of payment.The hotel payment flows include prices that are charged during check-out time on the booking site and at the hotel during check-in.
You should use the potentialAction
property which is bundled with the PayAction
's "recipient
" field to indicate the point of payment. Refer to PayAction
to learn more about recipient
property.
Google supports the following two settings for PayAction
's recipient:
recipient.@type = "OnlineBusiness"
refers to payment collected at the time of booking by the online merchant. This is the default setting if potentialAction
is not specified.
recipient.@type = "Hotel"
refers to the payment collected at the hotel.
The following is a basic example of adding price structured data to your web page. Multiple hotel-level offers can be included in the makesOffer
property.
PostalAddress
types such as addressCountry
, postalCode
, streetAddress
and other fields are mandatory if you choose to specify the address
property. The Google-displayed rate should be listed first in the makesOffer
property. The price amount specified includes all applicable taxes.
{
"@context": "https://schema.org",
"@type": "Hotel",
"name": "ACME Hotel",
"identifier": "hotel-id-1234",
"address": {
"@type": "PostalAddress",
"addressCountry": "AT",
"addressLocality": "Innsbruck",
"addressRegion": "Tyrol",
"postalCode": "6020",
"streetAddress": "Technikerstrasse 21"
},
"makesOffer": [
{
"@type": ["Offer", "LodgingReservation"],
"checkinTime": "2023-03-10 15:00:00",
"checkoutTime": "2023-03-16 10:00:00",
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": 1222.74,
"priceCurrency": "USD"
}
},
{
"@type": ["Offer", "LodgingReservation"],
"checkinTime": "2023-03-10 15:00:00",
"checkoutTime": "2023-03-16 10:00:00",
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": 1200.74,
"priceCurrency": "USD"
}
},
...
]
}
Price breakdown
The following is an example of the priceSpecification
property with the price breakdown. The base rate, taxes such as generic tax and discount are defined using the UnitPriceSpecification
component. Remember to set the priceComponentType
field with the values corresponding to the UnitPriceSpecification
component.
The total price for the length of stay should be specified in the CompoundPriceSpecification
property. The price breakdown should be specified in the priceComponent
property.
{
"@context": "https://schema.org",
"@type": "Hotel",
"name": "ACME Hotel",
"identifier": "hotel-id-1234",
"address": {...},
"makesOffer": {
"@type": ["Offer", "LodgingReservation"],
"checkinTime": "2023-03-10 15:00:00",
"checkoutTime": "2023-03-16 10:00:00",
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": 1222.74,
"priceCurrency": "USD",
"priceComponent": [
{
"@type": "UnitPriceSpecification",
"name": "",
"price": 1150,
"priceCurrency": "USD"
},
{
"@type": "UnitPriceSpecification",
"name": "GenericTax",
"price": 172.74,
"priceCurrency": "USD",
"priceComponentType": "GenericTax"
},
{
"@type": "UnitPriceSpecification",
"name": "Discount",
"price": -100,
"priceCurrency": "USD",
"priceComponentType": "Discount"
}
]
}
}
}
Point of Payment
The following is an example of potentialAction
specification in using PayAction
's recipient type.
The total price of the package is $1170 and the online website charges part of the total price which is $1150 at the time of booking specified using the "@type": "OnlineBusiness"
and the user has to pay the remaining $20 at the time of check-in at the hotel which is specified using the @type": "Hotel"
.
You must specify the potentialAction
component in order to break down payment at the time of booking and at the hotel. If it is not specified then payAction
interprets the payment at the time of booking as the default payment method.
potentialAction
for both payment at the time of booking and at the hotel separately.
{
"@context": "https://schema.org",
"@type": "Hotel",
"name": "ACME Hotel",
"identifier": "hotel-id-1234",
"makesOffer": {
"@type": ["Offer", "LodgingReservation"],
"checkinTime": "2023-03-10 15:00:00",
"checkoutTime": "2023-03-16 10:00:00]",
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": 1170,
"priceCurrency": "USD",
"priceComponent": [
{
"@type": "UnitPriceSpecification",
"price": 1150,
"priceCurrency": "USD",
"potentialAction": {
"@type": "https://schema.org/PayAction",
"recipient": {
"@type": "OnlineBusiness",
"name": "myonlinebusiness"
}
}
},
{
"@type": "UnitPriceSpecification",
"price": 20,
"priceCurrency": "USD",
"potentialAction": {
"@type": "https://schema.org/PayAction",
"recipient": {
"@type": "Hotel",
"name": "The Langham, Boston",
"address": { ... }
}
}
}
]
}
}
}
Microdata example Price breakdown
The following is an example of the priceSpecification
property with the price breakdown. The base rate, taxes such as generic tax and discount are defined using the UnitPriceSpecification
component. Remember to set the name
property with the values corresponding to the UnitPriceSpecification
component.
The total price for the length of stay should be specified in the CompoundPriceSpecification
property. The price breakdown should be specified in the priceComponent
property.
<div itemscope itemtype="https://schema.org/Hotel">
<meta itemprop="name" content="ACME Hotel"/>
<meta itemprop="identifier" content="hotel-id-1234"/>
<div itemscope itemtype="https://schema.org/PostalAddress" itemprop="address">
<meta itemprop="addressCountry" content="US" />
<meta itemprop="addressLocality" content="Mountain View" />
<meta itemprop="addressRegion" content="Santa Clara" />
<meta itemprop="postalCode" content="94040" />
<meta itemprop="streetAddress" content="123 Main street" />
</div>
<div itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation" itemprop="makesOffer">
<meta itemprop="checkinTime" content="2023-03-10 15:00:00" />
<meta itemprop="checkoutTime" content="2023-03-16 10:00:00"/>
<div itemscope itemtype="https://schema.org/CompoundPriceSpecification" itemprop="priceSpecification">
<meta itemprop="price" content="1222.74" />
<meta itemprop="priceCurrency" content="USD" />
<div itemscope itemtype="https://schema.org/UnitPriceSpecification" itemprop="priceComponent">
<meta itemprop="name" content="" />
<meta itemprop="price" content="1150" />
<meta itemprop="priceCurrency" content="USD" />
</div>
<div itemscope itemtype="https://schema.org/UnitPriceSpecification" itemprop="priceComponent">
<meta itemprop="name" content="GenericTax" />
<meta itemprop="price" content="172.74" />
<meta itemprop="priceCurrency" content="USD" />
<meta itemprop="priceComponentType" content="GenericTax" />
</div>
<div itemscope itemtype="https://schema.org/UnitPriceSpecification" itemprop="priceComponent">
<meta itemprop="name" content="Discount" />
<meta itemprop="price" content="-100" />
<meta itemprop="priceCurrency" content="USD" />
<meta itemprop="priceComponentType" content="Discount" />
</div>
</div>
</div>
</div>
hasMerchantReturnPolicy
property
This property is used to annotate the merchant refund policy in the itineraries.
"hasMerchantReturnPolicy": {
"@type": "MerchantReturnPolicy",
"returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
"refundType": "https://schema.org/FullRefund",
"merchantReturnDays": "YYYY-MM-DD[THH:mm:ss]",
"restockingFee": 0
}
Syntax
The hasMerchantReturnPolicy
has the following syntax:
{
"@context": "https://schema.org",
"@type": "Hotel",
...
"makesOffer": {
"@type": ["Offer", "LodgingReservation"],
"checkinTime": "YYYY-MM-DD[THH:mm:ss]",
"checkoutTime": "YYYY-MM-DD[THH:mm:ss]",
"priceSpecification": { ... },
"hasMerchantReturnPolicy": {
"@type": "MerchantReturnPolicy",
"returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
"refundType": "https://schema.org/FullRefund",
"merchantReturnDays": "YYYY-MM-DD[THH:mm:ss]",
"restockingFee": 0
}
}
}
Property
The following is the hasMerchantReturnPolicy
property:
The merchant refund policy. Partners should use MerchantReturnPolicy.restockingFee
to indicate cancellation policies that don't refund the full amount for the length of stay.
If hasMerchantReturnPolicy
is not specified or left empty it is assumed that the amount is non-refundable. You can specify the non-refundable policy using the returnPolicyCategory: MerchantReturnNotPermitted
property.
The following is a basic example of structured data for a hotel with room details and total price with taxes and fees. This example denotes a stay that can be canceled without any charges until 11 PM (UTC) on December 18, 2023. Partners should use "MerchantReturnPolicy.restockingFee"
to indicate cancellation policies that don't refund the full amount of the stay. The restockingFee
defaults to $0.
{
"@context": "https://schema.org",
"@type": "Hotel",
"name": "ACME Hotel",
"identifier": "hotel-id-1234",
"description": "Beautiful resort in the outskirts of the city",
"address": {...},
"makesOffer": {
"@type": ["Offer", "LodgingReservation"],
"checkinTime": "2023-12-15 16:00:00",
"checkoutTime": "2023-12-20 11:00:00",
"priceSpecification": {...},
"hasMerchantReturnPolicy": {
"@type": "MerchantReturnPolicy",
"returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
"refundType": "https://schema.org/FullRefund",
"merchantReturnDays": "2023-12-18 23:00:00",
"restockingFee": 0
}
}
}
eligibleCustomerType
property
This property can be used to annotate the rewards programs provided for hotel membership customers.
"eligibleCustomerType": "RewardsMember",
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": "float",
"priceCurrency": "currency"
}
Syntax
The eligibleCustomerType
property has the following syntax:
{
"@context": "https://schema.org",
"@type": "Hotel",
...
"makesOffer": {
"@type": ["Offer", "LodgingReservation"],
"checkinTime": "YYYY-MM-DD[THH:mm:ss]",
"checkoutTime": "YYYY-MM-DD[THH:mm:ss]",
"eligibleCustomerType": "RewardsMember",
"priceSpecification": { ... }
}
}
Property
The following is the eligibleCustomerType
property:
The loyalty programs or the member rewards offered for the customers.
Many hotel pages display member rates together with public rates, to encourage users to sign up for their loyalty programs. Rates restricted to particular audiences, such as member rates, can be specified by setting theOffer.eligibleCustomerType
property. Examples Member rates
The following is a basic example of member pricing or fenced rate specification for loyalty programs. The customer is a "rewards member" of the hotel.
Key Point: Thename
and eligibleCustomerType
properties must be specified in the Offer
property.
{
"@context": "https://schema.org",
"@type": "Hotel",
"name": "ACME Hotel",
"identifier": "hotel-id-1234",
"address": {...},
"makesOffer": {
"@type": ["Offer", "LodgingReservation"],
"name": "RewardsMember",
"checkinTime": "2023-12-15 16:00:00",
"checkoutTime": "2023-12-20 11:00:00",
"eligibleCustomerType": "RewardsMember",
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": 1342.74,
"priceCurrency": "USD",
"priceComponent": [
{
"@type": "UnitPriceSpecification",
"name": "Base rate",
"price": 1069.98,
"priceCurrency": "USD"
},
{
"@type": "UnitPriceSpecification",
"name": "GenericTax",
"price": 172.74,
"priceCurrency": "currency"
},
{
"@type": "UnitPriceSpecification",
"name": "ResortFee",
"price": 100,
"priceCurrency": "USD"
}
]
}
}
}
Member & regular rates
This is an example of both regular and member rate prices annotations. The member pricing is listed first followed by regular rates.
{
"@context": "https://schema.org",
"@type": "Hotel",
"name": "ACME Hotel",
"identifier": "hotel-id-1234",
"address": {...},
"makesOffer": [
{
"@type": ["Offer", "LodgingReservation"],
"name": "RewardsMember",
"checkinTime": "2023-12-15 16:00:00",
"checkoutTime": "2023-12-20 11:00:00",
"eligibleCustomerType": "RewardsMember",
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": 1342.74,
"priceCurrency": "USD",
"priceComponent": [
{
"@type": "UnitPriceSpecification",
"name": "Base rate",
"price": 1069.98,
"priceCurrency": "USD"
},
{
"@type": "UnitPriceSpecification",
"name": "GenericTax",
"price": 172.74,
"priceCurrency": "currency"
},
{
"@type": "UnitPriceSpecification",
"name": "ResortFee",
"price": 100,
"priceCurrency": "USD"
}
]
}
},
{
"@type": ["Offer", "LodgingReservation"],
"name": "regularRate",
"checkinTime": "2023-12-15 16:00:00",
"checkoutTime": "2023-12-20 11:00:00",
"priceSpecification": {
"price": 1572.24,
"priceCurrency": "USD",
"priceComponent": [
{
"@type": "UnitPriceSpecification",
"name": "Base rate",
"price": 1369.98,
"priceCurrency": "USD"
},
{
"@type": "UnitPriceSpecification",
"name": "GenericTax",
"price": 202.26,
"priceCurrency": "currency"
},
{
"@type": "UnitPriceSpecification",
"name": "ResortFee",
"price": 100,
"priceCurrency": "USD"
}
]
}
}
]
}
HotelRoom structured data offers
property
offers
annotations are used to markup your room itineraries. You should use the offers
property for HotelRoom
specification.
"offers": {
"@type": ["Offer", "LodgingReservation"],
"identifier": "hotel-room-id-1234",
"checkinTime": "YYYY-MM-DD[THH:mm:ss]",
"checkoutTime": "YYYY-MM-DD[THH:mm:ss]",
"priceSpecification": {...}
}
Syntax
The offers
property has the following syntax:
{
"@context": "https://schema.org",
"@type": "HotelRoom",
"identifier": "hotel-room-id-1234",
"offers": {
"@type": ["Offer", "LodgingReservation"],
"checkinTime": "YYYY-MM-DD[THH:mm:ss]",
"checkoutTime": "YYYY-MM-DD[THH:mm:ss]",
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": "float",
"priceCurrency": "currency",
...
}
}
}
Properties
The following are the offers
properties:
The room price specification for the given itinerary.
The offers
property can contain an array of offers.
The check-in time in the user's timezone. If your timezone is not mentioned then the hotel timezone is considered.
LodgingReservation.checkoutTime Required DateTimeThe check-out time in the user's timezone. If your timezone is not mentioned then the hotel timezone is considered.
Key Point:LodgingReservation
check-in and check-out time should be specified in an additional @type
property on all offers. Example offers
The following is a basic example for specifying offers
in HotelRoom
property.
{
"@context": "https://schema.org",
"@type": "HotelRoom",
"identifier": "hotel-room-id-1234",
"offers": {
"@type": ["Offer", "LodgingReservation"],
"identifier": "rate-plan-id-of-member-rate",
"checkinTime": "2023-03-10 15:00:00",
"checkoutTime": "2023-03-16 10:00:00",
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": 1222.74,
"priceCurrency": "USD"
}
}
}
bed
and occupancy
property
The bed
property is used to annotate the bed type and the number of beds available in the room. The occupancy
property is used to annotate the number of guests in the room. bed
and occupancy
properties can be specified using the HotelRoom
property.
"@type": "Hotel",
"identifier": "hotel-id-1234",
"containsPlace": {
"@type": ["HotelRoom", "Product"],
"identifier": "hotel-room-id",
"bed": {
"@type": "BedDetails",
"numberOfBeds": "integer",
"typeOfBed": "KING"
},
"occupancy": {
"@type": "QuantitativeValue",
"value": "integer"
}
}
Syntax
The bed
and occupancy
properties has the following syntax:
{
"@context": "https://schema.org",
"@type": "Hotel",
"name": "hotel-name",
"identifier": "hotel-id-1234",
"containsPlace": {
"@type": ["HotelRoom", "Product"],
"name": "room-name",
"identifier": "hotel-room-id-1234",
"bed": {
"@type": "BedDetails",
"numberOfBeds": "integer",
"typeOfBed": "KING"
},
"occupancy": {
"@type": "QuantitativeValue",
"value": "integer"
},
"offers": {
"@type": ["Offer", "LodgingReservation"],
"identifier": "rate-plan-id-of-member-rate",
"checkinTime": "YYYY-MM-DD[THH:mm:ss]",
"checkoutTime": "YYYY-MM-DD[THH:mm:ss]",
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": "float",
"priceCurrency": "currency",
"priceComponent": {
"@type": "UnitPriceSpecification",
"name": "",
"price": "float",
"priceCurrency": "currency"
},
...
}
}
}
}
bed
and occupancy
properties can only be set by using the HotelRoom
property. Room-specific information, including room-level rates, can be included to the Hotel
property through the containsPlace
property. Refer to the Hotel
and HotelRoom
specification example.
The following are the bed
and occupancy
properties:
The type of bed(s) included in the accommodation and the number of occupants in the room.
The supported values are:
CALIFORNIA_KING
KING
QUEEN
FULL
DOUBLE
SEMI_DOUBLE
SINGLE
The number of guests in the hotel room. The type for occupancy is a QuantitativeValue
.
Occupancy is an explicit property of HotelRoom
, not for a specific Offer
. Rates should only be tagged for the requested occupancy.
It is used to annotate the room-level rates associated with specific rooms. It can also be used to specify the amenities in the room.
Learn more on how to use containsPlace
in amenityFeature property.
The following is a basic example of beds and occupancies for a room specification.
{
"@context": "https://schema.org",
"@type": ["HotelRoom", "Product"],
"name": "Deluxe Room, 1 King Bed",
"identifier": "hotel-room-id-1234",
"bed": [
{
"@type": "BedDetails",
"numberOfBeds": 1,
"typeOfBed": "KING"
},
{
"@type": "BedDetails",
"numberOfBeds": 1,
"typeOfBed": "SINGLE"
}
],
"occupancy": {
"@type": "QuantitativeValue",
"value": 2
},
"offers": {
"@type": ["Offer", "LodgingReservation"],
"identifier": "rate-plan-id-of-member-rate",
"checkinTime": "2023-03-10 15:00:00",
"checkoutTime": "2023-03-16 10:00:00",
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": 1222.74,
"priceCurrency": "USD"
}
}
}
Hotel and HotelRoom
The following is an example of annotating the Hotel
and HotelRoom
properties along with bed
, occupancy
and priceSpecification
.
{
"@context": "https://schema.org",
"@type": "Hotel",
"name": "hotel-name",
"identifier": "hotel-id-1234",
"containsPlace": {
"@type": ["HotelRoom", "Product"],
"name": "Deluxe Room, 1 King Bed",
"identifier": "hotel-room-id",
"bed": {
"@type": "BedDetails",
"numberOfBeds": 1,
"typeOfBed": "KING"
},
"occupancy": {
"@type": "QuantitativeValue",
"value": 2
},
"amenityFeature": {
"@type": "LocationFeatureSpecification",
"name": "Minibar",
"value": true
},
"offers": {
"@type": ["Offer", "LodgingReservation"],
"identifier": "rate-plan-id-of-member-rate",
"checkinTime": "2023-03-10 15:00:00",
"checkoutTime": "2023-03-16 10:00:00",
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": 1222.74,
"priceCurrency": "USD"
}
}
}
}
HotelRoom priceSpecification
property
Hotel room price specification is similar to hotel price specification.The difference is that room prices are specified using the Product.offers
property instead of the Hotel.makesOffer
property.
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": "float",
"priceCurrency": "currency",
"priceComponent": {
"@type": "UnitPriceSpecification",
"name": "GenericTax",
"price": "float",
"priceCurrency": "currency"
}
...
}
Syntax
The priceSpecification
property for hotel rooms has the following syntax:
{
"@context": "https://schema.org",
"@type": ["HotelRoom", "Product"],
...
"bed": {
"@type": "BedDetails",
"numberOfBeds": "integer",
"typeOfBed": "KING"
},
"occupancy": {
"@type": "QuantitativeValue",
"value": "integer"
},
"offers": {
"@type": ["Offer", "LodgingReservation"],
...
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": "float",
"priceCurrency": "currency",
"priceComponent": [
{
"@type": "UnitPriceSpecification",
"name": "",
"price": "float",
"priceCurrency": "currency"
},
{
"@type": "UnitPriceSpecification",
"name": "GenericTax",
"price": "float",
"priceCurrency": "currency",
"priceComponentType": "GenericTax"
},
{
"@type": "UnitPriceSpecification",
"name": "Discount",
"price": "float",
"priceCurrency": "currency",
"priceComponentType": "Discount"
}
]
}
}
}
Key Point:When hotel rooms are specified, the partner should annotate the rates on the rooms and not on the hotel. Properties
The following are the HotelRoom priceSpecification
properties:
The price per room including the taxes and fees for the Product
.
Google rate should always be annotated on your landing page along with your complete rate details. Annotating rate details lets you complete price accuracy checks. Google accepts both hotel-level and room-level prices.
Hotel.Offer.priceSpecification.priceCurrency Required currency A three-letter currency code for the specified price. Eg:"USD"
. Hotel.Offer.priceSpecification.priceComponent Optional UnitPriceSpecification[]
The total price breakdown including taxes and fees for the hotel room and the occupancy with offers linked to HotelRoom
and Product
. There are two types of price structured data:
CompoundPriceSpecification
provides price breakdowns to include the following:
Base rate: The basic price per night
Per-stay taxes: The price per night with taxes.
Per-occupant charges: The price per night per occupancy.
occupancy
is an explicit property of HotelRoom
, not for a specific Offer
. Rates should only be tagged for the requested occupancy.
Discount: The deduction amount.
UnitPriceSpecification
is used to specify the type of charges. You should include PriceComponentTypeEnumeration
values for specifying additional charges.
The values for PriceComponentTypeEnumeration
are:
Discount
: The generic discount towards the price.
ResortFee
: It is an additional charge that has to be paid at the hotel. It can vary based on the type of lodging property.
GenericTax
: It is an additional miscellaneous tax.
ServiceFee
: It is an additional fee that is charged by the booking channel.
You must set the values in the name
property of UnitPriceSpecification
. All values are required if you choose to include price breakdown and it must be specified in the UnitPriceSpecification
component.
The following is a basic example of defining the total price for the length of stay and price per occupancy.
{
"@context": "https://schema.org",
"@type": ["HotelRoom", "Product"],
"name": "Deluxe Room King, 1 Single Bed",
"identifier": "hotel-room-id-1234",
"bed": [
{
"@type": "BedDetails",
"numberOfBeds": 1,
"typeOfBed": "KING"
},
{
"@type": "BedDetails",
"numberOfBeds": 1,
"typeOfBed": "SINGLE"
}
],
"occupancy": {
"@type": "QuantitativeValue",
"value": 2
},
"offers": {
"@type": ["Offer", "LodgingReservation"],
"checkinTime": "2023-03-10 15:00:00",
"checkoutTime": "2023-03-16 10:00:00",
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": 1232.74,
"priceCurrency": "USD"
}
},
...
}
Room price breakdown
The following is an example of price per room or plan. The price breakdown is defined for room type such as Deluxe
room and the bed
and occupancy
type such as KING
and SINGLE
beds and an occupancy of 2 guests.
{
"@context": "https://schema.org",
"@type": ["HotelRoom", "Product"],
"name": "Deluxe Room King, 1 Single Bed",
"identifier": "hotel-room-id-1234",
"offers": {
"@type": ["Offer", "LodgingReservation"],
"identifier": "rate-plan-id-of-member-rate",
"checkinTime": "2023-03-10 15:00:00",
"checkoutTime": "2023-03-16 10:00:00",
"bed": [
{
"@type": "BedDetails",
"numberOfBeds": 1,
"typeOfBed": "KING"
},
{
"@type": "BedDetails",
"numberOfBeds": 1,
"typeOfBed": "SINGLE"
}
],
"occupancy": {
"@type": "QuantitativeValue",
"value": 2
},
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": 1222.74,
"priceCurrency": "USD",
"priceComponent": [
{
"@type": "UnitPriceSpecification",
"name": "Base rate",
"price": 1150,
"priceCurrency": "USD"
},
{
"@type": "UnitPriceSpecification",
"name": "GenericTax",
"price": 172.74,
"priceCurrency": "USD",
"priceComponentType": "GenericTax"
},
{
"@type": "UnitPriceSpecification",
"name": "Discount",
"price": -100,
"priceCurrency": "USD",
"priceComponentType": "Discount"
}
]
}
}
}
includesObject
property
This property is used to annotate rate-specific services provided in the hotel or room such as meal options and valet service. You can annotate includesObject
in either Hotel
or HotelRoom
property.
{
"includesObject": [
{
"@type": "TypeAndQuantityNode",
"typeOfGood": {
"@type": "Service",
"name": "Valet"
}
},
{
"@type": "TypeAndQuantityNode",
"amountOfThisGood": "float",
"unitText": "currency",
"typeOfGood": {
"@type": "FoodService",
"name": "MealCredit"
}
}
]
}
Syntax
The includesObject
has the following syntax for rate-specific services available in the room:
{
"@context": "https://schema.org",
...
"@type": ["HotelRoom", "Product"],
...
"offers": {
"@type": ["Offer", "LodgingReservation"],
...
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": "float",
"priceCurrency": "currency"
},
"includesObject": [
{
"@type": "TypeAndQuantityNode",
"typeOfGood": {
"@type": "Service",
"name": "Valet"
}
},
{
"@type": "TypeAndQuantityNode",
"amountOfThisGood": "float",
"unitText": "currency",
"typeOfGood": {
"@type": "FoodService",
"name": "MealCredit"
}
}
]
}
}
Key Point: When hotel rooms are specified, you should annotate the rates on the rooms and not on the hotel. Property
The includesObject
has the following property:
The services provided in the hotel or room.
Rate-specific features are included with the includesObject
property. The name field on "TypeAndQuantityNode.typeOfGood"
should be used to indicate the type of service such as valet or meal service.
Rate-specific features may also be included within base level offers, or may be specified as add-ons for an additional price.
The includesObject
requires a value of type TypeAndQuantityNode
as follows:
BreakfastIncluded
DinnerIncluded
Valet
MealCredit
The following is a basic example of rate-specific features for valet parking and food services. Rate-specific features should be specified with the "Offer.includesObject"
property. The name field on "TypeAndQuantityNode.typeOfGood"
should be used to indicate the type of service.
{
"@context": "https://schema.org",
"@type": ["HotelRoom", "Product"],
"name": "Deluxe Room, 1 King Bed",
"identifier": "hotel-room-id-1234",
"offers": {
"@type": ["Offer", "LodgingReservation"],
"identifier": "rate-plan-id-of-member-rate",
"checkinTime": "2023-03-10 15:00:00",
"checkoutTime": "2023-03-16 10:00:00",
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": 1222.74,
"priceCurrency": "USD"
},
"includesObject": [
{
"@type": "TypeAndQuantityNode",
"typeOfGood": {
"@type": "Service",
"name": "Valet"
}
},
{
"@type": "TypeAndQuantityNode",
"amountOfThisGood": 50,
"unitText": "USD",
"typeOfGood": {
"@type": "FoodService",
"name": "MealCredit"
}
}
]
}
}
availability
property
The offer.availability
property is used to annotate the sold out itineraries for the hotel rooms.
"offers": {
"@type": ["Offer", "LodgingReservation"],
"checkinTime": "YYYY-MM-DD[THH:mm:ss]",
"checkoutTime": "YYYY-MM-DD[THH:mm:ss]",
"availability": "https://schema.org/SoldOut"
}
Syntax
The availability
property has the following syntax:
{
"@context": "https://schema.org",
...
"@type": ["HotelRoom", "Product"],
"name": "room-type",
"identifier": "hotel-room-id-1234",
"bed": {
"@type": "BedDetails",
"numberOfBeds": "integer",
"typeOfBed": "KING"
},
"occupancy": {
"@type": "QuantitativeValue",
"value": "integer"
},
"offers": {
"@type": ["Offer", "LodgingReservation"],
"checkinTime": "YYYY-MM-DD[THH:mm:ss]",
"checkoutTime": "YYYY-MM-DD[THH:mm:ss]",
"availability": "https://schema.org/SoldOut"
}
}
Property
The following are the availability
property:
The availability of the hotel or room.
Rates are extracted from schema.org/Offer
and the rate information is not created using schema.org/Hotel
or schema.org/HotelRoom
. This means that even sold out itineraries must have an offer.
An offer without a priceSpecification
is considered as unavailable. Unavailable offers should be specified as "Offer.availability= https://schema.org/SoldOut"
.
Offer.availability
doesn't need to be specified if the offer is annotated with a valid priceSpecification.
The following is a basic example to show hotel room unavailability. You should include the bed type, the number of beds and the occupancy details for the specified room.
{
"@context": "https://schema.org",
"@type": ["HotelRoom", "Product"],
"name": "Deluxe Room, 1 King Bed",
"identifier": "hotel-room-id-1234",
"bed": [
{
"@type": "BedDetails",
"numberOfBeds": 1,
"typeOfBed": "KING"
},
{
"@type": "BedDetails",
"numberOfBeds": 1,
"typeOfBed": "SINGLE"
}
],
"occupancy": {
"@type": "QuantitativeValue",
"value": 2
},
"offers": {
"@type": ["Offer", "LodgingReservation"],
"checkinTime": "2023-03-10 15:00:00",
"checkoutTime": "2023-03-16 10:00:00",
"availability": "https://schema.org/SoldOut",
"priceSpecification": {...}
}
}
Key Point: Offers
must be specified for sold out itineraries. amenityFeature
property
Amenities can be specified in either Hotel
or HotelRoom
type using the amenityFeature
property. You should use containsPlace
property to specify amenities provided in the room.
{
"@type": "Hotel",
"amenityFeature": [
{
"@type": "LocationFeatureSpecification",
"name": "HotTub",
"hoursAvailable": {
"@type": "OpeningHoursSpecification",
"opens": "HH:mm:ss",
"closes": "HH:mm:ss"
}
},
{
"@type": "LocationFeatureSpecification",
"name": "GymFitnessEquipment",
"value": "boolean"
}
],
"containsPlace": {
"@type": "HotelRoom",
"amenityFeature": [
{
"@type": "LocationFeatureSpecification",
"name": "Minibar",
"value": true
},
{
"@type": "LocationFeatureSpecification",
"name": "Smoking",
"value": false
}
]
}
}
Syntax
The amenityFeature
and the containsPlace
properties has the following syntax:
{
"@context": "https://schema.org",
"@type": "Hotel",
...
"amenityFeature": {
"@type": "LocationFeatureSpecification",
"name": "HotTub",
"hoursAvailable": {
"@type": "OpeningHoursSpecification",
"opens": "HH:mm:ss",
"closes": "HH:mm:ss"
}
},
"containsPlace": {
"@type": "HotelRoom",
"amenityFeature": {
"@type": "LocationFeatureSpecification",
"name": "Minibar",
"value": "boolean"
}
}
}
Amenities
The following amenities are allowed and defined in the name
property.
The type of internet available on the property.
Supported values are:
FREE
PAID
NONE
The type of parking available on the property.
Supported values are:
FREE
PAID
NONE
The type of pool available on the property.
Supported values are:
INDOOR
OUTDOOR
NONE
Indicates whether the room is a Japanese style design.
Supported values are:
WESTERN
JAPANESE
JAPANESE_WESTERN
License number of the business that is to be shown on the property in certain regions of the world. It can be repeated and if multiple licenses exist then it is recommended to add the owner or authority of the license. For example, "Paris: 123456ABC"
The following are the amenityFeature
properties:
The amenities provided in the hotel or room. It can be specified using the amenityFeature
property . Amenities should be available to all guests in the hotel irrespective of selected rate plan. amenityFeature
is specified using the LocationFeatureSpecification
property value.
Amenities can be specified at either the Hotel
or HotelRoom
level.
The amenities provided in the hotel or room to all hotel guests. It can be specified using the amenityFeature
. Amenities should be available to all guests in the hotel room irrespective of selected rate plan.
Hotel.containsPlace.amenityFeature
are the amenities provided in the hotel.
HotelRoom.containsPlace.amenityFeature
are the amenities provided in the room.
The following is an example of a hotel with a pool open from 10AM to 10PM and no gym availability at the property. The hotel room is non-smoking and has a minibar.
{
"@context": "https://schema.org",
"@type": "Hotel",
"name": "ACME Hotel",
"address": { ... },
"amenityFeature": [
{
"@type": "LocationFeatureSpecification",
"name": "HotTub",
"hoursAvailable": {
"@type": "OpeningHoursSpecification",
"opens": "10:00:00",
"closes": "22:00:00"
}
},
{
"@type": "LocationFeatureSpecification",
"name": "GymFitnessEquipment",
"value": false
}
],
"containsPlace": {
"@type": "HotelRoom",
"amenityFeature": [
{
"@type": "LocationFeatureSpecification",
"name": "Minibar",
"value": true
},
{
"@type": "LocationFeatureSpecification",
"name": "Smoking",
"value": false
}
],
"offers": {
"@type": ["Offer", "LodgingReservation"],
"identifier": "rate-plan-id-of-member-rate",
"checkinTime": "2023-03-10 15:00:00",
"checkoutTime": "2023-03-16 10:00:00",
"priceSpecification": {
"@type": "CompoundPriceSpecification",
"price": 1222.74,
"priceCurrency": "USD"
}
}
}
}
All rights reserved. Java is a registered trademark of Oracle and/or its affiliates.
Last updated 2024-09-18 UTC.
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2024-09-18 UTC."],[[["This documentation provides instructions on implementing structured data for hotel pricing to improve search engine visibility and accuracy."],["Google recommends using JSON-LD and ensuring data accuracy to comply with its Price Accuracy Policy."],["Schema.org types like `Hotel`, `HotelRoom`, and properties like `priceSpecification` are used to define hotel and room details."],["Structured data enables enhanced price validations, debugging, and user trust by providing clear pricing information to search engines."],["Specifying details such as room rates, amenities, and payment options using schema.org properties further improves the user experience."]]],[]]
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4