> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://bcdtravel.ferndocs.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://bcdtravel.ferndocs.com/_mcp/server.

# Book flight

## Overview

The `book` endpoint creates a flight reservation in the GDS. It supports regular GDS content (Amadeus, Sabre) as well as low-cost carriers and NDC content from Travelfusion.

## Use case

This endpoint can be used on a reservation check-out page to allow users to book a fare. The booking process initiates the reservation with the airline, which may take some time to fully process.

> **Note**
>
> View the `complete_verification` endpoint for more information on the booking process for Travelfusion fares that require 3D security for credit card payments.

## What's next?

The `booking_uid` in the response must be used to get reservation details via the `get_reservation_details` endpoint until the status becomes something other than `in-progress`.

## Key parameters

| Parameter                             | Type   | Required    | Description                                                                                                               |
| ------------------------------------- | ------ | ----------- | ------------------------------------------------------------------------------------------------------------------------- |
| `fare_group_key`                      | string | yes         | Fare group key from the `pricing` response                                                                                |
| `flight_option_keys`                  | array  | yes         | Flight option keys from the `pricing` response                                                                            |
| `optional_service_keys`               | array  | no          | Optional service keys if add-ons were selected                                                                            |
| `travelers`                           | array  | yes         | Traveler details (name, DOB, passport, contact)                                                                           |
| `payment`                             | object | yes         | Payment information (credit card or corporate billing)                                                                    |
| `credit_card_verification_return_url` | string | conditional | Required for Travelfusion fares that need 3D Secure verification. URL where the bank redirects after payment verification |
| `custom_trip_data`                    | object | no          | Custom trip metadata for reporting purposes                                                                               |
| `client_reportable_data`              | object | no          | Client-specific reporting data                                                                                            |

## Response structure

The response contains:

* `booking_uid` — unique booking identifier for tracking the reservation
* `status` — initial reservation status (typically `in-progress`)
* `pnr_id` — passenger name record identifier in the GDS

## Booking flow

#### Validate fare via pricing

Always call the `pricing` endpoint first to confirm the fare is still available.

#### Collect traveler and payment details

Gather traveler information and payment method from your checkout page.

#### Submit booking request

Call the `book` endpoint with all required parameters.

#### Poll for completion

Use `get_reservation_details` with the `booking_uid` to check status until it resolves to `active` or returns an error.

#### Handle 3D Secure (if applicable)

For Travelfusion fares requiring 3D Secure: redirect the user to the `verification_url`, then call `complete_verification` with the returned `verification_id`.

## Error handling

If the booking fails, common scenarios include:

* **Fare no longer available** — the fare expired between pricing and booking
* **Payment declined** — credit card validation failed
* **Duplicate booking** — same `booktrack_id` was already used (create a new one for retries)

> **Warning**
>
> Always create a new `booktrack_id` when re-attempting a booking that failed. Reusing the same identifier will result in a duplicate booking error.