# Lists all booking discounts for a given activity and date

`GET /api/configuration/booking-discounts`

- **Success:** `200 OK`
- **Products:** Operator (`FOH`), Consumer (`CONSUMER`) (any one of these products, not all)
- **Features:** Online Bookings (`ONLINEBOOK`), Front of House Generic Access (`FOHGENERIC`) (any one of these features, not all)

HTML version: [Lists all booking discounts for a given activity and date](https://support.gladstonesoftware.cloud/reference/configuration/lists-all-booking-discounts-for-a-given-activity-and-date)

## Overview

Returns the multi-person booking discounts available for one activity on one date: for each
discount, the combined price and the combinations of price levels that qualify for it. Call it while
building a booking, once you know the activity and the date, to work out whether the party you are
booking matches a discounted combination.

Both `activityId` and `date` are required. The
date must be today or later, and the activity must exist, or you get a `400` or `404` before any
discount is looked up.

**This endpoint is gated behind the `BOOKINGDISCOUNTS` feature.** If your token does not carry it,
every call returns `403` — including calls that would otherwise return an empty list. There is no
way to detect the feature from this endpoint other than by the `403`.

A date with no qualifying discounts returns `200` with an empty array, not `404`. Only promotions of
type Booking that are active and whose validity period covers the date are considered, so the same
activity can return discounts for one date and nothing for the next.

## Endpoint

`GET {base_url}/api/configuration/booking-discounts`

`{base_url}` is the environment URL issued to your integration. See [Authenticating with Gladstone APIs](../../guides/authenticating-with-gladstone-apis.md).

## Query parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `activityId` | string | Yes | The activity whose discounts you want, using the activity's string id — the same value you use when booking. Required: omitting it, or sending it empty, fails with `400` and the message `Activity ID and Date must be provided.` An id that does not exist fails with `404` and `Activity with ID '{activityId}' does not exist.` |
| `date` | string (date-time) | Yes | The date the booking is for. Required: omitting it fails with `400` and `Activity ID and Date must be provided.` Only the date part is used — any time component is discarded. It must be today or later, compared against the current UTC date, so a past date fails with `400` and `The date must be from today onwards`. A discount is included only when its promotion's validity period covers this date, both ends inclusive. |

## Sample request

```bash title="cURL"
curl -X GET '{base_url}/api/configuration/booking-discounts' \
  -H 'Authorization: Bearer {accessToken}' \
  -H 'X-Use-SSO: true'
```

## Response fields

| Field | Type | Description |
|-------|------|-------------|
| `[].bookingDiscountID` | integer (int32) | Identifies the booking discount the entry belongs to. **It is not unique within the response** — one entry is produced per active Booking promotion mapped to the discount's promotion code, so a discount covered by more than one such promotion appears more than once, with the same combinations repeated. Group by this value before displaying. |
| `[].bookingDiscountType` | string | The kind of booking discount, as configured in the back office. Always present, maximum 20 characters, free text. |
| `[].comboPrice` | number (double) | The total price charged for the whole qualifying combination, not a per-person price and not a discount amount to subtract. Given to 2 decimal places. |
| `[].combinations` | array of object | The alternative sets of price levels that qualify for `comboPrice`. A booking matches the discount if its participants' price levels match any one of these entries. Returned as an empty array, never `null`, when the discount has no combinations configured — in which case nothing can match it. |
| `[].combinations[].comboID` | integer (int32) | Identifies this particular combination. It is unique across all discounts, not just within this entry, and it is the combination a usage record points at when the discount is taken — though [booking discount usage records](lists-booking-discount-usage-records-with-optional-filtering-and-pagination.md) report the combination as its price-level string rather than by this id. |
| `[].combinations[].priceLevelCombo` | array of string | The price levels making up this combination, one entry per participant — so a combination of two adults and a junior appears as three entries, and repeats are meaningful. Configured as a single string of at most 200 characters and split for you, so the order carries no meaning: compare it as a multiset against your party's price levels. Empty when the configured value was blank. |

## Sample response

```json title="200 OK"
[
  {
    "bookingDiscountID": 12345,
    "bookingDiscountType": "string",
    "comboPrice": 10.5,
    "combinations": [
      {
        "comboID": 12345,
        "priceLevelCombo": [
          "string"
        ]
      }
    ]
  }
]
```

## Errors

| Status | Meaning | When |
|--------|---------|------|
| `400` | Bad request | One of three checks, in this order, with the message as a plain string body: `Activity ID and Date must be provided.` when either parameter is missing or empty; `The date must be from today onwards` when `date` is before the current UTC date. |
| `403` | Forbidden | Your token does not carry the `BOOKINGDISCOUNTS` feature. The body is the plain string `The requested operation requires Module BOOKINGDISCOUNTS to be enabled`. This is checked before the parameters, so a `403` tells you nothing about whether your parameters were valid. Contact Gladstone Support to have the feature enabled for your integration. |
| `404` | Not found | No activity exists with that id. The body is the plain string `Activity with ID '{activityId}' does not exist.` An activity that exists but has no discounts returns `200` with an empty array instead. |
| `500` | Internal server error | An unexpected server-side failure while reading the discounts. The body is empty. |
