Skip to content

Registered profile · Protocol v1.0

Hotel Rate Offer Profile

Describe a named hotel property with a source-observed starting nightly price. A source-observed starting nightly price for an identified hotel property.

Selector
hotel_rate
Price unit
night
Rate kind
reference_starting_nightly
Profile status
protocol-v1.0.0-r15

Required Offer context

Complete the common Offer shell first

The profile adds domain facts; it does not replace the required Partner Offer fields.

Category
travel_tourism.accommodations.hotels_motels_resorts.hotels
Commercial
price.amount, price.currency, price.unit: "night", price.tax_status, and quote.observed_at
Identity and action
source_offer_id, version: "3.0", entity, booking action, and goals
Unknown dates and room type are not validation errors

When the source only provides a starting nightly price, omit offer_info.details.data.stay and offer_info.details.data.room. Do not send null, empty objects, placeholder dates, or an invented room name.

Presentation

Present it as a starting nightly reference

offer_info.title can state the named property and starting nightly price, for example Central Tokyo Hotel from CNY 788 per night. The profile does not assert availability, a room allocation, or a total stay price.

Field reference

Paths below are complete Offer paths. Requirement labels are computed in the context of the selected profile.

29 fields

Profile envelope

Closed supply-profile envelope. profile selects exactly one registered closed data shape.

Field pathTypeRequirementMeaning and constraints
offer_info.details.profilestringrequiredRegistered supply Offer profile identifier in the stable v1.0 registry.Const: "hotel_rate"
offer_info.details.dataobjectrequiredClosed public facts for a hotel reference starting nightly price. This profile never asserts a confirmed inventory allocation or total-stay price.Closed object: unknown properties are not allowed

Rate

Closed price-nature declaration for the hotel rate profile.

Field pathTypeRequirementMeaning and constraints
offer_info.details.data.rateobjectrequiredClosed price-nature declaration for the hotel rate profile.Closed object: unknown properties are not allowed
offer_info.details.data.rate.kindstringrequiredThe price is a source-observed single-night reference or starting price, not a booking, inventory, room-allocation, or total-stay assertion.Const: "reference_starting_nightly"

Property

Identified hotel property and its public location facts.

Field pathTypeRequirementMeaning and constraints
offer_info.details.data.propertyobjectrequiredIdentified hotel property and its public location facts.Closed object: unknown properties are not allowed
offer_info.details.data.property.namestringrequiredNon-empty source-provided hotel property name.Minimum length: 1 · Maximum length: 300
offer_info.details.data.property.locationobjectrequiredPublic AON location reference, country, and optional source-provided display facts for the property.Closed object: unknown properties are not allowed
offer_info.details.data.property.location.location_idstringrequiredNumeric-string identifier that must be an active AON Full Location Catalog v1 member under semantic validation.Pattern: ^[0-9]+$
offer_info.details.data.property.location.country_codestringrequiredUppercase two-letter ISO 3166-1 alpha-2 country or territory code supplied by the source.Pattern: ^[A-Z]{2}$
offer_info.details.data.property.location.citystringoptionalOptional source-provided city display name when known.Minimum length: 1 · Maximum length: 200
offer_info.details.data.property.location.addressstringoptionalOptional source-provided property address when known.Minimum length: 1 · Maximum length: 500
offer_info.details.data.property.location.latitudestring | numberoptionalOptional WGS-84 latitude when supplied by the source. String values preserve existing adapter payloads; numeric values must be from -90 through 90.Minimum: -90 · Maximum: 90
offer_info.details.data.property.location.longitudestring | numberoptionalOptional WGS-84 longitude when supplied by the source. String values preserve existing adapter payloads; numeric values must be from -180 through 180.Minimum: -180 · Maximum: 180
offer_info.details.data.property.location.timezonestringoptionalOptional source-provided IANA-style property timezone when known.Minimum length: 1 · Maximum length: 64
offer_info.details.data.property.property_typestringoptionalOptional source-provided property type when known.Minimum length: 1 · Maximum length: 80
offer_info.details.data.property.star_ratingstring | numberoptionalOptional source-provided property star rating when known. String values preserve existing source formatting; numeric values must be from 1 through 5.Minimum length: 1 · Maximum: 5

Stay

Optional stay facts. Omit the entire object when dates are unknown; when supplied both dates are required.

Field pathTypeRequirementMeaning and constraints
offer_info.details.data.stayobjectoptionalOptional stay facts. Omit the entire object when dates are unknown; when supplied both dates are required.Closed object: unknown properties are not allowed
offer_info.details.data.stay.check_instringRequired when stay is presentKnown local check-in calendar date; never a default or inferred placeholder.Format: date
offer_info.details.data.stay.check_outstringRequired when stay is presentKnown local check-out calendar date; semantic validation requires it to be after check_in.Format: date
offer_info.details.data.stay.occupancyobjectoptionalOptional known search or booking occupancy. Omit it instead of inventing room or guest counts.Closed object: unknown properties are not allowed
offer_info.details.data.stay.occupancy.roomsintegerRequired when occupancy is presentPositive number of rooms when known.Minimum: 1
offer_info.details.data.stay.occupancy.adultsintegerRequired when occupancy is presentPositive number of adult guests when known.Minimum: 1
offer_info.details.data.stay.occupancy.children_agesarray<integer>optionalOptional ages of known child guests. Omit when there are no children or their ages are unknown.Minimum items: 1 · Maximum items: 12 · Item minimum: 0 · Item maximum: 17

Room

Optional room facts. Omit the entire object when the room type is unknown.

Field pathTypeRequirementMeaning and constraints
offer_info.details.data.roomobjectoptionalOptional room facts. Omit the entire object when the room type is unknown.Closed object: unknown properties are not allowed
offer_info.details.data.room.namestringRequired when room is presentNon-empty source-provided room name when the room is known.Minimum length: 1 · Maximum length: 300
offer_info.details.data.room.room_idstringoptionalOptional opaque source room identifier when it is safe to disclose.Minimum length: 1 · Maximum length: 256
offer_info.details.data.room.beddingarray<string>optionalOptional non-empty source-provided bedding descriptions.Minimum items: 1 · Maximum items: 8 · Item minimum length: 1 · Item maximum length: 100
offer_info.details.data.room.max_occupancyintegeroptionalOptional maximum room occupancy when known.Minimum: 1
offer_info.details.data.room.room_type_guaranteedbooleanoptionalOptional source assertion that the named room type is guaranteed.

Canonical Partner Offer example

This fixture-derived example retains every source-known property fact while intentionally omitting unknown stay and room branches.

JSON · hotel_rate Partner Offer
{
  "source_offer_id": "hotel-central-tokyo-reference-nightly",
  "version": "3.0",
  "offer_info": {
    "title": "Central Tokyo Hotel from CNY 788 per night",
    "offer_type": "offline_service",
    "category": {
      "id": "travel_tourism.accommodations.hotels_motels_resorts.hotels"
    },
    "description": "Source-observed starting nightly price for Central Tokyo Hotel.",
    "commercial": {
      "price": {
        "amount": "788.00",
        "currency": "CNY",
        "unit": "night",
        "tax_status": "unknown"
      },
      "quote": {
        "observed_at": "2026-09-04T09:00:00Z"
      }
    },
    "details": {
      "profile": "hotel_rate",
      "data": {
        "rate": {
          "kind": "reference_starting_nightly"
        },
        "property": {
          "name": "Central Tokyo Hotel",
          "star_rating": "4",
          "location": {
            "location_id": "1009317",
            "country_code": "JP",
            "city": "Tokyo",
            "address": "1 Chome Marunouchi, Chiyoda City",
            "latitude": "35.681236",
            "longitude": 139.767125,
            "timezone": "Asia/Tokyo"
          }
        }
      }
    }
  },
  "entity": {
    "id": "ctrip-example",
    "name": "Example Travel"
  },
  "action": {
    "type": "open_url",
    "consumer_action": "book",
    "payload": {
      "url": "https://example.com/hotels/central-tokyo"
    }
  },
  "goals": [
    {
      "event": "booking",
      "pricing": {
        "model": "cpa",
        "amount": "10",
        "currency": "USD"
      }
    }
  ]
}

Semantic validation

  • State only a starting nightly price: hotel_rate requires commercial.price.unit night hotel_rate must declare rate.kind reference_starting_nightly
  • Use an active AON location: hotel_rate property.location.location_id must be an active AON Full Location Catalog v1 member
  • Omit unknown stay dates: A producer that does not know exact dates or a room type omits the entire corresponding object; it must not send null, empty strings, placeholder dates, or a partial stay. hotel_rate stay.check_out must be later than stay.check_in
  • Omit an unknown room type: hotel_rate room.name must be non-blank when room is supplied
  • Supply details are Partner input facts: current Query Generic projection must not include offer_info.details