Cancellation Policy Extension¶
Overview¶
The Cancellation Policy Extension defines the
dev.ucp.lodging.policy.cancellation policy type on the core
policies[] primitive for the lodging service. It
adds pre-purchase, machine-readable cancellation terms to policies that
carry this type, so platforms can answer questions like "Can I cancel this booking?",
"Is it free cancellation or is there a fee?", and "Is this rate completely
non-refundable?" without leaving to parse external policy pages.
Key features:
- Tri-state refundability classification (
refundability) to signal whether cancellation is currently free (refundable), incurs a penalty (partially_refundable), or is disallowed (non_refundable) - Human-readable summary in
descriptioncarrying detailed property cutoff times, timezone deadlines, and penalty schedules - Optional direct link to the property's complete legal terms (
url)
Dependencies:
- The core
policies[]primitive (see Policies). - Any parent capabilities this type extends: Booking
(
dev.ucp.lodging.booking).
Discovery¶
Businesses advertise cancellation policy support in their profile. The type
extends any surface that carries policies[]:
{
"ucp": {
"version": "draft",
"capabilities": {
"dev.ucp.lodging.policy.cancellation": [
{
"version": "draft",
"extends": [
"dev.ucp.lodging.booking"
],
"spec": "https://ucp.dev/draft/specification/lodging/extensions/cancellation-policy",
"schema": "https://ucp.dev/draft/schemas/lodging/policy_cancellation.json"
}
]
}
}
}
Schema¶
When this type is active, a policies[] entry whose type is
dev.ucp.lodging.policy.cancellation carries additional attributes
(e.g., refundability) in addition to the base type,
description, applies_to, and url.
| Name | Type | Requirement | Description |
|---|---|---|---|
| type | Reverse Domain Name | Required | Constant = dev.ucp.lodging.policy.cancellation. Policy discriminator for lodging cancellation terms. Policy type discriminator. Open reverse-DNS vocabulary. See specification documentation for the registry of well-known policy types. Businesses MAY define custom types in their own domain (e.g., com.example.policy.price_match). Platforms MUST tolerate unknown values. |
| description | Description | Required | Human-readable policy summary in one or more formats (plain, markdown, html). Required on every policy so a platform can present it without understanding any type-specific fields. This is not the buyer-facing disclosure — display is compelled by a messages[] warning (see the Policies section). |
| applies_to | Array[string] | Optional | RFC 9535 JSONPath expressions identifying the nodes this policy applies to, relative to the embedding response root (e.g., $.line_items[0] in cart/checkout, $.products[2] in catalog). Each target covers the node it names and everything nested under it, so a target on a product also covers its variants. A singular query (RFC 9535 Section 2.3.5.1; name and index selectors only) names a single node; filters, wildcards, and slices match a set. When omitted, the policy applies to the entire response. When policies of the same type contest a node, the narrowest target wins and overrides the rest. See the Policies section for how specificity resolves. |
| url | string | Optional | Optional link to the full policy document. |
| refundability | string | Required | High-level refundability classification. Well-known values: refundable (free cancellation currently available), partially_refundable (cancellable with penalty, or inside penalty window), non_refundable (no refund upon cancellation). |
Cancellation terms¶
Refundability classifications¶
The refundability field provides a standardized high-level classification:
refundable: Free cancellation is currently available. The booker can cancel without penalty before the deadline stated indescription.partially_refundable: The booking can be cancelled, but a cancellation fee applies (e.g., a one-night room charge or fixed administrative fee), or the booking is currently inside a partial penalty window. Specific cancellation fees, penalty schedules, and refund effects are outlined in the policy'sdescriptionfield.non_refundable: The reservation cannot be refunded upon cancellation (the full booking price is retained by the business, subject to local regulation).
Non-refundable bookings¶
To signal that a booking or rate is non-refundable, a business MUST set
refundability to "non_refundable".
When a business requires the booker to be shown that a booking is non-refundable
prior to confirmation, it emits a messages[] warning with
presentation: "disclosure" and code equal to
dev.ucp.lodging.policy.cancellation, targeting the item. The disclosure pairs
with the governing cancellation policy at that node, as defined in
Presenting policies.
Human-readable descriptions¶
Because lodging cancellation rules frequently incorporate specific property
local cutoff times (e.g., "by 3:00 PM property time 2 days before check-in")
and seasonal rules, businesses MUST articulate the full timeline and terms in
description. The description and refundability field MUST NOT contradict
each other.
Targeting and precedence¶
Targeting and precedence are provided by the policies[] primitive and are not
redefined here. In short: a policy with no applies_to is the response-wide
default; a policy that targets specific room overrides will result in the
narrowest same-type target winning. See
Targeting and
Precedence.
For lodging bookings, a common example is when a business states a single default cancellation policy once, then adds targeted overrides only for specific exceptions (such as a non-refundable room rate or promotional upgrade).
Responsibilities¶
Cancellation policies are business-stated facts. They are response-only data that a platform never submits. They carry no user-asserted claims and no PII.
A business SHOULD accurately summarize cancellation timelines, applicable
penalties and cutoff deadlines in description and link to full policy terms
via url. A platform SHOULD surface url alongside the policy description
so the booker can review full dynamic property policies.
Examples¶
[
{
"type": "dev.ucp.lodging.policy.cancellation",
"description": {
"plain": "Free cancellation until Dec 20, 2026, 3:00 PM EDT (48 hours before check-in). 1 night penalty thereafter."
},
"refundability": "refundable",
"url": "https://example.com/cancellation-terms"
},
{
"type": "dev.ucp.lodging.policy.cancellation",
"description": {
"plain": "Non-refundable promotional rate. This room reservation cannot be cancelled or modified for a refund."
},
"applies_to": ["$.stays[0]"],
"refundability": "non_refundable",
"url": "https://example.com/cancellation-terms#non-refundable"
}
]