---
title: "2. Confirm an experience booking"
method: POST
path: "/experiences/bookings"
tags: ["Bookings"]
---

# 2. Confirm an experience booking

`POST /experiences/bookings`

## Request

- Base URL: `https://api.liteapi.travel/v3.0`
- URL: `https://api.liteapi.travel/v3.0/experiences/bookings`
- Auth: API key in header `X-API-Key`

## Overview

Confirm the booking after the guest completes payment, using the `prebookId` and `transactionId` from the prebook step.

## When to Use

- **Final booking step** - After the guest confirms payment via the Stripe SDK using the prebook's `secretKey`

## What You Get

- **`status`** - `PENDING_CONFIRMATION` right away; final `CONFIRMED` status arrives via webhook
- **`price`** / **`commission`** / **`clientCommission`** - Your price and earnings for this booking

## Quick Start

POST with `prebookId`, `billing`, `traveler`, and `payment.method: TRANSACTION_ID`. An `ERROR` status on the underlying cart returns HTTP 502.

## Error codes

Product-operation codes are listed below. Shared authentication/access/rate-limit middleware can return common codes such as 401, 40301 or 4290. HTTP status and error code are separate; do not parse message text.

| Code | Meaning |
| --- | --- |
| 73001 | invalid booking request |
| 73002 | reservation hold has expired; please create a new prebook |
| 73003 | a booking already exists for this prebookId |
| 73004 | payment has not been confirmed yet; complete the Stripe payment before booking |
| 73005 | booking resource not found |
| 73006 | experience booking rejected by provider |
| 73007 | transactionId does not match the prebook payment intent |
| 73008 | booking provider request failed |
| 73009 | booking provider request timed out |
| 73010 | booking request is unauthorized |
| 73011 | booking request is forbidden |
| 73012 | booking service is temporarily unavailable |
| 73013 | booking could not be confirmed in the selected currency |
| 73014 | booking could not be confirmed because the price changed |
| 73099 | failed to create booking |

## Request body

- ExperienceBookingRequest
  - `prebookId` string, required: LiteAPI prebook id from `POST /experiences/tours/{id}/prebooks`.
  - `billing` ExperienceBillingContact, required
    - `firstName` string, required
    - `lastName` string, required
    - `email` string, email, required
    - `phoneNumber` string, required
    - `countryCode` string
  - `traveler` ExperienceTravelerContact, required
    - `firstName` string, required
    - `lastName` string, required
    - `email` string, email, required
    - `phoneNumber` string, required
  - `payment` ExperiencePaymentInput, required
    - `method` 'TRANSACTION_ID', required: Phase 1 supports Stripe capture via `TRANSACTION_ID` only.
    - `transactionId` string: Stripe transaction id from prebook. Omit to use the id stored on the prebook session.
  - `customTags` object: Optional bag of up to 5 user-defined key/value labels persisted with the booking. Keys must match `^[A-Z0-9_-]+$`; values are strings up to 255 characters.

## Response `200`

Booking accepted (PENDING_CONFIRMATION) or idempotent return

- ExperienceBookingResponse
  - `data` ExperienceBookingData, required
    - `bookingId` string: LiteAPI booking identifier.
    - `prebookId` string: LiteAPI prebook session that created this booking.
    - `status` 'PENDING_CONFIRMATION' | 'CONFIRMED' | 'FAILED' | 'CANCELLED'
    - `providerStatus` string: Detailed booking status, when available.
    - `cartId` string: Shopping cart identifier from the provider checkout session.
    - `experienceBookingId` string: Internal booking identifier from the provider checkout session.
    - `providerBookingId` string: Provider-side booking reference hash.
    - `providerBookingReference` string: Booking reference, when available. Retained after cancellation.
    - `tourId` integer: Provider tour identifier.
    - `optionId` integer: Chosen tour option from booking-options.
    - `dateTime` string, date-time: Booked slot start time.
    - `price` number: Price charged via Stripe and persisted on the booking.
    - `commission` number: Your earnings on this booking.
    - `clientCommission` number: Your earnings on this booking.
    - `currency` string: ISO 4217 currency code for all monetary amounts on this booking.
    - `voucherCode` string: Discount voucher code applied to this booking, if any.
    - `voucherTotalAmount` number: Amount covered by the discount voucher. Zero when no voucher was applied.
    - `paymentStatus` string: Stripe payment lifecycle status (e.g. `succeeded`, `requires_capture`).
    - `paymentTransactionId` string: Stripe PaymentIntent transaction identifier.
    - `cancellationRequestedAt` string, date-time, nullable: When cancellation was requested on this booking, if any.
    - `cancelledAt` string, date-time, nullable: When this booking was fully cancelled, if applicable.
    - `refundProcessedAt` string, date-time, nullable: When the refund for this booking's cancellation was processed, if applicable.
    - `refund` ExperienceCancellationRefundResponse
      - `cancellationFee` number
      - `refundAmount` number
      - `refundType` string
      - `estimateConfidence` string
      - `currency` string
      - `sellingPrice` number
    - `customTags` object: Optional bag of up to 5 user-defined key/value labels persisted with the booking. Keys must match `^[A-Z0-9_-]+$`; values are strings up to 255 characters.
    - `voucher` object, nullable: Provider voucher payload available after the booking is confirmed. Structure varies by provider; known fields for the current provider are listed below, but treat this object as provider-dependent.
      - `bookingReference` string
      - `ticketUrl` string
      - `ticketHash` string
      - `supplierEmergencyPhoneNumber` string: Supplier's emergency contact phone number. Not the traveler's phone number.
      - `supplierEmergencyEmail` string: Supplier's emergency contact email. This is not, and must never be treated as, the traveler's/customer's email address.
      - `supplierBookingCodes` object[]: One entry per ticket, when the provider issues per-ticket codes.
        - `ticketHash` string
        - `label` string
        - `type` string
        - `code` string
        - `pricingCategoryId` integer
    - `experienceSnapshot` object, nullable: Versioned, provider-neutral snapshot of the tour/booking as it looked at booking time, for rendering post-booking pages (confirmation, manage-booking) without re-fetching the tour. `version: 2` is the active schema below. Deprecated `version: 1` top-level fields (`title`, `rating`, `media`, `startingLocation`, `schedule`, `guide`, `payment`, `cancellationPolicy`) may still appear on bookings made before the V2 migration — read them for old data, don't rely on them for new integrations.
      - `version` integer: Snapshot schema version. `2` is current.
      - `capturedAt` string, date-time, nullable
      - `contentLanguage` string, nullable
      - `isPartial` boolean: True if this snapshot is missing data (e.g. captured before all tour content was available).
      - `product` object, nullable
        - `title` string, nullable
        - `optionTitle` string, nullable
        - `primaryImageUrl` string, nullable
        - `rating` object, nullable
          - `value` number, nullable
          - `scale` number, nullable
          - `count` integer, nullable
      - `selection` object, nullable
        - `serviceType` 'driver' | 'guide' | 'host' | 'instructor' | 'audio_guide' | 'other', nullable
        - `language` object, nullable
          - `mode` string, nullable
          - `code` string, nullable
        - `participants` object[]
          - `ticketCategory` string
          - `label` string
          - `quantity` integer
      - `fulfilment` object, nullable
        - `meetingPoint` object, nullable
          - `instructions` string, nullable
          - `latitude` number, nullable
          - `longitude` number, nullable
          - `coordinatePrecision` string, nullable
        - `pickup` object, nullable: Present when the guest selected a pickup location during checkout.
          - `selectedAddress` string, nullable
          - `latitude` number, nullable
          - `longitude` number, nullable
          - `instructions` string, nullable
        - `dropOffInstructions` string, nullable
      - `customerInstructions` object, nullable
        - `additionalInformation` string[]
        - `itemsToBring` string[]
        - `notAllowed` string[]
        - `notSuitableFor` string[]
        - `inclusions` string[]
        - `exclusions` string[]
      - `cancellationTerms` object, nullable
        - `cancellable` boolean, nullable
        - `refundable` boolean, nullable
        - `partlyRefundable` boolean, nullable
        - `feeUnit` string, nullable
        - `feeValue` number, nullable
        - `offsetMinutes` integer, nullable
        - `summary` string, nullable
        - `freeCancellationUntil` string, nullable
      - `supplierEmergencyContact` object, nullable: Supplier's emergency contact for this booking. Not the traveler's/customer's contact details.
        - `email` string, nullable
        - `phone` string, nullable
        - `capturedAt` string, date-time, nullable
        - `source` 'provider_voucher' | 'provider_booking', nullable

## Other responses

- `400`: Invalid booking input, expired hold, unconfirmed payment, mismatched transaction or a confirmed business rejection.
- `401`: Authentication failed. Shared API-key middleware uses code 401; product handlers can use their operation-specific unauthorized code listed on the endpoint.
- `403`: Access denied. Shared access middleware uses common codes; product-specific forbidden codes are listed on the endpoint.
- `404`: Prebook or booking resource not found. Code 73005.
- `409`: A booking already exists for this prebookId. Code 73003.
- `413`: Request body exceeds the 1 MiB limit. Code 73001.
- `429`: Shared Dispatcher request limit exceeded. Code 4290; this is not an Experiences operation code.
- `500`: Failed to create booking. Code 73099.
- `502`: Booking dependency failed. Code 73008.
- `503`: Booking service temporarily unavailable. Code 73012.
- `504`: Booking dependency timed out. Code 73009. The error alone does not prove that the booking was not applied.

---

[API](https://skmtc.dev/liteapi/apis/api-experiences.md) - [All operations](https://skmtc.dev/liteapi/apis/api-experiences/llms.txt) - [OpenAPI document](https://skmtc.dev/liteapi/apis/api-experiences/revisions/40074513d3a2?raw)
