Skip to main content
POST
Create a booking

Authorizations

Authorization
string
header
required

Your brand's secret API key, e.g. Bearer way_sk_live_bhEqcn0i1fRoUEHBPjJkQA. Older Way-Brand-Id + Way-Secret-Key credentials still work: see Legacy authentication.

Headers

Authorization
string

Optional bearer token used only by loyalty-authenticated flows (for example Hyatt members); not required for standard integrations.

Path Parameters

brandId
string
required

The brand's ID - must match the brand your API key identifies (or the Way-Brand-Id header when one is sent).

Body

application/json
data
object[]
required

The cart items to book, one per experience session. Uses the same item shape as the payment intent request; all items are booked together under the cart identified by cartId.

purchaser
object
required

The person paying for the booking, who receives the confirmation email. Does not have to be one of the participants.

loyaltyProgramData
object

Loyalty program membership to associate with the booking, used with loyalty payment flows and member benefits.

paymentMethod
enum<string>

How the guest pays. credit-card goes through Stripe: create a payment intent first and confirm the charge after booking. cash, room-charge, member-number, loyalty and pay-upon-arrival skip Stripe entirely and the booking is confirmed synchronously; room-charge and member-number additionally require paymentDetail populated from the room-charge validate endpoint. kicc is the KICC payment-gateway flow. Any booking with a zero total also confirms synchronously.

Available options:
credit-card,
room-charge,
member-number,
loyalty,
kicc,
cash,
pay-later,
pay-upon-arrival
Example:

"credit-card"

paymentDetail
object | null

Payment reference details for non-card methods. Required for room-charge and member-number bookings - populate it from the room-charge validate response. Omit for card payments.

bookingScriptUrl
string<uri>

URL of the page where the booking was made. Stored as the booking's source URL for attribution.

Example:

"https://www.example-hotel.com/experiences"

externalAnalyticsUserId
string

Your analytics platform's identifier for the guest. Stored on the booking and surfaced in financial reports for cross-system attribution.

Example:

"GA1.2.345678901.1720000000"

siteLanguage
string

Language code of the site where the booking was made (e.g. en). Stored on the booking and included in booking details and webhooks.

Example:

"en"

deviceType
enum<string>

Type of device the guest booked from, recorded for analytics.

Available options:
pc,
mobile
Example:

"pc"

cartId
string<uuid>

Client-generated UUID (v4 or v7) identifying this checkout's cart - there is no create-cart endpoint; Way accepts the ID lazily the first time it appears. Use the same cartId as the payment intent so Way can correlate booking and payment, and rotate to a fresh UUID before retrying a failed checkout.

Example:

"14e722e0-048b-4c7b-a70d-5e812b2b761e"

sendEmail
boolean

Whether Way sends the guest confirmation emails for this booking. Defaults to true.

convertToUsd
boolean
default:false

When true and the cart's currency is not USD, charges the booking in USD using Way's conversion rate. Defaults to false.

recommendationId
string<uuid> | null

ID of the listing recommendation that led to this checkout, stored on the resulting bookings for attribution.

Example:

"0d9c1f2e-3a4b-4c5d-8e6f-7a8b9c0d1e2f"

Response

201 - application/json

Booking details.

subjectId
string
required

The unique identifier of the payment subject.

Example:

"subject-123"

subjectType
string
required

The type of the subject related to the payment.

Example:

"booking"

confirmationCode
string
required

Confirmation code for the payment.

Example:

"CONFIRM12345"

amount
number
required

Amount of the payment. For card payments this echoes the Stripe payment intent and is in minor units (15000 = $150.00); for cash and other non-card bookings it is in major units. Prefer the payment intent's totalNetAmount or the booking's amount from Get bookings for pricing.

Example:

17800

currency
string
required

Currency of the transaction.

Example:

"USD"

clientSecret
object

Stripe client secret to confirm the payment with (card payments only); null for cash and other non-card bookings.

Example:

"pi_3NxA7bK2eZ_secret_Yz4Q8w"

metadata
object | null

Additional metadata related to the payment.

Example: