List bookings
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.
Your API key. Issued and revoked from the TrustPixel dashboard; the gateway resolves it to an owning organization on every request.
In: header
Query Parameters
Rows per page (default 20, max 100).
1 <= value <= 10020Rows to skip. meta.pagination.total is the full count, so the last page is at total - limit.
0 <= value0Keep only bookings in this status.
Value in
- "CREATED"
- "PREBOOK_IN_PROGRESS"
- "READY_FOR_COMPLETE"
- "COMPLETE_IN_PROGRESS"
- "CONFIRMED"
- "CANCEL_IN_PROGRESS"
- "CANCELED"
- "FAILED"
- "EXPIRED"
Keep only bookings held with this supplier. The supplier is fixed when the booking is created and never changes, so this is a stable filter.
Value in
- "LITEAPI"
- "DUFFEL"
Earliest booking-creation time, inclusive. When the booking was created, not when you travel. A date (2026-08-14) starts at midnight UTC; a full timestamp is used as given.
Latest booking-creation time, inclusive. A date (2026-08-14) means the end of that day, so created_from and created_to set to the same date return that whole day. A full timestamp is used as given, to the millisecond. UTC.
Exact match on the supplier's own reference for the booking — its order id. Returns a page of at most one; no partial or case-insensitive matching.
1 <= lengthWhat to order by. Defaults to created_at. total_amount compares raw amounts and does not convert currencies, so a mixed-currency page sorts 500 EUR and 500 USD as equal. Bookings with no price yet always sort last, whichever direction you pick. You cannot sort by travel date.
"created_at"Value in
- "created_at"
- "total_amount"
Defaults to desc whichever field you sort by.
"desc"Value in
- "asc"
- "desc"
Header Parameters
Correlation id echoed to the upstream service and returned on the response. Generated as req_<uuid> when omitted.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/v1/flight/bookings"{ "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": { "pagination": { "limit": 20, "offset": 0, "has_more": false, "total": 2 } }}Prebook a flight offer POST
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.
Get a booking GET
One booking with its itinerary, passengers, services, payments and money, in whatever status it has. `expires_at` is present while the booking can still be completed, `failure` when it is `FAILED` or when a cancellation was refused, and `cancellation` once it is `CANCELED`. Each payment carries its card in `payment_method` when the card can be read; a card that could not be read in time can appear when you read the booking again. `airline_initiated_changes` lists the airline's recorded changes to your booked flights, beside the flights you booked in `journeys`. A booking you do not own is a `404`.