Developer Hub

Cancel for any reason

Give travelers the flexibility to cancel a non-refundable booking and receive a refund for the full hotel price

Please note: This feature is currently available for a subset of partners as part of a pilot period. We expect to launch more broadly in Q3 2026. If you're interested in this feature, reach out to your account manager.

Overview

The Trip Protection API is a new, optional capability for those who already integrated with the Rapid Lodging API. It allows eligible lodging bookings to be offered with a cancel for any reason (CFAR) upgrade, giving travelers the flexibility to cancel a non-refundable booking and receive a full refund of the price paid for the hotel.

What is CFAR?

With the addition of CFAR, travelers can cancel non-refundable lodging bookings before check‑in and receive a full hotel refund. CFAR is a travel service—not traditional travel insurance—and requires no qualifying reason or claims process; travelers may cancel for any reason without additional paperwork.

CFAR helps you:

  • Increase conversion on lower-priced non-refundable inventory
  • Give travelers confidence when booking non-refundable rates
  • Reduce friction around cancellation
  • Provide flexibility without introducing manual claims handling

CFAR live site display example

CFAR UI Illustration

Please note: This sample is provided for illustrative purposes only.

Launch requirements

Before integrating the Trip Protection API, you must already be live on the Rapid Lodging API (Availability/Shopping, Price Check, and Booking endpoints). The authentication mechanism will be through Signature Authentication as in the Rapid Lodging API.

Contact your account manager to have this scope added to your credentials.

How it works

The CFAR integration is minimally disruptive. No changes are required to your existing Rapid Lodging request payloads for Availability/Shopping, Booking, and Cancellation (Steps 1, 4, and 6). The new behavior is additive, so if you don’t act on the CFAR offer, you'll see no change to your integration.

CFAR with Rapid Lodging

CFAR integration with Lodging

Step 1: Search for lodging rates

No changes required.

This is the standard Rapid Lodging Availability/Shopping call. No modifications are needed to the request or response handling.

Step 2: Call the Price Check API

This is the standard Rapid Lodging price check call. No changes to the request are required.

When a rate is eligible for CFAR, the Price Check response will include an add_trip_protection link alongside the existing book link in the links object. You should use this link to offer the traveler the CFAR option.

Example: Price Check response links object (CFAR-eligible rate)

{
  "links": {
    "book": {
      "method": "POST",
      "href": "/v3/itineraries?token=QldfCGtcTjIbASj7"
    },
    "add_trip_protection": {
      "method": "GET",
      "href": "/v1/trip-protection/quote?token=QldfCGtcTjIbASj7"
    }
  }
}

Note: The add_trip_protection link will only be present when the rate is eligible for CFAR. If the link is absent, CFAR is not available for that rate.

Step 3: Get a Trip Protection quote

Endpoint: GET /v1/trip-protection/quote?token={token}

This is an optional step that retrieves a full CFAR quote for the selected rate. Use the href from the add_trip_protection link returned in Step 2 as the request URL.

The response contains:

  • Product details: product name, type, vendor, and merchant of record
  • Policy details: coverage dates, coverage percentage and limit, marketing copy (headline, overview, benefits), disclaimer, and a link to the policy wording document
  • Pricing: the CFAR price (trip_protection_price) and combined lodging + protection totals (totals), each expressed in both billable and request currencies (inclusive and exclusive of taxes/fees)
  • Cancel penalties: penalties that apply to the protection product itself if cancelled
  • Booking link: the links.book parameter is used in Step 4 to book with CFAR

Required headers

HeaderRequiredNotes
AcceptYesMust be application/json
Accept-EncodingYesMust be gzip
Customer-IpYesEnd-traveler's IPv4 address (not your server's)
User-AgentYesCustomer's user-agent or {app-name}/{app-version}
Customer-Session-IdNoUnique per user session; re-use across calls in the same session
TestNoFor sandbox testing: standard, service_unavailable, unknown_internal_error

Example: Quote response

{
  "product_name": "Cancel for any reason (100% Refund)",
  "product_type": "hotel_cancel_for_any_reason",
  "vendor": "[vendor name]",
  "merchant_of_record": "expedia",
  "policy": {
    "start_date": "2025-10-13T15:59:00.000+01:00",
    "end_date": "2025-10-18T08:00:00.000-08:00",
    "coverage": {
      "percentage": "100%",
      "limit": {
        "inclusive": {
          "billable_currency": { "value": "[amount]", "currency": "USD" },
          "request_currency": { "value": "[amount]", "currency": "USD" }
        },
        "exclusive": {
          "billable_currency": { "value": "[amount]", "currency": "USD" },
          "request_currency": { "value": "[amount]", "currency": "USD" }
        }
      }
    },
    "description": {
      "headline": "Change of plans? You're covered.",
      "overview": "Add flexibility to your stay with Cancel for any reason coverage. Get a refund if you cancel before 8:00 AM property time on [check-in date].",
      "benefits": "<b>Get a refund of 100%: [refund_amount]</b>
<b>Cancel anytime before 8:00 AM property time on [checkin_date]</b>
<b>No questions asked, no paperwork</b>
"
    },
    "disclaimer": "By purchasing, I agree to all Cancel for any reason [policy_terms_link_text] on my itinerary",
    "links": {
      "policy_wording": {
        "method": "GET",
        "href": "https://staging.vendor.com/pds/1ed50cef-49e1-4ff6-acc9-137ba784e472?policy_type=expedia_travel_insurance_v1"
      }
    }
  },
  "pricing": {
    "trip_protection_price": {
      "inclusive": {
        "billable_currency": { "value": "[amount]", "currency": "USD" },
        "request_currency": { "value": "[amount]", "currency": "USD" }
      },
      "exclusive": {
        "billable_currency": { "value": "[amount]", "currency": "USD" },
        "request_currency": { "value": "[amount]", "currency": "USD" }
      }
    },
    "totals": {
      "inclusive": {
        "billable_currency": { "value": "[amount]", "currency": "USD" },
        "request_currency": { "value": "[amount]", "currency": "USD" }
      },
      "exclusive": {
        "billable_currency": { "value": "[amount]", "currency": "USD" },
        "request_currency": { "value": "[amount]", "currency": "USD" }
      }
    }
  },
  "refundable": false,
  "cancel_penalties": [
    {
      "start": "2026-10-13T15:59:00.000+01:00",
      "end": "2026-10-18T08:00:00.000-08:00",
      "currency": "USD",
      "amount": "[amount]",
      "percent": "100%"
    }
  ],
  "links": {
    "book": {
      "method": "POST",
      "href": "/v3/itineraries?token=MY5S3j36cOcL",
      "expires": "2026-10-13T16:10:00.000+01:00"
    }
  }
}

Step 4: Call Booking API

No changes to the request payload.

This is the standard Rapid Lodging Booking call (POST /v3/itineraries). The booking link to use depends on whether the traveler opted into CFAR.

Traveler choiceBooking link to use
With CFARlinks.book from the Step 3 quote response
Without CFARlinks.book from the Step 2 Price Check response

No new fields are added to the booking request or response. CFAR is activated solely by which token is used in the booking link.

Note: The links.book token from the quote response expires (see the expires field). Ensure the booking is submitted before the token expiry.

Step 5: Retrieve Booking

No changes to the request.

This is the standard Rapid Lodging GET /v3/itineraries/{itinerary_id} call.

When CFAR was purchased, the Itinerary response will include an additional trip_protection object containing the policy and pricing details of the purchased product. If you did not purchase CFAR, you'll see no change to the Itinerary response.

Additionally, when CFAR is active, the cancel_penalties and refundable fields on the rate object in the itinerary will reflect the CFAR policy rather than the base rate's cancellation policy.

Example: Itinerary response showing the trip_protection object

[
  {
    "itinerary_id": "8999989898988",
    "property_id": "8150374",
    "trip_protection": {
      "product_name": "Cancel for any reason (100% Refund)",
      "product_type": "hotel_cancel_for_any_reason",
      "vendor": "[vendor]",
      "merchant_of_record": "expedia",
      "policy": {
        "start_date": "2026-10-13T15:59:00.000+01:00",
        "end_date": "2026-10-18T08:00:00.000-08:00",
        "coverage": {
          "percentage": "100%",
          "limit": {
            "inclusive": {
              "billable_currency": { "value": "[amount]", "currency": "USD" }
            },
            "exclusive": {
              "billable_currency": { "value": "[amount]", "currency": "USD" }
            }
          }
        },
        "links": {
          "policy_wording": {
            "method": "GET",
            "href": "https://staging.vendor.com/pds/1ed50cef-49e1-4ff6-acc9-137ba784e472?policy_type=expedia_travel_insurance_v1"
          }
        }
      },
      "pricing": {
        "inclusive": {
          "billable_currency": { "value": "[amount]", "currency": "USD" }
        },
        "exclusive": {
          "billable_currency": { "value": "[amount]", "currency": "USD" }
        }
      }
    }
  }
]

Note: The trip_protection pricing in the Retrieve response reflects the billable currency only. For the full breakdown including request currency, refer to the original quote response.

Step 6: Cancel Booking

No changes to the request.

This is the standard Rapid Lodging cancellation call. When CFAR was purchased, canceling the booking will automatically trigger a refund claim on behalf of the traveler. No additional action is required for your implementation.

Refunds are processed entirely by Expedia Group. The traveler will receive the applicable refund through the standard claim settlement process.

API details

Explore the Trip Protection-related endpoint definitions on this page, then use the API Explorer or another testing software to get an understanding of how the examples and schema definitions compare to the actual output.


Note: This schema file is provided for evaluation purposes only. Changes and refinement, including breaking changes, are likely before this reaches general availability.

Did you find this page helpful?
How can we improve this content?
Thank you for helping us improve!