Hotel price structured data reference

  • Structured data on hotel webpages, using schema.org's Hotel and HotelRoom in JSON-LD format, helps Google validate pricing information for Google Hotels.

  • Structured data values must match the visible information on your website to improve price accuracy validations and aid debugging.

  • Required properties for Hotel include name, address, and makesOffer, with nested details for offers and pricing.

  • Required properties for HotelRoom include offers, with nested pricing and optional details like bed and occupancy.

  • Various optional properties like hasMerchantReturnPolicy, eligibleCustomerType, includesObject, availability, and amenityFeature can provide additional information for hotels and rooms.

This page provides the technical specification and vocabulary reference for Schema.org hotel structured data markups.

Overview

Hotel price structured data provides a standardized, machine-readable format to explain, validate, and display hotel prices listed on your website, regardless of your visual layout. This includes base prices, rates, room specifications, itemized fees and taxes, and booking policies.

Google recommends that you annotate your webpages with standardized structured data provided by Schema.org to accurately extract prices from your webpages.

Standard structured data allows for scaling price accuracy validations through improving the reliability of crawlers, increasing the number of price accuracy validations, enabling direct debugging of price accuracy issues, and maintaining a consistent price accuracy score.

If you're new to structured data, learn more about structured data vocabulary and format.

Google Hotels recommends Microdata format by default to annotate your webpages for hotel price accuracy checks. The JSON-LD format is deprecated for price accuracy validation. Note that this recommendation applies strictly to hotel price accuracy validation and doesn't affect other usages of structured data across Google (such as Google Search rich results). To learn more about formats supported for general Search features, see supported 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:

HotelRoom structured data is used to annotate room-specific fields in your web page.

HotelRoom structured data has the following properties:

Navigation attributes are used to explain interactive elements and page states to crawlers. For more information, see navigation tagging.

Hotel structured data

The following properties apply to the Hotel entity.

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:

Microdata

<div itemscope itemtype="https://schema.org/Hotel">
  <span itemprop="name">hotel-name</span>
  <meta itemprop="identifier" content="hotel-id-1234"/>
  <div itemprop="address" itemscope itemtype="https://schema.org/PostalAddress">
    <span itemprop="streetAddress">1234 Main St.</span>,
    <span itemprop="addressLocality">City Name</span>,
    <span itemprop="addressRegion">State Name</span>
    <span itemprop="postalCode">01234</span>
    <span itemprop="addressCountry">XX</span>
  </div>
  <div itemprop="makesOffer" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
    ...
  </div>
</div>

JSON-LD (Deprecated)

{
  "@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.

Name and address example

The following is a basic example of adding name and address annotations:

Microdata

<div itemscope itemtype="https://schema.org/Hotel">
  <h1 itemprop="name">Mountain Hotel</h1>
  <meta itemprop="identifier" content="hotel-id-1234"/>
  <div itemprop="address" itemscope itemtype="https://schema.org/PostalAddress">
    <span itemprop="streetAddress">Technikerstrasse 21</span>,
    <span itemprop="addressLocality">Innsbruck</span>,
    <span itemprop="addressRegion">Tyrol</span>
    <span itemprop="postalCode">6020</span>
    <span itemprop="addressCountry">AT</span>
  </div>
  <div itemprop="makesOffer" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
    Check-in: <time itemprop="checkinTime" content="2023-03-10T15:00:00">Mar 10, 2023 3:00 PM</time>
    Check-out: <time itemprop="checkoutTime" content="2023-03-16T10:00:00">Mar 16, 2023 10:00 AM</time>
    <div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
      <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1222.74</span>
    </div>
  </div>
</div>

JSON-LD (Deprecated)

{
  "@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:

Microdata

<div itemscope itemtype="https://schema.org/Hotel">
  <span itemprop="name">hotel-name</span>
  <div itemprop="makesOffer" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
    Check-in: <time itemprop="checkinTime" content="YYYY-MM-DDTHH:mm:ss">YYYY-MM-DD[THH:mm:ss]</time>
    Check-out: <time itemprop="checkoutTime" content="YYYY-MM-DDTHH:mm:ss">YYYY-MM-DD[THH:mm:ss]</time>
    <meta itemprop="availability" content="https://schema.org/InStock"/>
    <div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
      ...
    </div>
  </div>
</div>

JSON-LD (Deprecated)

{
  "@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 makesOffer property can contain an array of offers.

LodgingReservation.checkinTime Required DateTime

The check-in time in the user's timezone. If your timezone isn't mentioned, then the hotel timezone is considered.

LodgingReservation.checkoutTime Required DateTime

The check-out time in the user's timezone. If your timezone isn't mentioned, then the hotel timezone is considered.

makesOffer example

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.

Microdata

<div itemscope itemtype="https://schema.org/Hotel">
  <span itemprop="name">Mountain Hotel</span>
  <div itemprop="makesOffer" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
    Check-in: <time itemprop="checkinTime" content="2023-03-10T15:00:00">Mar 10, 2023 3:00 PM</time>
    Check-out: <time itemprop="checkoutTime" content="2023-03-16T10:00:00">Mar 16, 2023 10:00 AM</time>
    <div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
      <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1222.74</span>
    </div>
  </div>
  <div itemprop="makesOffer" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
    Check-in: <time itemprop="checkinTime" content="2023-03-10T15:00:00">Mar 10, 2023 3:00 PM</time>
    Check-out: <time itemprop="checkoutTime" content="2023-03-16T10:00:00">Mar 16, 2023 10:00 AM</time>
    <div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
      <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1200.74</span>
    </div>
  </div>
</div>

JSON-LD (Deprecated)

{
  "@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:

Microdata

<div itemscope itemtype="https://schema.org/Hotel">
  <span itemprop="name">hotel-name</span>
  ...
  <div itemprop="makesOffer" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
    ...
    <div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
      <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">float</span>

      <div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
        <span itemprop="name"></span>
        <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">float</span>
      </div>

      <div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
        <span itemprop="name">GenericTax</span>
        <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">float</span>
        <meta itemprop="priceComponentType" content="GenericTax"/>
      </div>

      <div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
        <span itemprop="name">Discount</span>
        <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">float</span>
        <meta itemprop="priceComponentType" content="Discount"/>
      </div>
    </div>
  </div>
</div>

JSON-LD (Deprecated)

{
  "@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"
        }
      ]
    }
  }
}

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:

  • 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.

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 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 isn't specified.

  • recipient.@type = "Hotel" refers to the payment collected at the hotel.

Examples

The following are examples of hotel price specifications.

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.

Microdata

<div itemscope itemtype="https://schema.org/Hotel">
  <span itemprop="name">ACME Hotel</span>
  <meta itemprop="identifier" content="hotel-id-1234"/>
  <div itemprop="address" itemscope itemtype="https://schema.org/PostalAddress">
    <span itemprop="streetAddress">Technikerstrasse 21</span>,
    <span itemprop="addressLocality">Innsbruck</span>,
    <span itemprop="addressRegion">Tyrol</span>
    <span itemprop="postalCode">6020</span>
    <span itemprop="addressCountry">AT</span>
  </div>

  <div itemprop="makesOffer" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
    Check-in: <time itemprop="checkinTime" content="2023-03-10T15:00:00">Mar 10, 2023 3:00 PM</time>
    Check-out: <time itemprop="checkoutTime" content="2023-03-16T10:00:00">Mar 16, 2023 10:00 AM</time>
    <div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
      <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1222.74</span>
    </div>
  </div>

  <div itemprop="makesOffer" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
    Check-in: <time itemprop="checkinTime" content="2023-03-10T15:00:00">Mar 10, 2023 3:00 PM</time>
    Check-out: <time itemprop="checkoutTime" content="2023-03-16T10:00:00">Mar 16, 2023 10:00 AM</time>
    <div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
      <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1200.74</span>
    </div>
  </div>
</div>

JSON-LD (Deprecated)

{
  "@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.

Microdata

<div itemscope itemtype="https://schema.org/Hotel">
  <h1 itemprop="name">ACME Hotel</h1>
  <meta itemprop="identifier" content="hotel-id-1234"/>
  <div itemprop="address" itemscope itemtype="https://schema.org/PostalAddress">
    <span itemprop="streetAddress">123 Main street</span>,
    <span itemprop="addressLocality">Mountain View</span>,
    <span itemprop="addressRegion">Santa Clara</span>
    <span itemprop="postalCode">94040</span>
    <span itemprop="addressCountry">US</span>
  </div>
  <div itemprop="makesOffer" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
    Check-in: <time itemprop="checkinTime" content="2023-03-10T15:00:00">Mar 10, 2023 3:00 PM</time>
    Check-out: <time itemprop="checkoutTime" content="2023-03-16T10:00:00">Mar 16, 2023 10:00 AM</time>

    <div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
      Total Price: <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1222.74</span>

      <!-- Price Components -->
      <div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
        <span itemprop="name">Base Rate</span>: <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1150</span>
      </div>

      <div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
        <span itemprop="name">GenericTax</span>: <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">172.74</span>
        <meta itemprop="priceComponentType" content="GenericTax" />
      </div>

      <div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
        <span itemprop="name">Discount</span>: <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">-100</span>
        <meta itemprop="priceComponentType" content="Discount" />
      </div>
    </div>
  </div>
</div>

JSON-LD (Deprecated)

{
  "@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 isn't specified, then payAction interprets the payment at the time of booking as the default payment method.

Microdata

<div itemscope itemtype="https://schema.org/Hotel">
  <span itemprop="name">ACME Hotel</span>
  <meta itemprop="identifier" content="hotel-id-1234"/>
  <div itemprop="makesOffer" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
    Check-in: <time itemprop="checkinTime" content="2023-03-10T15:00:00">Mar 10, 2023 3:00 PM</time>
    Check-out: <time itemprop="checkoutTime" content="2023-03-16T10:00:00">Mar 16, 2023 10:00 AM</time>
    <div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
      Price Due: <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1170</span>

      <!-- Paid Online -->
      <div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
        <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1150</span>
        <div itemprop="potentialAction" itemscope itemtype="https://schema.org/PayAction">
          <div itemprop="recipient" itemscope itemtype="https://schema.org/OnlineBusiness">
            <span itemprop="name">myonlinebusiness</span>
          </div>
        </div>
      </div>

      <!-- Paid at Hotel -->
      <div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
        <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">20</span>
        <div itemprop="potentialAction" itemscope itemtype="https://schema.org/PayAction">
          <div itemprop="recipient" itemscope itemtype="https://schema.org/Hotel">
            <span itemprop="name">The Langham, Boston</span>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

JSON-LD (Deprecated)

{
  "@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": { ... }
            }
          }
        }
      ]
    }
  }
}

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:

Microdata

<div itemscope itemtype="https://schema.org/Hotel">
  ...
  <div itemprop="makesOffer" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
    ...
    <div itemprop="hasMerchantReturnPolicy" itemscope itemtype="https://schema.org/MerchantReturnPolicy">
      <link itemprop="returnPolicyCategory" href="https://schema.org/MerchantReturnFiniteReturnWindow"/>
      <link itemprop="refundType" href="https://schema.org/FullRefund"/>
      <meta itemprop="merchantReturnDays" content="YYYY-MM-DDTHH:mm:ss"/>
      <meta itemprop="restockingFee" content="0"/>
    </div>
  </div>
</div>

JSON-LD (Deprecated)

{
  "@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 MerchantReturnPolicy.restockingFee to indicate cancellation policies that don't refund the full amount for the length of stay.

If hasMerchantReturnPolicy isn't 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.

Return policy example

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.

Microdata

<div itemscope itemtype="https://schema.org/Hotel">
  <span itemprop="name">ACME Hotel</span>
  <div itemprop="makesOffer" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
    ...
    <div itemprop="hasMerchantReturnPolicy" itemscope itemtype="https://schema.org/MerchantReturnPolicy">
      <link itemprop="returnPolicyCategory" href="https://schema.org/MerchantReturnFiniteReturnWindow"/>
      <link itemprop="refundType" href="https://schema.org/FullRefund"/>
      Cancellation Deadline: <time itemprop="merchantReturnDays" content="2023-12-18T23:00:00">2023-12-18 23:00:00</time>
      Fee: $<span itemprop="restockingFee">0</span>
    </div>
  </div>
</div>

JSON-LD (Deprecated)

{
  "@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:

Microdata

<div itemscope itemtype="https://schema.org/Hotel">
  ...
  <div itemprop="makesOffer" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
    <meta itemprop="eligibleCustomerType" content="RewardsMember"/>
    ...
  </div>
</div>

JSON-LD (Deprecated)

{
  "@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 the Offer.eligibleCustomerType property.

Examples

The following are examples of rewards member rates.

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.

Microdata

<div itemscope itemtype="https://schema.org/Hotel">
  <span itemprop="name">ACME Hotel</span>
  <meta itemprop="identifier" content="hotel-id-1234"/>
  <div itemprop="address" itemscope itemtype="https://schema.org/PostalAddress">
    <!-- Address details -->
  </div>

  <div itemprop="makesOffer" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
    <span itemprop="name">RewardsMember</span>
    <meta itemprop="eligibleCustomerType" content="RewardsMember"/>

    Check-in: <time itemprop="checkinTime" content="2023-12-15T16:00:00">Dec 15, 2023 4:00 PM</time>
    Check-out: <time itemprop="checkoutTime" content="2023-12-20T11:00:00">Dec 20, 2023 11:00 AM</time>

    <div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
      Total: <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1342.74</span>

      <div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
        <span itemprop="name">Base rate</span>: <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1069.98</span>
      </div>

      <div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
        <span itemprop="name">GenericTax</span>: <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">172.74</span>
      </div>

      <div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
        <span itemprop="name">ResortFee</span>: <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">100</span>
      </div>
    </div>
  </div>
</div>

JSON-LD (Deprecated)

{
  "@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 and regular rates

This is an example of both regular and member rate prices annotations. The member pricing is listed first followed by regular rates.

Microdata

<div itemscope itemtype="https://schema.org/Hotel">
  <span itemprop="name">ACME Hotel</span>
  <meta itemprop="identifier" content="hotel-id-1234"/>
  <div itemprop="address" itemscope itemtype="https://schema.org/PostalAddress">
    <!-- Address details -->
  </div>

  <!-- Member Rate -->
  <div itemprop="makesOffer" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
    <span itemprop="name">RewardsMember</span>
    <meta itemprop="eligibleCustomerType" content="RewardsMember"/>

    Check-in: <time itemprop="checkinTime" content="2023-12-15T16:00:00">Dec 15, 2023 4:00 PM</time>
    Check-out: <time itemprop="checkoutTime" content="2023-12-20T11:00:00">Dec 20, 2023 11:00 AM</time>

    <div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
      Total: <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1342.74</span>

      <div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
        <span itemprop="name">Base rate</span>: <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1069.98</span>
      </div>

      <div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
        <span itemprop="name">GenericTax</span>: <span itemprop="priceCurrency" content="currency">$</span><span itemprop="price">172.74</span>
      </div>

      <div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
        <span itemprop="name">ResortFee</span>: <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">100</span>
      </div>
    </div>
  </div>

  <!-- Regular Rate -->
  <div itemprop="makesOffer" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
    <span itemprop="name">regularRate</span>

    Check-in: <time itemprop="checkinTime" content="2023-12-15T16:00:00">Dec 15, 2023 4:00 PM</time>
    Check-out: <time itemprop="checkoutTime" content="2023-12-20T11:00:00">Dec 20, 2023 11:00 AM</time>

    <div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
      Total: <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1572.24</span>

      <div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
        <span itemprop="name">Base rate</span>: <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1369.98</span>
      </div>

      <div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
        <span itemprop="name">GenericTax</span>: <span itemprop="priceCurrency" content="currency">$</span><span itemprop="price">202.26</span>
      </div>

      <div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
        <span itemprop="name">ResortFee</span>: <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">100</span>
      </div>
    </div>
  </div>
</div>

JSON-LD (Deprecated)

{
  "@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

The following properties apply to the HotelRoom entity.

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:

Microdata

<div itemscope itemtype="https://schema.org/HotelRoom">
  <meta itemprop="identifier" content="hotel-room-id-1234"/>
  <div itemprop="offers" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
    Check-in: <time itemprop="checkinTime" content="YYYY-MM-DDTHH:mm:ss">YYYY-MM-DD[THH:mm:ss]</time>
    Check-out: <time itemprop="checkoutTime" content="YYYY-MM-DDTHH:mm:ss">YYYY-MM-DD[THH:mm:ss]</time>
    <div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
      <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">float</span>
      ...
    </div>
  </div>
</div>

JSON-LD (Deprecated)

{
  "@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 offers property can contain an array of offers.

LodgingReservation.checkinTime Required DateTime

The check-in time in the user's timezone. If your timezone isn't mentioned, then the hotel timezone is considered.

LodgingReservation.checkoutTime Required DateTime

The check-out time in the user's timezone. If your timezone isn't mentioned, then the hotel timezone is considered.

offers example

Microdata

<div itemscope itemtype="https://schema.org/HotelRoom">
  <meta itemprop="identifier" content="hotel-room-id-1234"/>
  <div itemprop="offers" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
    <meta itemprop="identifier" content="rate-plan-id-of-member-rate"/>
    Check-in: <time itemprop="checkinTime" content="2023-03-10T15:00:00">Mar 10, 2023 3:00 PM</time>
    Check-out: <time itemprop="checkoutTime" content="2023-03-16T10:00:00">Mar 16, 2023 10:00 AM</time>
    <div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
      <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1222.74</span>
    </div>
  </div>
</div>

JSON-LD (Deprecated)

{
  "@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:

Microdata

<div itemscope itemtype="https://schema.org/Hotel">
  <span itemprop="name">hotel-name</span>
  <meta itemprop="identifier" content="hotel-id-1234"/>
  <div itemprop="containsPlace" itemscope itemtype="https://schema.org/HotelRoom https://schema.org/Product">
    <span itemprop="name">room-name</span>
    <meta itemprop="identifier" content="hotel-room-id-1234"/>

    <!-- Bed Details -->
    <div itemprop="bed" itemscope itemtype="https://schema.org/BedDetails">
      <span itemprop="numberOfBeds">integer</span>
      <span itemprop="typeOfBed">KING</span>
    </div>

    <!-- Occupancy -->
    <div itemprop="occupancy" itemscope itemtype="https://schema.org/QuantitativeValue">
      Occupancy: <span itemprop="value">integer</span>
    </div>

    <div itemprop="offers" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
      ...
    </div>
  </div>
</div>

JSON-LD (Deprecated)

{
  "@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:

  • CALIFORNIA_KING
  • KING
  • QUEEN
  • FULL
  • DOUBLE
  • SEMI_DOUBLE
  • SINGLE
HotelRoom.occupancy Optional (Recommended) QuantitativeValue

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.

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 containsPlace in amenityFeature property.

Examples

The following are examples of bed and occupancy specifications.

HotelRoom example

The following is a basic example of beds and occupancies for a room specification.

Microdata

<div itemscope itemtype="https://schema.org/HotelRoom https://schema.org/Product">
  <meta itemprop="identifier" content="hotel-room-id-1234"/>
  <span itemprop="name">Deluxe Room, 1 King Bed</span>

  <div itemprop="bed" itemscope itemtype="https://schema.org/BedDetails">
    <span itemprop="numberOfBeds">1</span>
    <span itemprop="typeOfBed">KING</span>
  </div>
  <div itemprop="bed" itemscope itemtype="https://schema.org/BedDetails">
    <span itemprop="numberOfBeds">1</span>
    <span itemprop="typeOfBed">SINGLE</span>
  </div>

  <div itemprop="occupancy" itemscope itemtype="https://schema.org/QuantitativeValue">
    Occupancy: <span itemprop="value">2</span>
  </div>

  <div itemprop="offers" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
    <meta itemprop="identifier" content="rate-plan-id-of-member-rate"/>
    Check-in: <time itemprop="checkinTime" content="2023-03-10T15:00:00">Mar 10, 2023 3:00 PM</time>
    Check-out: <time itemprop="checkoutTime" content="2023-03-16T10:00:00">Mar 16, 2023 10:00 AM</time>
    <div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
      <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1222.74</span>
    </div>
  </div>
</div>

JSON-LD (Deprecated)

{
  "@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 example

The following is an example of annotating the Hotel and HotelRoom properties along with bed, occupancy and priceSpecification.

Microdata

<div itemscope itemtype="https://schema.org/Hotel">
  <span itemprop="name">hotel-name</span>
  <meta itemprop="identifier" content="hotel-id-1234"/>

  <div itemprop="containsPlace" itemscope itemtype="https://schema.org/HotelRoom https://schema.org/Product">
    <span itemprop="name">Deluxe Room, 1 King Bed</span>
    <meta itemprop="identifier" content="hotel-room-id"/>

    <div itemprop="bed" itemscope itemtype="https://schema.org/BedDetails">
      <span itemprop="numberOfBeds">1</span>
      <span itemprop="typeOfBed">KING</span>
    </div>

    <div itemprop="occupancy" itemscope itemtype="https://schema.org/QuantitativeValue">
      Occupancy: <span itemprop="value">2</span>
    </div>

    <div itemprop="amenityFeature" itemscope itemtype="https://schema.org/LocationFeatureSpecification">
      <span itemprop="name">Minibar</span>
      <meta itemprop="value" content="true"/>
    </div>

    <div itemprop="offers" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
      <meta itemprop="identifier" content="rate-plan-id-of-member-rate"/>
      Check-in: <time itemprop="checkinTime" content="2023-03-10T15:00:00">Mar 10, 2023 3:00 PM</time>
      Check-out: <time itemprop="checkoutTime" content="2023-03-16T10:00:00">Mar 16, 2023 10:00 AM</time>
      <div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
        <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1222.74</span>
      </div>
    </div>
  </div>
</div>

JSON-LD (Deprecated)

{
  "@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:

Microdata

<div itemscope itemtype="https://schema.org/HotelRoom https://schema.org/Product">
  ...
  <div itemprop="offers" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
    ...
    <div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
      <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">float</span>

      <div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
        <span itemprop="name"></span>
        <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">float</span>
      </div>

      <div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
        <span itemprop="name">GenericTax</span>
        <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">float</span>
        <meta itemprop="priceComponentType" content="GenericTax"/>
      </div>

      <div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
        <span itemprop="name">Discount</span>
        <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">float</span>
        <meta itemprop="priceComponentType" content="Discount"/>
      </div>
    </div>
  </div>
</div>

JSON-LD (Deprecated)

{
  "@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 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's an additional charge that has to be paid at the hotel. It can vary based on the type of lodging property.

    • GenericTax: It's an additional miscellaneous tax.

    • ServiceFee: It's 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.

Examples

The following are examples of HotelRoom price specifications.

Total room price example

The following is a basic example of defining the total price for the length of stay and price per occupancy.

Microdata

<div itemscope itemtype="https://schema.org/HotelRoom https://schema.org/Product">
  <span itemprop="name">Deluxe Room King, 1 Single Bed</span>
  <meta itemprop="identifier" content="hotel-room-id-1234"/>

  <div itemprop="bed" itemscope itemtype="https://schema.org/BedDetails">
    <span itemprop="numberOfBeds">1</span>
    <span itemprop="typeOfBed">KING</span>
  </div>
  <div itemprop="bed" itemscope itemtype="https://schema.org/BedDetails">
    <span itemprop="numberOfBeds">1</span>
    <span itemprop="typeOfBed">SINGLE</span>
  </div>

  <div itemprop="occupancy" itemscope itemtype="https://schema.org/QuantitativeValue">
    Occupancy: <span itemprop="value">2</span>
  </div>

  <div itemprop="offers" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
    Check-in: <time itemprop="checkinTime" content="2023-03-10T15:00:00">Mar 10, 2023 3:00 PM</time>
    Check-out: <time itemprop="checkoutTime" content="2023-03-16T10:00:00">Mar 16, 2023 10:00 AM</time>
    <div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
      <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1232.74</span>
    </div>
  </div>
</div>

JSON-LD (Deprecated)

{
  "@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 example

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.

Microdata

<div itemscope itemtype="https://schema.org/HotelRoom https://schema.org/Product">
  <span itemprop="name">Deluxe Room King, 1 Single Bed</span>
  <meta itemprop="identifier" content="hotel-room-id-1234"/>

  <div itemprop="offers" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
    <meta itemprop="identifier" content="rate-plan-id-of-member-rate"/>
    Check-in: <time itemprop="checkinTime" content="2023-03-10T15:00:00">Mar 10, 2023 3:00 PM</time>
    Check-out: <time itemprop="checkoutTime" content="2023-03-16T10:00:00">Mar 16, 2023 10:00 AM</time>

    <div itemprop="bed" itemscope itemtype="https://schema.org/BedDetails">
      <span itemprop="numberOfBeds">1</span>
      <span itemprop="typeOfBed">KING</span>
    </div>
    <div itemprop="bed" itemscope itemtype="https://schema.org/BedDetails">
      <span itemprop="numberOfBeds">1</span>
      <span itemprop="typeOfBed">SINGLE</span>
    </div>

    <div itemprop="occupancy" itemscope itemtype="https://schema.org/QuantitativeValue">
      Occupancy: <span itemprop="value">2</span>
    </div>

    <div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
      Total: <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1222.74</span>

      <div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
        <span itemprop="name">Base rate</span>: <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1150</span>
      </div>

      <div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
        <span itemprop="name">GenericTax</span>: <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">172.74</span>
        <meta itemprop="priceComponentType" content="GenericTax"/>
      </div>

      <div itemprop="priceComponent" itemscope itemtype="https://schema.org/UnitPriceSpecification">
        <span itemprop="name">Discount</span>: <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">-100</span>
        <meta itemprop="priceComponentType" content="Discount"/>
      </div>
    </div>
  </div>
</div>

JSON-LD (Deprecated)

{
  "@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:

Microdata

<div itemscope itemtype="https://schema.org/HotelRoom https://schema.org/Product">
  ...
  <div itemprop="offers" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
    ...
    <div itemprop="includesObject" itemscope itemtype="https://schema.org/TypeAndQuantityNode">
      <div itemprop="typeOfGood" itemscope itemtype="https://schema.org/Service">
        <span itemprop="name">Valet</span>
      </div>
    </div>

    <div itemprop="includesObject" itemscope itemtype="https://schema.org/TypeAndQuantityNode">
      <meta itemprop="amountOfThisGood" content="float"/>
      <meta itemprop="unitText" content="currency"/>
      <div itemprop="typeOfGood" itemscope itemtype="https://schema.org/FoodService">
        <span itemprop="name">MealCredit</span>
      </div>
    </div>
  </div>
</div>

JSON-LD (Deprecated)

{
  "@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 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

includesObject example

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.

Microdata

<div itemscope itemtype="https://schema.org/HotelRoom https://schema.org/Product">
  <span itemprop="name">Deluxe Room, 1 King Bed</span>
  <meta itemprop="identifier" content="hotel-room-id-1234"/>

  <div itemprop="offers" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
    <meta itemprop="identifier" content="rate-plan-id-of-member-rate"/>
    Check-in: <time itemprop="checkinTime" content="2023-03-10T15:00:00">Mar 10, 2023 3:00 PM</time>
    Check-out: <time itemprop="checkoutTime" content="2023-03-16T10:00:00">Mar 16, 2023 10:00 AM</time>

    <div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
      <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1222.74</span>
    </div>

    <!-- Included Services -->
    <div itemprop="includesObject" itemscope itemtype="https://schema.org/TypeAndQuantityNode">
      <div itemprop="typeOfGood" itemscope itemtype="https://schema.org/Service">
        <span itemprop="name">Valet</span>
      </div>
    </div>

    <div itemprop="includesObject" itemscope itemtype="https://schema.org/TypeAndQuantityNode">
      <meta itemprop="amountOfThisGood" content="50"/>
      <meta itemprop="unitText" content="USD"/>
      <div itemprop="typeOfGood" itemscope itemtype="https://schema.org/FoodService">
        <span itemprop="name">MealCredit</span>
      </div>
    </div>
  </div>
</div>

JSON-LD (Deprecated)

{
  "@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:

Microdata

<div itemscope itemtype="https://schema.org/HotelRoom https://schema.org/Product">
  ...
  <div itemprop="offers" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
    ...
    <meta itemprop="availability" content="https://schema.org/SoldOut"/>
    Sold Out
  </div>
</div>

JSON-LD (Deprecated)

{
  "@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 schema.org/Offer and the rate information isn't 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.

availability example

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.

Microdata

<div itemscope itemtype="https://schema.org/HotelRoom https://schema.org/Product">
  <span itemprop="name">Deluxe Room, 1 King Bed</span>
  <meta itemprop="identifier" content="hotel-room-id-1234"/>

  <div itemprop="bed" itemscope itemtype="https://schema.org/BedDetails">
    <span itemprop="numberOfBeds">1</span>
    <span itemprop="typeOfBed">KING</span>
  </div>
  <div itemprop="bed" itemscope itemtype="https://schema.org/BedDetails">
    <span itemprop="numberOfBeds">1</span>
    <span itemprop="typeOfBed">SINGLE</span>
  </div>

  <div itemprop="occupancy" itemscope itemtype="https://schema.org/QuantitativeValue">
    Occupancy: <span itemprop="value">2</span>
  </div>

  <div itemprop="offers" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
    Check-in: <time itemprop="checkinTime" content="2023-03-10T15:00:00">Mar 10, 2023 3:00 PM</time>
    Check-out: <time itemprop="checkoutTime" content="2023-03-16T10:00:00">Mar 16, 2023 10:00 AM</time>
    <meta itemprop="availability" content="https://schema.org/SoldOut"/>
    Sold Out

    <div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
      <!-- Price Specification details -->
    </div>
  </div>
</div>

JSON-LD (Deprecated)

{
  "@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:

Microdata

<div itemscope itemtype="https://schema.org/Hotel">
  ...
  <!-- Hotel Amenity -->
  <div itemprop="amenityFeature" itemscope itemtype="https://schema.org/LocationFeatureSpecification">
    <span itemprop="name">HotTub</span>
    <div itemprop="hoursAvailable" itemscope itemtype="https://schema.org/OpeningHoursSpecification">
      <time itemprop="opens" content="HH:mm:ss">HH:mm:ss</time>
      <time itemprop="closes" content="HH:mm:ss">HH:mm:ss</time>
    </div>
  </div>

  <div itemprop="containsPlace" itemscope itemtype="https://schema.org/HotelRoom">
    <!-- Room Amenity -->
    <div itemprop="amenityFeature" itemscope itemtype="https://schema.org/LocationFeatureSpecification">
      <span itemprop="name">Minibar</span>
      <meta itemprop="value" content="boolean"/>
    </div>
  </div>
</div>

JSON-LD (Deprecated)

{
  "@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:

  • FREE
  • PAID
  • NONE
amenityFeature.ParkingType Optional Enum

The type of parking available on the property.

Supported values are:

  • FREE
  • PAID
  • NONE
amenityFeature.PoolType Optional Enum

The type of pool available on the property.

Supported values are:

  • INDOOR
  • OUTDOOR
  • NONE
amenityFeature.RoomStyle Optional Enum

Indicates whether the room is a Japanese style design.

Supported values are:

  • WESTERN
  • JAPANESE
  • JAPANESE_WESTERN
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, "Paris: 123456ABC"

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 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.

containsPlace Optional LocationFeatureSpecification

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.

Amenities example

The following is a basic example of a hotel with a pool open from 10 AM to 10 PM and no gym availability at the property. The hotel room is non-smoking and has a minibar.

Microdata

<div itemscope itemtype="https://schema.org/Hotel">
  <span itemprop="name">ACME Hotel</span>

  <!-- Amenities -->
  <div itemprop="amenityFeature" itemscope itemtype="https://schema.org/LocationFeatureSpecification">
    <span itemprop="name">HotTub</span>
    <div itemprop="hoursAvailable" itemscope itemtype="https://schema.org/OpeningHoursSpecification">
      Open from <time itemprop="opens" content="10:00:00">10:00</time>
      to <time itemprop="closes" content="22:00:00">22:00</time>
    </div>
  </div>

  <div itemprop="amenityFeature" itemscope itemtype="https://schema.org/LocationFeatureSpecification">
    <span itemprop="name">GymFitnessEquipment</span>:
    <meta itemprop="value" content="false"/> No
  </div>

  <div itemprop="containsPlace" itemscope itemtype="https://schema.org/HotelRoom">
    <!-- Room Amenities -->
    <div itemprop="amenityFeature" itemscope itemtype="https://schema.org/LocationFeatureSpecification">
      <span itemprop="name">Minibar</span>:
      <meta itemprop="value" content="true"/> Yes
    </div>
    <div itemprop="amenityFeature" itemscope itemtype="https://schema.org/LocationFeatureSpecification">
      <span itemprop="name">Smoking</span>:
      <meta itemprop="value" content="false"/> No
    </div>

    <div itemprop="offers" itemscope itemtype="https://schema.org/Offer https://schema.org/LodgingReservation">
      <meta itemprop="identifier" content="rate-plan-id-of-member-rate"/>
      Check-in: <time itemprop="checkinTime" content="2023-03-10T15:00:00">Mar 10, 2023 3:00 PM</time>
      Check-out: <time itemprop="checkoutTime" content="2023-03-16T10:00:00">Mar 16, 2023 10:00 AM</time>
      <div itemprop="priceSpecification" itemscope itemtype="https://schema.org/CompoundPriceSpecification">
        <span itemprop="priceCurrency" content="USD">$</span><span itemprop="price">1222.74</span>
      </div>
    </div>
  </div>
</div>

JSON-LD (Deprecated)

{
  "@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"
      }
    }
  }
}

Custom HTML5 attributes with the data-nav- prefix are used to annotate interactive elements and declare page states, allowing the crawler to navigate through the booking flow.

The navigation tagging uses the following attribute syntax:

Attributes

<body data-nav-stage="stage_name">
  ...
  <button data-nav-criticalpath="true"
          data-nav-interactiontype="CLICK"
          data-nav-interactionorder="1">
    Action
  </button>
  ...
  <button data-nav-close="true">Dismiss</button>
</body>

The following are the navigation attributes:

Attribute Values Description
data-nav-stage landing, room-selection, checkout, confirmation Declares active funnel state for crawlers. Attached to <body> or high-level wrapper.
data-nav-stage-final true, false Indicator for the last page of the flow (default false). If no elements with data-nav-criticalpath="true" are present on a page, the crawler automatically considers it the final page of the flow.
data-nav-criticalpath true, false Marks an element that the crawler MUST interact with to reach the final booking page. If no elements with data-nav-criticalpath="true" are present on a page, the crawler automatically considers it the final page of the flow.
data-nav-interactiontype CLICK, SELECT Specifies the interaction action. CLICK is for buttons/links. SELECT is for dropdowns/radio groups.
data-nav-interactionorder integer Provides an execution sequence for multi-step navigation. Lower numbers execute first.
data-nav-close true Marks dismissal buttons on popups, cookie banner overlays, or upsell modals.

The following are examples of navigation tagging.

Click navigation

The following is a basic example of click navigation declaring the funnel stage.

<body data-nav-stage="room-selection" data-nav-stage-final="false">
  <h1>Select Your Room</h1>
  
  <!-- Crawler needs to click this to proceed -->
  <button data-nav-criticalpath="true"
          data-nav-interactiontype="CLICK"
          data-nav-interactionorder="1">
    Select & Proceed
  </button>
</body>

Multi-step navigation

The following is an example of multi-step navigation including a cookie banner, accordion reveal, and click.

<div data-nav-stage="landing" data-nav-stage-final="false">
  <!-- Hotel, LodgingReservation info, and Offer price are expected to be included in this page -->

  <!-- Step 1: Accept cookies -->
  <div class="cookie-banner">
    <p>We use cookies to improve your experience.</p>
    <button data-nav-close="true"
            data-nav-criticalpath="true"
            data-nav-interactiontype="CLICK"
            data-nav-interactionorder="1">Accept cookies</button>
  </div>

  <!-- Step 2: Open accordion to reveal pricing (Crucial for making prices visible in Mobile UIs) -->
  <div data-nav-criticalpath="true"
       data-nav-interactiontype="CLICK"
       data-nav-interactionorder="2"
       class="accordion-header">
    <span>View Room Rates</span>
  </div>


  <!-- Step 3: Book the room -->
  <div class="accordion-content">
    <button data-nav-criticalpath="true"
            data-nav-interactiontype="CLICK"
            data-nav-interactionorder="3">
      Book Now
    </button>
  </div>
</div>

Final page declaration

The following is an example of declaring the final page of the booking flow.

<!-- Marks this as the final confirmation page where price is extracted -->
<!-- Hotel, LodgingReservation info, and Offer price are expected to be included in this page -->
<div data-nav-stage="confirmation" data-nav-stage-final="true">
  <h1>Grand View Hotel</h1>
  <!-- Price and other details here -->
</div>