Create Booking.com Promotion

Create a promotion on a Booking.com property. The promotion goes on sale on Booking.com as soon as it is created, so check the discount, dates, rooms and rate plans before sending. The required fields and allowed values depend on type (see the fields below); Hostex rejects requests that cannot be valid with 400 before calling Booking.com.

  • idempotency_key is required. Booking.com creates a new promotion for every request, so retry a failed or timed-out request with the same key: Hostex returns the promotion created by the first request (created: false) instead of creating a duplicate. This holds for 24 hours from the first request. Do not retry with a new key before checking GET /channel_accounts/booking/promotions. When the 502 message lists promotion ids, one of them may be the promotion this request created: check them instead of retrying.
  • Send a JSON body.
  • Booking.com keeps one mobile_rate promotion per property and one geo_rate promotion per country channel (target_channel), with fixed ids (MR, GR<target_channel>). Creating one while it already exists, active or inactive, would replace it, so Hostex reads the property first and returns 409 with the existing id: change that promotion with PATCH /channel_accounts/booking/promotions/{promotion_id} instead. If you were retrying a create that may already have succeeded, the id in that 409 is the promotion it created.
  • non_refundable: true makes Booking.com create a 3-day non-refundable policy for the property if it has none.
  • Booking.com promotions cannot be deleted; to remove one, deactivate it with POST /channel_accounts/booking/promotions/{promotion_id}/deactivate.
  • In addition to the per-minute limit below, at most 20 creation requests per Booking.com property per day (server time zone); 429 responses include Retry-After.
  • Returns 501 while creating and editing promotions is not enabled for your account (it is enabled separately from POST /channel_accounts/booking/promotions/excluded_dates).
  • Limited to 10 promotion writes per minute per Booking.com property, shared with POST /channel_accounts/booking/promotions/excluded_dates, in addition to the account rate limits; 429 responses include Retry-After.
  • Values Booking.com rejects return 400 with the Booking.com code in error_msg (for example DISCOUNT_NOT_IN_RANGE, ROOMS_INVALID, TARGET_CHANNEL_NO_ACCESS).
  • 502 means Booking.com was unavailable or the result could not be confirmed; the change may still be applied within the next few minutes.

Requires a writable access token.

Body Params
integer
required

The id of a Booking.com channel account, from GET /channel_accounts. A Booking.com channel account is one Booking.com property; promotions belong to the property, not to a single room.

string
required
^[A-Za-z0-9_-]{8,64}$

A key you choose for this new promotion, 8-64 letters, digits, - or _. Booking.com creates a new promotion on every request, so if a request fails or times out, send it again with the same key: Hostex then returns the promotion created by the first request instead of creating a second one (created: false). This protection lasts 24 hours from the first request; after that the same key creates a new promotion. Use a new key for every new promotion. Reusing a key with different promotion fields returns 409.

string
enum
required

Promotion type. basic, last_minute, early_booker, geo_rate (country rate), mobile_rate, campaign_black_friday, campaign_early_year, campaign_getaway, campaign_late_escape (only during Booking.com's campaign sign-up period, with stay dates inside the campaign window), or new_property_deal (fixed 20% that ends after 3 bookings or 90 days; only for properties open for less than 12 months with no bookings, and needs no other field). The type cannot be changed later.

string
length ≤ 255

Promotion name, at most 255 characters. Only visible to you in the Booking.com Extranet, not to guests. Required except for geo_rate, mobile_rate and new_property_deal (Booking.com does not return a name for geo_rate and mobile_rate promotions).

integer
1 to 99

Discount percentage, an integer. Ranges by type: basic, last_minute, early_booker 1-99 (10-99 when target_channel is subscribers); geo_rate 5-30; mobile_rate 10-80; campaign_getaway, campaign_late_escape, campaign_early_year 15-99; campaign_black_friday 30-99. Not used by new_property_deal (fixed 20%). Required except for new_property_deal.

string

Who sees the promotion. basic, last_minute, early_booker: public (default) or subscribers (Genius / subscribed members). mobile_rate: app (default) or all. geo_rate: the Booking.com country channel, required; copy it from an existing georate promotion (GET /channel_accounts/booking/promotions) or the Booking.com Extranet, since not every property can use every country. Not used by `campaign*`.

integer
0 to 30

Minimum length of stay in nights. basic, last_minute, early_booker: 0-30, where 0 follows the rate plan's minimum stay and 1 means no minimum. geo_rate, mobile_rate: 1-30. Not used by campaign_*.

boolean

true to offer the promotion only on non-refundable terms. ⚠️ If the property has no non-refundable policy yet, Booking.com automatically creates a 3-day non-refundable policy and applies it. Not used by campaign_*.

stay_date
object

The stay dates the promotion applies to. Required except for geo_rate, mobile_rate and new_property_deal (Booking.com does not return stay dates for geo_rate and mobile_rate promotions).

additional_dates
array of dates

Extra single stay dates outside stay_date.start-stay_date.end on which the promotion also applies, YYYY-MM-DD, at most 366.

additional_dates
book_date
object

The dates on which guests can book the promotion, YYYY-MM-DD. end must not be after stay_date.end. Not used by last_minute, early_booker and campaign_*. Omit for no limit.

book_time
object

The hours of the day during which guests can book the promotion, 0-24 in the property's time zone. Not used by campaign_*. Omit for no limit.

last_minute
object

How close to check-in the promotion becomes bookable. Required for last_minute (unit hour or day, value 1-1000). geo_rate and mobile_rate accept at most one of last_minute (unit must be day, value 1-365) or early_booker.

integer
1 to 500

How many days in advance guests must book. Required for early_booker (1-500). geo_rate and mobile_rate accept at most one of early_booker (1-365) or last_minute. The window cannot start before the day the promotion is created.

rooms
array of strings

Booking.com room ids the promotion applies to: the part before - of a Booking.com listing_id from GET /listings (<room id>-<rate plan id>), e.g. 1320924403. Required for basic, last_minute, early_booker and campaign_*; not used by geo_rate and mobile_rate.

rooms
parent_rates
array of strings

Booking.com rate plan ids the promotion applies to: the part after - of a Booking.com listing_id from GET /listings. They must be active rate plans of the property. The promotion only applies to room and rate plan combinations that already exist; it does not create new ones. Required for every type except new_property_deal.

parent_rates
Response

Language
Credentials
Header
LoadingLoading…
Response
Click Try It! to start a request and see the response here! Or choose an example:
application/json