XooCode(){

HotelRoom

HotelRoom is a Room subtype for a single room within a hotel. It re-declares bed and occupancy from Accommodation but does not redeclare numberOfRooms (a hotel room is one room, by definition). Use HotelRoom for individual room types in a hotel: standard king, deluxe queen, accessible double, twin, family. For multi-room accommodations, use Suite.

The type hierarchy is Thing → Place → Accommodation → Room → HotelRoom (5 levels). Hotel rooms appear inside a Hotel entity via containsPlace. The hotel describes the property; the HotelRoom describes the bookable unit. Search engines need both: the hotel for location and the room for booking-level details.

Full example of schema.org/HotelRoom json-ld markup

The markup is verified as valid with Rich Results Test from Google.

Highlight legend:Required by GoogleRecommendedOptional
schema.org/HotelRoom
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@id": "https://hoteldunmore.com/rooms/deluxe-king#room",
  "@type": "HotelRoom",
  "name": "Deluxe King Room",
  "description": "King-bedded room with city view, work desk, walk-in shower, and complimentary high-speed WiFi. Ideal for business travelers attending events at The Thunderdome.",
  "url": "https://hoteldunmore.com/rooms/deluxe-king",
  "image": [
    "https://hoteldunmore.com/rooms/deluxe-king/photo-1x1.jpg",
    "https://hoteldunmore.com/rooms/deluxe-king/photo-4x3.jpg",
    "https://hoteldunmore.com/rooms/deluxe-king/photo-16x9.jpg"
  ],
  "containedInPlace": { "@id": "https://hoteldunmore.com#hotel", "@type": "Hotel", "name": "Hotel Dunmore" },
  "bed": { "@type": "BedDetails", "numberOfBeds": 1, "typeOfBed": "King" },
  "occupancy": { "@type": "QuantitativeValue", "value": 2 },
  "floorSize": { "@type": "QuantitativeValue", "value": "28", "unitCode": "MTK" },
  "amenityFeature": [
    { "@type": "LocationFeatureSpecification", "name": "WiFi", "value": true },
    { "@type": "LocationFeatureSpecification", "name": "Work desk", "value": true },
    { "@type": "LocationFeatureSpecification", "name": "Walk-in shower", "value": true },
    { "@type": "LocationFeatureSpecification", "name": "Smart TV", "value": true },
    { "@type": "LocationFeatureSpecification", "name": "Air conditioning", "value": true },
    { "@type": "LocationFeatureSpecification", "name": "Mini-fridge", "value": true }
  ],
  "petsAllowed": false
}
</script>

bed

For a single bed configuration, use a Text label: "bed": "King", "bed": "Two Queens". For more detail, use BedDetails with numberOfBeds and typeOfBed. Google Hotels reads bed type for filter results and may show the bed configuration in the room card.

occupancy

occupancy takes a QuantitativeValue with the maximum number of guests. For a king room that sleeps 2, use value: 2. For a family room with extra beds, use value: 4. Google Hotels uses occupancy for guest-count search filters.

Minimal valid version

The smallest markup that still produces a valid HotelRoom entity. Use it as the floor. Reach for the advanced example above when you want search engines and AI agents to understand more about your content.

schema.org/HotelRoom (minimal)
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "HotelRoom",
  "name": "Deluxe King Room",
  "containedInPlace": { "@type": "Hotel", "name": "Hotel Dunmore" },
  "bed": { "@type": "BedDetails", "numberOfBeds": 1, "typeOfBed": "King" },
  "occupancy": { "@type": "QuantitativeValue", "value": 2 },
  "image": "https://hoteldunmore.com/rooms/deluxe-king/photo-16x9.jpg",
  "description": "King-bedded room with city view and work desk."
}
</script>

Google rich results this unlocks

Markup matching this example makes your page eligible for the following Google Search rich results. The primary target drives the required / recommended property classification in the advanced code block above.

Common HotelRoom mistakes

Mistakes that pass validation but silently fail to earn rich results or mislead consumers walking the graph. Avoid these and your markup will be ahead of most sites in the wild.

  1. 01

    HotelRoom without containedInPlace

    Wrong
    HotelRoom listed standalone with no Hotel reference
    Right
    "containedInPlace": { "@id": "...#hotel", "@type": "Hotel", "name": "..." }

    Hotel rooms must belong to a hotel. containedInPlace links the room to the parent Hotel entity. Without it, Google sees an orphan room with no property context, location, or amenities.

  2. 02

    Setting numberOfRooms on a HotelRoom

    Wrong
    "numberOfRooms": 1 on a HotelRoom
    Right
    Omit numberOfRooms - a hotel room is one room by definition

    HotelRoom intentionally does not redeclare numberOfRooms because a single room equals one room. Setting it adds noise without information. If you have multiple rooms, you want Suite, not HotelRoom.

  3. 03

    Inventing bed type URL values

    Wrong
    "typeOfBed": "https://schema.org/KingSizeBed"
    Right
    "typeOfBed": "King" (use Text - schema.org BedType has no published enum members)

    Schema.org defines BedType as an enumeration but has not published any specific bed type instances. Use plain text strings like "King", "Queen", "Twin", "Sofa bed". Made-up URLs will fail validation.

About the example data

A standard king room at Hotel Dunmore, the type of room booked by typical XooCon attendees through the LodgingReservation example.

Comments

Loading comments...

Leave a comment