> ## Documentation Index
> Fetch the complete documentation index at: https://docs.spaportal.cz/llms.txt
> Use this file to discover all available pages before exploring further.

# Promotion

> A percentage discount on nights of a stay, and the hotels and room types it applies to.

A visit type's `promotions` lists its current and future promotions that apply
to the channel of your [public key](https://docs.spaportal.cz/api/authentication.md#channels-and-scope).
The API returns only applicable promotions; you do not filter them by channel.
With `expand=priceFromPeriods`, the detail also includes ended promotions, so
you can explain past [price periods](https://docs.spaportal.cz/api/objects/price-from-period.md).

A listed promotion does not guarantee a discounted stay: it can lie outside
the package's permitted stays, or the discounted rooms can be sold out. [Prices](https://docs.spaportal.cz/api/prices.md#promotions) explains how promotions change the
indicative minima and how overlapping discounts combine.

## Fields and night bounds

| Field | Meaning |
| - | - |
| `id` | Promotion id. Each promotion appears once, even when it is assigned to several channels. |
| `name` | Localized display name; a missing translation is `null`. |
| `percentage` | Discount in percent, greater than 0 and at most 100. |
| `from` | First discounted night. |
| `to` | Last discounted night, inclusive, or `null` when the promotion has no end. |
| `appliesTo` | Hotels and room types the promotion is limited to, or `null` when it applies to every hotel selling the package. |

A night is identified by the date it starts on: `to: "2027-02-28"` includes
the night of 28 February and its checkout on 1 March. These bounds describe
discounted nights, not the package's
[permitted stays](https://docs.spaportal.cz/api/visit-types.md#testing-a-stay-against-its-rules). A stay
that overlaps the promotion only partly is discounted on the overlapping
nights.

Each `appliesTo` entry has `hotelId` and `roomTypeIds`. `roomTypeIds: null` means
every room type of that hotel; otherwise it lists the room type ids it applies to.
Entries reference only hotels that sell the package, and a detail request with
`hotelId` does not narrow them. `roomTypeIds` can contain a disabled room
type. It is not offered for new bookings, is missing from the hotel's room
catalog, and does not count in price periods. Skip ids that you cannot find in
the catalog.

Promotions are ordered by `from`, then `id`.

## Example: selected room types of one hotel

This promotion discounts two room types of one hotel by 15% on the nights
from 4 January to 28 February 2027. Other room types and hotels are
unaffected.

```json theme={null}
{
  "id": "6720c0a1b2c3d4e5f6a7d302",
  "name": {
    "cs-CZ": "Zimní nabídka vybraných pokojů",
    "de": "Winterangebot für ausgewählte Zimmer"
  },
  "percentage": 15,
  "from": "2027-01-04",
  "to": "2027-02-28",
  "appliesTo": [
    {
      "hotelId": "6720c0a1b2c3d4e5f6a7c101",
      "roomTypeIds": [
        "6720c0a1b2c3d4e5f6a7f101",
        "6720c0a1b2c3d4e5f6a7f102"
      ]
    }
  ]
}
```

## Fields


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.