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, andquote.observed_at- Identity and action
source_offer_id,version: "3.0",entity, bookingaction, andgoals
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.
Profile envelope
Closed supply-profile envelope. profile selects exactly one registered closed data shape.
| Field path | Type | Requirement | Meaning and constraints |
|---|---|---|---|
offer_info.details.profile | string | required | Registered supply Offer profile identifier in the stable v1.0 registry.Const: "hotel_rate" |
offer_info.details.data | object | required | Closed 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 path | Type | Requirement | Meaning and constraints |
|---|---|---|---|
offer_info.details.data.rate | object | required | Closed price-nature declaration for the hotel rate profile.Closed object: unknown properties are not allowed |
offer_info.details.data.rate.kind | string | required | The 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 path | Type | Requirement | Meaning and constraints |
|---|---|---|---|
offer_info.details.data.property | object | required | Identified hotel property and its public location facts.Closed object: unknown properties are not allowed |
offer_info.details.data.property.name | string | required | Non-empty source-provided hotel property name.Minimum length: 1 · Maximum length: 300 |
offer_info.details.data.property.location | object | required | Public 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_id | string | required | Numeric-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_code | string | required | Uppercase 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.city | string | optional | Optional source-provided city display name when known.Minimum length: 1 · Maximum length: 200 |
offer_info.details.data.property.location.address | string | optional | Optional source-provided property address when known.Minimum length: 1 · Maximum length: 500 |
offer_info.details.data.property.location.latitude | string | number | optional | Optional 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.longitude | string | number | optional | Optional 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.timezone | string | optional | Optional source-provided IANA-style property timezone when known.Minimum length: 1 · Maximum length: 64 |
offer_info.details.data.property.property_type | string | optional | Optional source-provided property type when known.Minimum length: 1 · Maximum length: 80 |
offer_info.details.data.property.star_rating | string | number | optional | Optional 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 path | Type | Requirement | Meaning and constraints |
|---|---|---|---|
offer_info.details.data.stay | object | optional | Optional 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_in | string | Required when stay is present | Known local check-in calendar date; never a default or inferred placeholder.Format: date |
offer_info.details.data.stay.check_out | string | Required when stay is present | Known local check-out calendar date; semantic validation requires it to be after check_in.Format: date |
offer_info.details.data.stay.occupancy | object | optional | Optional 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.rooms | integer | Required when occupancy is present | Positive number of rooms when known.Minimum: 1 |
offer_info.details.data.stay.occupancy.adults | integer | Required when occupancy is present | Positive number of adult guests when known.Minimum: 1 |
offer_info.details.data.stay.occupancy.children_ages | array<integer> | optional | Optional 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 path | Type | Requirement | Meaning and constraints |
|---|---|---|---|
offer_info.details.data.room | object | optional | Optional room facts. Omit the entire object when the room type is unknown.Closed object: unknown properties are not allowed |
offer_info.details.data.room.name | string | Required when room is present | Non-empty source-provided room name when the room is known.Minimum length: 1 · Maximum length: 300 |
offer_info.details.data.room.room_id | string | optional | Optional opaque source room identifier when it is safe to disclose.Minimum length: 1 · Maximum length: 256 |
offer_info.details.data.room.bedding | array<string> | optional | Optional 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_occupancy | integer | optional | Optional maximum room occupancy when known.Minimum: 1 |
offer_info.details.data.room.room_type_guaranteed | boolean | optional | Optional 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.
{
"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