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

# Promotions

> Validate and apply coupon codes, access codes, and credits at checkout

Way supports three kinds of promotional mechanics at checkout: **coupon codes** (discounts), **access codes** (unlock gated listings), and **credit codes** (stored value). All are configured by the brand in the dashboard; your integration validates them and passes them into the booking payload.

## Coupon codes

Validate a code the guest entered with [Validate coupon code](/api-reference/brand-configuration/validate-coupon-code):

```bash theme={null}
curl -X POST "$WAY_API/v1/brands/$WAY_BRAND_ID/coupon-codes/SUMMER25/validate" \
  --header "Authorization: Bearer $WAY_API_KEY" \
  --header "Content-Type: application/json" \
  --data '{}'
```

A valid code returns its discount details:

```json theme={null}
{
  "id": "coupon-123",
  "code": "SUMMER25",
  "type": "percentage",
  "discountType": "fixed_amount",
  "value": 25,
  "experienceIds": ["e7a3b8d1-..."]
}
```

* `value` + `discountType` tell you how to present the discount (percentage vs fixed amount).
* `experienceIds`, when present, scopes the coupon to specific experiences - apply it only to matching cart items.
* An invalid or expired code returns an error status; show the guest a clear "code not valid" message.

**Apply it** by passing `couponCode` in the checkout calls - on the cart item (`data[].couponCode`) for item-scoped coupons or at the top level of the [book-bulk payload](/api-reference/carts-and-checkout/create-booking) for cart-wide ones. The [payment intent](/api-reference/carts-and-checkout/create-payment-intent) call accepts the same fields, so the discounted total flows into `totalNetAmount` before the guest pays - validate first, then price.

## Access codes

Access codes gate **exclusive listings** (listings with `isExclusive: true` are backed by access-code-protected experiences). The guest enters a code; you check it with [Validate access code](/api-reference/brand-configuration/validate-access-code):

```bash theme={null}
curl -X POST "$WAY_API/v1/brands/$WAY_BRAND_ID/access-codes/VIP2026/validate" \
  --header "Authorization: Bearer $WAY_API_KEY" \
  --header "Content-Type: application/json" \
  --data '{}'
```

On success, unlock the gated listing in your UI and pass `accessCode` in the cart item (`data[].accessCode`) when booking - book-bulk enforces it server-side, so skipping this fails the booking for gated experiences.

## Credit codes

Credits are prepaid/stored-value codes applied at booking time via `data[].appliedCreditCodes` in the book-bulk payload:

```json theme={null}
"appliedCreditCodes": [
  { "code": "GIFT-8H2K", "appliedValue": 50, "sequence": 1 }
]
```

`appliedValue` is how much of the credit to consume against this item, and `sequence` controls the order when several codes apply (they're processed ascending). There is no public validation endpoint for credit codes - the values are validated at booking time.

## Where discounts show up

The discounted total appears in the payment intent's `totalNetAmount` and the booking's `amount`. To show a running total as the guest applies codes, call [Create a payment intent](/api-reference/carts-and-checkout/create-payment-intent) with `"getOnlyTotalNetAmount": true` - it prices the cart (including promotion fields) without initializing a payment.
