---
title: "Get booking services"
method: GET
path: "/flights/bookings/{bookingId}/services"
tags: ["Flight Bookings"]
---

# Get booking services

`GET /flights/bookings/{bookingId}/services`

## Request

- Base URL: `https://api.liteapi.travel/v3.0`
- URL: `https://api.liteapi.travel/v3.0/flights/bookings/{bookingId}/services`
- Auth: API key in header `X-API-Key`

## Overview

Retrieve the ancillary services (seats, baggage) for an existing flight booking: services that are **already booked** together with the live catalog of services that **can still be booked**.

## When to Use

- **Post-booking upsell** - Show the passenger which seats and bags they can still add after the booking was created
- **Booking management** - Display the services already attached to the booking with the prices that were charged
- **Availability refresh** - The bookable catalog is fetched live from the provider on every call

## What You Get

- **`groups`** - Bookable services grouped by category (seat, baggage) with post-margin prices and encoded `serviceId`s
- **`bookedServices`** - Services already attached to the booking; entries booked through the API carry the exact price that was charged at attach time
- **`expiresAt`** - Validity window of the bookable catalog

## Key Features

- **Read-only**: Safe to call at any time; the catalog reflects live availability
- **Consistent pricing**: Booked services echo the post-margin amounts the user actually paid

## Quick Start

Provide the `bookingId` (returned from `POST /flights/bookings`) in the URL path.

On a ticketed booking (status `CONFIRMED`) `groups` lists only what can be sold after ticketing (provider-dependent, usually baggage) and only when `canAddServicesAfterTicketing` is true; buy them with `POST /flights/bookings/{bookingId}/services` and `/services/confirm`.

## Path parameters

- `bookingId` string, required

## Query parameters

- `forceRefresh` boolean
- `includeServicesHistory` boolean

## Response `200`

Successful response

- object
  - `data` object[]: Services result array (always one item)
    - `expiresAt` string: Expiry time of the bookable services catalog (ISO 8601)
    - `groups` object[]: Ancillary services that can still be booked, grouped by category (seat, baggage). Prices are customer-facing display amounts (post-margin); serviceId is an encoded identifier.
      - `available` boolean: Whether any services in this group are currently available
      - `category` string: Service category: seat, baggage or, when enabled for the provider, meal, lounge, pet, wifi_entertainment, priority, assistance (sold at the provider price, item code in metadata.<category>.subCode)
      - `label` string: Human-readable group label
      - `services` object[]: Available services in this group
        - `serviceId` string: Unique service identifier — use this in selectedServices when attaching
        - `name` string: Human-readable service name (e.g. Seat 7A)
        - `category` string: Service category: seat, baggage or, when enabled for the provider, meal, lounge, pet, wifi_entertainment, priority, assistance (sold at the provider price, item code in metadata.<category>.subCode)
        - `passengerType` string: Applicable passenger type (ALL, ADT, CHD, INF)
        - `segmentKey` string: The segment this service applies to
        - `pricing` FlightItemPricing: Pricing for an ancillary item (e.g. baggage)
          - `display` FlightMoneyAmount: A monetary amount with currency
            - `amount` number: Monetary amount
            - `currency` string: ISO 4217 currency code
          - `converted` boolean: True if FX currency conversion was applied
        - `metadata` object: Category-specific metadata. Contains exactly one of `seat` (when category is `seat`) or `baggage` (when category is `baggage`).
          - `seat` object: Seat details — present only when the service category is `seat`
            - `available` boolean: Whether this seat is currently available for selection
            - `position` string: Physical position in the row (e.g. window, middle, aisle)
            - `seatColumn` string: Column letter (e.g. A, B, C)
            - `seatNumber` string: Full seat label (e.g. 1A)
            - `seatRow` integer: Row number
            - `seatType` string: Seat class/type (e.g. standard, extra_legroom, exit_row)
          - `baggage` object: Baggage details — present only when the service category is `baggage`
            - `bagType` string: Type of bag (e.g. checked, cabin, equipment). equipment is sports equipment or a musical instrument (skis, bike, golf bag...), with its own maxQuantity / maxBagsAllowed
            - `pieces` integer: Number of bag pieces included
            - `weightKg` number: Weight allowance in kilograms
            - `maxQuantity` integer: Maximum quantity of this bag option per passenger per segment. Omitted when unknown. This is the limit to cap the selection at: Atlas rejects a quantity above it (error 44116); Sabre and Travelport still accept it for now.
            - `maxBagsAllowed` integer: Highest bag position covered by the bag options of this bagType (e.g. 5 for "4th to 5th bag"). A position, not a count of bags to buy: position 1 may be the fare's free bag. Omitted when unknown. Cap the selection by maxQuantity, which never adds up to more than this.
    - `bookedServices` FlightBookedService[]: Services already attached to the booking, priced as charged at attach time
      - `serviceId` string, required: Encoded service identifier (carries provider serviceId, post-margin price, currency, category)
      - `name` string: Human-readable service name (e.g. 'Seat 1A')
      - `category` string: Service category (e.g. 'seat', 'baggage')
      - `passengerType` string: Applicable passenger type (ALL, ADT, CHD, INF)
      - `passengerIndex` integer: Index of the passenger this service applies to (0-based; matches the passengers[] array)
      - `segmentKey` string: The flight segment this service applies to (matches journey.segments[].segmentKey)
      - `quantity` integer: Number of units booked
      - `createdAt` string, date-time: UTC timestamp when the provider attached the service
      - `phase` string: When the service joined the booking: 'pre_booking', 'post_booking', or 'post_ticketing' (sold on the ticketed booking with POST /flights/bookings/{bookingId}/services/confirm)
      - `status` string: Provider status of this service: 'pending', 'requested', 'confirmed', 'failed', 'dropped', 'replaced' or 'cancelled'
      - `pricing` FlightItemPricing, required: Pricing for an ancillary item (e.g. baggage)
        - `display` FlightMoneyAmount: A monetary amount with currency
          - `amount` number: Monetary amount
          - `currency` string: ISO 4217 currency code
        - `converted` boolean: True if FX currency conversion was applied
      - `metadata` object: Category-specific metadata. Contains exactly one of `seat` (when category is 'seat') or `baggage` (when category is 'baggage').
        - `seat` object: Seat details — present only when category is 'seat'
          - `available` boolean: Whether this seat is currently available
          - `position` string: Physical position (window, middle, aisle)
          - `seatColumn` string: Column letter (e.g. A, B, C)
          - `seatNumber` string: Full seat label (e.g. 1A)
          - `seatRow` integer: Row number
          - `seatType` string: Seat class/type (standard, extra_legroom, exit_row, ...)
        - `baggage` object: Baggage details — present only when category is 'baggage'
          - `bagType` string: Type of bag (e.g. checked, cabin, equipment). equipment is sports equipment or a musical instrument (skis, bike, golf bag...), with its own maxQuantity / maxBagsAllowed
          - `pieces` integer, nullable: Number of bag pieces. Null for an included allowance with no piece limit (weight-only); never means zero bags
          - `weightKg` number, nullable: Weight allowance in kilograms. Null when the provider states no weight limit
          - `maxQuantity` integer: Maximum quantity of this bag option per passenger per segment. Omitted when unknown.
          - `maxBagsAllowed` integer: Highest bag position covered by the bag options of this bagType (e.g. 5 for "4th to 5th bag"). A position, not a count of bags to buy: position 1 may be the fare's free bag. Omitted when unknown.
      - `emdNumber` string, nullable: Airline document (EMD) number issued for a service sold after ticketing. Null until the provider reports it on a later read of the reservation.
    - `metadata` FlightServicesMetadata: Catalog-level rules returned next to the service groups
      - `ancillaryExclusions` object[]: Provider selection rules over services (today the Travelfusion bag options). A selection breaking a rule is refused with 400 44019 and details.conflicts.
        - `type` string, required: selectOne: pick at most one of serviceIds; mutuallyExclusive: the services cannot be combined
        - `scope` string: What the rule applies to
        - `reason` string
        - `serviceIds` string[], required: Encoded serviceIds from groups[].services[] covered by the rule
    - `canAddServicesAfterTicketing` boolean: Ticketed bookings only: whether groups can be bought after ticketing

## Other responses

- `400`: Bad request — invalid booking ID format
- `401`: Unauthorized
- `404`: Booking not found

---

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