This page provides a reference to add structured data markups to your hotels' pricing data.
Overview
Hotel 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.
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
andaddress
propertiesmakesOffer
propertyHotel priceSpecification
propertyhasMerchantReturnPolicy
propertyeligibleCustomerType
property
HotelRoom
structured data is used to annotate room-specific fields in
your web page.
HotelRoom
structured data has the following properties:
offers
propertybed
andoccupancy
propertiesHotelRoom priceSpecification
propertyincludesObject
propertyavailability
propertyamenityFeature
property
Hotel structured data
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:
JSON-LD
{
"@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"]
...
}
}
Properties
The following are the name
and address
properties:
Property | Required? | Type | Description |
---|---|---|---|
Hotel.name | Required | string | The name of the hotel |
Hotel.identifier | Required | string | 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 & address
The 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:
JSON-LD
{
"@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": { ... }
}
}
Properties
The following are the makesOffer
properties:
Property | Required? | Type | Description |
---|---|---|---|
makesOffer | Required | Offer and LodgingReservation | The hotel offer(s) for the given itinerary.
The |
LodgingReservation.checkinTime | Required | DateTime | The check-in time in the user's timezone. If your timezone is not mentioned then the hotel timezone is considered. |
LodgingReservation.checkoutTime | Required | DateTime | The check-out time in the user's timezone. If your timezone is not mentioned then the hotel timezone is considered. |
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.
{
...
"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:
JSON-LD
{
"@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:
Property | Required? | Type | Description |
---|---|---|---|
Hotel.Offer.priceSpecification.price | Required | float | 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:
You must set the values in the |
Hotel.Offer.priceSpecification.priceComponent. potentialAction | Optional | PayAction | 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 Google supports the following two settings for
|
Examples
JSON-LD examples
Price
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.
{
"@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:
JSON-LD
{
"@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:
Attribute | Required? | Type | Description |
---|---|---|---|
Offer.hasMerchantReturnPolicy | Optional | MerchantReturnPolicy | The merchant refund policy. Partners should use
If |
Example
Return policy
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:
JSON-LD
{
"@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:
Attribute | Required? | Type | Description |
---|---|---|---|
Offer.eligibleCustomerType | Optional | BusinessEntityType | 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.
{
"@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:
JSON-LD
{
"@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:
Property | Required? | Type | Description |
---|---|---|---|
offers | Required | Offer and LodgingReservation | The room price specification for the given itinerary. The |
LodgingReservation.checkinTime | Required | DateTime | The check-in time in the user's timezone. If your timezone is not mentioned then the hotel timezone is considered. |
LodgingReservation.checkoutTime | Required | DateTime | The check-out time in the user's timezone. If your timezone is not mentioned then the hotel timezone is considered. |
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:
JSON-LD
{
"@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.
Properties
The following are the bed
and occupancy
properties:
Property | Required? | Type | Description |
---|---|---|---|
HotelRoom.bed | Optional (Recommended) | bed | The type of bed(s) included in the accommodation and the number of occupants in the room. The supported values are:
|
HotelRoom.occupancy | Optional (Recommended) | QuantitativeValue | The number of guests in the hotel room. The type for occupancy is a
Occupancy is an explicit property of
|
containsPlace | Optional (Recommended) | LocationFeatureSpecification | 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 |
Examples
HotelRoom
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:
JSON-LD
{
"@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"
}
]
}
}
}
Properties
The following are the HotelRoom priceSpecification
properties:
Property | Required? | Type | Description |
---|---|---|---|
Hotel.Offer.priceSpecification.price | Required | float | The price per room including the taxes and fees for the
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
|
Examples
Total room price
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:
JSON-LD
{
"@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"
}
}
]
}
}
Property
The includesObject
has the following property:
Attribute | Required? | Type | Description |
---|---|---|---|
Offer.includesObject | Optional | TypeAndQuantityNode | The services provided in the hotel or room. Rate-specific features are included with the
Rate-specific features may also be included within base level offers, or may be specified as add-ons for an additional price. The
|
Example
Services
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:
JSON-LD
{
"@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:
Attribute | Required? | Type | Description |
---|---|---|---|
Offer.availability | Optional | ItemAvailability | The availability of the hotel or room. Rates are extracted from
An offer without a
|
Example
Availability
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": {...}
}
}
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:
JSON-LD
{
"@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.
Attribute | Required? | Type | Description |
---|---|---|---|
amenityFeature.AC | Optional | boolean | Whether the property has air conditioning. |
amenityFeature.AirportShuttle | Optional | boolean | Whether the host provides transportation to and from the airport or other terminals. |
amenityFeature.Balcony | Optional | boolean | Whether the accommodation has a balcony. |
amenityFeature.BeachAccess | Optional | boolean | Whether the property has access to a public beach close to the property. |
amenityFeature.ChildFriendly | Optional | boolean | Whether the property is suitable for children. |
amenityFeature.Crib | Optional | boolean | Whether the property provides a crib. |
amenityFeature.Elevator | Optional | boolean | Whether the property has an elevator. |
amenityFeature.FirePlace | Optional | boolean | Whether the accommodation has a fireplace. |
amenityFeature.FreeBreakfast | Optional | boolean | Whether the property has free breakfast included for all guests. Use rate features to indicate if breakfast is included only for specific rate plans. |
amenityFeature.GymFitnessEquipment | Optional | boolean | Whether the property has a gym or any fitness equipment. |
amenityFeature.Heating | Optional | boolean | Whether the accommodation has heating. |
amenityFeature.HotTub | Optional | boolean | Whether the property has a hot tub. |
amenityFeature.InstantBookable | Optional | boolean | Whether the property is instantly bookable through the checkout process. The alternative is waiting for approval. |
amenityFeature.IroningBoard | Optional | boolean | Whether the property has ironing boards available. |
amenityFeature.Kitchen | Optional | boolean | Whether the accommodation has a kitchen. |
amenityFeature.Microwave | Optional | boolean | Whether the accommodation has a microwave available. |
amenityFeature.OpenAirBath(Hotels only) | Optional | boolean | Whether the accommodation has an open air bath attached. If specified at the room level, the bath should be private for room occupants only. |
amenityFeature.OutdoorGrill | Optional | boolean | Whether the property has a grill. |
amenityFeature.OvenStove | Optional | boolean | Whether the property has a stove. |
amenityFeature.Patio | Optional | boolean | Whether the property has a patio. |
amenityFeature.Pool | Optional | boolean | Whether the accommodation has a pool. |
amenityFeature.PrivateBeachAccess | Optional | boolean | Whether the property has dedicated access to a non-public beach. |
amenityFeature.SelfCheckinCheckout | Optional | boolean | Whether the property supports self check-in and check-out. |
amenityFeature.WasherDryer | Optional | boolean | Whether the accommodation has laundry appliances. |
amenityFeature.Wifi | Optional | boolean | Whether the property has Wifi. |
amenityFeature.Smoking | Optional | boolean | Whether the accommodation allows smoking. |
amenityFeature.InternetType | Optional | Enum | The type of internet available on the property. Supported values are:
|
amenityFeature.ParkingType | Optional | Enum | The type of parking available on the property. Supported values are:
|
amenityFeature.PoolType | Optional | Enum | The type of pool available on the property. Supported values are:
|
amenityFeature.RoomStyle | Optional | Enum | Indicates whether the room is a Japanese style design. Supported values are:
|
amenityFeature.LicenseNum | Required | string | 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, |
Properties
The following are the amenityFeature
properties:
Property | Required? | Type | Description |
---|---|---|---|
amenityFeature | Optional | LocationFeatureSpecification | The amenities provided in the hotel or room. It can be specified
using the Amenities can be specified at either the |
containsPlace | Optional | LocationFeatureSpecification | The amenities provided in the hotel or room to all hotel guests. It
can be specified using the
|
Example
Amenities in hotel and 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"
}
}
}
}