Skip to main content
After a hotel stay is booked, Price Drop Protection keeps searching the same hotel. When the same room, with the same cancellation terms, costs more than USD 10 less than the traveler paid, Jinko books it as a new booking, cancels the stay on the original booking and refunds the difference to the traveler’s original payment. Price Drop Protection is free.

What it covers

  • Hotel stays paid at booking, for one room, on a rate that can be cancelled for a full refund. For any other stay, get_booking_ancillaries says why it cannot be protected (see When protection cannot be added).
  • Jinko searches the hotel once a day (terms.check_interval_minutes) until shortly before free cancellation of the stay ends (terms.ends_at), so that the original stay can still be cancelled for a full refund.
  • A rebook needs the same hotel, room, board, dates and guests, free cancellation until at least the same date as the original booking, and a price lower by more than terms.min_saving_money (USD 10). For a booking in another currency, USD 10 is converted at the rate of the day of each check.
  • A stay is rebooked at most once. The new booking cannot be protected again.
  • When the original booking also holds a flight, the new booking holds only the hotel. The flight stays on the original booking.

Add protection to a booking

Once the hotel booking is confirmed, list what can be added to it with its booking_ref and the traveler’s last name.
Each booked hotel item that can be protected has one offer of type price_drop_protection:
description is one paragraph you can show the traveler as it is. With the traveler’s approval, add the offer to a trip of its own and check it out:
  • Send add_item without a trip_id: the protection is a trip of its own. The trip takes the travelers and contact of the booking; you do not add them.
  • A trip that holds only free products has nothing to pay. Checkout answers status fulfilling and payment_type none, with an empty checkout_url and no expires_at. There is no payment step.
  • The offer’s trip_item_token is valid until catalog_expires_at. Protection can be added until purchase_deadline.
Through MCP, the same steps are get_booking_ancillaries({ booking_ref, last_name }), then trip({ add_item: { trip_item_token } }) without a trip_id, then checkout({ trip_id }).

Follow the protection

get_booking shows price_drop_protection on the protected hotel item:
A search that finds no cheaper equivalent room changes nothing: the status stays active until the next search.

When the stay is rebooked

Jinko first books the same room at the lower price as a new booking, then cancels the stay on the original booking. If the original stay cannot be cancelled for a full refund at that moment, Jinko cancels the new booking instead, keeps the original, and the protection ends with ended_reason refund_window_closed. After a rebook:
  • The original hotel item is cancelled and shows price_drop_protection.status rebooked, with the new booking in rebook. When the original booking held only this stay, its status is cancelled too; a flight on the same booking stays booked, so do not stop tracking it:
  • The new booking holds the stay. Read it with get_booking on rebook.new_booking_ref and the same last name. Cancel it as any hotel booking; a refund goes to the original payment.
  • refund_money is what the traveler paid for the original stay minus the price of the new booking. It is refunded to the original payment. Nothing new is charged: the original payment covers the new booking.
  • The traveler receives one email, hotel-price-drop-rebooked, with the new booking and the cancellation of the original stay. Jinko sends no separate booking confirmation or cancellation email for a rebook.
  • Jinko sends the servicing.price_drop_rebooked webhook event. See Webhooks.

When protection cannot be added

An item with purchasable false lists no offer. not_purchasable_reason says why:

Test on sandbox

On sandbox, a rebook happens only when the hotel’s sandbox price is lower when Jinko searches it. No call triggers a rebook. Test adding protection and reading price_drop_protection there, and handle the servicing.price_drop_rebooked event from the example in Webhooks.