> 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.

# 5 · Fare quote

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

**Re-price an offer & get a quote token.**

**What:** re-prices a chosen offer against the live supplier and returns a **signed `quoteToken`**.

**When:** after the traveller picks an offer from `/search`, immediately before `/book`.

**Before / After:** `/search` → here → `/book` (pass the `quoteToken`).

**Gotchas**

* **Always show your customer `pricing.totalAmount` from this response, never the search price.** It can differ from Search even when `priceChanged` is `false`, because not every supplier reports a change. If `priceChanged` is `true`, tell your customer the price moved, and book with this token only if they accept it.
* The `quoteToken` binds this price, offer and passengers for about 15 minutes (`quoteTokenExpiresAt`); after that, quote again.
* It does **not** hold the seat. `/book` asks the supplier again: if the price went up you get `FARE_HIGHER_THAN_QUOTED`, if the seats are gone you get `INSUFFICIENT_SEATS`, and nothing is booked; quote again. If the price went down, you are booked at the lower price.
* Send the **same** `adults`/`children`/`infants` + `supplierOfferRef` + dates you’ll book with — the token binds them.
* **Every quote is checked before it is signed.** In the quote, every adult and child line in `pricing.perPax` is present and above 0, and the lines add up to `totalAmount` exactly. A quote that fails this is refused with `422 FARE_QUOTE_UNUSABLE` (the reason is in `error.supplierError.failureClass`; nothing is quoted or booked): choose another fare or search again.
* **With infants, read `pricing.infantFare.status` here, not at search** — the quote is the truth and can differ. `NOT_GIVEN`: `totalAmount` covers adults and children only; add your own infant charge. A missing infant price is never a reason to refuse a quote.
* **Send the offer’s `departureDate` back** from `/search`. `tripType` and `returnDate` may be left out: the offer’s own trip is used. When you send them, they must be the offer’s; another trip answers `400 OFFER_TRIP_MISMATCH` (its `details` name the offer’s values). A `returnDate` needs `tripType: "ROUND_TRIP"`.
* No supplier field: `supplierOfferRef` already names the supplier. Most organisations see the supplier only after booking, and sending `sourceCode` returns `SOURCE_CODE_NOT_ACCEPTED`.

**Example — request:**

```json
{ "supplierOfferRef": "floffer_9x2k7q", "tripType": "ONE_WAY", "departureDate": "2027-01-15", "adults": 1 }
```

**Response (trimmed)** — pass `quoteToken` straight to `/book`:

```json
{ "data": { "quoteToken": "eyJhbGci…", "quoteTokenExpiresAt": "2027-01-10T04:45:00.000Z", "priceChanged": false, "pricing": { "totalAmount": 5480.00, "currency": "INR" } } }
```

Reference: https://docs.kitionz.com/flight-api/5-fare-quote

## 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 fareQuoteBody.

- `supplierOfferRef` (string, required)
- `adults` (integer, required)
- `departureDate` (string, required) — The offer's `departureDate` from /search — send it back unchanged (a different date → 400 OFFER_TRIP_MISMATCH).
- `sourceCode` (string, optional) — Leave it out: supplierOfferRef already names the supplier. Only an organisation shown suppliers before booking may send it, and it must then match the offer; for everyone else it is refused with SOURCE_CODE_NOT_ACCEPTED.
- `children` (integer, optional, default: 0)
- `infants` (integer, optional, default: 0)
- `tripType` (enum, optional) — The offer's `tripType` from /search. May be left out: the offer's own trip type is used. When sent it must be the offer's (another → 400 OFFER_TRIP_MISMATCH).
  - Allowed values: `ONE_WAY`, `ROUND_TRIP`
- `returnDate` (string, optional) — Round trip only: the offer's `returnDate` from /search, sent only with tripType ROUND_TRIP. May be left out (the offer fixes it); when sent, send it on /fare-quote and /book alike.

## Response

### 200

Default Response

- `success` (boolean, required)
- `statusCode` (double, required)
- `data` (FlightFareQuoteResponse, required) — Re-priced fare quote with per-offer eligibility AND the signed quoteToken + quoteTokenExpiresAt that /book requires.
- `meta` (V1FlightsFareQuotePostResponsesContentApplicationJsonSchemaMeta, required)

## Types

### FlightFareQuoteResponse

Re-priced fare quote with per-offer eligibility AND the signed quoteToken + quoteTokenExpiresAt that /book requires.

- `pricing` (FlightFareQuoteResponsePricing, required)
- `eligibility` (FlightFareQuoteResponseEligibility, required)
- `quoteToken` (string, required)
- `quoteTokenExpiresAt` (string, required)
- `priceChanged` (boolean, required) — true when the supplier reported that the price changed since Search. Not every supplier reports a change, so the price can differ even when this is false: always show `pricing.totalAmount` from this response, never the search price. This `quoteToken` carries that price; if it changed, book only after your customer accepts it.
- `sourceCode` (string, optional) — Present only when your organisation is shown suppliers before booking; otherwise omitted (the supplier is named on the booking).
- `supplierQuoteRef` (string, optional) — Present only when your organisation is shown suppliers before booking; otherwise omitted (the supplier is named on the booking).
- `availableSeats` (double, optional)
- `ssrCatalog` (list of FlightFareQuoteResponseSsrCatalogItems, optional)
- `baggage` (FlightFareQuoteResponseBaggage, optional)

### V1FlightsFareQuotePostResponsesContentApplicationJsonSchemaMeta

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

### FlightFareQuoteResponsePricing

- `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` (FlightFareQuoteResponsePricingPublished, required)
- `offered` (FlightFareQuoteResponsePricingOffered, required)
- `taxComponents` (list of FlightFareQuoteResponsePricingTaxComponentsItems, required)
- `commercials` (list of FlightFareQuoteResponsePricingCommercialsItems, required)
- `perPax` (FlightFareQuoteResponsePricingPerPax, optional)
- `infantFare` (FlightFareQuoteResponsePricingInfantFare, 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 FlightFareQuoteResponsePricingComponentsItems, optional)

### FlightFareQuoteResponseEligibility

- `bookingModesSupported` (list of enum, required)
  - Allowed values: `LIVE`, `HOLD`, `REQUEST`
- `seatSelectionAllowed` (boolean, required)
- `ssrCategoriesAllowed` (list of enum, required)
  - Allowed values: `SEATS`, `BAGGAGE`, `MEALS`, `OTHER`
- `fareRulesAvailable` (boolean, required)
- `ticketingTimeLimit` (string, optional)
- `notes` (string, optional)

### FlightFareQuoteResponseSsrCatalogItems

- `type` (enum, required)
  - Allowed values: `SEAT`, `BAGGAGE`, `MEAL`, `OTHER`
- `supplierSsrRef` (string, required)
- `label` (string, required)
- `price` (double, required)
- `currency` (string, required)
- `perPax` (boolean, required)
- `free` (boolean, required)
- `segmentRef` (string, optional)
- `description` (string, optional)

### FlightFareQuoteResponseBaggage

- `perPax` (list of FlightFareQuoteResponseBaggagePerPaxItems, required)

### V1FlightsFareQuotePostResponsesContentApplicationJsonSchemaMetaPagination

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

### FlightFareQuoteResponsePricingPublished

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

### FlightFareQuoteResponsePricingOffered

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

### FlightFareQuoteResponsePricingTaxComponentsItems

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

### FlightFareQuoteResponsePricingCommercialsItems

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

### FlightFareQuoteResponsePricingPerPax

- `adult` (FlightFareQuoteResponsePricingPerPaxAdult, optional)
- `child` (FlightFareQuoteResponsePricingPerPaxChild, optional)
- `infant` (FlightFareQuoteResponsePricingPerPaxInfant, optional)

### FlightFareQuoteResponsePricingInfantFare

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`

### FlightFareQuoteResponsePricingComponentsItems

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

### FlightFareQuoteResponseBaggagePerPaxItems

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

### FlightFareQuoteResponsePricingPerPaxAdult

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

### FlightFareQuoteResponsePricingPerPaxChild

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

### FlightFareQuoteResponsePricingPerPaxInfant

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

### FlightFareQuoteResponseBaggagePerPaxItemsCheckIn

- FlightFareQuoteResponseBaggagePerPaxItemsCheckIn0
- FlightFareQuoteResponseBaggagePerPaxItemsCheckIn1

### FlightFareQuoteResponseBaggagePerPaxItemsCabin

- FlightFareQuoteResponseBaggagePerPaxItemsCabin0
- FlightFareQuoteResponseBaggagePerPaxItemsCabin1

### FlightFareQuoteResponseBaggagePerPaxItemsCheckIn0

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

### FlightFareQuoteResponseBaggagePerPaxItemsCheckIn1

- `weightKg` (double, required)

### FlightFareQuoteResponseBaggagePerPaxItemsCabin0

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

### FlightFareQuoteResponseBaggagePerPaxItemsCabin1

- `weightKg` (double, required)

## Examples

### Price confirmed

**Request**

```json
{
  "supplierOfferRef": "floffer_034n1fbuIzGX130wB12QcM",
  "adults": 1,
  "departureDate": "2026-11-10",
  "tripType": "ONE_WAY"
}
```

**Response**

```json
{
  "success": true,
  "statusCode": 200,
  "data": {
    "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
        }
      }
    },
    "eligibility": {
      "bookingModesSupported": [
        "LIVE"
      ],
      "seatSelectionAllowed": false,
      "ssrCategoriesAllowed": [],
      "fareRulesAvailable": true,
      "notes": "Kitionz Test Air — simulated; no supplier is called."
    },
    "quoteToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6ImtpdGlvbnouZmxpZ2h0LnF1b3RlIiwia2lkIjoidjEiLCJlbmMiOiJBMjU2R0NNIiwiZWtpZCI6Ijk5YzFjYzI1In0.t6vMFSmW73MRTNjQb4R4KLQtI1Oc4zV5CYdecMRxfNHA-AEGH-mSEWQnHrruZM7BS0NsK6oQZ7PQOWeII303Ij52A4ELfAKkrxI3VdNt4XKl24MVgdW25YWEKc9xnq8dzIAQPK2Kh2c-V_tFji3mEXOzEwYHqZT8ixCyf6FVlcjCzKg6ok2_R9ZoLylokn6qCufPhKouhMCwPqqPVhocxJ7KNCOnAGeyvsh4JA5Rpro55mi1O-zSn4qREVCTBiSL48_4F9L1Yslbi7e3hdWmhZi0cVz0IeCkxUppHbqCfRT61rBsCuMMwGtsQiDR6J3xi-SWm-_GJmCMgLwgf-lGHTFVPtaAY1Apf96kc2VcBYm2Zz1YnmE1JqSQFP3qrtk6QBGlUFe0of3GIv-HCPNSWB_4HklVJoqFuywf4xloMs_czLXrIvDiEDI9RwG1BwMTpK2lk_jsKmbLgSSvekg4_m0fOY9xJoqTi6nqPxMBob_zdhgm5St3Q60LsC-R-RSNt8vVfbzj_wHR7nC-S1VDZzSdUF_ztoTTWzXe03xOiW6O42_5T5v3p7A9FVNLibu89om4FahhtsXNjllllxmvP1smrZbWJ3mQtNcLtPy_C8QRN0YxkPeB_at8qj1qvYn1bS_w4yP8xFd7PswR_LZ3RecB9VkAUpe-bzWyPKLT1Z_nhL-qEZVkZKaJzEvQ14aAnSGYmR1HrgTci-VVUzLtPpQSsaQa9ONK3g35glx0VhsmIOvPi2ehpLbLZWPyFYPpoPrCopHSrO_1RSwZNk5FmmaffoI12xrAxjJwsF72xZ6zrxUFh1nofoZ0pm0n5WIQFnhF73guv61ycaTOjkGtfMHYv14Wz8yCueuHBfL9LzsbX3KH48uIoVWLX5eWPA8JMn8Yg23KRz6MOfiX_g0PIWJLrSZMyuWa3DzcMz6H0mjHOzUQBUYEa03GCgAKHCu0yg782VqeLtK25c_Kki0p0Eu-2oznAGP5Y1IdQ67caFqqNfALByVp13VL9B4UZoX9pd9fkeRR1vOPA0gRnoHQS3WMpaW6_QnKt-PkqKct4rzFk6QjecAlWikno7zSmcFi6leJPFpVfdP8S5GguWXPF5eBh9w6BGG94a3pnp0ATbvSxJOMZZzuzpnfILQhAGdARmB0gYWpMtAUvF6UWkJsC_Kk9YPNyjjlwTJOLtRErM-QYFbBy64naHLTk98CynMMuY76BHbzMKtKIs4kKwG1XV2DEmds36or_bA9qGdOF_v1nI6OlUpZ2bHC66DMiA0_0DC9en3Vb0VBpuwnMaJBNdw3BUaCla5XC3m8HIgIX7uz_a0sJfDWv7xxRWovCZj44mV6o7ZHASfTXd9awfccpLcQ9lmwH8bLn77IkeHAxgft5ZMX2_k3XsnMi4Zqbdznyh4xxe7ka6bshixEbKJfmIQC5O6bLKqK6BYpAfaasULjBgZI4-CAf0-Zx1OZmympjB1EcoI.er0c6-SoJBkTk1lHMmrBHxP9Sibofb7YKxR83xKQDLg",
    "quoteTokenExpiresAt": "2026-10-27T06:09:25.000Z",
    "priceChanged": false,
    "availableSeats": 9,
    "baggage": {
      "perPax": [
        {
          "paxType": "ADT",
          "checkIn": {
            "weightKg": 15
          },
          "cabin": {
            "weightKg": 7
          }
        }
      ]
    }
  },
  "meta": {
    "requestId": "req_034n1fbzBDCsbz9wxgm5fQ",
    "timestamp": "2026-10-27T05:54:25.729Z",
    "path": "/v1/flights/fare-quote",
    "method": "POST"
  }
}
```

**SDK Code**

```python Price confirmed
import requests

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

payload = {
    "supplierOfferRef": "floffer_034n1fbuIzGX130wB12QcM",
    "adults": 1,
    "departureDate": "2026-11-10",
    "tripType": "ONE_WAY"
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

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

print(response.json())
```

```javascript Price confirmed
const url = 'https://sandbox-api.kitionz.com/v1/flights/fare-quote';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"supplierOfferRef":"floffer_034n1fbuIzGX130wB12QcM","adults":1,"departureDate":"2026-11-10","tripType":"ONE_WAY"}'
};

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

```go Price confirmed
package main

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

func main() {

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

	payload := strings.NewReader("{\n  \"supplierOfferRef\": \"floffer_034n1fbuIzGX130wB12QcM\",\n  \"adults\": 1,\n  \"departureDate\": \"2026-11-10\",\n  \"tripType\": \"ONE_WAY\"\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 Price confirmed
require 'uri'
require 'net/http'

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

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  \"supplierOfferRef\": \"floffer_034n1fbuIzGX130wB12QcM\",\n  \"adults\": 1,\n  \"departureDate\": \"2026-11-10\",\n  \"tripType\": \"ONE_WAY\"\n}"

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

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

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

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

$client = new \GuzzleHttp\Client();

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

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

```csharp Price confirmed
using RestSharp;

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

```swift Price confirmed
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "supplierOfferRef": "floffer_034n1fbuIzGX130wB12QcM",
  "adults": 1,
  "departureDate": "2026-11-10",
  "tripType": "ONE_WAY"
] as [String : Any]

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

let request = NSMutableURLRequest(url: NSURL(string: "https://sandbox-api.kitionz.com/v1/flights/fare-quote")! 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()
```

### Price changed since search

**Request**

```json
{
  "supplierOfferRef": "floffer_034n1fbuPL0s3fwICHZ6JK",
  "adults": 1,
  "departureDate": "2026-11-10",
  "tripType": "ONE_WAY"
}
```

**Response**

```json
{
  "success": true,
  "statusCode": 200,
  "data": {
    "pricing": {
      "totalAmount": 6626,
      "currency": "INR",
      "published": {
        "baseFare": 5615.25,
        "taxes": 1010.75,
        "total": 6626
      },
      "offered": {
        "baseFare": 5615.25,
        "taxes": 1010.75,
        "total": 6626,
        "commission": 0,
        "tds": 0,
        "netPayable": 6626
      },
      "taxComponents": [],
      "commercials": [],
      "perPax": {
        "adult": {
          "count": 1,
          "total": 6626
        }
      }
    },
    "eligibility": {
      "bookingModesSupported": [
        "LIVE"
      ],
      "seatSelectionAllowed": false,
      "ssrCategoriesAllowed": [],
      "fareRulesAvailable": true,
      "notes": "Kitionz Test Air — simulated; no supplier is called."
    },
    "quoteToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6ImtpdGlvbnouZmxpZ2h0LnF1b3RlIiwia2lkIjoidjEiLCJlbmMiOiJBMjU2R0NNIiwiZWtpZCI6Ijk5YzFjYzI1In0.yUQ_xu1WkoHbADnX5_t_nlL6aBpIkQE9VIEqk4viJnm1oCuxwMUQYEaGX5Yc-bOCHvfDG2zGTF9uN0PpmuPxt9Vi4J1PCPeeTBDnJHLW7jZ2CNCDPwFwEp8DnULnveNqO3AhBGK4ynepVSIop7UDUCUxwSndkqjh13nNRR8ed-jJJaaI9tutu1VVPEHbHo-yyiKsXj2wFbaE6R2CE0ikuLknpZ9tc0iKKWLMpXvc2MsH5apEAVZHupnOuSPEsyJrf7bAYmRnmlCLdhRtQuOlH6dAHqgBIm92Mxocmvf6hLHAlWpFxS2B_k0PafHpoSQWBaI4NPQlkswMHDb1gigjQxFh_AxpKRgjv83Lxxwk8NUim9mvrV_hSdNnKx7LTVJWBftzljPagiQ2r4mblkBybwCRdtyLUg6hpbv-FeET_F8nHcPbn9gAqTi8YLhy2rjUSBJrqqHGzOlpV_yynbCJnyPIBtYGb0s9seHdb6VVYM0RsMAt4e5OewGwSh9Tv2_jPAfDmFw-AZmK9DPjBusSItReX5uDMDDZPjE5ufo_yWAlEPrHGlrwOt27E9q64bfSCsw6qp3FYQA-Hz19EYo1Tzi5rakDjC533a05iI30C24gRuCblSWHnN_8Y81XjE_abgVIF_4vuDgLkjApQKlIJh04pIs0DU2_yy_u-qMMTu-gFEM0VeXllk14ViEaH4efJ_C9ahA-zcLIk1tHWKaCk1VzzeibBHMtCFrZQ9pqu8tbA4XLahDUZAOT4UpzMaclTPRVHKWJlG_btNb16nL2GiMDYqFPA14EPKnubKOcFTfMDpb18OTKmuh1aScdQFE-mVf5LRI8kqe0zRb5pQTnYz4raDyIPvN88POOYgkrKuzfuVyjtJ-x21mqhw8coQ1A5_EQNIaVOCMyulgH7K5fHso6xt6yDtf1Tdoef5LGwwNLl-hmEPafykqGbDnAjfnZCO3zdeRMkVj1wQ_id8EOAy31YyDIJSLaujGi568n3jc5B-rxFwqc15PDvBN9yHHB2-7AA6ySPN4FLasSY6_c62CCSgapSlRrNw_WF7vnUA7-izAmEdvcfW76_taCG_1Nfkexx-UwhYIIS-_ZOt6ryabfLhcKQx9LcFSEVQL1blJtBrHx4DByaFeAK5eBDZ9aivelPulnKrvv4UWcwkIbtCkybnv2Iknzc3mqVQ4gii3aRvCU-QQitzxhYox5gfc8JUeF8a01bqHANw8Jv7EiTQzPumqZYdZ0f2Aj2-cIS-BvCPncG_8MHMch9pbi70z_cJfNqjBaiScWyQnmDU_23EjTyOWQQKSGXHGBZVO6rVLuPltLVQc8mZn_K-KB3qnsYLKP0IZrcEIlXvSVhu7Y9VBB3C-EneyVAqkjyLtApRJoxx2_hJoJL2bvDQsqI5bjVOssLrIBEGbQh4vpvfP0lJNhHM-OAHT1W48ygR8ipp0mNTCi-5a6u_PWeedCT8zHFjFDiKjc3k5EJg.iRgchB_act-WDvEesxL97fn0qBbC8emVfUPCxBW34hE",
    "quoteTokenExpiresAt": "2026-10-27T06:09:25.000Z",
    "priceChanged": true,
    "availableSeats": 9,
    "baggage": {
      "perPax": [
        {
          "paxType": "ADT",
          "checkIn": {
            "weightKg": 15
          },
          "cabin": {
            "weightKg": 7
          }
        }
      ]
    }
  },
  "meta": {
    "requestId": "req_034n1fc3xJDJr4nvbCPkLt",
    "timestamp": "2026-10-27T05:54:25.767Z",
    "path": "/v1/flights/fare-quote",
    "method": "POST"
  }
}
```

**SDK Code**

```python Price changed since search
import requests

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

payload = {
    "supplierOfferRef": "floffer_034n1fbuPL0s3fwICHZ6JK",
    "adults": 1,
    "departureDate": "2026-11-10",
    "tripType": "ONE_WAY"
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

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

print(response.json())
```

```javascript Price changed since search
const url = 'https://sandbox-api.kitionz.com/v1/flights/fare-quote';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"supplierOfferRef":"floffer_034n1fbuPL0s3fwICHZ6JK","adults":1,"departureDate":"2026-11-10","tripType":"ONE_WAY"}'
};

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

```go Price changed since search
package main

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

func main() {

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

	payload := strings.NewReader("{\n  \"supplierOfferRef\": \"floffer_034n1fbuPL0s3fwICHZ6JK\",\n  \"adults\": 1,\n  \"departureDate\": \"2026-11-10\",\n  \"tripType\": \"ONE_WAY\"\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 Price changed since search
require 'uri'
require 'net/http'

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

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  \"supplierOfferRef\": \"floffer_034n1fbuPL0s3fwICHZ6JK\",\n  \"adults\": 1,\n  \"departureDate\": \"2026-11-10\",\n  \"tripType\": \"ONE_WAY\"\n}"

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

```java Price changed since search
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

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

```php Price changed since search
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

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

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

```csharp Price changed since search
using RestSharp;

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

```swift Price changed since search
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "supplierOfferRef": "floffer_034n1fbuPL0s3fwICHZ6JK",
  "adults": 1,
  "departureDate": "2026-11-10",
  "tripType": "ONE_WAY"
] as [String : Any]

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

let request = NSMutableURLRequest(url: NSURL(string: "https://sandbox-api.kitionz.com/v1/flights/fare-quote")! 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()
```