Prebook a flight offer
Re-price the offer and bind it: the itinerary, passengers and contact are stored and the booking answers READY_FOR_COMPLETE. A fresh key answers 201; repeating the same x-idempotency-key under the same organisation and user answers 200 with the existing booking. No inventory is held before book, so expires_at is a real deadline. use_payment_sdk decides how book pays: a saved instrument by default, or a Payment SDK intent whose token comes back in meta.payment_sdk on the 201. On Duffel, an airline can grant a member price for a passenger's loyalty_accounts, which lowers total_amount. A Duffel offer takes one active booking at a time, so prebooking it under a new key answers 409 while an earlier booking of it is unfinished.
Your API key. Issued and revoked from the TrustPixel dashboard; the gateway resolves it to an owning organization on every request.
In: header
Header Parameters
Correlation id echoed to the upstream service and returned on the response. Generated as req_<uuid> when omitted.
Your key for this prebook. Repeating it with the same organisation and user returns the existing booking rather than placing a second hold. After a failed booking, send a new key.
1 <= length <= 256Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
You bind an offer with the contact and passengers. Duffel reserves nothing before book; LiteAPI creates a checkout and may hold the itinerary during prebook.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/v1/flight/prebook" \ -H "x-idempotency-key: trip-2026-11-10-1" \ -H "Content-Type: application/json" \ -d '{ "offer_reference": "eyJzdXBwbGllciI6ImR1ZmZlbCIsIm9mZmVyIjoib2ZmXzAwMDBC…", "contact": { "first_name": "Amira", "last_name": "Haddad", "email": "amira.haddad@example.com", "phone_number": "2080160509", "phone_country_code": "44" }, "passengers": [ { "first_name": "Amira", "last_name": "Haddad", "birthday": "1988-04-12", "type": "ADULT", "gender": "F", "nationality": "GB" } ] }'{ "data": { "id": "bkg_0192f3a4b5c64d7e8f9a0b1c2d3e4f5b", "supplier": "DUFFEL", "status": "CREATED", "total_amount": { "amount": 260.67, "currency": "USD" }, "fare_amount": { "amount": 220.67, "currency": "USD" }, "fare_tax_amount": { "amount": 50, "currency": "USD" }, "services_amount": { "amount": 40, "currency": "USD" }, "services": [ { "id": "svc_0192f3a4b5c6", "status": "PENDING", "passenger_id": "string", "segment_ids": [ "string" ], "quantity": 1, "unit_amount": { "amount": 40, "currency": "USD" }, "total_amount": { "amount": 40, "currency": "USD" }, "payment_id": "pay_0192f3a4b5c64d7e8f9a0b1c2d3e4f61", "type": "BAGGAGE", "baggage": { "type": "CHECKED", "max_weight_kg": 23 } } ], "payments": [ { "id": "pay_0192f3a4b5c64d7e8f9a0b1c2d3e4f60", "status": "CAPTURED", "amount": { "amount": 180.67, "currency": "USD" }, "collected_by": "OEX", "payment_method": { "type": "CARD", "card": { "brand": "VISA", "last4": "4242", "funding": "CREDIT", "wallet": "APPLE_PAY" } }, "created_at": "2026-11-01T12:40:12.000Z" } ], "expires_at": "2026-11-01T12:49:56.000Z", "cancellation_policy": { "refundable": false, "penalty": { "amount": 150, "currency": "USD" } }, "fare_conditions": { "refund": { "allowed": true, "penalty": { "amount": 75, "currency": "USD" } }, "change": { "allowed": true, "penalty": { "amount": 75, "currency": "USD" } } }, "passengers": [ { "id": "string", "first_name": "Amira", "last_name": "Haddad", "loyalty_accounts": [ { "airline_iata_code": "BA", "membership_number": "•••••1014" } ] } ], "journeys": [ { "id": "string", "origin": "LHR", "destination": "CDG", "direction": "OUTBOUND", "fare_brand": "Premium", "departure_time": "2026-11-10T06:58:00", "arrival_time": "2026-11-10T09:15:00", "duration_minutes": 137, "stops": 0, "segments": [ { "id": "string", "origin": "LHR", "destination": "CDG", "departure_time": "2026-11-10T06:58:00", "arrival_time": "2026-11-10T09:15:00", "marketing_flight": "AF1681", "marketing_carrier": "Air France", "marketing_carrier_logo_url": "https://assets.duffel.com/img/airlines/for-light-background/full-color-logo/AF.svg", "operating_carrier": "KLM", "operating_carrier_logo_url": "https://assets.duffel.com/img/airlines/for-light-background/full-color-logo/KL.svg", "duration_minutes": 137, "passengers": [ { "passenger_id": "psg_0192f3a4b5c64d7e8f9a0b1c2d3e4f5c", "cabin_class": "BUSINESS", "cabin_name": "Business", "checked_bags": 1, "carry_on_bags": 1 } ] } ] } ], "supplier_reference": "ord_0000B9M0HSU2oNVmKw0UKj", "airline_pnr": "J6AK3S", "confirmed_at": "2026-11-01T12:40:12.000Z", "canceled_at": "2026-11-02T09:15:00.000Z", "cancellation": { "fee": { "amount": 95, "currency": "USD" }, "refunded_by": "SUPPLIER", "refund_amount": { "amount": 286.14, "currency": "USD" }, "refund_to": [ { "payment_id": "pay_0192f3a4b5c64d7e8f9a0b1c2d3e4f61" } ] }, "failure": { "code": "book_failed", "description": "The offer is no longer available." }, "created_at": "2026-11-01T12:34:56.000Z", "updated_at": "2026-11-01T12:40:12.000Z" }, "meta": { "payment_sdk": { "provider": "oex", "token": "string" } }}Get seat maps GET
The cabin layout of each flight on this offer, read live from the airline, with every seat priced per passenger. Choose a seat by sending the `services[].id` for that passenger in prebook's `services` with `quantity: 1`; it is included in the fare's `total_amount` and paid at book. A seat whose `services` is empty cannot be chosen. An empty list means the airline publishes no map for these flights. Seats cannot be added after the ticket is issued.
List bookings GET
The caller's bookings, newest first, with `meta.pagination`. Filter by `status`, `supplier`, `supplier_reference` and creation date, and sort by `created_at` or `total_amount`. Only bookings created under the calling organisation and user are returned. Each booking's `payments` come without `payment_method`; read the booking for its cards.