Reference

Every endpoint of the flight API in call order. Open a strip for its example request and reply, the keys and what they mean, and the errors it answers with. Examples are illustrative values in the exact shape; the test cases show real captures.

▸1.POST /generate-tokenExchange the API key for a token that lives 4 hours (expires_in 14400).open pagekeys explained

Exchange the API key for a token that lives 4 hours (expires_in 14400). Every later call sends it as Authorization: Bearer <token>.

Auth: Authorization: Bearer <token> from generate-token.

Request
{
  "api_key": "ak_3f2e1d0c9b8a7f6e5d4c3b2a1f0e9d8c"
}
Reply
{
  "token": "<token>",
  "token_type": "Bearer",
  "expires_in": 14400,
  "expires_at": "2026-10-16T10:12:00Z"
}
Keys and what they mean
Request
keytypewhen presentimportancemeaning
api_keystringrequiredmust readYour API key (starts with aiqo_). Keep it on your server; never send it from a browser or app.
Total: 1 keys
Reply
keytypewhen presentimportancemeaning
tokenstringalwaysmust readSend it as Authorization: Bearer <token> on every other call.
token_typestringalwaysinformationalAlways Bearer.
expires_inintegeralwaysmust readSeconds the token lives (14400 = 4 hours). Get a new token before it ends; a call with an expired token answers 401.
expires_atdatetimealwaysusefulThe same end as a time (UTC).
Total: 4 keys
Errors this call answers with (4)
HTTPcodemessagedetailwhen
4019001Authentication requiredInvalid api_keyUnknown key, suspended user, or the API has no API-key routes (today). Observed on the local stack.
4019001Authentication requiredApi_key required
4005000Invalid request(Huma's text)Malformed JSON or wrong content type.
4299004Too many requestsRate limit, when configured.
Questions developers ask (2)
How long does a token last?
4 hours (expires_in, expires_at). Renew before it ends; an expired token answers 401 with code 9001.
Can I call the API from a browser or a mobile app?
No. The API key must stay on your server; call the API from there.
▸3.POST /flights/repriceReprice the chosen fare(s) with the airline and return the itinerary: the final price, what the booking needs (passport, DOB, GST, hold allowed) and any price change..open pagekeys explained

Reprice the chosen fare(s) with the airline and return the itinerary: the final price, what the booking needs (passport, DOB, GST, hold allowed) and any price change.

Auth: Authorization: Bearer <token> from generate-token.

Request
{
  "items": [
    {
      "option_id": "3f9e8d7c-6b5a-4f3e-9d2c-1b0a9f8e7d6c",
      "price_id": "7c1b2f3e-9a4d-4c2e-8f1a-2b3c4d5e6f70"
    }
  ]
}
  • items: one entry per fare; a return sold as two one-way fares sends two items. option_id and price_id at top level are accepted for a single fare.
Reply
{
  "itinerary_id": "9b8a7f6e-5d4c-4b3a-2f1e-0d9c8b7a6f5e",
  "valid_till": "2026-10-18T20:27:00+05:30",
  "fare_rules": {
    "fr_1": {
      "cancellation": [
        {
          "allowed": false,
          "from": {
            "value": 0,
            "unit": "HOURS"
          },
          "to": {
            "value": 3,
            "unit": "HOURS"
          },
          "text": "Non-refundable within 3 hours of departure"
        },
        {
          "allowed": true,
          "amount": 3899,
          "from": {
            "value": 3,
            "unit": "HOURS"
          },
          "to": {
            "value": 365,
            "unit": "DAYS"
          }
        }
      ],
      "date_change": [
        {
          "allowed": true,
          "amount": 2999,
          "from": {
            "value": 3,
            "unit": "HOURS"
          },
          "to": {
            "value": 365,
            "unit": "DAYS"
          }
        }
      ]
    }
  },
  "results": [
    {
      "journey_indexes": [
        0
      ],
      "option_id": "3f9e8d7c-6b5a-4f3e-9d2c-1b0a9f8e7d6c",
      "segments": [
        {
          "segment_index": 0,
          "journey_index": 0,
          "segment_id": "BLR_BOM_QP_1101",
          "from": "BLR",
          "to": "BOM",
          "airline_code": "QP",
          "airline_name": "Akasa Air",
          "aircraft_type": "737 MAX 8",
          "flight_number": "1101",
          "departure_time": "2026-11-14T06:00:00",
          "departure_terminal": "1",
          "arrival_time": "2026-11-14T07:45:00",
          "arrival_terminal": "2",
          "duration": 105
        }
      ],
      "fare": {
        "price_id": "7c1b2f3e-9a4d-4c2e-8f1a-2b3c4d5e6f70",
        "fare_rules": {
          "0": "fr_1"
        },
        "adult": {
          "fare_ref": "SAVER",
          "refundable_type": "PARTIALLY_REFUNDABLE",
          "cabin_class": "Economy",
          "booking_class": "Q",
          "fare_basis": "QPSAVER",
          "baggage": {
            "hand": {
              "kg": 7
            },
            "checkin": {
              "kg": 15
            }
          },
          "fare": {
            "hand_baggage": "7Kg",
            "checkin_baggage": "15Kg",
            "base_fare": 4200,
            "yq": 0,
            "yr": 0,
            "airline_gst": 0,
            "booking_fee": 0,
            "commission": 0,
            "other_taxes": 812,
            "total_fare": 5012,
            "net_fare": 5012,
            "pax_count": 1
          }
        },
        "varies_by_segment": false
      }
    }
  ],
  "booking_requirements": {
    "is_gst_mandatory": false,
    "pan_applicable": false,
    "passport_mandatory": false,
    "dob_applicable": {
      "adt": false,
      "chd": true,
      "inf": true
    },
    "is_hold": true,
    "firstname_length": 30,
    "lastname_length": 30,
    "firstname_min_length": 2,
    "lastname_min_length": 2,
    "seat_mandatory": false,
    "meal_mandatory": false,
    "baggage_mandatory": false
  },
  "price": {
    "adult": {
      "hand_baggage": "7Kg",
      "checkin_baggage": "15Kg",
      "base_fare": 4200,
      "yq": 0,
      "yr": 0,
      "airline_gst": 0,
      "booking_fee": 0,
      "commission": 0,
      "other_taxes": 812,
      "total_fare": 5012,
      "net_fare": 5012,
      "pax_count": 1
    },
    "total": {
      "hand_baggage": "7Kg",
      "checkin_baggage": "15Kg",
      "base_fare": 4200,
      "yq": 0,
      "yr": 0,
      "airline_gst": 0,
      "booking_fee": 0,
      "commission": 0,
      "other_taxes": 812,
      "total_fare": 5012,
      "net_fare": 5012,
      "pax_count": 1
    }
  },
  "messages": [
    {
      "type": "FARE_ALERT",
      "option_id": "3f9e8d7c-6b5a-4f3e-9d2c-1b0a9f8e7d6c",
      "message": "Fare has changed: previous price 5012.00, current price 5112.00 (difference: 100.00)",
      "old_value": 5012,
      "new_value": 5112
    }
  ]
}
  • booking_requirements.is_hold says whether POST /flights/book may be called with is_hold true; the other fields say what the booking must carry (GST, PAN, passport, dates of birth, name lengths, mandatory seat, meal or bag).
  • results[] has one entry per item sent: the option's flights and the one fare, priced again, in the fare shape of search (detail=segment adds segments[] inside fare). fare_rules holds the rules those fares point at.
  • valid_till is when the supplier's session for this itinerary ends (the API's review session, default 15 minutes); book before it.
  • messages is absent when nothing changed; otherwise one entry per repriced option with type FARE_ALERT, the option_id, and the old and new value.
Keys and what they mean
Request
keytypewhen presentimportancemeaning
items[]arrayrequired, one per groupmust readOne item per search group you chose from: one for a one way or a combined return, two for a domestic return (one per direction).
items[].option_idstringrequiredmust readThe option_id from the search reply.
items[].price_idstringrequiredmust readThe price_id of the chosen fare of that option. An option_id or price_id not in a current search answers 400 with errors[] (search again).
Total: 3 keys
Reply
keytypewhen presentimportancemeaning
itinerary_idstringalwaysmust readNames the repriced itinerary. Send it to ancillaries, seat map and book.
valid_tilldatetimealwaysmust readUntil when the itinerary_id can be booked. After it, book answers 410: reprice again.
results[]arrayalwaysmust readOne entry per item sent: journey_indexes, option_id, the flights (segments) and the one fare, priced again.
results[].segments[]arrayalwaysmust readThe flights in order, each named by (journey_index, segment_index); segment_index restarts at 0 in every journey.
results[].fareobjectalwaysmust readThe fare in the shape of search: price_id, per passenger type (adult, child, infant) the fare_ref, refundable_type, cabin_class, booking_class, fare_basis, baggage and fare, and fare_rules ids.
price.totalobjectalwaysmust readThe price in the components of search: base_fare, yq, yr, airline_gst, booking_fee, commission, other_taxes, total_fare (what the traveller pays), net_fare (what you pay us), pax_count, and the baggage stated in the fare. For the whole booking.
price.adult (child, infant)objectalways (child, infant when requested)usefulThe price in the components of search: base_fare, yq, yr, airline_gst, booking_fee, commission, other_taxes, total_fare (what the traveller pays), net_fare (what you pay us), pax_count, and the baggage stated in the fare. For one passenger of that type.
booking_requirementsobjectalwaysmust readWhat book must carry: is_gst_mandatory, pan_applicable, passport_mandatory, dob_applicable (adt, chd, inf), name lengths, and whether a seat, meal or bag is mandatory.
booking_requirements.is_holdbooleanalwaysmust readtrue when this fare may be booked on hold (book with is_hold true); false: book directly, paid at once.
fare_rulesobjectwhen knownusefulThe cancellation and date-change rules the fares point at, keyed by id (fr_1, …): bands with allowed, amount or percent, the window (from, to) and the airline's text.
messages[]arrayonly when the price changedmust readOne entry per repriced option whose price changed since search: type FARE_ALERT, option_id, old_value, new_value. Show the new price before booking.
Total: 11 keys
Errors this call answers with (6)
HTTPcodemessagedetailwhen
4019001Authentication requiredInvalid token
4005100Invalid search requestoption_id and price_id are requiredAlso 'each review item needs option_id and price_id'.
4045103Flight not foundoption_id or price_id not in a stored search.
4105102Search results have expired
5025001The airline or supplier could not complete the requestReprice failed at the airline.
5045002A supplier or service did not answer in time
Questions developers ask (2)
The price changed. What now?
messages has a FARE_ALERT with old_value and new_value for that option_id. Show the new price to the traveller before booking; the itinerary is priced at the new value.
Until when can I book?
valid_till of the reprice reply: the airline's session for this itinerary. Book before it or reprice again.
▸4.POST /flights/ancillariesOptional.open pagekeys explained

Optional. Baggage, meal and other add-ons on sale on the itinerary, each with the journey and the flights it covers.

Auth: Authorization: Bearer <token> from generate-token.

Request
{
  "itinerary_id": "9b8a7f6e-5d4c-4b3a-2f1e-0d9c8b7a6f5e"
}
Reply
{
  "itinerary_id": "9b8a7f6e-5d4c-4b3a-2f1e-0d9c8b7a6f5e",
  "segments": [
    {
      "journey_index": 0,
      "segment_index": 0,
      "airline_code": "QP",
      "flight_number": "1101",
      "from": "BLR",
      "to": "BOM"
    }
  ],
  "baggage": [
    {
      "journey_index": 0,
      "items": [
        {
          "code": "XBAG05",
          "label": "Extra 5 Kg",
          "price": 1500
        }
      ]
    }
  ],
  "meal": [
    {
      "journey_index": 0,
      "segment_index": 0,
      "items": [
        {
          "code": "VGML",
          "label": "Vegetarian meal",
          "price": 350
        }
      ]
    }
  ],
  "other": []
}
  • segments[] repeats the itinerary's flights, each named by (journey_index, segment_index) as in search and reprice; segment_index restarts at 0 inside every journey.
  • Bags are sold per journey: baggage[] has one entry per journey. Meals and other items are sold per flight: meal[] and other[] have one entry per flight. A journey or flight absent from a bucket offers nothing of that type.
  • On book, send a bag with its code and journey_index; a meal, other item or seat with its code, journey_index and segment_index.
  • errors[] (plain strings) appears when one flight's catalogue failed; the rest is still returned.
Keys and what they mean
Request
keytypewhen presentimportancemeaning
itinerary_idstringrequiredmust readThe itinerary_id from reprice. An expired one answers 404: reprice again.
Total: 1 keys
Reply
keytypewhen presentimportancemeaning
segments[]arrayalwaysusefulThe flights of the itinerary, each named by (journey_index, segment_index), with airline_code, flight_number, from and to.
baggage[]arrayalways (empty when none)must readExtra bags per journey: journey_index and items. A bag covers every flight of its journey, so it has no segment_index.
meal[]arrayalways (empty when none)must readMeals per flight: journey_index, segment_index and items.
other[]arrayalways (empty when none)usefulOther items per flight (priority check-in, bundles): journey_index, segment_index and items.
<list>[].items[]arrayalwaysmust readWhat can be bought: code (send it to book), label (show it), price (per passenger, INR).
Total: 5 keys
Errors this call answers with (4)
HTTPcodemessagedetailwhen
4019001Authentication requiredInvalid token
4005100Invalid search requestitinerary_id is requirederrors[]: field itinerary_id, rule required.
4045104Itinerary not found or expiredUnknown or expired itinerary_id.
5025001The airline or supplier could not complete the request
Questions developers ask (1)
How do I send a bag and a meal on book?
A bag with its code and journey_index; a meal, seat or other item with its code, journey_index and segment_index, exactly as this reply gave them.
▸5.POST /flights/seat-mapOptional.open pagekeys explained

Optional. The seat map of every flight of the itinerary with price and availability per seat.

Auth: Authorization: Bearer <token> from generate-token.

Request
{
  "itinerary_id": "9b8a7f6e-5d4c-4b3a-2f1e-0d9c8b7a6f5e"
}
Reply
{
  "itinerary_id": "9b8a7f6e-5d4c-4b3a-2f1e-0d9c8b7a6f5e",
  "segments": [
    {
      "journey_index": 0,
      "segment_index": 0,
      "airline_code": "QP",
      "flight_number": "1101",
      "from": "BLR",
      "to": "BOM"
    }
  ],
  "seats": [
    {
      "journey_index": 0,
      "segment_index": 0,
      "aircraft_type": "737 MAX 8",
      "total_seats": 189,
      "seats": [
        {
          "aisle": false,
          "amount": 600,
          "code": "WINDOW",
          "column": 1,
          "desc": "1A",
          "exit_row": false,
          "infant": true,
          "is_available": true,
          "leg_room": true,
          "middle": false,
          "near_wings": false,
          "reclining": true,
          "row": 1,
          "tax": 0,
          "window": true
        }
      ]
    }
  ]
}
  • segments[] as in ancillaries; each seats block names its flight by (journey_index, segment_index). desc is the seat label (1A) that goes into the booking; code is the seat type.
Keys and what they mean
Request
keytypewhen presentimportancemeaning
itinerary_idstringrequiredmust readThe itinerary_id from reprice.
Total: 1 keys
Reply
keytypewhen presentimportancemeaning
segments[]arrayalwaysusefulThe flights of the itinerary, each named by (journey_index, segment_index), with airline_code, flight_number, from and to.
seats[]arrayalways (empty when the airline gives no map)must readOne seat map per flight: journey_index, segment_index, aircraft_type, total_seats and seats.
seats[].seats[]arrayalwaysmust readEvery seat: code (send it to book), desc (e.g. 3A, show it), row, column, amount (price; 0 = free), tax, is_available.
seats[].seats[].window / aisle / middlebooleanalwaysusefulWhere the seat is in its row.
seats[].seats[].exit_row / leg_room / infant / near_wings / recliningbooleanalwaysusefulSeat features. A passenger with an infant needs a seat with infant true; exit rows have rules of their own.
Total: 5 keys
Errors this call answers with (4)
HTTPcodemessagedetailwhen
4019001Authentication requiredInvalid token
4005100Invalid search requestitinerary_id is required
4045104Itinerary not found or expired
5025001The airline or supplier could not complete the request
▸6.POST /flights/bookSave the passengers on the itinerary, then pay from the wallet and ticket (is_hold false) or hold the booking without payment (is_hold true)..open pagekeys explained

Save the passengers on the itinerary, then pay from the wallet and ticket (is_hold false) or hold the booking without payment (is_hold true).

Auth: Authorization: Bearer <token> from generate-token.

Request
{
  "itinerary_id": "9b8a7f6e-5d4c-4b3a-2f1e-0d9c8b7a6f5e",
  "is_hold": false,
  "gst_details": {
    "name": "Example Travels Pvt Ltd",
    "number": "27AABCE1234F1Z5",
    "address": "12 MG Road, Mumbai 400001",
    "email": "accounts@example.com",
    "mobile": "+919876543210"
  },
  "pax_details": [
    {
      "first_name": "Rahul",
      "last_name": "Sharma",
      "pax_type": "ADULT",
      "title": "Mr",
      "gender": "male",
      "dob": "1990-05-12",
      "phone": "+919876543210",
      "email": "rahul.sharma@example.com",
      "passport_details": {
        "passport_number": "Z1234567",
        "passport_issue_date": "2022-01-10",
        "passport_expiry_date": "2032-01-09",
        "passport_issue_country": "IN",
        "nationality": "IN"
      },
      "ancillaries": {
        "seat": [
          {
            "code": "1A",
            "price": 600,
            "label": "window",
            "journey_index": 0,
            "segment_index": 0
          }
        ],
        "baggage": [
          {
            "code": "XBAG05",
            "price": 1500,
            "label": "Extra 5 Kg",
            "journey_index": 0
          }
        ],
        "meal": [],
        "other": []
      }
    }
  ]
}
  • pax_details: one per traveller, at least one. pax_type ADULT, CHILD or INFANT; title Mr, Mrs, Ms, Mstr, Miss; gender male or female; dates YYYY-MM-DD (values as the web frontend sends them; the validator names are passenger_type, passenger_title, gender, dateformat).
  • phone and email are required on every passenger; the first passenger's pair is stored as the customer contact.
  • gst_details is optional as a block; when present, all five fields are required and number must be a valid GSTIN.
  • passport_details is optional; send it when review's requirements say passport_applicable.
Reply
{
  "booking_id": "AIOR482913",
  "itinerary_id": "9b8a7f6e-5d4c-4b3a-2f1e-0d9c8b7a6f5e",
  "status": "SUCCESS",
  "amount": 7112
}
Hold (is_hold true)
{
  "booking_id": "AIOR482914",
  "itinerary_id": "9b8a7f6e-5d4c-4b3a-2f1e-0d9c8b7a6f5e",
  "status": "ONHOLD",
  "amount": 7112,
  "pay_till": "2026-10-17T10:12:00Z"
}
  • status is the payment status for a paid booking (SUCCESS; PENDING when the ticket is not yet issued) and ONHOLD for a hold.
Keys and what they mean
Request
keytypewhen presentimportancemeaning
itinerary_idstringrequiredmust readThe itinerary_id from reprice, before its valid_till.
is_holdbooleanoptional, default falsemust readfalse: book directly, paid at once from your balance or credit and ticketed. true: hold the seats without payment until pay_till (only when reprice said booking_requirements.is_hold true); then confirm-hold or release.
pax_details[]arrayrequired, one per passengermust readEvery passenger of the search, adults first: first_name, last_name, pax_type (ADULT, CHILD, INFANT), title, gender, dob, phone and email.
pax_details[].passport_detailsobjectwhen reprice says passport_mandatoryusefulpassport_number, passport_issue_date, passport_expiry_date, passport_issue_country, nationality.
pax_details[].ancillariesobjectoptionalusefulWhat this passenger buys: seat[], meal[], other[] (each with code, price, label, journey_index and segment_index) and baggage[] (code, price, label, journey_index; no segment_index). Codes come from ancillaries and seat map; an item on a flight not in the itinerary answers 400 with errors[] (rule scope).
gst_detailsobjectoptional; required when reprice says is_gst_mandatoryusefulThe company on the invoice: name, number (GSTIN), address, email, mobile.
Total: 6 keys
Reply
keytypewhen presentimportancemeaning
booking_idstringalwaysmust readYour booking's id. Send it to booking details, confirm-hold and release.
statusstringalwaysmust readONHOLD (held, pay before pay_till), SUCCESS (booked directly and paid), PENDING (the airline has not confirmed yet: read the booking details), or the booking's state.
pay_tilldatetimeon a holdmust readUntil when the hold can be confirmed; after it the airline releases the seats.
amountnumberalwaysmust readWhat the booking costs (INR); taken at once for a direct booking, at confirm-hold for a hold.
itinerary_idstringalwaysinformationalThe itinerary that was booked.
Total: 5 keys
Errors this call answers with (7)
HTTPcodemessagedetailwhen
4019001Authentication requiredInvalid token
4039002You do not have permission for this actionRole without bookings.create (Finance, Operation, Tech).
4003000Invalid request(the API's detail text)
4009003Some fields are missing or invalidSchema validation of the body (required fields, formats); errors[] lists them.
5033003A service the API depends on is unavailable(the API's text)the API answered 5xx or did not answer.
4093101Hold booking limit reached
5009000Something went wrongPayment or order errors that no translator knows.
Questions developers ask (2)
Is gst_details required?
Only when booking_requirements.is_gst_mandatory is true. When you send it, all five fields are required.
What is the difference between is_hold true and false?
false pays from your wallet and tickets at once. true holds the seats without payment until pay_till; confirm with confirm-hold or give them back with release.
▸7.POST /flights/booking/detailsThe booking as stored: status, payment status, the flights with the PNR, the passengers with their fare and ticket number per flight, the price..open pagekeys explained

The booking as stored: status, payment status, the flights with the PNR, the passengers with their fare and ticket number per flight, the price.

Auth: Authorization: Bearer <token> from generate-token.

Request
{
  "booking_id": "AIOR482913"
}
Reply
{
  "booking_id": "AIOR482913",
  "status": "SUCCESS",
  "payment_status": "SUCCESS",
  "created_at": "2026-10-15T10:12:34Z",
  "route_type": "DOMESTIC",
  "journeys": [
    {
      "journey_index": 0,
      "from": "BLR",
      "to": "BOM",
      "departure_time": "2026-11-14T06:00:00",
      "arrival_time": "2026-11-14T07:45:00",
      "segments": [
        {
          "segment_index": 0,
          "from": "BLR",
          "to": "BOM",
          "airline_code": "QP",
          "airline_name": "Akasa Air",
          "flight_number": "1101",
          "departure_time": "2026-11-14T06:00:00",
          "arrival_time": "2026-11-14T07:45:00",
          "departure_terminal": "1",
          "arrival_terminal": "2",
          "duration": 105
        }
      ],
      "passengers": [
        {
          "passenger_index": 0,
          "first_name": "Rahul",
          "last_name": "Sharma",
          "pax_type": "ADULT",
          "title": "Mr",
          "gender": "male",
          "dob": "1990-05-12",
          "passport_details": {
            "passport_number": "Z1234567",
            "passport_issue_date": "2022-01-10",
            "passport_expiry_date": "2032-01-09",
            "nationality": "IN"
          },
          "fare": {
            "base_fare": 4200,
            "yq": 500,
            "other_taxes": 312,
            "ancillaries": 2100,
            "total_fare": 7112,
            "net_fare": 7112
          },
          "status": "CONFIRMED",
          "pnr": "H7K2PQ",
          "ticket_number": "",
          "fare_ref": "SAVER",
          "refundable_type": "PARTIALLY_REFUNDABLE",
          "cabin_class": "Economy",
          "booking_class": "Q",
          "fare_basis": "QPSAVER",
          "baggage": {
            "hand": {
              "kg": 7
            },
            "checkin": {
              "kg": 15
            }
          },
          "ancillaries": {
            "seat": [
              {
                "code": "1A",
                "price": 600,
                "label": "window",
                "segment_index": 0
              }
            ],
            "baggage": [
              {
                "code": "XBAG05",
                "price": 1500,
                "label": "Extra 5 Kg"
              }
            ]
          }
        }
      ]
    }
  ],
  "price": {
    "base_fare": 4200,
    "yq": 500,
    "other_taxes": 312,
    "ancillaries": 2100,
    "total_fare": 7112,
    "net_fare": 7112
  },
  "gst_details": {
    "name": "Example Travels Pvt Ltd",
    "number": "27AABCE1234F1Z5",
    "address": "12 MG Road, Mumbai 400001",
    "email": "accounts@example.com",
    "mobile": "+919876543210"
  }
}
  • journeys[] is the booking journey by journey: its dates, its flights (segment_index restarts at 0 inside each journey; operating airline shown only on a codeshare) and, for every passenger on it, who they are (passenger_index is the same person on every journey), the status, the PNR, the ticket number, the fare paid for that journey in the components of the search price plus ancillaries, the fare attributes (fare_ref, refundable_type, cabin, booking class, fare basis, included baggage) and the ancillaries bought (a seat or meal with its segment_index, a bag without).
  • status per passenger per journey is PENDING until the booking is held or ticketed, then CONFIRMED; CANCELLED, VOIDED or REISSUED come later. price is the booking as a whole in the same components, total_fare and net_fare included.
  • pay_till appears on a held booking. Zero fare fields are omitted (omitempty).
  • status values are the API's order statuses: CREATED, PENDING, SUCCESS, ONHOLD, FAILED, PNR_RELEASED, CANCELLED, ABORTED.
Keys and what they mean
Request
keytypewhen presentimportancemeaning
booking_idstringrequiredmust readThe id book returned.
Total: 1 keys
Reply
keytypewhen presentimportancemeaning
statusstringalwaysmust readThe booking's state: CREATED, ONHOLD, SUCCESS, PNR_RELEASED, CANCELLED, FAILED.
payment_statusstringalwaysmust readPENDING until paid, then SUCCESS; FAILED or REFUNDED later.
pay_tilldatetimeon a holdmust readUntil when a held booking can be confirmed; after it the airline releases the seats.
journeys[]arrayalwaysmust readThe booking journey by journey: its dates, its flights and, for every passenger on it, who they are, their state, the PNR, the ticket, the fare paid for that journey and the add-ons.
journeys[].passengers[].pnrstringonce the airline confirmedmust readThe airline's record locator for this passenger on this journey. Empty until the hold or the ticket is confirmed.
journeys[].passengers[].statusstringalwaysmust readPENDING until confirmed, then CONFIRMED; CANCELLED, VOIDED or REISSUED when something happened to this passenger on this journey.
priceobjectalwaysmust readThe booking's price as a whole, in the components of the search price (base_fare, yq, yr, airline_gst, booking_fee, commission, other_taxes, total_fare, net_fare) plus ancillaries and fees.
journeys[].passengers[].fareobjectalwaysmust readWhat this passenger's journey cost, in the components of the search price plus ancillaries bought on it.
Total: 8 keys
Errors this call answers with (4)
HTTPcodemessagedetailwhen
4019001Authentication requiredInvalid token
4039002You do not have permission for this actionRole without bookings.read.
4003000Invalid requestBooking_id is required
4049005Not foundBooking not found
Questions developers ask (1)
Why is pnr empty?
The airline has not confirmed yet: the passenger reads PENDING. It appears once the hold or the ticket is confirmed.
▸8.POST /flights/booking/confirm-holdPay a held booking from the wallet and ticket it, before pay_till..open pagekeys explained

Pay a held booking from the wallet and ticket it, before pay_till.

Auth: Authorization: Bearer <token> from generate-token.

Request
{
  "booking_id": "AIOR482914"
}
Reply
{
  "booking_id": "AIOR482914",
  "itinerary_id": "9b8a7f6e-5d4c-4b3a-2f1e-0d9c8b7a6f5e",
  "status": "SUCCESS",
  "amount": 7112
}
Keys and what they mean
Request
keytypewhen presentimportancemeaning
booking_idstringrequiredmust readA booking on hold (status ONHOLD), before its pay_till.
Total: 1 keys
Reply
keytypewhen presentimportancemeaning
statusstringalwaysmust readSUCCESS when paid and ticketed; read the booking details for the tickets.
amountnumberalwaysmust readWhat was taken from your balance or credit (INR).
booking_idstringalwaysinformationalThe booking confirmed.
itinerary_idstringalwaysinformationalIts itinerary.
Total: 4 keys
Errors this call answers with (6)
HTTPcodemessagedetailwhen
4019001Authentication requiredInvalid token
4039002You do not have permission for this actionRole without bookings.hold.
4003000Invalid requestBooking_id is required
4049005Not foundBooking not found
4093102Booking is not pendingNot a held booking, or already confirmed.
5009000Something went wrongInsufficient wallet or payment faults that no translator knows.
▸9.POST /flights/booking/releaseGive up a held booking: the PNR is released at the airline and the order becomes PNR_RELEASED.open pagekeys explained

Give up a held booking: the PNR is released at the airline and the order becomes PNR_RELEASED. A ticketed booking cannot be released.

Auth: Authorization: Bearer <token> from generate-token.

Request
{
  "booking_id": "AIOR482914"
}
Reply
{
  "booking_id": "AIOR482914",
  "status": "PNR_RELEASED",
  "pnr": "H7K2PQ"
}
  • success is false when every provider release failed; status then stays as it was.
Keys and what they mean
Request
keytypewhen presentimportancemeaning
booking_idstringrequiredmust readA booking on hold. A booking that is not on hold answers an error.
Total: 1 keys
Reply
keytypewhen presentimportancemeaning
statusstringalwaysmust readPNR_RELEASED when the airline freed the seats. A release the airline refuses answers 409 (code 3105): the PNR is still held, try again later.
pnrstringalwaysusefulThe record locator that was released.
booking_idstringalwaysinformationalThe booking released.
Total: 3 keys
Errors this call answers with (5)
HTTPcodemessagedetailwhen
4019001Authentication requiredInvalid token
4039002You do not have permission for this actionRole without bookings.cancel.
4003000Invalid requestBooking_id is required
4049005Not foundBooking not found
4093102Booking is not pendingTicketed or already released.
Questions developers ask (1)
Release answered 409 3105. Is the booking released?
No. The airline did not give the PNR back; it stays held until pay_till. Try again later.
▸ Error codes

Every error reply has the same body: code, message, optional detail, optional errors[] (field, rule, message) and traceId to quote to support.

Common to every call

codemessagewhen
9000500Something went wrong An unexpected fault; the cause is logged under traceId.
9001401Authentication required No valid token or API key, or the token expired.
9002403You do not have permission for this action
9003400Some fields are missing or invalid Schema validation; errors[] lists field, rule, params.
9004429Too many requests Rate limit.
9005404Not found The record does not exist or is not the caller's.
9006499Request cancelled The caller closed the request before the answer.
Total: 7 codes

Search, reprice, ancillaries, seat map

codemessagewhen
5000400Invalid request
5001502The airline or supplier could not complete the request Supplier or the API error.
5002504A supplier or service did not answer in time Timeout. No raise site in the code.
5003503A service the API depends on is unavailable
5004502The payment could not be completed Not public. No raise site in the code.
5100400Invalid search request Search, review or itinerary request invalid. Raised by all four external the API routes.
5101404Search not found No raise site in the code.
5102410Search results have expired No raise site in the code.
5103404Flight not found Raised by review (and the UI's search details routes).
5104404Itinerary not found or expired Add-ons and seat map on an unknown itinerary.
5105400The supplier does not support this route or cabin No raise site in the code.
5106404Supplier account not found Not public. No raise site in the code.
5200404Booking not found No raise site in the code; the API's internal book routes answer 9000 instead.
Total: 13 codes

Book, details, hold

codemessagewhen
3000400Invalid request
3001400A required field is missing Declared on the internal create routes; never raised.
3002400A field has an invalid value Declared on the internal create routes; never raised.
3003503A service the API depends on is unavailable
3100404Booking not found Internal routes. The external routes answer the generic 9005 instead.
3101409Hold booking limit reached Hold path.
3102409Booking is not pending Confirm or release on a booking in the wrong state.
3103409Booking is not assigned Ops routes only.
3104409Booking fare does not match the airline PNR Import route only.
Total: 9 codes