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

# Submit PNR

POST https://sandbox-api.kitionz.com/v1/flights/bookings/{id}/fulfil
Content-Type: application/json

**Submit the PNR for an offline (request) booking.**

**What:** confirms a request booking (an offer with `booking.requestBooking: true` — a Kitionz-managed portal) with the PNR you obtained by booking with the supplier on your own account. `PENDING_FULFILMENT` → `CONFIRMED`.

**When:** after `/book` returned `status: PENDING_FULFILMENT` and you completed the booking with the supplier — before the booking’s `nextAction.deadlineAt`: the expiry window after it was made (72 hours by default), or the first flight’s departure if that is earlier. After that time Kitionz may cancel the request at any time, and a PNR sent to a cancelled request is refused with `409 BOOKING_NOT_PENDING`.


**Note:** idempotent — submitting the same PNR again returns the booking; a different PNR on an already-fulfilled booking returns `409 BOOKING_ALREADY_FULFILLED`; a booking that is not a request returns `409 BOOKING_NOT_A_REQUEST` (its PNR comes from the supplier). Sends the `flight_booking.confirmed` webhook. In Test, the PNR must be `TEST` followed by 6 letters or digits, without I, L, O or U (for example `TESTA7K2Q9`; anything else is `400 TEST_PNR_REQUIRED`). To give up on a pending request, call `/cancel` (it is withdrawn, no supplier call).

Reference: https://docs.kitionz.com/flights/submit-pnr

## Authentication

- `Authorization` header (bearer token, required) — Your Kitionz API key, sent as `Authorization: Bearer keyId:secret`. Create a Test key at sandbox.kitionz.com → **API keys**, a Live key at kitionz.com → **API → API keys**.

## Servers

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

## Request

### Path parameters

- `id` (string, required)

### Headers

- `Idempotency-Key` (string, required) — A new unique value (a UUID) for every write: one booking, one cancel. Save it with your order before you call. Send the SAME value again only when you send the SAME request again after a timeout: you get the first answer back. Reusing it on any other write answers 422 IDEMPOTENCY_KEY_REUSED_WITH_DIFFERENT_PARAMS.

### Body (application/json)

This endpoint expects a fulfilBody.

- `pnr` (string, required)
- `supplierReference` (string, optional)

## Response

### 200

Default Response

- `success` (boolean, required)
- `statusCode` (double, required)
- `data` (FlightBookingEnvelope, required) — A full persisted booking (passengers, segments, events, amounts, status).
- `meta` (V1FlightsBookingsIdFulfilPostResponsesContentApplicationJsonSchemaMeta, required)

## Types

### FlightBookingEnvelope

A full persisted booking (passengers, segments, events, amounts, status).

- `id` (string, required) — The booking id (bkg_…): your key for every call about this booking. Key your orders on it, never on the PNR (two airlines can issue the same PNR).
- `supplierCode` (string, required) — The supplier's code (the connection the booking was made through).
- `seller` (FlightBookingEnvelopeSeller, required, nullable) — Who sold this booking: the real seller (for a marketplace, the agency behind it), with the support contacts Kitionz holds for it. Null when the seller could not be resolved.
- `environment` (enum, required)
  - Allowed values: `SANDBOX`, `PRODUCTION`
- `status` (enum, required) — Booking status. Each booking also carries nextAction, which names what you do next. What each value means: * RESERVED — transient: Kitionz reserved the booking before calling the supplier. Treat it like PENDING\_CONFIRMATION. * PENDING\_CONFIRMATION — not final yet, and the booking MAY exist at the supplier. Do NOT book this trip again and do not issue a ticket to your customer. Read the booking again after nextAction.pollAfterSeconds. Kitionz checks it with the supplier; still pending after 20 minutes: contact Kitionz support with the booking id. * PARTIALLY\_BOOKED — no longer produced: Kitionz never books a round trip as two separate bookings. Listed until a later version removes it. * HELD — the seats are held, not ticketed. Ticket before nextAction.deadlineAt with POST /v1/flights/bookings/\{id}/ticket. * PENDING\_FULFILMENT — a request: nothing is booked and nothing charged by Kitionz. Book on the supplier’s portal, then POST /v1/flights/bookings/\{id}/fulfil with the PNR before nextAction.deadlineAt (72 hours after booking by default, or the first flight’s departure if that is earlier), or /cancel to withdraw. After the deadline Kitionz may cancel the request at any time. * CONFIRMED — booked and confirmed; pnr is present. * FAILED — not booked, nothing charged; failure says why. Safe to search and book again. * CANCELLED — cancelled or withdrawn (including an expired request). * SCHEDULE\_CHANGED — not produced today: Kitionz does not watch confirmed bookings for airline changes and sends no webhook for them. Airline and seller messages reach your organisation’s registered email and mobile; to catch a change, watch each booked flight with Flight Status (POST /v1/flight-status/monitors) and refresh the booking before departure. * CANCELLED\_BY\_SUPPLIER — the seller reported the booking cancelled when Kitionz read it: after you call POST /v1/flights/bookings/\{id}/refresh, or while Kitionz checks a pending booking. Kitionz does not read confirmed bookings by itself and sends no webhook for this. Contact the seller named in seller.
  - Allowed values: `RESERVED`, `PENDING_CONFIRMATION`, `PARTIALLY_BOOKED`, `HELD`, `PENDING_FULFILMENT`, `CONFIRMED`, `FAILED`, `CANCELLED`, `SCHEDULE_CHANGED`, `CANCELLED_BY_SUPPLIER`
- `bookingMode` (string, required)
- `bookingChannel` (enum, required, nullable)
  - Allowed values: `CONSOLE_UI`, `API`
- `supplierReference` (string, required, nullable) — The seller’s own booking number: quote it to the seller’s support. null until the seller gave one.
- `pnr` (string, required, nullable) — The airline’s booking code (PNR): the traveller uses it at check-in and on the airline’s website. It can arrive after /book (read the booking again). Kitionz returns no e-ticket numbers or ticket document: get them from the seller named in seller.
- `ticketingTimeLimit` (string, required, nullable)
- `booker` (FlightBookingEnvelopeBooker, required)
- `passengers` (list of FlightBookingEnvelopePassengersItems, required)
- `segments` (list of FlightBookingEnvelopeSegmentsItems, required)
- `events` (list of FlightBookingEnvelopeEventsItems, required)
- `adults` (double, required)
- `children` (double, required)
- `infants` (double, required)
- `departureDate` (string, required, nullable)
- `returnDate` (string, required, nullable)
- `tripType` (string, required)
- `origin` (FlightBookingEnvelopeOrigin, required) — Where the trip starts.
- `destination` (FlightBookingEnvelopeDestination, required) — Where the outbound trip ends.
- `price` (FlightBookingEnvelopePrice, required) — The price: one block with the same names on the offer, the fare quote and the booking. A part the seller did not state is null. Kitionz computes only: netPayable from a stated commission and TDS, each row’s perPerson, and the equal split of one amount stated for adults and children together.
- `quotedTotalAmount` (double, required, nullable) — The total of the fare quote this booking was made on (its quoteToken). price.totalAmount is never above it. null for a booking that kept no quote total.
- `reconciliation` (FlightBookingEnvelopeReconciliation, required)
- `baggage` (FlightBookingEnvelopeBaggage, required, nullable) — The included baggage of the offer this booking was made on: as the supplier’s booking answer states it when it gave one, else as the fare quote at booking stated it, else as Search stated it. A later answer from the supplier that states baggage (a refresh, or the status check of a booking confirmed after it was made) replaces the rows of the passenger types it states; types it does not mention keep their earlier rows. Shown in every status: on a FAILED booking nothing was booked, and this is what the offer was sold with. null when none of them stated any — not stated, not “no baggage”.
- `policy` (FlightBookingEnvelopePolicy, required, nullable) — The refund and change policy the offer was sold with, as Search showed it (the offer’s `policy`). null when not stated, or for a booking made before Kitionz kept it.
- `externalReference` (string, required, nullable) — Your own reference you sent on /book (for example your order number); null when you sent none. GET /v1/flights/bookings?externalReference=… finds the booking by it.
- `failure` (FlightBookingEnvelopeFailure, required, nullable) — Why the booking failed: present when status is FAILED, null otherwise. Nothing was booked and nothing charged.
- `nextAction` (FlightBookingEnvelopeNextAction, required) — The one thing you do next with this booking. Always present.
- `bookedAt` (string, required)
- `createdAt` (string, required)
- `updatedAt` (string, required)
- `sourceCode` (string, required, deprecated) — Old name of supplierCode (the same value), removed in the next release. Read supplierCode.
- `supplier` (FlightBookingEnvelopeSupplier, required, nullable, deprecated) — Old name of seller (the same value), removed in the next release. Read seller.
- `returnSupplier` (FlightBookingEnvelopeReturnSupplier, required, nullable, deprecated) — Removed in the next release. Always null: one seller sells the whole booking (ADR-0149).
- `originCode` (string, required, deprecated) — Old name of origin.iataCode (the same value), removed in the next release. Read origin.iataCode.
- `destCode` (string, required, deprecated) — Old name of destination.iataCode (the same value), removed in the next release. Read destination.iataCode.
- `totalAmount` (double, required, deprecated) — Old name of price.totalAmount (the same value), removed in the next release. Read price.totalAmount.
- `currency` (string, required, deprecated) — Old name of price.currency (the same value), removed in the next release. Read price.currency.
- `fareBreakdown` (FlightBookingEnvelopeFareBreakdown, required, deprecated) — Old name of price (the same value), removed in the next release. Read price. Every part of it is in price (perHeadTotal here rounds to whole rupees; price.passengerFares[].perPerson is to the paisa).
- `cabin` (enum, required, nullable, deprecated) — Removed in the next release. Read each flight’s cabin (segments[].cabin). The cabin the offer was sold with, as Search showed it (the offer’s `cabin`); null when not stated, or for a booking made before Kitionz kept it.
  - Allowed values: `ECONOMY`, `PREMIUM_ECONOMY`, `BUSINESS`, `FIRST`

### V1FlightsBookingsIdFulfilPostResponsesContentApplicationJsonSchemaMeta

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

### FlightBookingEnvelopeSeller

Who sold this booking: the real seller (for a marketplace, the agency behind it), with the support contacts Kitionz holds for it. Null when the seller could not be resolved.

- `name` (string, required, nullable)
- `website` (string, required, nullable)
- `supportPhone` (string, required, nullable)
- `supportEmail` (string, required, nullable)

### FlightBookingEnvelopeBooker

- `name` (string, required, nullable)
- `email` (string, required, nullable)
- `phone` (string, required, nullable)

### FlightBookingEnvelopePassengersItems

- `id` (string, required)
- `passengerIndex` (double, required)
- `title` (string, required)
- `firstName` (string, required)
- `lastName` (string, required, nullable)
- `passengerType` (enum, required, nullable) — ADULT, CHILD or INFANT. null only for a booking stored with another spelling.
  - Allowed values: `ADULT`, `CHILD`, `INFANT`
- `dateOfBirth` (string, required, nullable) — The date of birth you sent (YYYY-MM-DD). null when you sent none — including when Kitionz sent a default one to the supplier (see dateOfBirthDefaulted).
- `dateOfBirthDefaulted` (boolean, required) — true when you sent no date of birth for this adult on a domestic trip and Kitionz sent the supplier 1 January of the year 20 years before the booking, because some suppliers refuse a booking without one. That date is not shown in dateOfBirth: never print it as the passenger’s. false otherwise. On a booking made before this field was added it is false, and dateOfBirth may still show that default date.
- `passportNumber` (string, required, nullable)
- `passportIssueDate` (string, required, nullable)
- `passportExpiryDate` (string, required, nullable)
- `nationality` (string, required, nullable)
- `passportIssuingCountry` (string, required, nullable) — The passport issuing country Kitionz recorded and sent to the supplier: the one you sent, or, on an international trip, your nationality value when you sent none. null when there is none.
- `gender` (string, required, nullable)
- `guardianPassengerIndex` (integer, required, nullable) — For an infant: the passengerIndex of the adult it travels with — the adult whose first and last name the booking recorded as its guardian. null for an adult or child, or when that name matches no adult or more than one.
- `wheelChair` (boolean, required)
- `perPaxStatus` (string, required, nullable)
- `perPaxAmount` (double, required, nullable)
- `travelerType` (string, required, deprecated) — Old name of passengerType (the same value), removed in the next release. Read passengerType.
- `guardian` (string, required, nullable, deprecated) — Old name of guardianPassengerIndex (the same value), removed in the next release. Read guardianPassengerIndex. It holds the adult’s name; guardianPassengerIndex holds the adult’s position.

### FlightBookingEnvelopeSegmentsItems

- `id` (string, required)
- `segmentIndex` (double, required)
- `legType` (string, required, nullable)
- `legIndex` (double, required, nullable)
- `marketingCarrier` (FlightBookingEnvelopeSegmentsItemsMarketingCarrier, required) — The airline whose number is on the ticket.
- `origin` (FlightBookingEnvelopeSegmentsItemsOrigin, required) — Where this flight leaves from.
- `destination` (FlightBookingEnvelopeSegmentsItemsDestination, required) — Where this flight lands.
- `departureTime` (string, required, nullable) — Departure in the origin airport zone. `null` when the supplier did not state it: only at a stop inside a leg, never on its first flight.
- `arrivalTime` (string, required, nullable) — Arrival in the destination airport zone. `null` when the supplier did not state it: only at a stop inside a leg, never on its last flight.
- `technicalStops` (list of FlightBookingEnvelopeSegmentsItemsTechnicalStopsItems, required)
- `unnamedStops` (integer, required)
- `layoverAfterMinutes` (integer, required, nullable) — Minutes waited after this flight before the next flight of the same leg: from the two times when both are stated, otherwise the supplier's stated wait saved with the booking. `null` on a leg's last flight, or when neither is known.
- `departureTerminal` (string, required, nullable) — Departure terminal the offer was sold with. null when not stated, or for a booking made before Kitionz kept it.
- `arrivalTerminal` (string, required, nullable) — Arrival terminal the offer was sold with. null when not stated, or for a booking made before Kitionz kept it.
- `cabin` (enum, required, nullable) — This flight’s cabin the offer was sold with. null when not stated, or for a booking made before Kitionz kept it.
  - Allowed values: `ECONOMY`, `PREMIUM_ECONOMY`, `BUSINESS`, `FIRST`
- `airlineCode` (string, required, deprecated) — Old name of marketingCarrier.iataCode (the same value), removed in the next release. Read marketingCarrier.iataCode.
- `airlineName` (string, required, nullable, deprecated) — Old name of marketingCarrier.name (the same value), removed in the next release. Read marketingCarrier.name.
- `flightNumber` (string, required, deprecated) — Old name of marketingCarrier.flightNumber (the same value), removed in the next release. Read marketingCarrier.flightNumber.
- `originCode` (string, required, deprecated) — Old name of origin.iataCode (the same value), removed in the next release. Read origin.iataCode.
- `originName` (string, required, nullable, deprecated) — Old name of origin.name (the same value), removed in the next release. Read origin.name.
- `destCode` (string, required, deprecated) — Old name of destination.iataCode (the same value), removed in the next release. Read destination.iataCode.
- `destName` (string, required, nullable, deprecated) — Old name of destination.name (the same value), removed in the next release. Read destination.name.
- `departureTimezone` (string, required, nullable, deprecated) — Old name of origin.timezone (the same value), removed in the next release. Read origin.timezone.
- `arrivalTimezone` (string, required, nullable, deprecated) — Old name of destination.timezone (the same value), removed in the next release. Read destination.timezone.
- `originTerminal` (string, required, nullable, deprecated) — Old name of departureTerminal (the same value), removed in the next release. Read departureTerminal.
- `destinationTerminal` (string, required, nullable, deprecated) — Old name of arrivalTerminal (the same value), removed in the next release. Read arrivalTerminal.
- `cabinClass` (enum, required, nullable, deprecated) — Old name of cabin (the same value), removed in the next release. Read cabin.
  - Allowed values: `ECONOMY`, `PREMIUM_ECONOMY`, `BUSINESS`, `FIRST`

### FlightBookingEnvelopeEventsItems

- `id` (string, required)
- `eventType` (string, required)
- `status` (string, required)
- `errorCode` (string, required, nullable)
- `errorMessage` (string, required, nullable)
- `createdAt` (string, required)

### FlightBookingEnvelopeOrigin

Where the trip starts.

- `iataCode` (string, required) — IATA airport code.
- `name` (string, required, nullable) — Airport name from the Kitionz airport list; null when the airport is not in it (the same rule on offers, bookings and stops).
- `city` (string, required, nullable) — The city the airport serves; null when the airport is not in the Kitionz airport list.
- `countryCode` (string, required, nullable) — ISO 3166-1 alpha-2 country code; null when the airport is not in the Kitionz airport list.
- `timezone` (string, required, nullable) — IANA time zone (the flight's local times carry its offset); null when the airport is not in the Kitionz airport list.

### FlightBookingEnvelopeDestination

Where the outbound trip ends.

- `iataCode` (string, required) — IATA airport code.
- `name` (string, required, nullable) — Airport name from the Kitionz airport list; null when the airport is not in it (the same rule on offers, bookings and stops).
- `city` (string, required, nullable) — The city the airport serves; null when the airport is not in the Kitionz airport list.
- `countryCode` (string, required, nullable) — ISO 3166-1 alpha-2 country code; null when the airport is not in the Kitionz airport list.
- `timezone` (string, required, nullable) — IANA time zone (the flight's local times carry its offset); null when the airport is not in the Kitionz airport list.

### FlightBookingEnvelopePrice

The price: one block with the same names on the offer, the fare quote and the booking. A part the seller did not state is null. Kitionz computes only: netPayable from a stated commission and TDS, each row’s perPerson, and the equal split of one amount stated for adults and children together.

- `totalAmount` (double, required) — What you pay the seller, in INR, for the passengers it priced. When infantFare.status is NOT_GIVEN it covers adults and children only.
- `currency` (string, required)
- `baseFare` (double, required, nullable) — The seller's base fare; null when the seller did not state it — never computed or assumed by Kitionz.
- `taxes` (double, required, nullable) — The seller's own tax split of the fare — not an airline-tax or GST figure; null when the seller did not state it — never computed or assumed by Kitionz.
- `commission` (double, required, nullable) — Your commission on this fare as the seller states it (a stated 0 stays 0); null when the seller did not state it — never computed or assumed by Kitionz.
- `tds` (double, required, nullable) — TDS on the commission as the seller states it; null when the seller did not state it — never computed or assumed by Kitionz.
- `netPayable` (double, required, nullable) — What the fare costs you net: the seller's stated net, else totalAmount − commission + tds when the seller states both; null otherwise.
- `publishedTotal` (double, required, nullable) — The seller's published (list) price; null when the seller did not state it — never computed or assumed by Kitionz.
- `publishedBaseFare` (double, required, nullable) — The published price's base fare; null when the seller did not state it — never computed or assumed by Kitionz.
- `publishedTaxes` (double, required, nullable) — The published price's taxes; null when the seller did not state it — never computed or assumed by Kitionz.
- `taxBreakdown` (list of FlightBookingEnvelopePriceTaxBreakdownItems, required) — The seller’s itemised taxes; empty when it states none.
- `commercials` (list of FlightBookingEnvelopePriceCommercialsItems, required) — The seller’s other commercial lines (fees, discounts, incentives); empty when none.
- `passengerFares` (list of FlightBookingEnvelopePricePassengerFaresItems, required) — One row per passenger type in the party: adults, then children, then infants.
- `infantFare` (FlightBookingEnvelopePriceInfantFare, required, nullable) — 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. null when the party has no infant — and on a booking with infants that kept no fare statement (still reserved, settled after an unclear /book outcome, or made before Kitionz kept it): then the infant price is not known, which is not "no infant".

### FlightBookingEnvelopeReconciliation

- `inSync` (boolean, required, nullable) — true / false when at least one figure was compared (the total, passenger counts or passenger statuses); null when nothing was compared: no supplier answer (supplierDataAvailable false), or an answer that states none of those figures (supplierDataAvailable true).
- `supplierDataAvailable` (boolean, required)
- `diffs` (list of FlightBookingEnvelopeReconciliationDiffsItems, required)

### FlightBookingEnvelopeBaggage

The included baggage of the offer this booking was made on: as the supplier’s booking answer states it when it gave one, else as the fare quote at booking stated it, else as Search stated it. A later answer from the supplier that states baggage (a refresh, or the status check of a booking confirmed after it was made) replaces the rows of the passenger types it states; types it does not mention keep their earlier rows. Shown in every status: on a FAILED booking nothing was booked, and this is what the offer was sold with. null when none of them stated any — not stated, not “no baggage”.

- `perPax` (list of FlightBookingEnvelopeBaggagePerPaxItems, required) — One row per passenger type the seller states an allowance for. A type with no row: not stated for that type. A stated 0 kg stays 0.

### FlightBookingEnvelopePolicy

The refund and change policy the offer was sold with, as Search showed it (the offer’s `policy`). null when not stated, or for a booking made before Kitionz kept it.

- `refundBeforeDeparture` (FlightBookingEnvelopePolicyRefundBeforeDeparture, required)
- `changeBeforeDeparture` (FlightBookingEnvelopePolicyChangeBeforeDeparture, required)
- `refund` (enum, required) — The seller's refund policy. NOT_GIVEN: the seller did not state it — Kitionz never assumes one. Treat any other value as NOT_GIVEN.
  - Allowed values: `REFUNDABLE`, `PARTIAL_REFUND`, `NON_REFUNDABLE`, `NOT_GIVEN`
- `change` (enum, required) — The seller's change policy. NOT_GIVEN: the seller did not state it — Kitionz never assumes one. Treat any other value as NOT_GIVEN.
  - Allowed values: `FREE_CHANGE`, `CHARGEABLE`, `NOT_ALLOWED`, `NOT_GIVEN`
- `refundPolicy` (enum, required, deprecated) — Old name of refund (the same value), removed in the next release. Read refund.
  - Allowed values: `REFUNDABLE`, `PARTIAL_REFUND`, `NON_REFUNDABLE`, `NOT_GIVEN`
- `changePolicy` (enum, required, deprecated) — Old name of change (the same value), removed in the next release. Read change.
  - Allowed values: `FREE_CHANGE`, `CHARGEABLE`, `NOT_ALLOWED`, `NOT_GIVEN`
- `cancellationFee` (double, optional)
- `changeFee` (double, optional)

### FlightBookingEnvelopeFailure

Why the booking failed: present when status is FAILED, null otherwise. Nothing was booked and nothing charged.

- `code` (string, required) — A stable code from the error catalog, e.g. SUPPLIER_BOOK_FAILED or BOOK_NOT_SENT.
- `message` (string, required) — Kitionz wording, safe to show to your customer.

### FlightBookingEnvelopeNextAction

The one thing you do next with this booking. Always present.

- `code` (enum, required) — What you do next. WAIT: not final yet and may exist at the supplier — do not book again, read the booking again after pollAfterSeconds. ISSUE_TICKET: seats held, ticket before deadlineAt. SUBMIT_PNR: book on the supplier’s portal and send the PNR to the path. SEARCH_AGAIN: nothing was booked — search and book another offer. CONTACT_SUPPLIER: the supplier changed the booking — contact the seller named in seller. NONE: nothing to do.
  - Allowed values: `WAIT`, `ISSUE_TICKET`, `SUBMIT_PNR`, `SEARCH_AGAIN`, `CONTACT_SUPPLIER`, `NONE`
- `description` (string, required) — The same in one or two plain sentences.
- `method` (enum, required, nullable) — The call to make, or null when the action is not a call.
  - Allowed values: `GET`, `POST`
- `path` (string, required, nullable) — The path of that call, or null.
- `pollAfterSeconds` (integer, required, nullable) — WAIT only: read the booking again after this many seconds. null otherwise.
- `deadlineAt` (string, required, nullable) — The time to act by (ISO 8601, UTC). ISSUE_TICKET: the supplier’s ticketing deadline, when it stated one. SUBMIT_PNR: send the PNR before it — the request booking’s expiry window after the booking was made (72 hours by default), or the first flight’s departure if that is earlier; after it, Kitionz may cancel the request at any time. Otherwise null.

### FlightBookingEnvelopeSupplier

Old name of seller (the same value), removed in the next release. Read seller.

- `name` (string, required, nullable)
- `website` (string, required, nullable)
- `supportPhone` (string, required, nullable)
- `supportEmail` (string, required, nullable)

### FlightBookingEnvelopeReturnSupplier

Removed in the next release. Always null: one seller sells the whole booking (ADR-0149).

- `name` (string, required, nullable)
- `website` (string, required, nullable)
- `supportPhone` (string, required, nullable)
- `supportEmail` (string, required, nullable)

### FlightBookingEnvelopeFareBreakdown

Old name of price (the same value), removed in the next release. Read price. Every part of it is in price (perHeadTotal here rounds to whole rupees; price.passengerFares[].perPerson is to the paisa).

- `tenantTotal` (double, required) — The total Kitionz bound and recorded for this booking.
- `currency` (string, required)
- `composition` (FlightBookingEnvelopeFareBreakdownComposition, required, nullable)
- `published` (FlightBookingEnvelopeFareBreakdownPublished, required, nullable)
- `taxComponents` (list of FlightBookingEnvelopeFareBreakdownTaxComponentsItems, required)
- `commercials` (list of FlightBookingEnvelopeFareBreakdownCommercialsItems, required)
- `perPax` (list of FlightBookingEnvelopeFareBreakdownPerPaxItems, required)
- `infantFare` (FlightBookingEnvelopeFareBreakdownInfantFare, 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. On a booking: the supplier's statement on the fare it was made on, which is always the one you were quoted (/book refuses a booking whose infant price changed since the quote). Present when the booking has an infant; absent when it has none, or was made before Kitionz recorded this. On NOT_GIVEN the INF row has perHeadTotal null and tenantTotal covers adults and children only.

### V1FlightsBookingsIdFulfilPostResponsesContentApplicationJsonSchemaMetaPagination

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

### FlightBookingEnvelopeSegmentsItemsMarketingCarrier

The airline whose number is on the ticket.

- `iataCode` (string, required, nullable) — The airline's IATA code; null when the seller stated none Kitionz can read.
- `name` (string, required, nullable) — The airline's name from the Kitionz airline list; null when not known. On a search offer only, until the next release: the name the seller stated when the airline is not in the list.
- `flightNumber` (string, required, nullable) — The flight number without the airline code; null when not stated.

### FlightBookingEnvelopeSegmentsItemsOrigin

Where this flight leaves from.

- `iataCode` (string, required) — IATA airport code.
- `name` (string, required, nullable) — Airport name from the Kitionz airport list; null when the airport is not in it (the same rule on offers, bookings and stops).
- `city` (string, required, nullable) — The city the airport serves; null when the airport is not in the Kitionz airport list.
- `countryCode` (string, required, nullable) — ISO 3166-1 alpha-2 country code; null when the airport is not in the Kitionz airport list.
- `timezone` (string, required, nullable) — IANA time zone (the flight's local times carry its offset); null when the airport is not in the Kitionz airport list.

### FlightBookingEnvelopeSegmentsItemsDestination

Where this flight lands.

- `iataCode` (string, required) — IATA airport code.
- `name` (string, required, nullable) — Airport name from the Kitionz airport list; null when the airport is not in it (the same rule on offers, bookings and stops).
- `city` (string, required, nullable) — The city the airport serves; null when the airport is not in the Kitionz airport list.
- `countryCode` (string, required, nullable) — ISO 3166-1 alpha-2 country code; null when the airport is not in the Kitionz airport list.
- `timezone` (string, required, nullable) — IANA time zone (the flight's local times carry its offset); null when the airport is not in the Kitionz airport list.

### FlightBookingEnvelopeSegmentsItemsTechnicalStopsItems

- `airport` (FlightBookingEnvelopeSegmentsItemsTechnicalStopsItemsAirport, required) — The airport where the flight stops.
- `airportCode` (string, required, deprecated) — Old name of airport.iataCode (the same value), removed in the next release. Read airport.iataCode.
- `arrivalTime` (string, optional)
- `departureTime` (string, optional)
- `durationMinutes` (double, optional)
- `arrivalTerminal` (string, optional)
- `departureTerminal` (string, optional)
- `airportName` (string, optional, deprecated) — Old name of airport.name (the same value), removed in the next release. Read airport.name.

### FlightBookingEnvelopePriceTaxBreakdownItems

- `code` (string, required) — The tax code, as the seller states it.
- `label` (string, required, nullable) — The seller’s label; null when not stated.
- `amount` (double, required)

### FlightBookingEnvelopePriceCommercialsItems

- `type` (string, required) — The kind of line, as the seller states it (e.g. DISCOUNT).
- `amount` (double, required)
- `appliesOn` (string, required, nullable) — The line it is computed on (e.g. TDS on DISCOUNT); null when not stated.
- `passengerType` (enum, required, nullable) — The passenger type it applies to; null when it is for the whole booking or not stated.
  - Allowed values: `ADULT`, `CHILD`, `INFANT`
- `owner` (string, required, nullable) — Who the line belongs to, as the seller states it (e.g. TMC); null when not stated.
- `label` (string, required, nullable) — The seller’s label; null when not stated.

### FlightBookingEnvelopePricePassengerFaresItems

- `passengerType` (enum, required)
  - Allowed values: `ADULT`, `CHILD`, `INFANT`
- `count` (integer, required) — How many passengers of this type travel.
- `perPerson` (double, required, nullable) — One passenger of this type: total / count, to the paisa (rounded half up when it does not divide evenly, so perPerson × count can differ from total by up to half a paisa a head — charge totalAmount, never a sum of perPerson). null when total is null. The old per-head figure (fareBreakdown.perPax[].perHeadTotal) rounds to whole rupees: switch every place you read per-head prices at once.
- `total` (double, required, nullable) — All count passengers of this type together: the seller’s line for this type, or Kitionz’s equal share of one amount the seller stated for adults and children together. null when no line covers exactly these passengers (an infant price not given, or one amount covering several types that Kitionz did not split). When every row states a total, the rows add up to totalAmount.
- `baseFare` (double, required, nullable) — The base fare of these passengers; null when the seller did not state it — never computed or assumed by Kitionz.
- `taxes` (double, required, nullable) — The taxes of these passengers; null when the seller did not state it — never computed or assumed by Kitionz.

### FlightBookingEnvelopePriceInfantFare

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.

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

### FlightBookingEnvelopeReconciliationDiffsItems

- `field` (string, required)
- `ours` (FlightBookingEnvelopeReconciliationDiffsItemsOurs, required, nullable)
- `supplier` (FlightBookingEnvelopeReconciliationDiffsItemsSupplier, required, nullable)
- `severity` (enum, required)
  - Allowed values: `critical`, `warning`, `info`
- `delta` (double, optional)

### FlightBookingEnvelopeBaggagePerPaxItems

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

### FlightBookingEnvelopePolicyRefundBeforeDeparture

- `allowed` (boolean, required, nullable) — true / false as the seller states it; null when the policy is NOT_GIVEN (not stated, never a guessed false).
- `penaltyAmount` (double, optional)
- `penaltyCurrency` (string, optional)

### FlightBookingEnvelopePolicyChangeBeforeDeparture

- `allowed` (boolean, required, nullable) — true / false as the seller states it; null when the policy is NOT_GIVEN (not stated, never a guessed false).
- `penaltyAmount` (double, optional)
- `penaltyCurrency` (string, optional)

### FlightBookingEnvelopeFareBreakdownComposition

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

### FlightBookingEnvelopeFareBreakdownPublished

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

### FlightBookingEnvelopeFareBreakdownTaxComponentsItems

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

### FlightBookingEnvelopeFareBreakdownCommercialsItems

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

### FlightBookingEnvelopeFareBreakdownPerPaxItems

- `paxType` (enum, required)
  - Allowed values: `ADT`, `CHD`, `INF`
- `count` (double, required)
- `perHeadTotal` (double, required, nullable)
- `baseFare` (double, required, nullable)
- `totalTax` (double, required, nullable)

### FlightBookingEnvelopeFareBreakdownInfantFare

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. On a booking: the supplier's statement on the fare it was made on, which is always the one you were quoted (/book refuses a booking whose infant price changed since the quote). Present when the booking has an infant; absent when it has none, or was made before Kitionz recorded this. On NOT_GIVEN the INF row has perHeadTotal null and tenantTotal covers adults and children only.

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

### FlightBookingEnvelopeSegmentsItemsTechnicalStopsItemsAirport

The airport where the flight stops.

- `iataCode` (string, required) — IATA airport code.
- `name` (string, required, nullable) — Airport name from the Kitionz airport list; null when the airport is not in it (the same rule on offers, bookings and stops).
- `city` (string, required, nullable) — The city the airport serves; null when the airport is not in the Kitionz airport list.
- `countryCode` (string, required, nullable) — ISO 3166-1 alpha-2 country code; null when the airport is not in the Kitionz airport list.
- `timezone` (string, required, nullable) — IANA time zone (the flight's local times carry its offset); null when the airport is not in the Kitionz airport list.

### FlightBookingEnvelopeReconciliationDiffsItemsOurs

- double
- string

### FlightBookingEnvelopeReconciliationDiffsItemsSupplier

- double
- string

### FlightBookingEnvelopeBaggagePerPaxItemsCheckIn

- FlightBookingEnvelopeBaggagePerPaxItemsCheckIn0
- FlightBookingEnvelopeBaggagePerPaxItemsCheckIn1

### FlightBookingEnvelopeBaggagePerPaxItemsCabin

- FlightBookingEnvelopeBaggagePerPaxItemsCabin0
- FlightBookingEnvelopeBaggagePerPaxItemsCabin1

### FlightBookingEnvelopeBaggagePerPaxItemsCheckIn0

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

### FlightBookingEnvelopeBaggagePerPaxItemsCheckIn1

- `weightKg` (double, required)

### FlightBookingEnvelopeBaggagePerPaxItemsCabin0

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

### FlightBookingEnvelopeBaggagePerPaxItemsCabin1

- `weightKg` (double, required)

## Examples

**Request**

```json
{
  "pnr": "TESTA7K2Q9"
}
```

**Response**

```json
{
  "success": true,
  "statusCode": 200,
  "data": {
    "id": "bkg_034nVJUDx36SuYpKozD1X1",
    "supplierCode": "kitionz_test_portal",
    "seller": {
      "name": "Kitionz Test Air",
      "website": null,
      "supportPhone": null,
      "supportEmail": null
    },
    "environment": "SANDBOX",
    "status": "CONFIRMED",
    "bookingMode": "REQUEST",
    "bookingChannel": "API",
    "supplierReference": "TESTA7K2Q9",
    "pnr": "TESTA7K2Q9",
    "ticketingTimeLimit": null,
    "booker": {
      "name": "Raj Kumar",
      "email": "raj@example-agency.in",
      "phone": "+919800000000"
    },
    "passengers": [
      {
        "id": "bkgpax_034nVJUEpWs023PXb61mC6",
        "passengerIndex": 0,
        "title": "MR",
        "firstName": "Raj",
        "lastName": "Kumar",
        "passengerType": "ADULT",
        "dateOfBirth": null,
        "dateOfBirthDefaulted": true,
        "passportNumber": null,
        "passportIssueDate": null,
        "passportExpiryDate": null,
        "nationality": null,
        "passportIssuingCountry": null,
        "gender": "MALE",
        "guardianPassengerIndex": null,
        "wheelChair": false,
        "perPaxStatus": null,
        "perPaxAmount": null,
        "travelerType": "ADULT",
        "guardian": null
      }
    ],
    "segments": [
      {
        "id": "bkgseg_034nVJUFDV2kFzs1zlC7JW",
        "segmentIndex": 0,
        "legType": "OUTBOUND",
        "legIndex": 0,
        "marketingCarrier": {
          "iataCode": "ZZ",
          "name": "Zz",
          "flightNumber": "900"
        },
        "origin": {
          "iataCode": "DEL",
          "name": "Indira Gandhi International Airport",
          "city": "New Delhi",
          "countryCode": "IN",
          "timezone": "Asia/Kolkata"
        },
        "destination": {
          "iataCode": "BOM",
          "name": "Chhatrapati Shivaji Maharaj International Airport",
          "city": "Mumbai",
          "countryCode": "IN",
          "timezone": "Asia/Kolkata"
        },
        "departureTime": "2026-11-30T05:30:00+05:30",
        "arrivalTime": "2026-11-30T07:40:00+05:30",
        "technicalStops": [],
        "unnamedStops": 0,
        "layoverAfterMinutes": null,
        "departureTerminal": null,
        "arrivalTerminal": null,
        "cabin": null,
        "airlineCode": "ZZ",
        "airlineName": "Zz",
        "flightNumber": "900",
        "originCode": "DEL",
        "originName": "Indira Gandhi International Airport",
        "destCode": "BOM",
        "destName": "Chhatrapati Shivaji Maharaj International Airport",
        "departureTimezone": "Asia/Kolkata",
        "arrivalTimezone": "Asia/Kolkata",
        "originTerminal": null,
        "destinationTerminal": null,
        "cabinClass": null
      }
    ],
    "events": [
      {
        "id": "bkgevent_034nVJUNJSGyJJxSwzgZWm",
        "eventType": "BOOKING_FULFILLED",
        "status": "SUCCESS",
        "errorCode": null,
        "errorMessage": null,
        "createdAt": "2026-10-28T02:02:19.964Z"
      },
      {
        "id": "bkgevent_034nVJUFbzmaqQqDuBw7EI",
        "eventType": "BOOKING_REQUESTED",
        "status": "SUCCESS",
        "errorCode": null,
        "errorMessage": null,
        "createdAt": "2026-10-28T02:02:19.885Z"
      }
    ],
    "adults": 1,
    "children": 0,
    "infants": 0,
    "departureDate": "2026-11-30",
    "returnDate": null,
    "tripType": "ONE_WAY",
    "origin": {
      "iataCode": "DEL",
      "name": "Indira Gandhi International Airport",
      "city": "New Delhi",
      "countryCode": "IN",
      "timezone": "Asia/Kolkata"
    },
    "destination": {
      "iataCode": "BOM",
      "name": "Chhatrapati Shivaji Maharaj International Airport",
      "city": "Mumbai",
      "countryCode": "IN",
      "timezone": "Asia/Kolkata"
    },
    "price": {
      "totalAmount": 5324,
      "currency": "INR",
      "baseFare": null,
      "taxes": null,
      "commission": null,
      "tds": null,
      "netPayable": null,
      "publishedTotal": null,
      "publishedBaseFare": null,
      "publishedTaxes": null,
      "taxBreakdown": [],
      "commercials": [],
      "passengerFares": [
        {
          "passengerType": "ADULT",
          "count": 1,
          "perPerson": 5324,
          "total": 5324,
          "baseFare": null,
          "taxes": null
        }
      ],
      "infantFare": null
    },
    "quotedTotalAmount": 5324,
    "reconciliation": {
      "inSync": null,
      "supplierDataAvailable": false,
      "diffs": []
    },
    "baggage": {
      "perPax": [
        {
          "paxType": "ADT",
          "checkIn": {
            "weightKg": 15
          },
          "cabin": {
            "weightKg": 7
          }
        }
      ]
    },
    "policy": {
      "refundBeforeDeparture": {
        "allowed": null
      },
      "changeBeforeDeparture": {
        "allowed": null
      },
      "refund": "NOT_GIVEN",
      "change": "NOT_GIVEN",
      "refundPolicy": "NOT_GIVEN",
      "changePolicy": "NOT_GIVEN"
    },
    "externalReference": null,
    "failure": null,
    "nextAction": {
      "code": "NONE",
      "description": "Nothing to do: the booking is confirmed.",
      "method": null,
      "path": null,
      "pollAfterSeconds": null,
      "deadlineAt": null
    },
    "bookedAt": "2026-10-28T02:02:19.950Z",
    "createdAt": "2026-10-28T02:02:19.872Z",
    "updatedAt": "2026-10-28T02:02:19.961Z",
    "sourceCode": "kitionz_test_portal",
    "supplier": {
      "name": "Kitionz Test Air",
      "website": null,
      "supportPhone": null,
      "supportEmail": null
    },
    "returnSupplier": null,
    "originCode": "DEL",
    "destCode": "BOM",
    "totalAmount": 5324,
    "currency": "INR",
    "fareBreakdown": {
      "tenantTotal": 5324,
      "currency": "INR",
      "composition": {
        "baseFare": null,
        "taxes": null,
        "commission": null,
        "tds": null,
        "netPayable": null
      },
      "published": {
        "baseFare": null,
        "taxes": null,
        "total": null
      },
      "taxComponents": [],
      "commercials": [],
      "perPax": [
        {
          "paxType": "ADT",
          "count": 1,
          "perHeadTotal": 5324,
          "baseFare": null,
          "totalTax": null
        }
      ]
    },
    "cabin": null
  },
  "meta": {
    "requestId": "req_034nVJUKU2LopX4zyhyZym",
    "timestamp": "2026-10-28T02:02:19.995Z",
    "path": "/v1/flights/bookings/bkg_034nVJUDx36SuYpKozD1X1/fulfil",
    "method": "POST"
  }
}
```

**SDK Code**

```python
import requests

url = "https://sandbox-api.kitionz.com/v1/flights/bookings/bkg_034nVJUDx36SuYpKozD1X1/fulfil"

payload = { "pnr": "TESTA7K2Q9" }
headers = {
    "Idempotency-Key": "replace-with-a-new-uuid-pnr-submitted",
    "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/bookings/bkg_034nVJUDx36SuYpKozD1X1/fulfil';
const options = {
  method: 'POST',
  headers: {
    'Idempotency-Key': 'replace-with-a-new-uuid-pnr-submitted',
    Authorization: 'Bearer <token>',
    'Content-Type': 'application/json'
  },
  body: '{"pnr":"TESTA7K2Q9"}'
};

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/bookings/bkg_034nVJUDx36SuYpKozD1X1/fulfil"

	payload := strings.NewReader("{\n  \"pnr\": \"TESTA7K2Q9\"\n}")

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

	req.Header.Add("Idempotency-Key", "replace-with-a-new-uuid-pnr-submitted")
	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/bookings/bkg_034nVJUDx36SuYpKozD1X1/fulfil")

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

request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = 'replace-with-a-new-uuid-pnr-submitted'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"pnr\": \"TESTA7K2Q9\"\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/bookings/bkg_034nVJUDx36SuYpKozD1X1/fulfil")
  .header("Idempotency-Key", "replace-with-a-new-uuid-pnr-submitted")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"pnr\": \"TESTA7K2Q9\"\n}")
  .asString();
```

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

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://sandbox-api.kitionz.com/v1/flights/bookings/bkg_034nVJUDx36SuYpKozD1X1/fulfil', [
  'body' => '{
  "pnr": "TESTA7K2Q9"
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
    'Idempotency-Key' => 'replace-with-a-new-uuid-pnr-submitted',
  ],
]);

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

```csharp
using RestSharp;

var client = new RestClient("https://sandbox-api.kitionz.com/v1/flights/bookings/bkg_034nVJUDx36SuYpKozD1X1/fulfil");
var request = new RestRequest(Method.POST);
request.AddHeader("Idempotency-Key", "replace-with-a-new-uuid-pnr-submitted");
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"pnr\": \"TESTA7K2Q9\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = [
  "Idempotency-Key": "replace-with-a-new-uuid-pnr-submitted",
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = ["pnr": "TESTA7K2Q9"] as [String : Any]

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

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