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

# 4 · Search

POST https://sandbox-api.kitionz.com/v1/flights/search
Content-Type: application/json

**Search flights.**

**What:** find bookable offers for a route, date(s) and passenger mix across every supplier you have enabled.

**When:** the start of every booking — or on its own to *display* fares.

**Before / After:** optionally call `/origins` + `/destinations` to build the form → here → pick one offer’s `supplierOfferRef` → `/fare-quote`.

**Gotchas**

* **`tripType` is optional.** Leave it out and you get every trip kind leaving on `departureDate`: one-way fares AND round-trip offers. `ROUND_TRIP` gives round trips only.
* **`ONE_WAY` can also return round trips.** Some suppliers answer a one-way search with round-trip packages too. Kitionz returns them: each says `tripType: "ROUND_TRIP"` and has its `returnDate`. Read `tripType` on every offer and show it as what it is; never assume an offer is the kind you searched. To get every package, send `ROUND_TRIP` or leave `tripType` out: a supplier that keeps one route list per trip kind is asked in a one-way search only where its one-way list has the route and date.
* **`returnDate` is the day your traveller flies back.** With it, every round-trip offer has that `returnDate`: the local date its return leg leaves. Round-trip offers that return on other days are not in `offers`: `meta.otherReturnDates` counts them per day. Search again with that `returnDate` to see them. `otherReturnDates` counts only the round trips suppliers already sent; it is not a calendar of every return day. Without a `returnDate`, you get the round trips leaving on `departureDate`, each with its own `returnDate`.
* **A `returnDate` with no `tripType`** is a return journey: one-way offers and the round trips back on `returnDate`. Read each one-way offer’s route (`legs[0].originCode` → `destCode`); never assume it flies your way out. Today they all do; one-way offers flying back will come in this same answer later. A `returnDate` is refused (400) with `tripType: "ONE_WAY"`, and with `slices` (the date of your second slice is your return date).
* **Each offer says which trip it is:** `tripType` (`ONE_WAY` | `ROUND_TRIP`), `departureDate`, and — for a round trip — `returnDate`, fixed by the fare. A round trip’s price covers **both ways**: label it so in your screen. Send `departureDate` back unchanged on `/fare-quote` and `/book`. Book each offer by its own labels: send the offer's `tripType` and `returnDate`, never the search's. They may be left out there (the offer's own are used); when sent they must be the offer's (a different trip → `400 OFFER_TRIP_MISMATCH`).
* A **round trip is ONE offer** with `legs: [OUTBOUND, RETURN]`, one `totalAmount`, one `supplierOfferRef`: one fare for both ways, booked with one `/fare-quote` and one `/book`. It can be a series package (seats bought in advance and sold as a pair) or a return fare. Never staple two one-ways together.
* Today round trips come only from suppliers whose catalogue offers them. With `tripType: "ROUND_TRIP"`, every other supplier is listed in `meta.suppliersExcluded` with reason `ROUND_TRIP_NOT_OFFERED` (left out, not a failure).
* Some suppliers need your return date to find round trips. With a `returnDate`, Kitionz asks them for that day only, never for other days, so their other return days are not in `otherReturnDates`. When Kitionz already holds such a supplier’s list of return days and your day is not on it, the supplier is not asked and is listed in `meta.suppliersExcluded` with reason `RETURN_DATE_NOT_LISTED` (left out, not a failure).
* A supplier whose fares are all of a category your `filters.inventoryCategories` (or your connection) leaves out — e.g. a series-only supplier when you ask for `ONLINE` — is not asked at all: it is listed in `meta.suppliersExcluded` with reason `INVENTORY_NOT_REQUESTED` (left out, not a failure).
* A supplier that publishes a date list is asked on every date its list shows. When its current list leaves the date out, it is not asked and is listed in `meta.suppliersExcluded` with reason `DATE_NOT_LISTED` (left out, not a failure). A supplier with no date list is asked on every one-way search (a round trip goes only to suppliers whose catalogue offers round trips, see above).
* Some suppliers return their round-trip packages together with their one-way fares, from one date list for both. Their listed dates count for both trip kinds: a `tripType: "ROUND_TRIP"` search asks them on any listed date, and a search with no `tripType` asks them once and returns both kinds.
* With `slices` the slices decide the kind (one slice = one-way, two = round trip); send `tripType` only if it agrees. Never send `returnDate` with `slices`: the date of your second slice is your return date, and `meta.otherReturnDates` is filled for it too.
* `meta.tripTypes` lists the kinds this search covered; each `meta.suppliers`, `meta.suppliersFailed` and `meta.suppliersExcluded` entry carries the `tripType` of its part (one supplier can appear once per kind) — so the same supplier can be in `suppliersSucceeded` (one kind answered) and in `suppliersFailed` (the other failed). `supplierCounts`, when present, counts distinct suppliers in each list. A `DEADLINE_EXCEEDED` entry with `tookMs: 0` means the search ran out of time before that part asked the supplier.
* Search prices are **indicative** — never charge off them; re-price at `/fare-quote`.
* Pax fields are `adults` / `children` / `infants` (same names across the whole flow).
* **With infants, read `pricing.infantFare.status`.** `PRICED`: the supplier’s infant price is in `pricing.perPax.infant` and inside `totalAmount`. `NOT_GIVEN`: the supplier gave no infant price, so `perPax.infant` is absent and `totalAmount` covers adults and children only. Add your own infant charge (the supplier or airline may still charge for the infant), or hide such fares — your choice. Kitionz never hides a fare and never shows ₹0 for a missing infant price. Treat any other status as `NOT_GIVEN`, and add your infant charge before you sort by price.
* **`sources` is optional — leave it out.** Kitionz already knows which suppliers your key is enabled for and searches all of them. Send `sources` only to narrow to a subset of THOSE (blanks ignored; a non-enabled code → 403). Don’t send the empty `[""]` from the example skeleton.
* **Each offer carries `capabilities`** `{ seatSelection, meals, extraBaggage, hold, fareRules, cancellation: REALTIME|OFFLINE|NONE }` — render your seat/meal/hold/cancel buttons off it. It’s a supplier-level hint; the exact per-offer answer comes at `/fare-quote` (`eligibility`), and `/book`/`/seat-map` reject an unsupported action with a typed 422 (e.g. `CAPABILITY_NOT_SUPPORTED`) — so a wrong button can’t cause a bad booking.
* **Each offer carries `booking`** — read `bookable` FIRST. `bookable: false` → show the fare, don’t offer to book it (`viaSupplierApi` is then **absent**, not false). `bookable: true` + `viaSupplierApi: true` → `/book` books with the supplier; the booking’s `status` tells you whether the PNR came back on that call or follows. `bookable: true` + `viaSupplierApi: false` → `/book` records a request (`PENDING_FULFILMENT`); book on the supplier’s portal, then `/bookings/:id/fulfil`. In code: `if (!booking.bookable) … else if (booking.viaSupplierApi) … else …` — never test `!booking.viaSupplierApi` alone.
* **The same flights often come back from several sellers** — Kitionz returns every offer and never removes a copy. Group them by **`journeyKey`**: equal keys mean the sellers state the same flights at the same start and end times (same airline and flight number, same airports including stops, each leg leaving and arriving at the same local time). Price, seats, baggage and rules differ per offer: never add seats across a group, and book one specific offer with its own `supplierOfferRef`. Each leg has a `legKey` (same rule, one direction) — equal leg keys never let you split a package or join two one-ways. When `journeyKeyComparable` is `false` (reasons in `legs[].legKeyGaps`) the key is unique to that offer: show it on its own. The key changes when an airline retimes a flight or Kitionz learns a fact a seller left out. The recipe (version `jk1`) is published so you can key your own inventory the same way.

**Example — request** (only `origin` / `destination` / `departureDate` / `adults` are required):

```json
{ "origin": "DEL", "destination": "BOM", "departureDate": "2027-01-15", "adults": 1 }
```

**Response (trimmed)** — take each offer’s `supplierOfferRef` into `/fare-quote`:

```json
{
  "data": {
    "searchId": "srch_x6xpERXqk",
    "offers": [ {
      "supplierOfferRef": "floffer_9x2k7q",
      "tripType": "ONE_WAY",
      "departureDate": "2027-01-15",
      "journeyKey": "jk1_59da15eff41394c5648af3caaab489ca",
      "journeyKeyComparable": true,
      "pricing": { "totalAmount": 5480.00, "currency": "INR" },
      "legs": [ {
        "legType": "OUTBOUND",
        "departureTime": "2027-01-15T06:00:00+05:30", "arrivalTime": "2027-01-15T08:10:00+05:30",
        "segments": [ { "marketingCarrier": { "code": "6E", "flightNumber": "2134" }, "originCode": "DEL", "destCode": "BOM" } ],
        "legKey": "lk1_59da15eff41394c5648af3caaab489ca", "legKeyComparable": true, "legKeyGaps": []
      } ],
      "capabilities": { "seatSelection": false, "hold": false, "cancellation": "OFFLINE" },
      "booking": { "bookable": true, "viaSupplierApi": true, "validatingCarrier": "6E" }
    }, {
      "supplierOfferRef": "floffer_4h8n2r",
      "tripType": "ROUND_TRIP",
      "departureDate": "2027-01-15",
      "returnDate": "2027-01-19",
      "pricing": { "totalAmount": 9940.00, "currency": "INR" },
      "legs": [ { "legType": "OUTBOUND" }, { "legType": "RETURN" } ],
      "booking": { "bookable": true, "viaSupplierApi": true, "validatingCarrier": "6E" }
    } ],
    "meta": { "tripTypes": ["ONE_WAY", "ROUND_TRIP"], "suppliersFailed": [], "otherReturnDates": [] }
  }
}
```

**Example — a return journey** (one-way offers and round trips back on 19 Jan):

```json
{ "origin": "DEL", "destination": "BOM", "departureDate": "2027-01-15", "returnDate": "2027-01-19", "adults": 1 }
```

**Response (trimmed)** — one round-trip offer comes back on 19 Jan; two others come back on 20 Jan and are only counted:

```json
{ "data": { "offers": [ { "tripType": "ONE_WAY", "departureDate": "2027-01-15" }, { "tripType": "ROUND_TRIP", "departureDate": "2027-01-15", "returnDate": "2027-01-19" } ], "meta": { "tripTypes": ["ONE_WAY", "ROUND_TRIP"], "otherReturnDates": [ { "returnDate": "2027-01-20", "offerCount": 2 } ] } } }
```

Reference: https://docs.kitionz.com/flight-api/4-search

## Authentication

- `Authorization` header (bearer token, required) — Your Kitionz API key, sent as `Authorization: Bearer keyId:secret`. Create it in your Kitionz console under **API → API keys**.

## Servers

- `https://sandbox-api.kitionz.com` (Test, default)
- `https://api.kitionz.com` (Live)

## Request

### Body (application/json)

This endpoint expects a flightSearchBody.

- `origin` (string, required)
- `destination` (string, required)
- `departureDate` (string, required)
- `returnDate` (string, optional) — The day your traveller flies back. Every round-trip offer in the answer has this returnDate (the local date its return leg leaves). Round-trip offers that return on other days are counted in meta.otherReturnDates. With tripType left out you get one-way offers and round trips back on this day: read each one-way offer’s route, never assume it flies out. Not allowed with tripType ONE_WAY, nor with slices (the date of your second slice is your return date).
- `tripType` (enum, optional) — Optional. Left out: every trip kind — one-way fares and round trips. ROUND_TRIP: round trips only. ONE_WAY: one-way fares, plus any round-trip packages a supplier’s one-way answer carries; each says tripType ROUND_TRIP with its returnDate. Read tripType on every offer and book it by its own labels: send fare-quote and book the offer’s tripType, never the search’s. To get every package, send ROUND_TRIP or leave tripType out.
  - Allowed values: `ONE_WAY`, `ROUND_TRIP`
- `adults` (integer, optional, default: 1)
- `children` (integer, optional, default: 0)
- `infants` (integer, optional, default: 0)
- `cabin` (enum, optional)
  - Allowed values: `ECONOMY`, `PREMIUM_ECONOMY`, `BUSINESS`, `FIRST`
- `sources` (list of string, optional) — Optional. Leave it out to use every supplier your account has switched on. Send a list of sourceCodes only to narrow this call to some of them; a code you cannot use is refused (403), and blank entries are ignored.
- `slices` (list of FlightSearchBodySlicesItems, optional)
- `filters` (FlightSearchBodyFilters, optional)

## Response

### 200

Default Response

- `success` (boolean, required)
- `statusCode` (double, required)
- `data` (FlightSearchEnvelope, required) — Flight-search result envelope: searchId + offers + per-supplier meta (partial supplier failures are surfaced in meta.suppliersFailed, never as a top-level error).
- `meta` (V1FlightsSearchPostResponsesContentApplicationJsonSchemaMeta, required)

## Types

### FlightSearchBodySlicesItems

- `origin` (string, required)
- `destination` (string, required)
- `departureDate` (string, required)
- `cabin` (enum, optional)
  - Allowed values: `ECONOMY`, `PREMIUM_ECONOMY`, `BUSINESS`, `FIRST`

### FlightSearchBodyFilters

- `airlines` (FlightSearchBodyFiltersAirlines, optional)
- `maxConnections` (integer, optional)
- `refundableOnly` (boolean, optional)
- `fareBrandsInclude` (list of string, optional)
- `fareBrandsExclude` (list of string, optional)
- `maxOffersPerSupplier` (integer, optional)
- `inventoryCategories` (list of enum, optional)
  - Allowed values: `SERIES`, `ONLINE`

### FlightSearchEnvelope

Flight-search result envelope: searchId + offers + per-supplier meta (partial supplier failures are surfaced in meta.suppliersFailed, never as a top-level error).

- `searchId` (string, required)
- `offers` (list of FlightSearchEnvelopeOffersItems, required)
- `meta` (FlightSearchEnvelopeMeta, required)

### V1FlightsSearchPostResponsesContentApplicationJsonSchemaMeta

- `requestId` (string, required)
- `timestamp` (datetime, required)
- `path` (string, required)
- `method` (string, required)
- `responseTime` (double, optional)
- `pagination` (V1FlightsSearchPostResponsesContentApplicationJsonSchemaMetaPagination, optional)

### FlightSearchBodyFiltersAirlines

- `include` (list of string, optional)
- `exclude` (list of string, optional)

### FlightSearchEnvelopeOffersItems

- `inventoryCategory` (enum, required)
  - Allowed values: `SERIES`, `ONLINE`
- `supplierOfferRef` (string, required)
- `legs` (list of FlightSearchEnvelopeOffersItemsLegsItems, required)
- `journeyKey` (string, required) — Group offers by this value. Two offers with the same journeyKey state the same flights at the same start and end times: for every flight the same airline and flight number, the same airports with every stop on the way, and every leg leaves and arrives at the same local time. Kitionz compares what the sellers state; it does not check the flights with the airline. Price, seats, cabin, baggage, rules and seller can all differ: never add seats across a group (sellers often sell the same seats), and always book one specific offer with its own supplierOfferRef — journeyKey is not accepted by any endpoint. The key is the same in every search and on every day for the same stated flights; it changes when an airline retimes a flight or when Kitionz learns a fact a seller left out. Opaque (`jk1_` + 32 characters, at most 64 letters, digits and `_`): compare whole values, never parse. The recipe is published (version jk1) so you can compute it for your own inventory.
- `journeyKeyComparable` (boolean, required) — false when any leg cannot be compared (see legs[].legKeyGaps). journeyKey is then unique to this offer and never groups with another: show it on its own, and do not store it.
- `tripType` (enum, required) — Which trip this offer is: ONE_WAY, or ROUND_TRIP when the return is part of the same fare (the price covers both ways). Send it back as tripType on /fare-quote and /book.
  - Allowed values: `ONE_WAY`, `ROUND_TRIP`
- `departureDate` (string, required) — Local date the outbound leg departs (YYYY-MM-DD). Send it back as departureDate.
- `pricing` (FlightSearchEnvelopeOffersItemsPricing, required)
- `baggage` (FlightSearchEnvelopeOffersItemsBaggage, required)
- `cabin` (enum, required)
  - Allowed values: `ECONOMY`, `PREMIUM_ECONOMY`, `BUSINESS`, `FIRST`, `UNKNOWN`
- `stops` (double, required)
- `booking` (FlightSearchEnvelopeOffersItemsBooking, required)
- `policy` (FlightSearchEnvelopeOffersItemsPolicy, required)
- `paymentRequirements` (FlightSearchEnvelopeOffersItemsPaymentRequirements, required)
- `requiredPassengerFields` (FlightSearchEnvelopeOffersItemsRequiredPassengerFields, required)
- `capabilities` (FlightSearchEnvelopeOffersItemsCapabilities, required)
- `sourceCode` (string, optional) — Present only when your organisation is shown suppliers before booking; otherwise omitted (the supplier is named on the booking).
- `returnDate` (string, optional) — Round trip only: local date the return leg departs (YYYY-MM-DD), fixed by the fare. Send it back as returnDate.
- `availableSeats` (double, optional)
- `fareFamily` (FlightSearchEnvelopeOffersItemsFareFamily, optional)
- `offerExpiresAt` (string, optional)
- `gstInvoiceAvailable` (boolean, optional)
- `fareCategory` (enum, optional)
  - Allowed values: `PRIVATE`, `PUBLISHED`, `CORPORATE`, `SME`, `COUPON`, `PROMO`, `FLEXI`, `SALE`, `OTHER`
- `fareTypeName` (string, optional)
- `fareTier` (double, optional)
- `privateFare` (FlightSearchEnvelopeOffersItemsPrivateFare, optional)
- `totalEmissionsKg` (double, optional)
- `supplier` (FlightSearchEnvelopeOffersItemsSupplier, optional) — Present only when your organisation is shown suppliers before booking; otherwise omitted (the supplier is named on the booking).

### FlightSearchEnvelopeMeta

- `tripTypes` (list of enum, required) — The trip kinds this search covered: the tripType you sent, or ONE_WAY and ROUND_TRIP when you sent none.
  - Allowed values: `ONE_WAY`, `ROUND_TRIP`, `MULTI_CITY`
- `suppliersCalled` (list of string, required) — Empty when your organisation is shown suppliers only after booking; supplierCounts then gives the totals.
- `suppliersSucceeded` (list of string, required) — Empty when your organisation is shown suppliers only after booking; supplierCounts then gives the totals.
- `suppliersFailed` (list of FlightSearchEnvelopeMetaSuppliersFailedItems, required) — One entry per supplier that failed, with its error code. Without supplier disclosure an entry has errorCode and tripType only.
- `suppliers` (list of FlightSearchEnvelopeMetaSuppliersItems, required) — Empty when your organisation is shown suppliers only after booking; supplierCounts then gives the totals.
- `suppliersSkipped` (list of FlightSearchEnvelopeMetaSuppliersSkippedItems, required) — Empty when your organisation is shown suppliers only after booking; supplierCounts then gives the totals.
- `suppliersExcluded` (list of FlightSearchEnvelopeMetaSuppliersExcludedItems, required) — Empty when your organisation is shown suppliers only after booking; supplierCounts then gives the totals.
- `otherReturnDates` (list of FlightSearchEnvelopeMetaOtherReturnDatesItems, required) — Round-trip offers that return on another day than your return date (the returnDate you sent, or the date of your second slice). They are not in offers: search again with that returnDate to see them. It counts only the round trips suppliers already sent; it is not a calendar of every return day. Sorted by date. Empty when you sent no return date, or when no round trip came back on another day.
- `totalDurationMs` (double, required)
- `supplierCounts` (FlightSearchEnvelopeMetaSupplierCounts, optional) — How many suppliers were called, succeeded, failed, skipped and excluded. Present only when your organisation is shown suppliers only after booking, because the supplier lists are then empty.
- `supplierDisclosure` ("AFTER_BOOKING", optional) — AFTER_BOOKING when this answer leaves suppliers out: they are named on the booking. Absent when your organisation is shown suppliers before booking.

### V1FlightsSearchPostResponsesContentApplicationJsonSchemaMetaPagination

- `page` (double, optional)
- `limit` (double, optional)
- `total` (double, optional)
- `totalPages` (double, optional)
- `hasNext` (boolean, optional)
- `hasPrev` (boolean, optional)

### FlightSearchEnvelopeOffersItemsLegsItems

- `legIndex` (double, required)
- `legType` (enum, required)
  - Allowed values: `OUTBOUND`, `RETURN`
- `originCode` (string, required)
- `destCode` (string, required)
- `departureTime` (string, required)
- `arrivalTime` (string, required)
- `stops` (double, required)
- `segments` (list of FlightSearchEnvelopeOffersItemsLegsItemsSegmentsItems, required)
- `legKey` (string, required) — Identifies the flights of this leg (one direction). Two legs with the same legKey — in this offer or another — state the same flights: for every flight the same airline and flight number, the same airports with every stop on the way, and the leg leaves and arrives at the same local time. Use it to see that a round-trip package’s outbound is the same flights as a one-way offer. Equal leg keys never let you book a package’s legs separately or join two one-way offers into a round trip. Opaque (`lk1_` + 32 characters): compare whole values, never parse. When legKeyComparable is false it is unique to this leg of this offer and matches nothing.
- `legKeyComparable` (boolean, required) — false when the seller did not state everything needed to compare this leg (legKeyGaps says what). legKey is then unique and never matches another leg.
- `legKeyGaps` (list of enum, required) — Why this leg cannot be compared; empty when it can. New codes may be added: treat an unknown code as opaque and branch only on legKeyComparable. AIRLINE_NOT_STATED: a flight’s airline code is blank or not an airline designator. FLIGHT_NUMBER_MISSING: a flight has no number. FLIGHT_NUMBER_JOINED: numbers joined in one flight ("910/997"). FLIGHT_NUMBER_UNREADABLE: a number that is not 1–4 digits with an optional letter. AIRPORT_NOT_EXACT: an airport that is not a 3-letter code. STOP_NOT_NAMED: a stop whose airport was not stated. TIME_NOT_STATED: the leg’s departure or arrival time cannot be read to the minute. ARRIVAL_UNCONFIRMED: the leg’s arrival time is not trusted. FLIGHTS_NOT_STATED: the leg lists no flights.
  - Allowed values: `AIRLINE_NOT_STATED`, `FLIGHT_NUMBER_MISSING`, `FLIGHT_NUMBER_JOINED`, `FLIGHT_NUMBER_UNREADABLE`, `AIRPORT_NOT_EXACT`, `STOP_NOT_NAMED`, `TIME_NOT_STATED`, `ARRIVAL_UNCONFIRMED`, `FLIGHTS_NOT_STATED`
- `originName` (string, optional)
- `destName` (string, optional)
- `departureTimezone` (string, optional, nullable)
- `arrivalTimezone` (string, optional, nullable)
- `durationMinutes` (double, optional)
- `layovers` (list of FlightSearchEnvelopeOffersItemsLegsItemsLayoversItems, optional) — One entry per stop between flights, in order (`segments.length - 1` entries). Absent for a one-flight leg, and when the wait at a stop cannot be stated (the supplier stated clocks there that contradict each other; both times at that stop are then `null`). Never a shorter list.
- `cabinClass` (enum, optional)
  - Allowed values: `ECONOMY`, `PREMIUM_ECONOMY`, `BUSINESS`, `FIRST`, `UNKNOWN`

### FlightSearchEnvelopeOffersItemsPricing

- `totalAmount` (double, required) — The supplier's total for the passengers it priced, in INR. When infantFare.status is NOT_GIVEN it covers adults and children only — the infants are not in it.
- `currency` (string, required)
- `published` (FlightSearchEnvelopeOffersItemsPricingPublished, required)
- `offered` (FlightSearchEnvelopeOffersItemsPricingOffered, required)
- `taxComponents` (list of FlightSearchEnvelopeOffersItemsPricingTaxComponentsItems, required)
- `commercials` (list of FlightSearchEnvelopeOffersItemsPricingCommercialsItems, required)
- `perPax` (FlightSearchEnvelopeOffersItemsPricingPerPax, optional)
- `infantFare` (FlightSearchEnvelopeOffersItemsPricingInfantFare, optional) — Whether the supplier gave a price for the infants. PRICED: the infant price is in perPax.infant and inside totalAmount. NOT_GIVEN: the supplier gave no infant price, so perPax.infant is absent and totalAmount covers adults and children only — add your own infant charge (the supplier or airline may still charge for the infant). Treat any other status as NOT_GIVEN. Present whenever the party has an infant, absent otherwise. Kitionz never hides a fare because the infant price is missing: it says NOT_GIVEN.
- `components` (list of FlightSearchEnvelopeOffersItemsPricingComponentsItems, optional)

### FlightSearchEnvelopeOffersItemsBaggage

- `perPax` (list of FlightSearchEnvelopeOffersItemsBaggagePerPaxItems, required)

### FlightSearchEnvelopeOffersItemsBooking

- `bookable` (boolean, required) — Can this offer be booked through Kitionz right now? Check this first.
- `validatingCarrier` (string, required)
- `viaSupplierApi` (boolean, optional) — Present only when `bookable` is true. `true` = /book books with the supplier (the booking `status` says whether the PNR came back now or follows). `false` = /book records a request (PENDING\_FULFILMENT): book on the supplier’s portal, then POST /bookings/\{id}/fulfil. Absent when not bookable — never test `!viaSupplierApi` on its own.
- `bookingClass` (string, optional)
- `ticketingDeadline` (string, optional, nullable)

### FlightSearchEnvelopeOffersItemsPolicy

- `refundBeforeDeparture` (FlightSearchEnvelopeOffersItemsPolicyRefundBeforeDeparture, required)
- `changeBeforeDeparture` (FlightSearchEnvelopeOffersItemsPolicyChangeBeforeDeparture, required)
- `refundPolicy` (enum, required)
  - Allowed values: `REFUNDABLE`, `PARTIAL_REFUND`, `NON_REFUNDABLE`, `UNKNOWN`
- `changePolicy` (enum, required)
  - Allowed values: `FREE_CHANGE`, `CHARGEABLE`, `NOT_ALLOWED`, `UNKNOWN`
- `cancellationFee` (double, optional)
- `changeFee` (double, optional)

### FlightSearchEnvelopeOffersItemsPaymentRequirements

- `requiresInstantPayment` (boolean, required)
- `priceGuaranteeExpiresAt` (string, optional)
- `paymentRequiredBy` (string, optional)

### FlightSearchEnvelopeOffersItemsRequiredPassengerFields

- `international` (boolean, required)
- `fields` (FlightSearchEnvelopeOffersItemsRequiredPassengerFieldsFields, required)

### FlightSearchEnvelopeOffersItemsCapabilities

- `seatSelection` (boolean, required)
- `meals` (boolean, required)
- `extraBaggage` (boolean, required)
- `hold` (boolean, required)
- `fareRules` (boolean, required)
- `cancellation` (enum, required)
  - Allowed values: `REALTIME`, `OFFLINE`, `NONE`

### FlightSearchEnvelopeOffersItemsFareFamily

- `code` (string, required)
- `attributes` (list of FlightSearchEnvelopeOffersItemsFareFamilyAttributesItems, required)
- `name` (string, optional)
- `cabin` (enum, optional)
  - Allowed values: `ECONOMY`, `PREMIUM_ECONOMY`, `BUSINESS`, `FIRST`, `UNKNOWN`

### FlightSearchEnvelopeOffersItemsPrivateFare

- `type` (enum, required)
  - Allowed values: `CORPORATE`, `TOUR`, `NEGOTIATED`, `OTHER`
- `corporateCode` (string, optional)
- `tourCode` (string, optional)
- `trackingReference` (string, optional)

### FlightSearchEnvelopeOffersItemsSupplier

Present only when your organisation is shown suppliers before booking; otherwise omitted (the supplier is named on the booking).

- `code` (string, required)
- `name` (string, required, nullable)
- `website` (string, required, nullable)

### FlightSearchEnvelopeMetaSuppliersFailedItems

- `errorCode` (string, required)
- `tripType` (enum, required)
  - Allowed values: `ONE_WAY`, `ROUND_TRIP`, `MULTI_CITY`
- `sourceCode` (string, optional) — Present only when your organisation is shown suppliers before booking; otherwise omitted (the supplier is named on the booking).

### FlightSearchEnvelopeMetaSuppliersItems

- `sourceCode` (string, required)
- `tookMs` (double, required)
- `offerCount` (double, required)
- `tripType` (enum, required)
  - Allowed values: `ONE_WAY`, `ROUND_TRIP`, `MULTI_CITY`
- `errorCode` (string, optional)

### FlightSearchEnvelopeMetaSuppliersSkippedItems

- `sourceCode` (string, required)
- `reason` (string, required)

### FlightSearchEnvelopeMetaSuppliersExcludedItems

- `sourceCode` (string, required)
- `reason` (string, required)
- `tripType` (enum, required)
  - Allowed values: `ONE_WAY`, `ROUND_TRIP`, `MULTI_CITY`

### FlightSearchEnvelopeMetaOtherReturnDatesItems

- `returnDate` (string, required) — A day other round-trip offers return: the local date their return leg leaves (YYYY-MM-DD), the same as each offer’s returnDate.
- `offerCount` (integer, required) — How many round-trip offers return on that day.

### FlightSearchEnvelopeMetaSupplierCounts

How many suppliers were called, succeeded, failed, skipped and excluded. Present only when your organisation is shown suppliers only after booking, because the supplier lists are then empty.

- `called` (integer, required)
- `succeeded` (integer, required)
- `failed` (integer, required)
- `skipped` (integer, required)
- `excluded` (integer, required)

### FlightSearchEnvelopeOffersItemsLegsItemsSegmentsItems

- `segmentIndex` (double, required)
- `marketingCarrier` (FlightSearchEnvelopeOffersItemsLegsItemsSegmentsItemsMarketingCarrier, required)
- `isCodeshare` (boolean, required)
- `originCode` (string, required)
- `destCode` (string, required)
- `departureTime` (string, required, nullable) — Departure, ISO 8601 with the origin airport's offset. `null` when the supplier did not state it (or stated clocks at this stop that contradict each other): only at a stop inside a leg (`segments[i > 0]`); a leg's first departure is always given. Show it as "time not stated"; never fill it in. The wait at that stop is `layovers[i - 1].durationMinutes` when `layovers` is present.
- `arrivalTime` (string, required, nullable) — Arrival, ISO 8601 with the destination airport's offset. `null` when the supplier did not state it (or stated clocks at this stop that contradict each other): only at a stop inside a leg (`segments[i < last]`); a leg's last arrival is always given. Show it as "time not stated"; never fill it in.
- `operatingCarrier` (FlightSearchEnvelopeOffersItemsLegsItemsSegmentsItemsOperatingCarrier, optional)
- `originName` (string, optional)
- `originTerminal` (string, optional)
- `destName` (string, optional)
- `destinationTerminal` (string, optional)
- `departureTimezone` (string, optional, nullable)
- `arrivalTimezone` (string, optional, nullable)
- `durationMinutes` (double, optional) — Flight minutes. Absent when either time of this flight is `null` (not stated) — never computed from a missing time.
- `aircraft` (FlightSearchEnvelopeOffersItemsLegsItemsSegmentsItemsAircraft, optional)
- `cabinClass` (enum, optional)
  - Allowed values: `ECONOMY`, `PREMIUM_ECONOMY`, `BUSINESS`, `FIRST`, `UNKNOWN`
- `bookingClass` (string, optional)
- `fareBasisCode` (string, optional)
- `fareType` (string, optional)
- `brandedFare` (string, optional)
- `technicalStops` (list of FlightSearchEnvelopeOffersItemsLegsItemsSegmentsItemsTechnicalStopsItems, optional)
- `unnamedStops` (integer, optional)
- `arrivalTimeUnconfirmed` (boolean, optional) — true when the supplier’s arrival time for this flight could not be trusted: show "arrival time not confirmed" instead of the time and its duration. Absent or false: the times are sane.

### FlightSearchEnvelopeOffersItemsLegsItemsLayoversItems

The stop between two flights of a leg. Exactly one per gap: `layovers[k]` is the stop between `segments[k]` and `segments[k + 1]` (the whole list is absent when one stop's wait cannot be stated).

- `airport` (string, required)
- `durationMinutes` (double, required) — Minutes waited at this stop: from the two clocks when both are stated, otherwise the supplier's stated wait.
- `isOvernight` (boolean, required, nullable) — True when the wait is longer than 6 hours by the clocks. `null` when a clock at this stop is not stated, so Kitionz cannot tell.
- `city` (string, optional)
- `airportChange` (boolean, optional)

### FlightSearchEnvelopeOffersItemsPricingPublished

- `baseFare` (double, required)
- `taxes` (double, required)
- `total` (double, required)

### FlightSearchEnvelopeOffersItemsPricingOffered

- `baseFare` (double, required)
- `taxes` (double, required)
- `total` (double, required)
- `commission` (double, required)
- `tds` (double, required)
- `netPayable` (double, required)

### FlightSearchEnvelopeOffersItemsPricingTaxComponentsItems

- `code` (string, required)
- `amount` (double, required)
- `label` (string, optional)

### FlightSearchEnvelopeOffersItemsPricingCommercialsItems

- `type` (string, required)
- `amount` (double, required)
- `appliesOn` (string, optional)
- `paxType` (enum, optional)
  - Allowed values: `ADULT`, `CHILD`, `INFANT`
- `supplierType` (string, optional)
- `label` (string, optional)

### FlightSearchEnvelopeOffersItemsPricingPerPax

- `adult` (FlightSearchEnvelopeOffersItemsPricingPerPaxAdult, optional)
- `child` (FlightSearchEnvelopeOffersItemsPricingPerPaxChild, optional)
- `infant` (FlightSearchEnvelopeOffersItemsPricingPerPaxInfant, optional)

### FlightSearchEnvelopeOffersItemsPricingInfantFare

Whether the supplier gave a price for the infants. PRICED: the infant price is in perPax.infant and inside totalAmount. NOT_GIVEN: the supplier gave no infant price, so perPax.infant is absent and totalAmount covers adults and children only — add your own infant charge (the supplier or airline may still charge for the infant). Treat any other status as NOT_GIVEN. Present whenever the party has an infant, absent otherwise. Kitionz never hides a fare because the infant price is missing: it says NOT_GIVEN.

- `status` (enum, required) — Whether the supplier gave a price for the infants. PRICED: the infant price is in perPax.infant and inside totalAmount. NOT_GIVEN: the supplier gave no infant price, so perPax.infant is absent and totalAmount covers adults and children only — add your own infant charge (the supplier or airline may still charge for the infant). Treat any other status as NOT_GIVEN.
  - Allowed values: `PRICED`, `NOT_GIVEN`

### FlightSearchEnvelopeOffersItemsPricingComponentsItems

- `code` (string, required)
- `amount` (double, required)
- `label` (string, optional)
- `applicability` (enum, optional)
  - Allowed values: `PER_BOOKING`, `PER_PAX`, `PER_SEGMENT`

### FlightSearchEnvelopeOffersItemsBaggagePerPaxItems

- `paxType` (enum, required)
  - Allowed values: `ADT`, `CHD`, `INF`
- `checkIn` (FlightSearchEnvelopeOffersItemsBaggagePerPaxItemsCheckIn, optional)
- `cabin` (FlightSearchEnvelopeOffersItemsBaggagePerPaxItemsCabin, optional)
- `segmentRef` (string, optional)

### FlightSearchEnvelopeOffersItemsPolicyRefundBeforeDeparture

- `allowed` (boolean, required)
- `penaltyAmount` (double, optional)
- `penaltyCurrency` (string, optional)

### FlightSearchEnvelopeOffersItemsPolicyChangeBeforeDeparture

- `allowed` (boolean, required)
- `penaltyAmount` (double, optional)
- `penaltyCurrency` (string, optional)

### FlightSearchEnvelopeOffersItemsRequiredPassengerFieldsFields

- `DATE_OF_BIRTH` (enum, optional)
  - Allowed values: `MANDATORY`, `OPTIONAL`
- `PASSPORT_NUMBER` (enum, optional)
  - Allowed values: `MANDATORY`, `OPTIONAL`
- `PASSPORT_EXPIRY` (enum, optional)
  - Allowed values: `MANDATORY`, `OPTIONAL`
- `PASSPORT_ISSUE_DATE` (enum, optional)
  - Allowed values: `MANDATORY`, `OPTIONAL`
- `PASSPORT_ISSUING_COUNTRY` (enum, optional)
  - Allowed values: `MANDATORY`, `OPTIONAL`
- `NATIONALITY` (enum, optional)
  - Allowed values: `MANDATORY`, `OPTIONAL`

### FlightSearchEnvelopeOffersItemsFareFamilyAttributesItems

- `key` (string, required)
- `status` (enum, required)
  - Allowed values: `INCLUDED`, `CHARGEABLE`, `NOT_OFFERED`
- `label` (string, optional)
- `amount` (double, optional)

### FlightSearchEnvelopeOffersItemsLegsItemsSegmentsItemsMarketingCarrier

- `code` (string, required)
- `name` (string, optional)
- `flightNumber` (string, optional)

### FlightSearchEnvelopeOffersItemsLegsItemsSegmentsItemsOperatingCarrier

- `code` (string, required)
- `name` (string, optional)
- `flightNumber` (string, optional)

### FlightSearchEnvelopeOffersItemsLegsItemsSegmentsItemsAircraft

- `code` (string, required)
- `name` (string, optional)

### FlightSearchEnvelopeOffersItemsLegsItemsSegmentsItemsTechnicalStopsItems

- `airportCode` (string, required)
- `airportName` (string, optional)
- `arrivalTime` (string, optional)
- `departureTime` (string, optional)
- `durationMinutes` (double, optional)
- `arrivalTerminal` (string, optional)
- `departureTerminal` (string, optional)

### FlightSearchEnvelopeOffersItemsPricingPerPaxAdult

- `count` (double, required)
- `total` (double, required)
- `baseFare` (double, optional)
- `totalTax` (double, optional)

### FlightSearchEnvelopeOffersItemsPricingPerPaxChild

- `count` (double, required)
- `total` (double, required)
- `baseFare` (double, optional)
- `totalTax` (double, optional)

### FlightSearchEnvelopeOffersItemsPricingPerPaxInfant

- `count` (double, required)
- `total` (double, required)
- `baseFare` (double, optional)
- `totalTax` (double, optional)

### FlightSearchEnvelopeOffersItemsBaggagePerPaxItemsCheckIn

- FlightSearchEnvelopeOffersItemsBaggagePerPaxItemsCheckIn0
- FlightSearchEnvelopeOffersItemsBaggagePerPaxItemsCheckIn1

### FlightSearchEnvelopeOffersItemsBaggagePerPaxItemsCabin

- FlightSearchEnvelopeOffersItemsBaggagePerPaxItemsCabin0
- FlightSearchEnvelopeOffersItemsBaggagePerPaxItemsCabin1

### FlightSearchEnvelopeOffersItemsBaggagePerPaxItemsCheckIn0

- `pieces` (double, required)
- `weightKgPerPiece` (double, optional)

### FlightSearchEnvelopeOffersItemsBaggagePerPaxItemsCheckIn1

- `weightKg` (double, required)

### FlightSearchEnvelopeOffersItemsBaggagePerPaxItemsCabin0

- `pieces` (double, required)
- `weightKgPerPiece` (double, optional)

### FlightSearchEnvelopeOffersItemsBaggagePerPaxItemsCabin1

- `weightKg` (double, required)

## Examples

**Request**

```json
{
  "origin": "DEL",
  "destination": "BOM",
  "departureDate": "2026-11-10",
  "adults": 1
}
```

**Response**

```json
{
  "success": true,
  "statusCode": 200,
  "data": {
    "searchId": "srch_oXkcHq-iQf8ivdJBLnzWtg",
    "offers": [
      {
        "inventoryCategory": "ONLINE",
        "supplierOfferRef": "floffer_034n1fbuIzGX130wB12QcM",
        "legs": [
          {
            "legIndex": 0,
            "legType": "OUTBOUND",
            "originCode": "DEL",
            "destCode": "BOM",
            "departureTime": "2026-11-10T05:30:00+05:30",
            "arrivalTime": "2026-11-10T07:40:00+05:30",
            "stops": 0,
            "segments": [
              {
                "segmentIndex": 0,
                "marketingCarrier": {
                  "code": "ZZ",
                  "name": "Kitionz Test Air",
                  "flightNumber": "100"
                },
                "isCodeshare": false,
                "originCode": "DEL",
                "destCode": "BOM",
                "departureTime": "2026-11-10T05:30:00+05:30",
                "arrivalTime": "2026-11-10T07:40:00+05:30",
                "originName": "Indira Gandhi International Airport",
                "destName": "Chhatrapati Shivaji Maharaj International Airport",
                "departureTimezone": "Asia/Kolkata",
                "arrivalTimezone": "Asia/Kolkata",
                "durationMinutes": 130,
                "cabinClass": "ECONOMY",
                "bookingClass": "Y",
                "arrivalTimeUnconfirmed": false
              }
            ],
            "legKey": "lk1_a1ab4b5e3e2a8b649585807b54d3800c",
            "legKeyComparable": true,
            "legKeyGaps": [],
            "originName": "Indira Gandhi International Airport",
            "destName": "Chhatrapati Shivaji Maharaj International Airport",
            "departureTimezone": "Asia/Kolkata",
            "arrivalTimezone": "Asia/Kolkata",
            "durationMinutes": 130
          }
        ],
        "journeyKey": "jk1_a1ab4b5e3e2a8b649585807b54d3800c",
        "journeyKeyComparable": true,
        "tripType": "ONE_WAY",
        "departureDate": "2026-11-10",
        "pricing": {
          "totalAmount": 5324,
          "currency": "INR",
          "published": {
            "baseFare": 4511.86,
            "taxes": 812.14,
            "total": 5324
          },
          "offered": {
            "baseFare": 4511.86,
            "taxes": 812.14,
            "total": 5324,
            "commission": 0,
            "tds": 0,
            "netPayable": 5324
          },
          "taxComponents": [],
          "commercials": [],
          "perPax": {
            "adult": {
              "count": 1,
              "total": 5324
            }
          }
        },
        "baggage": {
          "perPax": [
            {
              "paxType": "ADT",
              "checkIn": {
                "weightKg": 15
              },
              "cabin": {
                "weightKg": 7
              }
            }
          ]
        },
        "cabin": "ECONOMY",
        "stops": 0,
        "booking": {
          "bookable": true,
          "validatingCarrier": "ZZ",
          "viaSupplierApi": true,
          "ticketingDeadline": null
        },
        "policy": {
          "refundBeforeDeparture": {
            "allowed": true,
            "penaltyAmount": 0,
            "penaltyCurrency": "INR"
          },
          "changeBeforeDeparture": {
            "allowed": false
          },
          "refundPolicy": "REFUNDABLE",
          "changePolicy": "CHARGEABLE"
        },
        "paymentRequirements": {
          "requiresInstantPayment": true
        },
        "requiredPassengerFields": {
          "international": false,
          "fields": {
            "DATE_OF_BIRTH": "OPTIONAL",
            "PASSPORT_NUMBER": "OPTIONAL",
            "PASSPORT_EXPIRY": "OPTIONAL",
            "PASSPORT_ISSUE_DATE": "OPTIONAL",
            "PASSPORT_ISSUING_COUNTRY": "OPTIONAL",
            "NATIONALITY": "OPTIONAL"
          }
        },
        "capabilities": {
          "seatSelection": true,
          "meals": false,
          "extraBaggage": false,
          "hold": true,
          "fareRules": true,
          "cancellation": "REALTIME"
        },
        "availableSeats": 9,
        "fareFamily": {
          "code": "TEST_CONFIRM",
          "attributes": [],
          "name": "Test fare — confirms",
          "cabin": "ECONOMY"
        },
        "fareCategory": "PUBLISHED",
        "fareTypeName": "Published"
      },
      {
        "inventoryCategory": "ONLINE",
        "supplierOfferRef": "floffer_034n1fbuOyp28AMirYcTCd",
        "legs": [
          {
            "legIndex": 0,
            "legType": "OUTBOUND",
            "originCode": "DEL",
            "destCode": "BOM",
            "departureTime": "2026-11-10T05:30:00+05:30",
            "arrivalTime": "2026-11-10T07:40:00+05:30",
            "stops": 0,
            "segments": [
              {
                "segmentIndex": 0,
                "marketingCarrier": {
                  "code": "ZZ",
                  "name": "Kitionz Test Air",
                  "flightNumber": "900"
                },
                "isCodeshare": false,
                "originCode": "DEL",
                "destCode": "BOM",
                "departureTime": "2026-11-10T05:30:00+05:30",
                "arrivalTime": "2026-11-10T07:40:00+05:30",
                "originName": "Indira Gandhi International Airport",
                "destName": "Chhatrapati Shivaji Maharaj International Airport",
                "departureTimezone": "Asia/Kolkata",
                "arrivalTimezone": "Asia/Kolkata",
                "durationMinutes": 130,
                "cabinClass": "ECONOMY",
                "bookingClass": "Y",
                "arrivalTimeUnconfirmed": false
              }
            ],
            "legKey": "lk1_0d6f2897d81dbea31ce550f6bd9c3713",
            "legKeyComparable": true,
            "legKeyGaps": [],
            "originName": "Indira Gandhi International Airport",
            "destName": "Chhatrapati Shivaji Maharaj International Airport",
            "departureTimezone": "Asia/Kolkata",
            "arrivalTimezone": "Asia/Kolkata",
            "durationMinutes": 130
          }
        ],
        "journeyKey": "jk1_0d6f2897d81dbea31ce550f6bd9c3713",
        "journeyKeyComparable": true,
        "tripType": "ONE_WAY",
        "departureDate": "2026-11-10",
        "pricing": {
          "totalAmount": 5324,
          "currency": "INR",
          "published": {
            "baseFare": 4511.86,
            "taxes": 812.14,
            "total": 5324
          },
          "offered": {
            "baseFare": 4511.86,
            "taxes": 812.14,
            "total": 5324,
            "commission": 0,
            "tds": 0,
            "netPayable": 5324
          },
          "taxComponents": [],
          "commercials": [],
          "perPax": {
            "adult": {
              "count": 1,
              "total": 5324
            }
          }
        },
        "baggage": {
          "perPax": [
            {
              "paxType": "ADT",
              "checkIn": {
                "weightKg": 15
              },
              "cabin": {
                "weightKg": 7
              }
            }
          ]
        },
        "cabin": "ECONOMY",
        "stops": 0,
        "booking": {
          "bookable": true,
          "validatingCarrier": "ZZ",
          "viaSupplierApi": false,
          "ticketingDeadline": null
        },
        "policy": {
          "refundBeforeDeparture": {
            "allowed": true,
            "penaltyAmount": 0,
            "penaltyCurrency": "INR"
          },
          "changeBeforeDeparture": {
            "allowed": false
          },
          "refundPolicy": "REFUNDABLE",
          "changePolicy": "CHARGEABLE"
        },
        "paymentRequirements": {
          "requiresInstantPayment": true
        },
        "requiredPassengerFields": {
          "international": false,
          "fields": {
            "DATE_OF_BIRTH": "OPTIONAL",
            "PASSPORT_NUMBER": "OPTIONAL",
            "PASSPORT_EXPIRY": "OPTIONAL",
            "PASSPORT_ISSUE_DATE": "OPTIONAL",
            "PASSPORT_ISSUING_COUNTRY": "OPTIONAL",
            "NATIONALITY": "OPTIONAL"
          }
        },
        "capabilities": {
          "seatSelection": false,
          "meals": false,
          "extraBaggage": false,
          "hold": false,
          "fareRules": false,
          "cancellation": "NONE"
        },
        "availableSeats": 9,
        "fareFamily": {
          "code": "TEST_CONFIRM",
          "attributes": [],
          "name": "Test fare — confirms",
          "cabin": "ECONOMY"
        },
        "fareCategory": "PUBLISHED",
        "fareTypeName": "Published"
      },
      {
        "inventoryCategory": "ONLINE",
        "supplierOfferRef": "floffer_034n1fbuP9Irz6YW1ZTK4h",
        "legs": [
          {
            "legIndex": 0,
            "legType": "OUTBOUND",
            "originCode": "DEL",
            "destCode": "BOM",
            "departureTime": "2026-11-10T07:00:00+05:30",
            "arrivalTime": "2026-11-10T09:10:00+05:30",
            "stops": 0,
            "segments": [
              {
                "segmentIndex": 0,
                "marketingCarrier": {
                  "code": "ZZ",
                  "name": "Kitionz Test Air",
                  "flightNumber": "101"
                },
                "isCodeshare": false,
                "originCode": "DEL",
                "destCode": "BOM",
                "departureTime": "2026-11-10T07:00:00+05:30",
                "arrivalTime": "2026-11-10T09:10:00+05:30",
                "originName": "Indira Gandhi International Airport",
                "destName": "Chhatrapati Shivaji Maharaj International Airport",
                "departureTimezone": "Asia/Kolkata",
                "arrivalTimezone": "Asia/Kolkata",
                "durationMinutes": 130,
                "cabinClass": "ECONOMY",
                "bookingClass": "Y",
                "arrivalTimeUnconfirmed": false
              }
            ],
            "legKey": "lk1_ee9e0be92409561b65f216febd659b7b",
            "legKeyComparable": true,
            "legKeyGaps": [],
            "originName": "Indira Gandhi International Airport",
            "destName": "Chhatrapati Shivaji Maharaj International Airport",
            "departureTimezone": "Asia/Kolkata",
            "arrivalTimezone": "Asia/Kolkata",
            "durationMinutes": 130
          }
        ],
        "journeyKey": "jk1_ee9e0be92409561b65f216febd659b7b",
        "journeyKeyComparable": true,
        "tripType": "ONE_WAY",
        "departureDate": "2026-11-10",
        "pricing": {
          "totalAmount": 5424,
          "currency": "INR",
          "published": {
            "baseFare": 4596.61,
            "taxes": 827.39,
            "total": 5424
          },
          "offered": {
            "baseFare": 4596.61,
            "taxes": 827.39,
            "total": 5424,
            "commission": 0,
            "tds": 0,
            "netPayable": 5424
          },
          "taxComponents": [],
          "commercials": [],
          "perPax": {
            "adult": {
              "count": 1,
              "total": 5424
            }
          }
        },
        "baggage": {
          "perPax": [
            {
              "paxType": "ADT",
              "checkIn": {
                "weightKg": 15
              },
              "cabin": {
                "weightKg": 7
              }
            }
          ]
        },
        "cabin": "ECONOMY",
        "stops": 0,
        "booking": {
          "bookable": true,
          "validatingCarrier": "ZZ",
          "viaSupplierApi": true,
          "ticketingDeadline": null
        },
        "policy": {
          "refundBeforeDeparture": {
            "allowed": true,
            "penaltyAmount": 0,
            "penaltyCurrency": "INR"
          },
          "changeBeforeDeparture": {
            "allowed": false
          },
          "refundPolicy": "REFUNDABLE",
          "changePolicy": "CHARGEABLE"
        },
        "paymentRequirements": {
          "requiresInstantPayment": true
        },
        "requiredPassengerFields": {
          "international": false,
          "fields": {
            "DATE_OF_BIRTH": "OPTIONAL",
            "PASSPORT_NUMBER": "OPTIONAL",
            "PASSPORT_EXPIRY": "OPTIONAL",
            "PASSPORT_ISSUE_DATE": "OPTIONAL",
            "PASSPORT_ISSUING_COUNTRY": "OPTIONAL",
            "NATIONALITY": "OPTIONAL"
          }
        },
        "capabilities": {
          "seatSelection": true,
          "meals": false,
          "extraBaggage": false,
          "hold": true,
          "fareRules": true,
          "cancellation": "REALTIME"
        },
        "availableSeats": 9,
        "fareFamily": {
          "code": "TEST_SLOW_CONFIRM",
          "attributes": [],
          "name": "Test fare — confirms after 2 min",
          "cabin": "ECONOMY"
        },
        "fareCategory": "PUBLISHED",
        "fareTypeName": "Published"
      },
      {
        "inventoryCategory": "ONLINE",
        "supplierOfferRef": "floffer_034n1fbuPJpqNjklwB9SZk",
        "legs": [
          {
            "legIndex": 0,
            "legType": "OUTBOUND",
            "originCode": "DEL",
            "destCode": "BOM",
            "departureTime": "2026-11-10T05:30:00+05:30",
            "arrivalTime": "2026-11-10T07:40:00+05:30",
            "stops": 0,
            "segments": [
              {
                "segmentIndex": 0,
                "marketingCarrier": {
                  "code": "ZZ",
                  "name": "Kitionz Test Air",
                  "flightNumber": "100"
                },
                "isCodeshare": false,
                "originCode": "DEL",
                "destCode": "BOM",
                "departureTime": "2026-11-10T05:30:00+05:30",
                "arrivalTime": "2026-11-10T07:40:00+05:30",
                "originName": "Indira Gandhi International Airport",
                "destName": "Chhatrapati Shivaji Maharaj International Airport",
                "departureTimezone": "Asia/Kolkata",
                "arrivalTimezone": "Asia/Kolkata",
                "durationMinutes": 130,
                "cabinClass": "ECONOMY",
                "bookingClass": "Y",
                "arrivalTimeUnconfirmed": false
              }
            ],
            "legKey": "lk1_a1ab4b5e3e2a8b649585807b54d3800c",
            "legKeyComparable": true,
            "legKeyGaps": [],
            "originName": "Indira Gandhi International Airport",
            "destName": "Chhatrapati Shivaji Maharaj International Airport",
            "departureTimezone": "Asia/Kolkata",
            "arrivalTimezone": "Asia/Kolkata",
            "durationMinutes": 130
          }
        ],
        "journeyKey": "jk1_a1ab4b5e3e2a8b649585807b54d3800c",
        "journeyKeyComparable": true,
        "tripType": "ONE_WAY",
        "departureDate": "2026-11-10",
        "pricing": {
          "totalAmount": 5444,
          "currency": "INR",
          "published": {
            "baseFare": 4613.56,
            "taxes": 830.44,
            "total": 5444
          },
          "offered": {
            "baseFare": 4613.56,
            "taxes": 830.44,
            "total": 5444,
            "commission": 0,
            "tds": 0,
            "netPayable": 5444
          },
          "taxComponents": [],
          "commercials": [],
          "perPax": {
            "adult": {
              "count": 1,
              "total": 5444
            }
          }
        },
        "baggage": {
          "perPax": [
            {
              "paxType": "ADT",
              "checkIn": {
                "weightKg": 15
              },
              "cabin": {
                "weightKg": 7
              }
            }
          ]
        },
        "cabin": "ECONOMY",
        "stops": 0,
        "booking": {
          "bookable": true,
          "validatingCarrier": "ZZ",
          "viaSupplierApi": true,
          "ticketingDeadline": null
        },
        "policy": {
          "refundBeforeDeparture": {
            "allowed": true,
            "penaltyAmount": 0,
            "penaltyCurrency": "INR"
          },
          "changeBeforeDeparture": {
            "allowed": false
          },
          "refundPolicy": "REFUNDABLE",
          "changePolicy": "CHARGEABLE"
        },
        "paymentRequirements": {
          "requiresInstantPayment": true
        },
        "requiredPassengerFields": {
          "international": false,
          "fields": {
            "DATE_OF_BIRTH": "OPTIONAL",
            "PASSPORT_NUMBER": "OPTIONAL",
            "PASSPORT_EXPIRY": "OPTIONAL",
            "PASSPORT_ISSUE_DATE": "OPTIONAL",
            "PASSPORT_ISSUING_COUNTRY": "OPTIONAL",
            "NATIONALITY": "OPTIONAL"
          }
        },
        "capabilities": {
          "seatSelection": true,
          "meals": false,
          "extraBaggage": false,
          "hold": true,
          "fareRules": true,
          "cancellation": "REALTIME"
        },
        "availableSeats": 4,
        "fareFamily": {
          "code": "TEST_CONFIRM",
          "attributes": [],
          "name": "Test fare — confirms · second seller, same flights, no infant fare",
          "cabin": "ECONOMY"
        },
        "fareCategory": "PUBLISHED",
        "fareTypeName": "Published"
      },
      {
        "inventoryCategory": "ONLINE",
        "supplierOfferRef": "floffer_034n1fbuPD3NrGQqgwCnJV",
        "legs": [
          {
            "legIndex": 0,
            "legType": "OUTBOUND",
            "originCode": "DEL",
            "destCode": "BOM",
            "departureTime": "2026-11-10T08:30:00+05:30",
            "arrivalTime": "2026-11-10T10:40:00+05:30",
            "stops": 0,
            "segments": [
              {
                "segmentIndex": 0,
                "marketingCarrier": {
                  "code": "ZZ",
                  "name": "Kitionz Test Air",
                  "flightNumber": "102"
                },
                "isCodeshare": false,
                "originCode": "DEL",
                "destCode": "BOM",
                "departureTime": "2026-11-10T08:30:00+05:30",
                "arrivalTime": "2026-11-10T10:40:00+05:30",
                "originName": "Indira Gandhi International Airport",
                "destName": "Chhatrapati Shivaji Maharaj International Airport",
                "departureTimezone": "Asia/Kolkata",
                "arrivalTimezone": "Asia/Kolkata",
                "durationMinutes": 130,
                "cabinClass": "ECONOMY",
                "bookingClass": "Y",
                "arrivalTimeUnconfirmed": false
              }
            ],
            "legKey": "lk1_35cbbb5ef89edb04ecc1aaeb790969b4",
            "legKeyComparable": true,
            "legKeyGaps": [],
            "originName": "Indira Gandhi International Airport",
            "destName": "Chhatrapati Shivaji Maharaj International Airport",
            "departureTimezone": "Asia/Kolkata",
            "arrivalTimezone": "Asia/Kolkata",
            "durationMinutes": 130
          }
        ],
        "journeyKey": "jk1_35cbbb5ef89edb04ecc1aaeb790969b4",
        "journeyKeyComparable": true,
        "tripType": "ONE_WAY",
        "departureDate": "2026-11-10",
        "pricing": {
          "totalAmount": 5524,
          "currency": "INR",
          "published": {
            "baseFare": 4681.36,
            "taxes": 842.64,
            "total": 5524
          },
          "offered": {
            "baseFare": 4681.36,
            "taxes": 842.64,
            "total": 5524,
            "commission": 0,
            "tds": 0,
            "netPayable": 5524
          },
          "taxComponents": [],
          "commercials": [],
          "perPax": {
            "adult": {
              "count": 1,
              "total": 5524
            }
          }
        },
        "baggage": {
          "perPax": [
            {
              "paxType": "ADT",
              "checkIn": {
                "weightKg": 15
              },
              "cabin": {
                "weightKg": 7
              }
            }
          ]
        },
        "cabin": "ECONOMY",
        "stops": 0,
        "booking": {
          "bookable": true,
          "validatingCarrier": "ZZ",
          "viaSupplierApi": true,
          "ticketingDeadline": null
        },
        "policy": {
          "refundBeforeDeparture": {
            "allowed": true,
            "penaltyAmount": 0,
            "penaltyCurrency": "INR"
          },
          "changeBeforeDeparture": {
            "allowed": false
          },
          "refundPolicy": "REFUNDABLE",
          "changePolicy": "CHARGEABLE"
        },
        "paymentRequirements": {
          "requiresInstantPayment": true
        },
        "requiredPassengerFields": {
          "international": false,
          "fields": {
            "DATE_OF_BIRTH": "OPTIONAL",
            "PASSPORT_NUMBER": "OPTIONAL",
            "PASSPORT_EXPIRY": "OPTIONAL",
            "PASSPORT_ISSUE_DATE": "OPTIONAL",
            "PASSPORT_ISSUING_COUNTRY": "OPTIONAL",
            "NATIONALITY": "OPTIONAL"
          }
        },
        "capabilities": {
          "seatSelection": true,
          "meals": false,
          "extraBaggage": false,
          "hold": true,
          "fareRules": true,
          "cancellation": "REALTIME"
        },
        "availableSeats": 9,
        "fareFamily": {
          "code": "TEST_SLOW_FAIL",
          "attributes": [],
          "name": "Test fare — pending, then fails after 2 min",
          "cabin": "ECONOMY"
        },
        "fareCategory": "PUBLISHED",
        "fareTypeName": "Published"
      },
      {
        "inventoryCategory": "ONLINE",
        "supplierOfferRef": "floffer_034n1fbuPKd7xKJdCq4AMX",
        "legs": [
          {
            "legIndex": 0,
            "legType": "OUTBOUND",
            "originCode": "DEL",
            "destCode": "BOM",
            "departureTime": "2026-11-10T21:30:00+05:30",
            "arrivalTime": "2026-11-10T23:40:00+05:30",
            "stops": 0,
            "segments": [
              {
                "segmentIndex": 0,
                "marketingCarrier": {
                  "code": "ZZ",
                  "name": "Kitionz Test Air"
                },
                "isCodeshare": false,
                "originCode": "DEL",
                "destCode": "BOM",
                "departureTime": "2026-11-10T21:30:00+05:30",
                "arrivalTime": "2026-11-10T23:40:00+05:30",
                "originName": "Indira Gandhi International Airport",
                "destName": "Chhatrapati Shivaji Maharaj International Airport",
                "departureTimezone": "Asia/Kolkata",
                "arrivalTimezone": "Asia/Kolkata",
                "durationMinutes": 130,
                "cabinClass": "ECONOMY",
                "bookingClass": "Y",
                "arrivalTimeUnconfirmed": false
              }
            ],
            "legKey": "lk1_5a0e944e8b1b2e21647f41ce82131beb",
            "legKeyComparable": false,
            "legKeyGaps": [
              "FLIGHT_NUMBER_MISSING"
            ],
            "originName": "Indira Gandhi International Airport",
            "destName": "Chhatrapati Shivaji Maharaj International Airport",
            "departureTimezone": "Asia/Kolkata",
            "arrivalTimezone": "Asia/Kolkata",
            "durationMinutes": 130
          }
        ],
        "journeyKey": "jk1_35c4e6c5b44be8e6afa6b0099e5f36e1",
        "journeyKeyComparable": false,
        "tripType": "ONE_WAY",
        "departureDate": "2026-11-10",
        "pricing": {
          "totalAmount": 5584,
          "currency": "INR",
          "published": {
            "baseFare": 4732.2,
            "taxes": 851.8,
            "total": 5584
          },
          "offered": {
            "baseFare": 4732.2,
            "taxes": 851.8,
            "total": 5584,
            "commission": 0,
            "tds": 0,
            "netPayable": 5584
          },
          "taxComponents": [],
          "commercials": [],
          "perPax": {
            "adult": {
              "count": 1,
              "total": 5584
            }
          }
        },
        "baggage": {
          "perPax": [
            {
              "paxType": "ADT",
              "checkIn": {
                "weightKg": 15
              },
              "cabin": {
                "weightKg": 7
              }
            }
          ]
        },
        "cabin": "ECONOMY",
        "stops": 0,
        "booking": {
          "bookable": true,
          "validatingCarrier": "ZZ",
          "viaSupplierApi": true,
          "ticketingDeadline": null
        },
        "policy": {
          "refundBeforeDeparture": {
            "allowed": true,
            "penaltyAmount": 0,
            "penaltyCurrency": "INR"
          },
          "changeBeforeDeparture": {
            "allowed": false
          },
          "refundPolicy": "REFUNDABLE",
          "changePolicy": "CHARGEABLE"
        },
        "paymentRequirements": {
          "requiresInstantPayment": true
        },
        "requiredPassengerFields": {
          "international": false,
          "fields": {
            "DATE_OF_BIRTH": "OPTIONAL",
            "PASSPORT_NUMBER": "OPTIONAL",
            "PASSPORT_EXPIRY": "OPTIONAL",
            "PASSPORT_ISSUE_DATE": "OPTIONAL",
            "PASSPORT_ISSUING_COUNTRY": "OPTIONAL",
            "NATIONALITY": "OPTIONAL"
          }
        },
        "capabilities": {
          "seatSelection": true,
          "meals": false,
          "extraBaggage": false,
          "hold": true,
          "fareRules": true,
          "cancellation": "REALTIME"
        },
        "availableSeats": 9,
        "fareFamily": {
          "code": "TEST_CONFIRM",
          "attributes": [],
          "name": "Test fare — confirms · flight number not stated",
          "cabin": "ECONOMY"
        },
        "fareCategory": "PUBLISHED",
        "fareTypeName": "Published"
      },
      {
        "inventoryCategory": "ONLINE",
        "supplierOfferRef": "floffer_034n1fbuPBAmN7XaEW93QK",
        "legs": [
          {
            "legIndex": 0,
            "legType": "OUTBOUND",
            "originCode": "DEL",
            "destCode": "BOM",
            "departureTime": "2026-11-10T10:00:00+05:30",
            "arrivalTime": "2026-11-10T12:10:00+05:30",
            "stops": 0,
            "segments": [
              {
                "segmentIndex": 0,
                "marketingCarrier": {
                  "code": "ZZ",
                  "name": "Kitionz Test Air",
                  "flightNumber": "103"
                },
                "isCodeshare": false,
                "originCode": "DEL",
                "destCode": "BOM",
                "departureTime": "2026-11-10T10:00:00+05:30",
                "arrivalTime": "2026-11-10T12:10:00+05:30",
                "originName": "Indira Gandhi International Airport",
                "destName": "Chhatrapati Shivaji Maharaj International Airport",
                "departureTimezone": "Asia/Kolkata",
                "arrivalTimezone": "Asia/Kolkata",
                "durationMinutes": 130,
                "cabinClass": "ECONOMY",
                "bookingClass": "Y",
                "arrivalTimeUnconfirmed": false
              }
            ],
            "legKey": "lk1_6f463362c5c27de77a24f58a1918bcb3",
            "legKeyComparable": true,
            "legKeyGaps": [],
            "originName": "Indira Gandhi International Airport",
            "destName": "Chhatrapati Shivaji Maharaj International Airport",
            "departureTimezone": "Asia/Kolkata",
            "arrivalTimezone": "Asia/Kolkata",
            "durationMinutes": 130
          }
        ],
        "journeyKey": "jk1_6f463362c5c27de77a24f58a1918bcb3",
        "journeyKeyComparable": true,
        "tripType": "ONE_WAY",
        "departureDate": "2026-11-10",
        "pricing": {
          "totalAmount": 5624,
          "currency": "INR",
          "published": {
            "baseFare": 4766.1,
            "taxes": 857.9,
            "total": 5624
          },
          "offered": {
            "baseFare": 4766.1,
            "taxes": 857.9,
            "total": 5624,
            "commission": 0,
            "tds": 0,
            "netPayable": 5624
          },
          "taxComponents": [],
          "commercials": [],
          "perPax": {
            "adult": {
              "count": 1,
              "total": 5624
            }
          }
        },
        "baggage": {
          "perPax": [
            {
              "paxType": "ADT",
              "checkIn": {
                "weightKg": 15
              },
              "cabin": {
                "weightKg": 7
              }
            }
          ]
        },
        "cabin": "ECONOMY",
        "stops": 0,
        "booking": {
          "bookable": true,
          "validatingCarrier": "ZZ",
          "viaSupplierApi": true,
          "ticketingDeadline": null
        },
        "policy": {
          "refundBeforeDeparture": {
            "allowed": true,
            "penaltyAmount": 0,
            "penaltyCurrency": "INR"
          },
          "changeBeforeDeparture": {
            "allowed": false
          },
          "refundPolicy": "REFUNDABLE",
          "changePolicy": "CHARGEABLE"
        },
        "paymentRequirements": {
          "requiresInstantPayment": true
        },
        "requiredPassengerFields": {
          "international": false,
          "fields": {
            "DATE_OF_BIRTH": "OPTIONAL",
            "PASSPORT_NUMBER": "OPTIONAL",
            "PASSPORT_EXPIRY": "OPTIONAL",
            "PASSPORT_ISSUE_DATE": "OPTIONAL",
            "PASSPORT_ISSUING_COUNTRY": "OPTIONAL",
            "NATIONALITY": "OPTIONAL"
          }
        },
        "capabilities": {
          "seatSelection": true,
          "meals": false,
          "extraBaggage": false,
          "hold": true,
          "fareRules": true,
          "cancellation": "REALTIME"
        },
        "availableSeats": 9,
        "fareFamily": {
          "code": "TEST_TIMEOUT_BOOKED",
          "attributes": [],
          "name": "Test fare — times out, booked after all",
          "cabin": "ECONOMY"
        },
        "fareCategory": "PUBLISHED",
        "fareTypeName": "Published"
      },
      {
        "inventoryCategory": "ONLINE",
        "supplierOfferRef": "floffer_034n1fbuP3VPkWaGyrnyLv",
        "legs": [
          {
            "legIndex": 0,
            "legType": "OUTBOUND",
            "originCode": "DEL",
            "destCode": "BOM",
            "departureTime": "2026-11-10T08:10:00+05:30",
            "arrivalTime": "2026-11-10T14:05:00+05:30",
            "stops": 1,
            "segments": [
              {
                "segmentIndex": 0,
                "marketingCarrier": {
                  "code": "ZZ",
                  "name": "Kitionz Test Air",
                  "flightNumber": "120"
                },
                "isCodeshare": false,
                "originCode": "DEL",
                "destCode": "BLR",
                "departureTime": "2026-11-10T08:10:00+05:30",
                "arrivalTime": null,
                "originName": "Indira Gandhi International Airport",
                "destName": "Kempegowda International Airport",
                "departureTimezone": "Asia/Kolkata",
                "arrivalTimezone": "Asia/Kolkata",
                "cabinClass": "ECONOMY",
                "bookingClass": "Y"
              },
              {
                "segmentIndex": 1,
                "marketingCarrier": {
                  "code": "ZZ",
                  "name": "Kitionz Test Air",
                  "flightNumber": "121"
                },
                "isCodeshare": false,
                "originCode": "BLR",
                "destCode": "BOM",
                "departureTime": null,
                "arrivalTime": "2026-11-10T14:05:00+05:30",
                "originName": "Kempegowda International Airport",
                "destName": "Chhatrapati Shivaji Maharaj International Airport",
                "departureTimezone": "Asia/Kolkata",
                "arrivalTimezone": "Asia/Kolkata",
                "cabinClass": "ECONOMY",
                "bookingClass": "Y",
                "arrivalTimeUnconfirmed": false
              }
            ],
            "legKey": "lk1_f0d185b92de457233bf7beb74fa0a96e",
            "legKeyComparable": true,
            "legKeyGaps": [],
            "originName": "Indira Gandhi International Airport",
            "destName": "Chhatrapati Shivaji Maharaj International Airport",
            "departureTimezone": "Asia/Kolkata",
            "arrivalTimezone": "Asia/Kolkata",
            "durationMinutes": 355,
            "layovers": [
              {
                "airport": "BLR",
                "durationMinutes": 95,
                "isOvernight": null,
                "airportChange": false
              }
            ]
          }
        ],
        "journeyKey": "jk1_f0d185b92de457233bf7beb74fa0a96e",
        "journeyKeyComparable": true,
        "tripType": "ONE_WAY",
        "departureDate": "2026-11-10",
        "pricing": {
          "totalAmount": 5664,
          "currency": "INR",
          "published": {
            "baseFare": 4800,
            "taxes": 864,
            "total": 5664
          },
          "offered": {
            "baseFare": 4800,
            "taxes": 864,
            "total": 5664,
            "commission": 0,
            "tds": 0,
            "netPayable": 5664
          },
          "taxComponents": [],
          "commercials": [],
          "perPax": {
            "adult": {
              "count": 1,
              "total": 5664
            }
          }
        },
        "baggage": {
          "perPax": [
            {
              "paxType": "ADT",
              "checkIn": {
                "weightKg": 15
              },
              "cabin": {
                "weightKg": 7
              }
            }
          ]
        },
        "cabin": "ECONOMY",
        "stops": 1,
        "booking": {
          "bookable": true,
          "validatingCarrier": "ZZ",
          "viaSupplierApi": true,
          "ticketingDeadline": null
        },
        "policy": {
          "refundBeforeDeparture": {
            "allowed": true,
            "penaltyAmount": 0,
            "penaltyCurrency": "INR"
          },
          "changeBeforeDeparture": {
            "allowed": false
          },
          "refundPolicy": "REFUNDABLE",
          "changePolicy": "CHARGEABLE"
        },
        "paymentRequirements": {
          "requiresInstantPayment": true
        },
        "requiredPassengerFields": {
          "international": false,
          "fields": {
            "DATE_OF_BIRTH": "OPTIONAL",
            "PASSPORT_NUMBER": "OPTIONAL",
            "PASSPORT_EXPIRY": "OPTIONAL",
            "PASSPORT_ISSUE_DATE": "OPTIONAL",
            "PASSPORT_ISSUING_COUNTRY": "OPTIONAL",
            "NATIONALITY": "OPTIONAL"
          }
        },
        "capabilities": {
          "seatSelection": true,
          "meals": false,
          "extraBaggage": false,
          "hold": true,
          "fareRules": true,
          "cancellation": "REALTIME"
        },
        "availableSeats": 9,
        "fareFamily": {
          "code": "TEST_CONFIRM",
          "attributes": [],
          "name": "Test fare — confirms · connection, stop times not stated",
          "cabin": "ECONOMY"
        },
        "fareCategory": "PUBLISHED",
        "fareTypeName": "Published"
      },
      {
        "inventoryCategory": "ONLINE",
        "supplierOfferRef": "floffer_034n1fbuPCVMvzONlTPrHA",
        "legs": [
          {
            "legIndex": 0,
            "legType": "OUTBOUND",
            "originCode": "DEL",
            "destCode": "BOM",
            "departureTime": "2026-11-10T11:30:00+05:30",
            "arrivalTime": "2026-11-10T13:40:00+05:30",
            "stops": 0,
            "segments": [
              {
                "segmentIndex": 0,
                "marketingCarrier": {
                  "code": "ZZ",
                  "name": "Kitionz Test Air",
                  "flightNumber": "104"
                },
                "isCodeshare": false,
                "originCode": "DEL",
                "destCode": "BOM",
                "departureTime": "2026-11-10T11:30:00+05:30",
                "arrivalTime": "2026-11-10T13:40:00+05:30",
                "originName": "Indira Gandhi International Airport",
                "destName": "Chhatrapati Shivaji Maharaj International Airport",
                "departureTimezone": "Asia/Kolkata",
                "arrivalTimezone": "Asia/Kolkata",
                "durationMinutes": 130,
                "cabinClass": "ECONOMY",
                "bookingClass": "Y",
                "arrivalTimeUnconfirmed": false
              }
            ],
            "legKey": "lk1_4dcf024ee8358e421f6b1cd8e9e23dcf",
            "legKeyComparable": true,
            "legKeyGaps": [],
            "originName": "Indira Gandhi International Airport",
            "destName": "Chhatrapati Shivaji Maharaj International Airport",
            "departureTimezone": "Asia/Kolkata",
            "arrivalTimezone": "Asia/Kolkata",
            "durationMinutes": 130
          }
        ],
        "journeyKey": "jk1_4dcf024ee8358e421f6b1cd8e9e23dcf",
        "journeyKeyComparable": true,
        "tripType": "ONE_WAY",
        "departureDate": "2026-11-10",
        "pricing": {
          "totalAmount": 5724,
          "currency": "INR",
          "published": {
            "baseFare": 4850.85,
            "taxes": 873.15,
            "total": 5724
          },
          "offered": {
            "baseFare": 4850.85,
            "taxes": 873.15,
            "total": 5724,
            "commission": 0,
            "tds": 0,
            "netPayable": 5724
          },
          "taxComponents": [],
          "commercials": [],
          "perPax": {
            "adult": {
              "count": 1,
              "total": 5724
            }
          }
        },
        "baggage": {
          "perPax": [
            {
              "paxType": "ADT",
              "checkIn": {
                "weightKg": 15
              },
              "cabin": {
                "weightKg": 7
              }
            }
          ]
        },
        "cabin": "ECONOMY",
        "stops": 0,
        "booking": {
          "bookable": true,
          "validatingCarrier": "ZZ",
          "viaSupplierApi": true,
          "ticketingDeadline": null
        },
        "policy": {
          "refundBeforeDeparture": {
            "allowed": true,
            "penaltyAmount": 0,
            "penaltyCurrency": "INR"
          },
          "changeBeforeDeparture": {
            "allowed": false
          },
          "refundPolicy": "REFUNDABLE",
          "changePolicy": "CHARGEABLE"
        },
        "paymentRequirements": {
          "requiresInstantPayment": true
        },
        "requiredPassengerFields": {
          "international": false,
          "fields": {
            "DATE_OF_BIRTH": "OPTIONAL",
            "PASSPORT_NUMBER": "OPTIONAL",
            "PASSPORT_EXPIRY": "OPTIONAL",
            "PASSPORT_ISSUE_DATE": "OPTIONAL",
            "PASSPORT_ISSUING_COUNTRY": "OPTIONAL",
            "NATIONALITY": "OPTIONAL"
          }
        },
        "capabilities": {
          "seatSelection": true,
          "meals": false,
          "extraBaggage": false,
          "hold": true,
          "fareRules": true,
          "cancellation": "REALTIME"
        },
        "availableSeats": 9,
        "fareFamily": {
          "code": "TEST_TIMEOUT_NOT_BOOKED",
          "attributes": [],
          "name": "Test fare — times out, never booked",
          "cabin": "ECONOMY"
        },
        "fareCategory": "PUBLISHED",
        "fareTypeName": "Published"
      },
      {
        "inventoryCategory": "ONLINE",
        "supplierOfferRef": "floffer_034n1fbuP2i7r30NFHCDZx",
        "legs": [
          {
            "legIndex": 0,
            "legType": "OUTBOUND",
            "originCode": "DEL",
            "destCode": "BOM",
            "departureTime": "2026-11-10T13:00:00+05:30",
            "arrivalTime": "2026-11-10T15:10:00+05:30",
            "stops": 0,
            "segments": [
              {
                "segmentIndex": 0,
                "marketingCarrier": {
                  "code": "ZZ",
                  "name": "Kitionz Test Air",
                  "flightNumber": "105"
                },
                "isCodeshare": false,
                "originCode": "DEL",
                "destCode": "BOM",
                "departureTime": "2026-11-10T13:00:00+05:30",
                "arrivalTime": "2026-11-10T15:10:00+05:30",
                "originName": "Indira Gandhi International Airport",
                "destName": "Chhatrapati Shivaji Maharaj International Airport",
                "departureTimezone": "Asia/Kolkata",
                "arrivalTimezone": "Asia/Kolkata",
                "durationMinutes": 130,
                "cabinClass": "ECONOMY",
                "bookingClass": "Y",
                "arrivalTimeUnconfirmed": false
              }
            ],
            "legKey": "lk1_17c41790c82e35777c6295473c9e29b7",
            "legKeyComparable": true,
            "legKeyGaps": [],
            "originName": "Indira Gandhi International Airport",
            "destName": "Chhatrapati Shivaji Maharaj International Airport",
            "departureTimezone": "Asia/Kolkata",
            "arrivalTimezone": "Asia/Kolkata",
            "durationMinutes": 130
          }
        ],
        "journeyKey": "jk1_17c41790c82e35777c6295473c9e29b7",
        "journeyKeyComparable": true,
        "tripType": "ONE_WAY",
        "departureDate": "2026-11-10",
        "pricing": {
          "totalAmount": 5824,
          "currency": "INR",
          "published": {
            "baseFare": 4935.59,
            "taxes": 888.41,
            "total": 5824
          },
          "offered": {
            "baseFare": 4935.59,
            "taxes": 888.41,
            "total": 5824,
            "commission": 0,
            "tds": 0,
            "netPayable": 5824
          },
          "taxComponents": [],
          "commercials": [],
          "perPax": {
            "adult": {
              "count": 1,
              "total": 5824
            }
          }
        },
        "baggage": {
          "perPax": [
            {
              "paxType": "ADT",
              "checkIn": {
                "weightKg": 15
              },
              "cabin": {
                "weightKg": 7
              }
            }
          ]
        },
        "cabin": "ECONOMY",
        "stops": 0,
        "booking": {
          "bookable": true,
          "validatingCarrier": "ZZ",
          "viaSupplierApi": true,
          "ticketingDeadline": null
        },
        "policy": {
          "refundBeforeDeparture": {
            "allowed": true,
            "penaltyAmount": 0,
            "penaltyCurrency": "INR"
          },
          "changeBeforeDeparture": {
            "allowed": false
          },
          "refundPolicy": "REFUNDABLE",
          "changePolicy": "CHARGEABLE"
        },
        "paymentRequirements": {
          "requiresInstantPayment": true
        },
        "requiredPassengerFields": {
          "international": false,
          "fields": {
            "DATE_OF_BIRTH": "OPTIONAL",
            "PASSPORT_NUMBER": "OPTIONAL",
            "PASSPORT_EXPIRY": "OPTIONAL",
            "PASSPORT_ISSUE_DATE": "OPTIONAL",
            "PASSPORT_ISSUING_COUNTRY": "OPTIONAL",
            "NATIONALITY": "OPTIONAL"
          }
        },
        "capabilities": {
          "seatSelection": true,
          "meals": false,
          "extraBaggage": false,
          "hold": true,
          "fareRules": true,
          "cancellation": "REALTIME"
        },
        "availableSeats": 9,
        "fareFamily": {
          "code": "TEST_SOLD_OUT",
          "attributes": [],
          "name": "Test fare — sold out at book",
          "cabin": "ECONOMY"
        },
        "fareCategory": "PUBLISHED",
        "fareTypeName": "Published"
      },
      {
        "inventoryCategory": "ONLINE",
        "supplierOfferRef": "floffer_034n1fbuP4eJqANbBKiPoM",
        "legs": [
          {
            "legIndex": 0,
            "legType": "OUTBOUND",
            "originCode": "DEL",
            "destCode": "BOM",
            "departureTime": "2026-11-10T14:30:00+05:30",
            "arrivalTime": "2026-11-10T16:40:00+05:30",
            "stops": 0,
            "segments": [
              {
                "segmentIndex": 0,
                "marketingCarrier": {
                  "code": "ZZ",
                  "name": "Kitionz Test Air",
                  "flightNumber": "106"
                },
                "isCodeshare": false,
                "originCode": "DEL",
                "destCode": "BOM",
                "departureTime": "2026-11-10T14:30:00+05:30",
                "arrivalTime": "2026-11-10T16:40:00+05:30",
                "originName": "Indira Gandhi International Airport",
                "destName": "Chhatrapati Shivaji Maharaj International Airport",
                "departureTimezone": "Asia/Kolkata",
                "arrivalTimezone": "Asia/Kolkata",
                "durationMinutes": 130,
                "cabinClass": "ECONOMY",
                "bookingClass": "Y",
                "arrivalTimeUnconfirmed": false
              }
            ],
            "legKey": "lk1_7f94ba0c7d359dfc00e6592dc61716e6",
            "legKeyComparable": true,
            "legKeyGaps": [],
            "originName": "Indira Gandhi International Airport",
            "destName": "Chhatrapati Shivaji Maharaj International Airport",
            "departureTimezone": "Asia/Kolkata",
            "arrivalTimezone": "Asia/Kolkata",
            "durationMinutes": 130
          }
        ],
        "journeyKey": "jk1_7f94ba0c7d359dfc00e6592dc61716e6",
        "journeyKeyComparable": true,
        "tripType": "ONE_WAY",
        "departureDate": "2026-11-10",
        "pricing": {
          "totalAmount": 5924,
          "currency": "INR",
          "published": {
            "baseFare": 5020.34,
            "taxes": 903.66,
            "total": 5924
          },
          "offered": {
            "baseFare": 5020.34,
            "taxes": 903.66,
            "total": 5924,
            "commission": 0,
            "tds": 0,
            "netPayable": 5924
          },
          "taxComponents": [],
          "commercials": [],
          "perPax": {
            "adult": {
              "count": 1,
              "total": 5924
            }
          }
        },
        "baggage": {
          "perPax": [
            {
              "paxType": "ADT",
              "checkIn": {
                "weightKg": 15
              },
              "cabin": {
                "weightKg": 7
              }
            }
          ]
        },
        "cabin": "ECONOMY",
        "stops": 0,
        "booking": {
          "bookable": true,
          "validatingCarrier": "ZZ",
          "viaSupplierApi": true,
          "ticketingDeadline": null
        },
        "policy": {
          "refundBeforeDeparture": {
            "allowed": true,
            "penaltyAmount": 0,
            "penaltyCurrency": "INR"
          },
          "changeBeforeDeparture": {
            "allowed": false
          },
          "refundPolicy": "REFUNDABLE",
          "changePolicy": "CHARGEABLE"
        },
        "paymentRequirements": {
          "requiresInstantPayment": true
        },
        "requiredPassengerFields": {
          "international": false,
          "fields": {
            "DATE_OF_BIRTH": "OPTIONAL",
            "PASSPORT_NUMBER": "OPTIONAL",
            "PASSPORT_EXPIRY": "OPTIONAL",
            "PASSPORT_ISSUE_DATE": "OPTIONAL",
            "PASSPORT_ISSUING_COUNTRY": "OPTIONAL",
            "NATIONALITY": "OPTIONAL"
          }
        },
        "capabilities": {
          "seatSelection": true,
          "meals": false,
          "extraBaggage": false,
          "hold": true,
          "fareRules": true,
          "cancellation": "REALTIME"
        },
        "availableSeats": 9,
        "fareFamily": {
          "code": "TEST_SUPPLIER_ERROR",
          "attributes": [],
          "name": "Test fare — supplier error at book",
          "cabin": "ECONOMY"
        },
        "fareCategory": "PUBLISHED",
        "fareTypeName": "Published"
      },
      {
        "inventoryCategory": "ONLINE",
        "supplierOfferRef": "floffer_034n1fbuPL0s3fwICHZ6JK",
        "legs": [
          {
            "legIndex": 0,
            "legType": "OUTBOUND",
            "originCode": "DEL",
            "destCode": "BOM",
            "departureTime": "2026-11-10T16:00:00+05:30",
            "arrivalTime": "2026-11-10T18:10:00+05:30",
            "stops": 0,
            "segments": [
              {
                "segmentIndex": 0,
                "marketingCarrier": {
                  "code": "ZZ",
                  "name": "Kitionz Test Air",
                  "flightNumber": "107"
                },
                "isCodeshare": false,
                "originCode": "DEL",
                "destCode": "BOM",
                "departureTime": "2026-11-10T16:00:00+05:30",
                "arrivalTime": "2026-11-10T18:10:00+05:30",
                "originName": "Indira Gandhi International Airport",
                "destName": "Chhatrapati Shivaji Maharaj International Airport",
                "departureTimezone": "Asia/Kolkata",
                "arrivalTimezone": "Asia/Kolkata",
                "durationMinutes": 130,
                "cabinClass": "ECONOMY",
                "bookingClass": "Y",
                "arrivalTimeUnconfirmed": false
              }
            ],
            "legKey": "lk1_c96e71ab891bffa4140708554fc09a2f",
            "legKeyComparable": true,
            "legKeyGaps": [],
            "originName": "Indira Gandhi International Airport",
            "destName": "Chhatrapati Shivaji Maharaj International Airport",
            "departureTimezone": "Asia/Kolkata",
            "arrivalTimezone": "Asia/Kolkata",
            "durationMinutes": 130
          }
        ],
        "journeyKey": "jk1_c96e71ab891bffa4140708554fc09a2f",
        "journeyKeyComparable": true,
        "tripType": "ONE_WAY",
        "departureDate": "2026-11-10",
        "pricing": {
          "totalAmount": 6024,
          "currency": "INR",
          "published": {
            "baseFare": 5105.08,
            "taxes": 918.92,
            "total": 6024
          },
          "offered": {
            "baseFare": 5105.08,
            "taxes": 918.92,
            "total": 6024,
            "commission": 0,
            "tds": 0,
            "netPayable": 6024
          },
          "taxComponents": [],
          "commercials": [],
          "perPax": {
            "adult": {
              "count": 1,
              "total": 6024
            }
          }
        },
        "baggage": {
          "perPax": [
            {
              "paxType": "ADT",
              "checkIn": {
                "weightKg": 15
              },
              "cabin": {
                "weightKg": 7
              }
            }
          ]
        },
        "cabin": "ECONOMY",
        "stops": 0,
        "booking": {
          "bookable": true,
          "validatingCarrier": "ZZ",
          "viaSupplierApi": true,
          "ticketingDeadline": null
        },
        "policy": {
          "refundBeforeDeparture": {
            "allowed": true,
            "penaltyAmount": 0,
            "penaltyCurrency": "INR"
          },
          "changeBeforeDeparture": {
            "allowed": false
          },
          "refundPolicy": "REFUNDABLE",
          "changePolicy": "CHARGEABLE"
        },
        "paymentRequirements": {
          "requiresInstantPayment": true
        },
        "requiredPassengerFields": {
          "international": false,
          "fields": {
            "DATE_OF_BIRTH": "OPTIONAL",
            "PASSPORT_NUMBER": "OPTIONAL",
            "PASSPORT_EXPIRY": "OPTIONAL",
            "PASSPORT_ISSUE_DATE": "OPTIONAL",
            "PASSPORT_ISSUING_COUNTRY": "OPTIONAL",
            "NATIONALITY": "OPTIONAL"
          }
        },
        "capabilities": {
          "seatSelection": true,
          "meals": false,
          "extraBaggage": false,
          "hold": true,
          "fareRules": true,
          "cancellation": "REALTIME"
        },
        "availableSeats": 9,
        "fareFamily": {
          "code": "TEST_PRICE_CHANGE",
          "attributes": [],
          "name": "Test fare — price changes at fare-quote",
          "cabin": "ECONOMY"
        },
        "fareCategory": "PUBLISHED",
        "fareTypeName": "Published"
      },
      {
        "inventoryCategory": "ONLINE",
        "supplierOfferRef": "floffer_034n1fbuPAoUcmJBYJxqXb",
        "legs": [
          {
            "legIndex": 0,
            "legType": "OUTBOUND",
            "originCode": "DEL",
            "destCode": "BOM",
            "departureTime": "2026-11-10T17:30:00+05:30",
            "arrivalTime": "2026-11-10T19:40:00+05:30",
            "stops": 0,
            "segments": [
              {
                "segmentIndex": 0,
                "marketingCarrier": {
                  "code": "ZZ",
                  "name": "Kitionz Test Air",
                  "flightNumber": "108"
                },
                "isCodeshare": false,
                "originCode": "DEL",
                "destCode": "BOM",
                "departureTime": "2026-11-10T17:30:00+05:30",
                "arrivalTime": "2026-11-10T19:40:00+05:30",
                "originName": "Indira Gandhi International Airport",
                "destName": "Chhatrapati Shivaji Maharaj International Airport",
                "departureTimezone": "Asia/Kolkata",
                "arrivalTimezone": "Asia/Kolkata",
                "durationMinutes": 130,
                "cabinClass": "ECONOMY",
                "bookingClass": "Y",
                "arrivalTimeUnconfirmed": false
              }
            ],
            "legKey": "lk1_297caf3cd3e3270257f5fc373067041b",
            "legKeyComparable": true,
            "legKeyGaps": [],
            "originName": "Indira Gandhi International Airport",
            "destName": "Chhatrapati Shivaji Maharaj International Airport",
            "departureTimezone": "Asia/Kolkata",
            "arrivalTimezone": "Asia/Kolkata",
            "durationMinutes": 130
          }
        ],
        "journeyKey": "jk1_297caf3cd3e3270257f5fc373067041b",
        "journeyKeyComparable": true,
        "tripType": "ONE_WAY",
        "departureDate": "2026-11-10",
        "pricing": {
          "totalAmount": 6124,
          "currency": "INR",
          "published": {
            "baseFare": 5189.83,
            "taxes": 934.17,
            "total": 6124
          },
          "offered": {
            "baseFare": 5189.83,
            "taxes": 934.17,
            "total": 6124,
            "commission": 0,
            "tds": 0,
            "netPayable": 6124
          },
          "taxComponents": [],
          "commercials": [],
          "perPax": {
            "adult": {
              "count": 1,
              "total": 6124
            }
          }
        },
        "baggage": {
          "perPax": [
            {
              "paxType": "ADT",
              "checkIn": {
                "weightKg": 15
              },
              "cabin": {
                "weightKg": 7
              }
            }
          ]
        },
        "cabin": "ECONOMY",
        "stops": 0,
        "booking": {
          "bookable": true,
          "validatingCarrier": "ZZ",
          "viaSupplierApi": true,
          "ticketingDeadline": null
        },
        "policy": {
          "refundBeforeDeparture": {
            "allowed": true,
            "penaltyAmount": 0,
            "penaltyCurrency": "INR"
          },
          "changeBeforeDeparture": {
            "allowed": false
          },
          "refundPolicy": "REFUNDABLE",
          "changePolicy": "CHARGEABLE"
        },
        "paymentRequirements": {
          "requiresInstantPayment": true
        },
        "requiredPassengerFields": {
          "international": false,
          "fields": {
            "DATE_OF_BIRTH": "OPTIONAL",
            "PASSPORT_NUMBER": "OPTIONAL",
            "PASSPORT_EXPIRY": "OPTIONAL",
            "PASSPORT_ISSUE_DATE": "OPTIONAL",
            "PASSPORT_ISSUING_COUNTRY": "OPTIONAL",
            "NATIONALITY": "OPTIONAL"
          }
        },
        "capabilities": {
          "seatSelection": true,
          "meals": false,
          "extraBaggage": false,
          "hold": true,
          "fareRules": true,
          "cancellation": "REALTIME"
        },
        "availableSeats": 9,
        "fareFamily": {
          "code": "TEST_HOLD",
          "attributes": [],
          "name": "Test fare — hold, then ticket",
          "cabin": "ECONOMY"
        },
        "fareCategory": "PUBLISHED",
        "fareTypeName": "Published"
      },
      {
        "inventoryCategory": "ONLINE",
        "supplierOfferRef": "floffer_034n1fbuPGrpuJJMzIDR7U",
        "legs": [
          {
            "legIndex": 0,
            "legType": "OUTBOUND",
            "originCode": "DEL",
            "destCode": "BOM",
            "departureTime": "2026-11-10T19:00:00+05:30",
            "arrivalTime": "2026-11-10T21:10:00+05:30",
            "stops": 0,
            "segments": [
              {
                "segmentIndex": 0,
                "marketingCarrier": {
                  "code": "ZZ",
                  "name": "Kitionz Test Air",
                  "flightNumber": "109"
                },
                "isCodeshare": false,
                "originCode": "DEL",
                "destCode": "BOM",
                "departureTime": "2026-11-10T19:00:00+05:30",
                "arrivalTime": "2026-11-10T21:10:00+05:30",
                "originName": "Indira Gandhi International Airport",
                "destName": "Chhatrapati Shivaji Maharaj International Airport",
                "departureTimezone": "Asia/Kolkata",
                "arrivalTimezone": "Asia/Kolkata",
                "durationMinutes": 130,
                "cabinClass": "ECONOMY",
                "bookingClass": "Y",
                "arrivalTimeUnconfirmed": false
              }
            ],
            "legKey": "lk1_57e43bebb4b66409fcefb9e15ac98766",
            "legKeyComparable": true,
            "legKeyGaps": [],
            "originName": "Indira Gandhi International Airport",
            "destName": "Chhatrapati Shivaji Maharaj International Airport",
            "departureTimezone": "Asia/Kolkata",
            "arrivalTimezone": "Asia/Kolkata",
            "durationMinutes": 130
          }
        ],
        "journeyKey": "jk1_57e43bebb4b66409fcefb9e15ac98766",
        "journeyKeyComparable": true,
        "tripType": "ONE_WAY",
        "departureDate": "2026-11-10",
        "pricing": {
          "totalAmount": 6224,
          "currency": "INR",
          "published": {
            "baseFare": 5274.58,
            "taxes": 949.42,
            "total": 6224
          },
          "offered": {
            "baseFare": 5274.58,
            "taxes": 949.42,
            "total": 6224,
            "commission": 0,
            "tds": 0,
            "netPayable": 6224
          },
          "taxComponents": [],
          "commercials": [],
          "perPax": {
            "adult": {
              "count": 1,
              "total": 6224
            }
          }
        },
        "baggage": {
          "perPax": [
            {
              "paxType": "ADT",
              "checkIn": {
                "weightKg": 15
              },
              "cabin": {
                "weightKg": 7
              }
            }
          ]
        },
        "cabin": "ECONOMY",
        "stops": 0,
        "booking": {
          "bookable": true,
          "validatingCarrier": "ZZ",
          "viaSupplierApi": true,
          "ticketingDeadline": null
        },
        "policy": {
          "refundBeforeDeparture": {
            "allowed": false
          },
          "changeBeforeDeparture": {
            "allowed": false
          },
          "refundPolicy": "NON_REFUNDABLE",
          "changePolicy": "NOT_ALLOWED"
        },
        "paymentRequirements": {
          "requiresInstantPayment": true
        },
        "requiredPassengerFields": {
          "international": false,
          "fields": {
            "DATE_OF_BIRTH": "OPTIONAL",
            "PASSPORT_NUMBER": "OPTIONAL",
            "PASSPORT_EXPIRY": "OPTIONAL",
            "PASSPORT_ISSUE_DATE": "OPTIONAL",
            "PASSPORT_ISSUING_COUNTRY": "OPTIONAL",
            "NATIONALITY": "OPTIONAL"
          }
        },
        "capabilities": {
          "seatSelection": true,
          "meals": false,
          "extraBaggage": false,
          "hold": true,
          "fareRules": true,
          "cancellation": "REALTIME"
        },
        "availableSeats": 9,
        "fareFamily": {
          "code": "TEST_CANCEL_REFUSED",
          "attributes": [],
          "name": "Test fare — confirms; cancel is refused",
          "cabin": "ECONOMY"
        },
        "fareCategory": "PUBLISHED",
        "fareTypeName": "Published"
      }
    ],
    "meta": {
      "tripTypes": [
        "ONE_WAY",
        "ROUND_TRIP"
      ],
      "suppliersCalled": [],
      "suppliersSucceeded": [],
      "suppliersFailed": [],
      "suppliers": [],
      "suppliersSkipped": [],
      "suppliersExcluded": [],
      "otherReturnDates": [],
      "totalDurationMs": 113,
      "supplierCounts": {
        "called": 2,
        "succeeded": 2,
        "failed": 0,
        "skipped": 0,
        "excluded": 0
      },
      "supplierDisclosure": "AFTER_BOOKING"
    }
  },
  "meta": {
    "requestId": "req_034n1fbkAenper6W8iYxvw",
    "timestamp": "2026-10-27T05:54:25.665Z",
    "path": "/v1/flights/search",
    "method": "POST"
  }
}
```

**SDK Code**

```python
import requests

url = "https://sandbox-api.kitionz.com/v1/flights/search"

payload = {
    "origin": "DEL",
    "destination": "BOM",
    "departureDate": "2026-11-10",
    "adults": 1
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript
const url = 'https://sandbox-api.kitionz.com/v1/flights/search';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"origin":"DEL","destination":"BOM","departureDate":"2026-11-10","adults":1}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://sandbox-api.kitionz.com/v1/flights/search"

	payload := strings.NewReader("{\n  \"origin\": \"DEL\",\n  \"destination\": \"BOM\",\n  \"departureDate\": \"2026-11-10\",\n  \"adults\": 1\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://sandbox-api.kitionz.com/v1/flights/search")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"origin\": \"DEL\",\n  \"destination\": \"BOM\",\n  \"departureDate\": \"2026-11-10\",\n  \"adults\": 1\n}"

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://sandbox-api.kitionz.com/v1/flights/search")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"origin\": \"DEL\",\n  \"destination\": \"BOM\",\n  \"departureDate\": \"2026-11-10\",\n  \"adults\": 1\n}")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://sandbox-api.kitionz.com/v1/flights/search', [
  'body' => '{
  "origin": "DEL",
  "destination": "BOM",
  "departureDate": "2026-11-10",
  "adults": 1
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://sandbox-api.kitionz.com/v1/flights/search");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"origin\": \"DEL\",\n  \"destination\": \"BOM\",\n  \"departureDate\": \"2026-11-10\",\n  \"adults\": 1\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "origin": "DEL",
  "destination": "BOM",
  "departureDate": "2026-11-10",
  "adults": 1
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://sandbox-api.kitionz.com/v1/flights/search")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```