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

# Create a payment intent

> Creates a Stripe payment intent for the cart and returns its client secret and total amount. Send the same cart items you will book. Pass `getOnlyTotalNetAmount: true` to price the cart without initializing a payment.



## OpenAPI

````yaml post /v1/brands/{brandId}/carts/{cartId}/payment_intents
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/brands/{brandId}/carts/{cartId}/payment_intents:
    post:
      tags:
        - Carts & Checkout
      summary: Create a payment intent
      description: >-
        Creates a Stripe payment intent for the cart and returns its client
        secret and total amount. Send the same cart items you will book. Pass
        `getOnlyTotalNetAmount: true` to price the cart without initializing a
        payment.
      operationId: BookingPublicController_createPaymentIntent
      parameters:
        - $ref: '#/components/parameters/brandIdPath_26'
        - $ref: '#/components/parameters/cartIdPath_27'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreatePaymentIntentRequest'
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CreatePaymentIntentResponse'
              example:
                data:
                  totalNetAmount: 200
                  paymentIntentSecret: pi_3Tso72FpAKNo2Ml2_secret_REDACTED
      security:
        - Brand-API-Key: []
        - Organization-API-Key: []
components:
  parameters:
    brandIdPath_26:
      name: brandId
      in: path
      schema:
        type: string
      required: true
      description: >-
        The brand's ID - must match the brand your API key identifies (or the
        Way-Brand-Id header when one is sent).
    cartIdPath_27:
      name: cartId
      in: path
      schema:
        type: string
      required: true
      description: Only bookings created from this cart.
      example: c4a1b2c3-d4e5-4f6a-8b9c-0d1e2f3a4b5c
  schemas:
    CreatePaymentIntentRequest:
      type: object
      properties:
        data:
          type: array
          items:
            type: object
            properties:
              sessionTime:
                type: string
                description: >-
                  Start of the chosen session - copy the session's startDateTime
                  from the sessions endpoint. A local date-time in the
                  experience's timezone, with no UTC offset.
                example: '2026-07-14T10:00:00'
              sessionDuration:
                type: number
                description: >-
                  Length of the session in minutes - copy the chosen session's
                  duration from the sessions endpoint.
                example: 60
              participants:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: string
                      description: >-
                        Optional participant identifier. Way generates its own
                        participant IDs at booking time, so this can be omitted.
                    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. Optional - guest
                        communication defaults to the purchaser's contact
                        details.
                      example: alice@example.com
                    phoneNumber:
                      type: string
                      nullable: true
                      description: >-
                        Participant's phone number, including country code.
                        Optional.
                      example: '+15550100'
                    priceTierName:
                      type: string
                      description: >-
                        Name of the session price tier this participant books -
                        must match one of the chosen session's priceTiers[].name
                        from the sessions endpoint. Determines the
                        per-participant price.
                      example: Participant
                    customQuestionResponses:
                      type: array
                      items:
                        type: object
                        properties:
                          questionId:
                            type: string
                            description: >-
                              ID of the custom question being answered, from the
                              custom questions endpoint.
                            example: q-dietary-01
                          answer:
                            type: array
                            items:
                              type: object
                              properties:
                                value:
                                  oneOf:
                                    - type: string
                                    - type: boolean
                                  description: >-
                                    The answer value - the selected option's
                                    display value for select questions, free
                                    text for text questions, or a boolean for
                                    checkboxes.
                                  example: vegetarian
                                key:
                                  type: string
                                  nullable: true
                                  description: >-
                                    The selected option's key for select-type
                                    questions; null for free-text and checkbox
                                    answers.
                                  example: hotel-lobby
                              required:
                                - value
                            description: >-
                              The answer as an array of value/key pairs.
                              Multi-select questions send one entry per selected
                              option; text and checkbox questions send a single
                              entry.
                        required:
                          - questionId
                          - answer
                      description: >-
                        Answers to participant-scoped custom questions for this
                        guest. Not needed for pricing - they can be sent here
                        for shape parity with the booking payload, but are
                        validated at book-bulk time.
                  required:
                    - firstName
                    - lastName
                    - priceTierName
                description: >-
                  One entry per guest, each referencing a price tier of the
                  chosen session. Tier prices determine the cart total. For
                  resource collections the array length must equal
                  resourceQuantity.
              mode:
                type: string
                enum:
                  - private
                  - shared
                description: >-
                  How the session is booked: shared joins the guest alongside
                  other bookings on the same session; private books the session
                  exclusively. Use the same value you will send in the booking
                  payload.
              couponCode:
                type: string
                nullable: true
                description: >-
                  Coupon code to apply to this item's price, reflected in the
                  returned totalNetAmount.
                example: SUMMER10
              discountAmount:
                type: number
                nullable: true
                description: >-
                  Fixed-amount discount to apply to this item, in the brand's
                  currency.
                example: 10
              discountPercentage:
                type: number
                nullable: true
                description: Percentage discount to apply to this item.
                example: 15
              accessCode:
                type: string
                nullable: true
                description: >-
                  Access code that unlocks an access-restricted experience for
                  booking.
                example: VIP-2026
              notes:
                type: string
                nullable: true
                description: >-
                  Free-text note attached to the booking, such as a special
                  request from the guest.
                example: Guest requested a window seat.
              metadata:
                type: object
                additionalProperties: {}
                nullable: true
                description: >-
                  Arbitrary key-value pairs stored with the booking for your own
                  use.
              internalNotes:
                type: string
                nullable: true
                description: >-
                  Internal note stored on the booking for brand staff; not shown
                  to the guest.
                example: VIP guest - assign senior host.
              listingAddOns:
                default: []
                type: array
                items:
                  type: object
                  properties:
                    listingAddOnId:
                      type: string
                      format: uuid
                      description: >-
                        ID of the listing add-on being purchased, from the
                        listing detail.
                      example: b3f1a2c4-5d6e-4f7a-8b9c-0d1e2f3a4b5c
                    quantity:
                      type: number
                      minimum: 0
                      exclusiveMinimum: true
                      description: >-
                        Number of units of the add-on to purchase. Must be a
                        positive integer.
                      example: 2
                  required:
                    - listingAddOnId
                    - quantity
                description: >-
                  Add-ons purchased with this item; their prices are included in
                  the returned totalNetAmount.
              appliedCreditCodes:
                type: array
                items:
                  type: object
                  properties:
                    code:
                      type: string
                      description: The credit code being redeemed.
                      example: GC-7F3K9QW2
                    appliedValue:
                      type: number
                      description: >-
                        Amount drawn from this credit code, in the brand's
                        currency.
                      example: 25
                    sequence:
                      type: number
                      description: >-
                        Order in which this code is applied when multiple credit
                        codes are redeemed; codes are applied in ascending
                        sequence.
                      example: 1
                  required:
                    - code
                    - appliedValue
                    - sequence
                nullable: true
                description: >-
                  Credit codes redeemed against this item, deducted from the
                  amount to charge.
              intendedConfirmationCode:
                type: string
                description: >-
                  Confirmation code to assign to the booking instead of a
                  Way-generated one. Omit to let Way generate the code.
                example: U7dSqlzCA
              waitlistEntryId:
                type: string
                format: uuid
                description: >-
                  ID of the guest's waitlist entry when this checkout redeems a
                  waitlist offer.
                example: 8a1a2b3c-4d5e-4f6a-8b9c-1d2e3f4a5b6c
              experienceId:
                type: string
                description: >-
                  ID of the experience being booked - use the chosen session's
                  experienceId from the sessions endpoint. For resource
                  collections the listing-level experienceId is null, so the
                  session's value is the one to send.
                example: c99f70ee-1c0e-4534-a31a-96d5d966cc4b
              resourceGroupId:
                type: string
                description: >-
                  ID of the resource group being booked, from the listing
                  detail's resourceGroups[].id. Required for resource-group
                  collections; omit for time-based experiences.
                example: 4a7d1e9b-2c5f-4b3a-8e6d-1f9a5c3b7e28
              resourceQuantity:
                type: number
                description: >-
                  Number of resource units to book. Required for resource-group
                  collections and must equal participants.length, otherwise the
                  API returns 422. Omit for time-based experiences.
                example: 2
            required:
              - sessionTime
              - participants
              - mode
              - experienceId
          description: >-
            The cart items to price, in the same shape as the book-bulk data[]
            items. Send the exact items you intend to book so the payment intent
            amount matches the booking.
        getOnlyTotalNetAmount:
          type: boolean
          description: >-
            When true, prices the cart and returns totalNetAmount without
            initializing a payment - paymentIntentSecret comes back null. Use it
            to show a running total before checkout.
        convertToUsd:
          default: false
          type: boolean
          description: >-
            When true and the cart's currency is not USD, prices the cart in USD
            using Way's conversion rate. Defaults to false.
        paymentIntentRevision:
          type: number
          description: >-
            Monotonically increasing revision number for this cart's payment
            intent, protecting against stale or duplicate requests: if the value
            is lower than or equal to the cart's stored revision, Way returns
            the existing intent instead of updating it. Omit if you only create
            the intent once per cart.
          example: 1
      required:
        - data
    CreatePaymentIntentResponse:
      type: object
      properties:
        totalNetAmount:
          type: number
          description: >-
            Total amount to charge for the cart after discounts and credits, in
            the brand's currency (USD when convertToUsd is true). Matches the
            amount the booking call will charge if the cart is unchanged.
          example: 200
        paymentIntentSecret:
          type: string
          nullable: true
          description: >-
            Stripe client secret for the created payment intent - use it to
            initialize Stripe Elements. Null when getOnlyTotalNetAmount is true.
            The booking response's clientSecret is the definitive secret to
            confirm the charge against.
          example: pi_3Tso72FpAKNo2Ml2_secret_REDACTED
      required:
        - totalNetAmount
        - paymentIntentSecret
  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).

````