More products

Flights

Flights use the same search, price-check and booking calls as hotels. What differs is the search body, the passenger details, and how quickly fares expire.

Send airport or city IATA codes and dates. Flight searches finish before POST /search returns, so the first results read is complete.

Return trip
{
  "productType": "flight",
  "origin": "DXB",
  "destination": "LHR",
  "checkIn": "2026-11-02",
  "checkOut": "2026-11-09",
  "cabinClass": "economy",
  "occupancy": [{ "adults": 2, "childrenAges": [7] }],
  "currency": "USD",
  "market": "AE"
}
Multi-city
{
  "productType": "flight",
  "slices": [
    { "origin": "LHR", "destination": "JFK", "date": "2026-11-02" },
    { "origin": "JFK", "destination": "LAX", "date": "2026-11-06" },
    { "origin": "LAX", "destination": "LHR", "date": "2026-11-12" }
  ],
  "cabinClass": "business",
  "occupancy": [{ "adults": 1, "childrenAges": [] }],
  "currency": "USD",
  "market": "GB"
}
FieldDescription
originIATA codeone-way/returnDeparture airport or city code, e.g. DXB.
destinationIATA codeone-way/returnArrival airport or city code.
checkInYYYY-MM-DDone-way/returnOutbound departure date.
checkOutYYYY-MM-DDReturn departure date. Send it for a return trip; leave it out for one-way.
slicesarray, up to 6multi-cityEach leg as origin, destination, date. When sent, origin, destination and dates are ignored.
cabinClass"economy" | "premium_economy" | "business" | "first"Preferred cabin.
occupancyarray, 1 entryrequiredPassengers: adults (1–8) and every child's age in childrenAges, infants included.
currencyISO 4217requiredYour wallet currency.
marketISO alpha-2requiredYour point of sale.

Results

Each result row is one priced itinerary for all passengers. summary.slices has one entry per journey (outbound, return, or each multi-city leg), and each slice lists its segments — the individual flights.

A result row (abridged)
{
  "rateQuoteId": "66f2a1c0e4b0c1d2e3f4c100",
  "sellAmountMinor": 184250,
  "sellCurrency": "USD",
  "refundable": false,
  "summary": {
    "rateName": "Example Air · Economy Flex",
    "airline": "Example Air",
    "route": "DXB→LHR",
    "departAt": "2026-11-02T08:15:00",
    "arriveAt": "2026-11-02T12:40:00",
    "stops": 0,
    "durationText": "7h 25m",
    "slices": [
      {
        "origin": "DXB", "destination": "LHR",
        "departAt": "2026-11-02T08:15:00", "arriveAt": "2026-11-02T12:40:00",
        "duration": "7h 25m", "stops": 0, "flights": "XA1",
        "segments": [
          { "origin": "DXB", "destination": "LHR", "carrier": "XA", "carrierName": "Example Air",
            "flightNumber": "1", "departAt": "2026-11-02T08:15:00", "arriveAt": "2026-11-02T12:40:00",
            "duration": "7h 25m", "cabin": "economy" }
        ]
      }
    ]
  }
}

durationText is ready to display. airline can be a name or an airline code, and fields a fare doesn't provide are null.

Fare details

For a fuller picture of a fare before checkout, call GET /quotes/:id/details. Its details can include the fare brand for each slice, aircraft and airport names per segment, the checked-bag allowance, whether refunds and changes are allowed before departure (with any penalty), and offerExpiresAt. Show baggage and change rules before the traveller commits.

Price-check promptly

Airline fares can expire sooner than the 20-minute quote clock — when the quote details carry offerExpiresAt, that is the fare's own deadline. Price-check as soon as the traveller chooses a fare and book immediately after. A 409 rate_unavailable means the fare has gone; search again.

Passenger details

Send one traveller per passenger searched — adults, then each child with type: "child" and their searched age (infants included, with their age). Always send all of these for every passenger:

  • firstName and lastName exactly as on the passport, title, dateOfBirth and gender;
  • passportNumber, passportExpiry and nationality — on every flight, domestic included. Some fares can't be booked without them, and the result doesn't tell you which.

For some fares these are checked before anything is charged: a missing field, or a passport that expires within 6 months of travel, returns 400 travel_documents_required with the traveller named in message. For others a gap only shows up as a failed booking, so check passport validity in your own form too.

The lead passenger also needs email and phone — airlines use them for disruption notices.

A passenger
{
  "firstName": "Asha",
  "lastName": "Rao",
  "title": "Ms",
  "type": "adult",
  "dateOfBirth": "1990-05-14",
  "gender": "f",
  "email": "asha.rao@example.com",
  "phone": "+971500000000",
  "passportNumber": "X1234567",
  "passportExpiry": "2031-01-01",
  "nationality": "IN"
}

Book and confirm

Book with paymentMethod: "credit" and an idempotency key, exactly as for hotels. A flight is confirmed only once it is ticketed. A booking that is paid but still being ticketed comes back supplier_pending — tickets usually follow within a minute or two. Poll POST /bookings/:id/refresh-status as described in Booking statuses, and don't book again.

On GET /bookings/:id, the flight's line item carries:

  • supplierConfirmationId — the airline's booking reference (locator) when it is known, otherwise the reservation's PNR. It is also in details.airlinePnr when the airline has issued one; details.pnr, when present, is the reservation's PNR.
  • details.tickets[] — one entry per ticketed passenger: name, ticketNo and airlinePnr.
  • details.ticketingStatus — ticketed or unticketed at the time the booking was made.

Ticket numbers are recorded when ticketing finishes during the booking call. A booking that went through supplier_pending may reach confirmed without them, and its ticketingStatus may still read unticketed; go by the booking's state, and email support with the orderRef if a traveller needs the ticket numbers. Not every flight carries these fields.

  • Holds aren't available for flights.
  • Flights are sold net; there is no commission.

Cancel

Cancel with POST /bookings/:id/cancel. What is refunded depends on the fare's conditions — many economy fares are non-refundable — so check the fare details before you offer a cancellation.

Flight cancellations are usually completed by our operations team rather than straight away: the booking moves to manual_review, with refund.status manual_review, until they finish. Don't cancel again; see Manual review.