> ## 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.

# Cancel bookings

> Cancels one or more bookings, or specific participants within them, optionally recording a refund amount.



## OpenAPI

````yaml post /v1/bookings/cancel
openapi: 3.0.0
info:
  title: Way Partner API
  description: >-
    REST API for Way partners: list experiences, check availability, run
    checkout, and manage bookings.
  version: '1.0'
servers:
  - url: https://api.letsway.com
    description: Production.
  - url: https://api.staging.letsway.com
    description: Staging.
security: []
tags:
  - name: Listings
    description: 'Retrieve the listings a brand offers: experiences, events, and resources.'
  - name: Availability
    description: Dates, sessions, and price tiers for scheduling a booking.
  - name: Carts & Checkout
    description: >-
      Payment intents and booking creation. The cart ID is a client-generated
      UUID; there is no create-cart endpoint.
  - name: Bookings
    description: Retrieve, cancel, and reschedule bookings.
  - name: Experiences
    description: Experience details, settings, custom questions, reviews, and hosts.
  - name: Brand Configuration
    description: Brand settings, taxonomy, terms, and promotion code validation.
  - name: Waitlists
    description: Waitlists for sold-out sessions and invitation handling.
  - name: Integrations
    description: Configured integrations, analytics, and room-charge validation.
  - name: Organizations
    description: Organization-level access across brands.
paths:
  /v1/bookings/cancel:
    post:
      tags:
        - Bookings
      summary: Cancel bookings
      description: >-
        Cancels one or more bookings, or specific participants within them,
        optionally recording a refund amount.
      operationId: BookingPublicKeyedController_cancelBooking
      parameters: []
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PublicBookingCancelRequest'
            example:
              bookings:
                - bookingId: 019f5ca1-4dc1-775d-a40d-833f44bfccf4
                  cancel: true
      responses:
        '200':
          description: Success.
          content:
            application/json:
              example:
                items:
                  - id: 019f5ca1-4dc1-775d-a40d-833f44bfccf4
                    confirmationCode: U7dSqlzCA
                    cartId: 1ccd47b4-8784-43a0-86a5-fc733265f3c4
                    cartConfirmationCode: 55xNJqU3Q
                    amount: 100
                    currency: USD
                    amountRefunded: 0
                    status: cancelled
                    purchaser:
                      id: 019f5ca1-5432-751e-8663-7b999f0f7ede
                      firstName: Alice
                      lastName: Rivera
                      emailAddress: alice@example.com
                      phoneNumber: '+15550100'
                    participants:
                      - id: 019f5ca1-5432-751e-8663-7c22693a6e7e
                        firstName: Alice
                        lastName: Rivera
                        emailAddress: null
                        phoneNumber: null
                        priceTierName: Participant
                        cancelledAt: '2026-07-13T17:59:57.430Z'
                    paymentMethod: cash
                    createdAt: '2026-07-13T17:58:23.757Z'
                    notes: null
                    internalNotes: null
                    event:
                      timezone: America/Chicago
                      startDateTime: '2026-07-14T10:00:00'
                    experience:
                      id: c99f70ee-1c0e-4534-a31a-96d5d966cc4b
                      title: Sunset Sailing Tour
        '201':
          description: Booking details.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicBookingCancelResponse'
      security:
        - Brand-API-Key: []
        - Organization-API-Key: []
components:
  schemas:
    PublicBookingCancelRequest:
      type: object
      properties:
        bookings:
          type: array
          items:
            type: object
            properties:
              bookingId:
                type: string
                format: uuid
                description: >-
                  Identifier of the booking to act on (the booking's id, not its
                  confirmation code).
                example: 019f5ca1-4dc1-775d-a40d-833f44bfccf4
              cancel:
                type: boolean
                enum:
                  - true
                description: >-
                  Set to true to cancel the booking. Omit when only cancelling
                  individual participants or issuing a refund.
                example: true
              participants:
                type: array
                items:
                  type: string
                  format: uuid
                minItems: 1
                description: >-
                  IDs of individual participants to cancel for a partial
                  cancellation. Omit to cancel the entire booking.
              refundAmount:
                type: number
                description: >-
                  Amount to refund to the guest, in the brand's currency. Can be
                  combined with a cancellation or sent on its own to refund
                  without cancelling.
                example: 50
            required:
              - bookingId
          description: Bookings to cancel or refund. Each item is processed independently.
      required:
        - bookings
    PublicBookingCancelResponse:
      type: object
      properties:
        items:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                description: >-
                  Unique identifier of the booking. Use it in subsequent get,
                  cancel, or reschedule requests.
                example: 019f5ca1-4dc1-775d-a40d-833f44bfccf4
              confirmationCode:
                type: string
                description: >-
                  The booking's own confirmation code - the code the guest sees
                  for this individual booking.
                example: U7dSqlzCA
              cartId:
                type: string
                format: uuid
                nullable: true
                description: Identifier of the cart the booking was created from.
                example: 1ccd47b4-8784-43a0-86a5-fc733265f3c4
              cartConfirmationCode:
                type: string
                nullable: true
                description: >-
                  Confirmation code of the cart the booking was purchased in. A
                  single cart checkout can produce multiple bookings that share
                  this code.
                example: 55xNJqU3Q
              amount:
                type: number
                description: Total booking amount in the brand's currency.
                example: 100
              currency:
                type: string
                description: >-
                  ISO 4217 currency code applying to all monetary amounts on the
                  booking.
                example: USD
              amountRefunded:
                type: number
                description: >-
                  Total amount refunded on this booking to date, in the brand's
                  currency.
                example: 25
              status:
                type: string
                enum:
                  - confirmed
                  - refunded
                  - processing
                  - failed
                  - cancelled
                description: >-
                  Booking lifecycle status after the request was processed.
                  processing means created and awaiting payment confirmation
                  (inventory is held); confirmed means completed; failed,
                  cancelled, and refunded are terminal states.
                example: cancelled
              purchaser:
                type: object
                properties:
                  id:
                    type: string
                    description: Unique identifier of the purchaser.
                    example: 019f5ca1-5432-751e-8663-7b999f0f7ede
                  firstName:
                    type: string
                    description: Purchaser's first name.
                    example: Alice
                  lastName:
                    type: string
                    description: Purchaser's last name.
                    example: Rivera
                  emailAddress:
                    type: string
                    nullable: true
                    description: >-
                      Purchaser's email address, where booking confirmations are
                      sent.
                    example: alice@example.com
                  phoneNumber:
                    type: string
                    nullable: true
                    description: Purchaser's phone number. Null when not provided.
                    example: '+15550100'
                  customQuestionAnswers:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                          description: Unique identifier of the recorded answer.
                          example: 7d1f4a2e-3b6c-4c8d-9e0f-1a2b3c4d5e6f
                        answer:
                          type: array
                          items:
                            type: object
                            properties:
                              value:
                                oneOf:
                                  - type: string
                                  - type: array
                                    items:
                                      type: string
                                  - type: boolean
                                nullable: true
                                description: >-
                                  The answer content: free text for input and
                                  textarea questions, the chosen option's label
                                  for select questions, or a boolean for
                                  terms-and-conditions acceptance. Null when no
                                  answer was given.
                              key:
                                type: string
                                nullable: true
                                description: >-
                                  For select-type questions, the UUID of the
                                  chosen option (matches
                                  question.options[].key). Null or omitted for
                                  other field types.
                                example: f0e1d2c3-b4a5-4968-8776-655443322110
                            required:
                              - value
                          description: >-
                            The submitted answer values. Select-type questions
                            can contain multiple entries; text and terms
                            questions contain one.
                        question:
                          type: object
                          properties:
                            customQuestionId:
                              type: string
                              description: >-
                                Identifier of the underlying custom question
                                definition.
                              example: b2a1c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d
                            prompt:
                              type: string
                              description: The question text shown to the guest.
                              example: Do you have any dietary restrictions?
                            fieldType:
                              type: string
                              enum:
                                - input
                                - textarea
                                - multiple_select
                                - single_select
                                - terms_and_conditions
                              description: >-
                                Input control used to collect the answer: free
                                text (input, textarea), option selection
                                (single_select, multiple_select), or a
                                terms-and-conditions acceptance checkbox.
                              example: single_select
                            options:
                              type: array
                              items:
                                type: object
                                properties:
                                  key:
                                    type: string
                                    format: uuid
                                    description: >-
                                      UUID that uniquely identifies the option;
                                      referenced by answer[].key and by
                                      conditional-display rules.
                                    example: f0e1d2c3-b4a5-4968-8776-655443322110
                                  value:
                                    type: string
                                    description: >-
                                      Display label of the option shown to the
                                      guest.
                                    example: Vegetarian
                                required:
                                  - key
                                  - value
                              nullable: true
                              description: >-
                                Available choices for single_select and
                                multiple_select questions. Null for other field
                                types.
                            termsAndConditions:
                              type: object
                              properties:
                                label:
                                  type: string
                                  description: >-
                                    Label displayed next to the acceptance
                                    checkbox.
                                  example: I agree to the spa terms and conditions
                                mediaId:
                                  type: string
                                  description: >-
                                    Identifier of the uploaded
                                    terms-and-conditions document.
                                  example: 8c7b6a5d-4e3f-4210-9876-543210fedcba
                                isOverrided:
                                  type: boolean
                                mediaUrl:
                                  type: string
                                  description: >-
                                    URL where the terms-and-conditions document
                                    can be viewed. May be omitted.
                                  example: >-
                                    https://cdn.letsway.com/media/spa-terms-and-conditions.pdf
                              required:
                                - label
                                - mediaId
                                - isOverrided
                              nullable: true
                              description: >-
                                Terms-and-conditions details for
                                terms_and_conditions questions. Null for other
                                field types.
                            config:
                              type: object
                              properties:
                                experienceId:
                                  type: string
                                  description: >-
                                    Identifier of the experience the question is
                                    attached to.
                                  example: c99f70ee-1c0e-4534-a31a-96d5d966cc4b
                                experienceQuestionId:
                                  type: string
                                  description: >-
                                    Identifier of this question's assignment to
                                    the experience (the per-experience question
                                    instance).
                                  example: 5a4b3c2d-1e0f-4987-a654-321098765432
                                isRequired:
                                  type: boolean
                                  description: >-
                                    Whether the guest must answer the question
                                    to complete checkout.
                                  example: true
                                isActive:
                                  type: boolean
                                  description: >-
                                    Whether the question is currently active on
                                    the experience.
                                  example: true
                                order:
                                  type: number
                                  description: >-
                                    Display position of the question relative to
                                    the experience's other questions.
                                  example: 1
                                scope:
                                  type: string
                                  enum:
                                    - purchaser
                                    - participant
                                  description: >-
                                    Whether the question is asked once of the
                                    purchaser or of each participant.
                                  example: purchaser
                                conditions:
                                  type: array
                                  items:
                                    type: object
                                    properties:
                                      rule:
                                        type: string
                                        enum:
                                          - value_matches
                                        description: >-
                                          Condition operator. value_matches shows
                                          this question when the answer to the
                                          question identified by conditionKey
                                          includes the option identified by
                                          conditionValue.
                                        example: value_matches
                                      conditionKey:
                                        type: string
                                        format: uuid
                                        description: >-
                                          Identifier of the parent question whose
                                          answer is evaluated.
                                        example: b2a1c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d
                                      conditionValue:
                                        type: string
                                        format: uuid
                                        description: >-
                                          Option key on the parent question that
                                          must be selected for this question to be
                                          shown.
                                        example: f0e1d2c3-b4a5-4968-8776-655443322110
                                    required:
                                      - rule
                                      - conditionKey
                                      - conditionValue
                                  nullable: true
                                  description: >-
                                    Conditional-display rules: the question is
                                    only shown when the guest's answer to
                                    another question matches. Null when the
                                    question is always shown.
                                conditionsMatchType:
                                  type: string
                                  enum:
                                    - any
                                    - all
                                  nullable: true
                                  description: >-
                                    Whether any or all of the conditions must
                                    match for the question to be shown. Null
                                    when there are no conditions.
                                  example: any
                              required:
                                - experienceId
                                - experienceQuestionId
                                - isRequired
                                - isActive
                                - order
                                - scope
                                - conditions
                                - conditionsMatchType
                              description: >-
                                How the question is applied to the experience it
                                was asked on.
                          required:
                            - customQuestionId
                            - prompt
                            - fieldType
                            - options
                            - termsAndConditions
                            - config
                          description: >-
                            Snapshot of the custom question as configured when
                            the answer was collected.
                      required:
                        - id
                        - answer
                        - question
                    description: >-
                      The purchaser's answers to the experience's custom
                      questions. Omitted when the experience has no
                      purchaser-scoped questions.
                required:
                  - id
                  - firstName
                  - lastName
                  - emailAddress
                  - phoneNumber
                description: >-
                  The guest who made the purchase and receives booking
                  communications.
              participants:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: string
                      format: uuid
                      description: >-
                        Unique identifier of the participant. Pass these IDs in
                        the cancel request's participants array to cancel
                        specific participants only.
                      example: 019f5ca1-5432-751e-8663-7c22693a6e7e
                    firstName:
                      type: string
                      description: Participant's first name.
                      example: Alice
                    lastName:
                      type: string
                      description: Participant's last name.
                      example: Rivera
                    emailAddress:
                      type: string
                      pattern: >-
                        ^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|.(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$
                      nullable: true
                      description: Participant's email address. Null when not collected.
                      example: alice@example.com
                    phoneNumber:
                      type: string
                      nullable: true
                      description: Participant's phone number. Null when not collected.
                      example: '+15550100'
                    priceTierName:
                      type: string
                      description: Name of the price tier the participant was booked under.
                      example: Adult
                    cancelledAt:
                      type: string
                      format: date-time
                      nullable: true
                      description: >-
                        ISO 8601 timestamp when this participant was cancelled.
                        Null while the participant is still active on the
                        booking.
                      example: '2026-07-13T17:59:57.430Z'
                    customQuestionAnswers:
                      type: array
                      items:
                        type: object
                        properties:
                          id:
                            type: string
                            description: Unique identifier of the recorded answer.
                            example: 7d1f4a2e-3b6c-4c8d-9e0f-1a2b3c4d5e6f
                          answer:
                            type: array
                            items:
                              type: object
                              properties:
                                value:
                                  oneOf:
                                    - type: string
                                    - type: array
                                      items:
                                        type: string
                                    - type: boolean
                                  nullable: true
                                  description: >-
                                    The answer content: free text for input and
                                    textarea questions, the chosen option's
                                    label for select questions, or a boolean for
                                    terms-and-conditions acceptance. Null when
                                    no answer was given.
                                key:
                                  type: string
                                  nullable: true
                                  description: >-
                                    For select-type questions, the UUID of the
                                    chosen option (matches
                                    question.options[].key). Null or omitted for
                                    other field types.
                                  example: f0e1d2c3-b4a5-4968-8776-655443322110
                              required:
                                - value
                            description: >-
                              The submitted answer values. Select-type questions
                              can contain multiple entries; text and terms
                              questions contain one.
                          question:
                            type: object
                            properties:
                              customQuestionId:
                                type: string
                                description: >-
                                  Identifier of the underlying custom question
                                  definition.
                                example: b2a1c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d
                              prompt:
                                type: string
                                description: The question text shown to the guest.
                                example: Do you have any dietary restrictions?
                              fieldType:
                                type: string
                                enum:
                                  - input
                                  - textarea
                                  - multiple_select
                                  - single_select
                                  - terms_and_conditions
                                description: >-
                                  Input control used to collect the answer: free
                                  text (input, textarea), option selection
                                  (single_select, multiple_select), or a
                                  terms-and-conditions acceptance checkbox.
                                example: single_select
                              options:
                                type: array
                                items:
                                  type: object
                                  properties:
                                    key:
                                      type: string
                                      format: uuid
                                      description: >-
                                        UUID that uniquely identifies the
                                        option; referenced by answer[].key and
                                        by conditional-display rules.
                                      example: f0e1d2c3-b4a5-4968-8776-655443322110
                                    value:
                                      type: string
                                      description: >-
                                        Display label of the option shown to the
                                        guest.
                                      example: Vegetarian
                                  required:
                                    - key
                                    - value
                                nullable: true
                                description: >-
                                  Available choices for single_select and
                                  multiple_select questions. Null for other
                                  field types.
                              termsAndConditions:
                                type: object
                                properties:
                                  label:
                                    type: string
                                    description: >-
                                      Label displayed next to the acceptance
                                      checkbox.
                                    example: I agree to the spa terms and conditions
                                  mediaId:
                                    type: string
                                    description: >-
                                      Identifier of the uploaded
                                      terms-and-conditions document.
                                    example: 8c7b6a5d-4e3f-4210-9876-543210fedcba
                                  isOverrided:
                                    type: boolean
                                  mediaUrl:
                                    type: string
                                    description: >-
                                      URL where the terms-and-conditions
                                      document can be viewed. May be omitted.
                                    example: >-
                                      https://cdn.letsway.com/media/spa-terms-and-conditions.pdf
                                required:
                                  - label
                                  - mediaId
                                  - isOverrided
                                nullable: true
                                description: >-
                                  Terms-and-conditions details for
                                  terms_and_conditions questions. Null for other
                                  field types.
                              config:
                                type: object
                                properties:
                                  experienceId:
                                    type: string
                                    description: >-
                                      Identifier of the experience the question
                                      is attached to.
                                    example: c99f70ee-1c0e-4534-a31a-96d5d966cc4b
                                  experienceQuestionId:
                                    type: string
                                    description: >-
                                      Identifier of this question's assignment
                                      to the experience (the per-experience
                                      question instance).
                                    example: 5a4b3c2d-1e0f-4987-a654-321098765432
                                  isRequired:
                                    type: boolean
                                    description: >-
                                      Whether the guest must answer the question
                                      to complete checkout.
                                    example: true
                                  isActive:
                                    type: boolean
                                    description: >-
                                      Whether the question is currently active
                                      on the experience.
                                    example: true
                                  order:
                                    type: number
                                    description: >-
                                      Display position of the question relative
                                      to the experience's other questions.
                                    example: 1
                                  scope:
                                    type: string
                                    enum:
                                      - purchaser
                                      - participant
                                    description: >-
                                      Whether the question is asked once of the
                                      purchaser or of each participant.
                                    example: participant
                                  conditions:
                                    type: array
                                    items:
                                      type: object
                                      properties:
                                        rule:
                                          type: string
                                          enum:
                                            - value_matches
                                          description: >-
                                            Condition operator. value_matches shows
                                            this question when the answer to the
                                            question identified by conditionKey
                                            includes the option identified by
                                            conditionValue.
                                          example: value_matches
                                        conditionKey:
                                          type: string
                                          format: uuid
                                          description: >-
                                            Identifier of the parent question whose
                                            answer is evaluated.
                                          example: b2a1c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d
                                        conditionValue:
                                          type: string
                                          format: uuid
                                          description: >-
                                            Option key on the parent question that
                                            must be selected for this question to be
                                            shown.
                                          example: f0e1d2c3-b4a5-4968-8776-655443322110
                                      required:
                                        - rule
                                        - conditionKey
                                        - conditionValue
                                    nullable: true
                                    description: >-
                                      Conditional-display rules: the question is
                                      only shown when the guest's answer to
                                      another question matches. Null when the
                                      question is always shown.
                                  conditionsMatchType:
                                    type: string
                                    enum:
                                      - any
                                      - all
                                    nullable: true
                                    description: >-
                                      Whether any or all of the conditions must
                                      match for the question to be shown. Null
                                      when there are no conditions.
                                    example: any
                                required:
                                  - experienceId
                                  - experienceQuestionId
                                  - isRequired
                                  - isActive
                                  - order
                                  - scope
                                  - conditions
                                  - conditionsMatchType
                                description: >-
                                  How the question is applied to the experience
                                  it was asked on.
                            required:
                              - customQuestionId
                              - prompt
                              - fieldType
                              - options
                              - termsAndConditions
                              - config
                            description: >-
                              Snapshot of the custom question as configured when
                              the answer was collected.
                        required:
                          - id
                          - answer
                          - question
                      description: >-
                        The participant's answers to the experience's custom
                        questions. Omitted when the experience has no
                        participant-scoped questions.
                  required:
                    - id
                    - firstName
                    - lastName
                    - priceTierName
                    - cancelledAt
                description: >-
                  Guests attending under this booking. Participants can be
                  cancelled individually - check each participant's cancelledAt.
              paymentMethod:
                type: string
                enum:
                  - credit-card
                  - room-charge
                  - member-number
                  - loyalty
                  - kicc
                  - cash
                  - pay-later
                  - pay-upon-arrival
                description: >-
                  How the booking was paid, for example credit-card for card
                  payments or room-charge to bill the guest's hotel room.
                example: credit-card
              createdAt:
                type: string
                format: date-time
                description: ISO 8601 timestamp when the booking was created.
                example: '2026-07-13T17:58:23.757Z'
              notes:
                type: string
                nullable: true
                description: Notes attached to the booking. Null when none.
                example: Guest requested a window table.
              internalNotes:
                type: string
                nullable: true
                description: >-
                  Internal staff notes on the booking, not shown to the guest.
                  Null when none.
                example: VIP guest - comp welcome drink.
              event:
                type: object
                properties:
                  timezone:
                    type: string
                    description: >-
                      IANA timezone of the event location; startDateTime is
                      expressed in this timezone.
                    example: America/Chicago
                  startDateTime:
                    type: string
                    description: >-
                      Session start as a local date-time in the event's
                      timezone, without a UTC offset.
                    example: '2026-07-14T10:00:00'
                required:
                  - timezone
                  - startDateTime
                description: The scheduled session the booking is for.
              experience:
                type: object
                properties:
                  id:
                    type: string
                    format: uuid
                    description: Unique identifier of the experience.
                    example: c99f70ee-1c0e-4534-a31a-96d5d966cc4b
                  title:
                    type: string
                    description: Display title of the experience.
                    example: Sunset Kayak Tour
                required:
                  - id
                  - title
                description: The experience the booking belongs to.
            required:
              - id
              - confirmationCode
              - cartId
              - cartConfirmationCode
              - amount
              - currency
              - amountRefunded
              - status
              - purchaser
              - participants
              - paymentMethod
              - createdAt
              - notes
              - internalNotes
              - event
              - experience
          description: >-
            Updated booking records, one for each booking processed by the
            cancellation request.
      required:
        - items
  securitySchemes:
    Brand-API-Key:
      type: http
      scheme: bearer
      description: >-
        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](/legacy-authentication).
    Organization-API-Key:
      type: http
      scheme: bearer
      description: >-
        Your organization's secret API key, e.g. `Bearer
        way_sk_live_ohEqcn0i1fRoUEHBPjJkQA`. Older `Way-Organization-Id` +
        `Way-Secret-Key` credentials still work: see [Legacy
        authentication](/legacy-authentication).

````