← all test cases

Domestic, return, 1 adult

DEL-BOM · return · 1 adult · booked on hold

Domestic return for 1 adult: search, reprice the cheapest fare, then the ancillaries and the seat map of the itinerary, book it on hold (no payment), read the booking details and release the hold. Two search segments. Domestic fares are sold per direction: two groups, [0] and [1]; reprice takes two items.

  1. 1 Search: 337 options
  2. 2 Reprice: 2 items
  3. 3 Ancillaries: 82 items
  4. 4 Seat map: 602 seats
  5. 5 Book on hold: 1 passengers
  6. 6 Booking details: 1 passengers
  7. 7 Release the hold: 1 released
▸2. RepricePOST /flights/reprice2 items
What this step returned: 2 items(click to expand)
  • 2 item(s) sent: option 33f7112a… / price 39baf0d4…; option 7ee707d5… / price f2973366…
  • Repriced option on journey_indexes [0]: 1 flight (IX 1463 DEL-NMI); multi-flight reprice: no
  • Fare Value PARTIALLY_REFUNDABLE: adult total 3,002, net 3,002; segments[] in the reply: no (detail=journey)
  • Repriced option on journey_indexes [1]: 2 flights (IX 1163 BOM-GOX, IX 2764 GOX-DEL); multi-flight reprice: yes
  • Fare Value : adult total 2,741, net 2,741; segments[] in the reply: no (detail=journey)
  • Price unchanged since search (no messages)
  • Booking requirements: hold allowed True, passport mandatory False, GST mandatory False, PAN applicable False, DOB adult/child/infant False/True/True
  • Price for the whole booking: total 5,743, net 5,743; itinerary_id expires at valid_till
  • 0 fare rule(s) in the reply
Request body
{
  "items": [
    {
      "option_id": "33f7112a-f10f-4975-8b0b-b614e38a2e41",
      "price_id": "39baf0d4-92fe-4741-939a-64e780f77a6e"
    },
    {
      "option_id": "7ee707d5-19b5-493c-a96e-98b7180cdafd",
      "price_id": "f2973366-f566-41ea-93f7-733fbb13ee24"
    }
  ]
}
Reply
{
  "itinerary_id": "e33a765e-a35e-4ee7-a72b-cf59d64e2eba",
  "valid_till": "2026-10-21T00:58:30+05:30",
  "results": [
    {
      "journey_indexes": [
        0
      ],
      "option_id": "33f7112a-f10f-4975-8b0b-b614e38a2e41",
      "segments": [
        {
          "segment_index": 0,
          "journey_index": 0,
          "from": "DEL",
          "to": "NMI",
          "airline_code": "IX",
          "airline_name": "Air India Express",
          "aircraft_type": "Airbus A32Y",
          "flight_number": "1463",
          "departure_time": "2026-11-20T06:00:00",
          "departure_terminal": "1",
          "arrival_time": "2026-11-20T08:05:00",
          "duration": 125
        }
      ],
      "fare": {
        "price_id": "39baf0d4-92fe-4741-939a-64e780f77a6e",
        "adult": {
          "fare": {
            "base_fare": 899,
            "yq": 850,
            "airline_gst": 96,
            "booking_fee": 100,
            "other_taxes": 319,
            "total_fare": 3001.94,
            "net_fare": 3001.94,
            "pax_count": 1
          },
          "fare_ref": "Value",
          "refundable_type": "PARTIALLY_REFUNDABLE",
          "cabin_class": "Economy",
          "booking_class": "X",
          "fare_basis": "XNRA015",
          "baggage": {
            "hand": {
              "kg": 7
            },
            "checkin": {
              "kg": 15
            }
          }
        },
        "varies_by_segment": false
      }
    },
    {
      "journey_indexes": [
        1
      ],
      "option_id": "7ee707d5-19b5-493c-a96e-98b7180cdafd",
      "segments": [
        {
          "segment_index": 0,
          "journey_index": 1,
          "from": "BOM",
          "to": "GOX",
          "airline_code": "IX",
          "airline_name": "Air India Express",
          "aircraft_type": "Boeing 7M8",
          "flight_number": "1163",
          "stops": 1,
          "departure_time": "2026-11-25T20:00:00",
          "departure_terminal": "2",
          "arrival_time": "2026-11-25T21:25:00",
          "duration": 85,
          "connecting_time": 20
        },
        {
          "segment_index": 1,
          "journey_index": 1,
          "from": "GOX",
          "to": "DEL",
          "airline_code": "IX",
          "airline_name": "Air India Express",
          "aircraft_type": "Airbus A320neo",
          "flight_number": "2764",
          "departure_time": "2026-11-25T21:45:00",
          "arrival_time": "2026-11-26T00:25:00",
          "arrival_terminal": "1",
          "duration": 160,
          "connecting_time": 20,
          "next_day": 1
        }
      ],
      "fare": {
        "price_id": "f2973366-f566-41ea-93f7-733fbb13ee24",
        "adult": {
          "fare": {
            "base_fare": 1001,
            "yq": 850,
            "other_taxes": 172,
            "total_fare": 2741,
            "net_fare": 2741,
            "pax_count": 1
          },
          "fare_ref": "Value",
          "cabin_class": "Economy",
          "booking_class": "EC",
          "fare_basis": "XNRA015",
          "baggage": {
            "hand": {
              "kg": 7
            },
            "checkin": {
              "kg": 15
            }
          }
        },
        "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": 50,
    "lastname_length": 50,
    "firstname_min_length": 2,
    "lastname_min_length": 2,
    "seat_mandatory": false,
    "meal_mandatory": false,
    "baggage_mandatory": false
  },
  "price": {
    "adult": {
      "base_fare": 1900,
      "yq": 1700,
      "airline_gst": 96,
      "booking_fee": 100,
      "other_taxes": 491,
      "total_fare": 5742.94,
      "net_fare": 5742.94,
      "pax_count": 1
    },
    "total": {
      "base_fare": 1900,
      "yq": 1700,
      "airline_gst": 96,
      "booking_fee": 100,
      "other_taxes": 491,
      "total_fare": 5742.94,
      "net_fare": 5742.94,
      "pax_count": 1
    }
  }
}
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.
▸3. AncillariesPOST /flights/ancillaries82 items
What this step returned: 82 items(click to expand)
  • 3 flight(s) in segments[]: (journey 0, segment 0) IX 1463 DEL-NMI; (journey 1, segment 0) IX 1163 BOM-GOX; (journey 1, segment 1) IX 2764 GOX-DEL
  • 20 bags (per journey): journey 0: 10 items; journey 1: 10 items
  • bags: price from 2,100 to 18,750; free items: 0
  • 37 meals (per flight): (journey 0, segment 0): 11 items; (journey 1, segment 0): 10 items; (journey 1, segment 1): 16 items
  • meals: price from 100 to 700; free items: 0
  • 25 other items (per flight): (journey 1, segment 0): 13 items; (journey 1, segment 1): 12 items
  • other items: price from 0 to 6,000; free items: 10
  • Errors: add-ons on BOM_DEL_IX_1163 dropped: not a flight of this itinerary; add-ons on BOM_DEL_IX_1163 dropped: not a flight of this itinerary
Request body
{
  "itinerary_id": "e33a765e-a35e-4ee7-a72b-cf59d64e2eba"
}
Reply
{
  "itinerary_id": "e33a765e-a35e-4ee7-a72b-cf59d64e2eba",
  "segments": [
    {
      "journey_index": 0,
      "segment_index": 0,
      "airline_code": "IX",
      "flight_number": "1463",
      "from": "DEL",
      "to": "NMI"
    },
    {
      "journey_index": 1,
      "segment_index": 0,
      "airline_code": "IX",
      "flight_number": "1163",
      "from": "BOM",
      "to": "GOX"
    },
    {
      "journey_index": 1,
      "segment_index": 1,
      "airline_code": "IX",
      "flight_number": "2764",
      "from": "GOX",
      "to": "DEL"
    }
  ],
  "baggage": [
    {
      "journey_index": 0,
      "items": [
        {
          "code": "6712",
          "label": "CABIN BAGGAGE 5KGS",
          "price": 3500
        },
        {
          "code": "6713",
          "label": "CABIN BAGGAGE 3KGS",
          "price": 2100
        },
        {
          "code": "6714",
          "label": "XCESS BAGGAGE 25KG",
          "price": 18750
        },
        "… 7 more (open the viewer)"
      ]
    },
    {
      "journey_index": 1,
      "items": [
        {
          "code": "PBCB",
          "label": "+ 5Kgs Xtra-Carry-On",
          "price": 3500
        },
        {
          "code": "PBCA",
          "label": "+3Kgs Xtra-Carry-On",
          "price": 2100
        },
        {
          "code": "PBAF",
          "label": "+ 25 Kg Xcess Baggage",
          "price": 18750
        },
        "… 7 more (open the viewer)"
      ]
    }
  ],
  "meal": [
    {
      "journey_index": 0,
      "segment_index": 0,
      "items": [
        {
          "code": "5750",
          "label": "Shondesh Tiramisu",
          "price": 250
        },
        {
          "code": "5751",
          "label": "Paneer Makhani with Jeera Aloo  Vegetable Pulao",
          "price": 600
        },
        {
          "code": "5752",
          "label": "Vegetable Manchurian with Fried Rice",
          "price": 600
        },
        "… 8 more (open the viewer)"
      ]
    },
    {
      "journey_index": 1,
      "segment_index": 0,
      "items": [
        {
          "code": "VSDB",
          "label": "Shondesh Tiramisu",
          "price": 250
        },
        {
          "code": "VQSB",
          "label": "Quinoa Salad",
          "price": 400
        },
        {
          "code": "VHRB",
          "label": "Herb Roast Vegetable Roll",
          "price": 400
        },
        "… 7 more (open the viewer)"
      ]
    },
    {
      "journey_index": 1,
      "segment_index": 1,
      "items": [
        {
          "code": "VSDB",
          "label": "Shondesh Tiramisu",
          "price": 250
        },
        {
          "code": "VQSB",
          "label": "Quinoa Salad",
          "price": 400
        },
        {
          "code": "VPMB",
          "label": "Paneer Makhani with Jeera Aloo & Vegetable Pulao",
          "price": 600
        },
        "… 13 more (open the viewer)"
      ]
    }
  ],
  "other": [
    {
      "journey_index": 1,
      "segment_index": 0,
      "items": [
        {
          "code": "WCHS",
          "label": "Wheelchair Unable to ascend and descend step",
          "price": 1500
        },
        {
          "code": "WCHR",
          "label": "Wheelchair Unable to walk long distance",
          "price": 1500
        },
        {
          "code": "WCHC",
          "label": "Cabin Wheelchair",
          "price": 0
        },
        "… 10 more (open the viewer)"
      ]
    },
    {
      "journey_index": 1,
      "segment_index": 1,
      "items": [
        {
          "code": "PVIP",
          "label": "Xpress Ahead- Prebook",
          "price": 600
        },
        {
          "code": "MKFR",
          "label": "Unused Iitnerary",
          "price": 0
        },
        {
          "code": "GUNS",
          "label": "Guns handling fee",
          "price": 5500
        },
        "… 9 more (open the viewer)"
      ]
    }
  ],
  "errors": [
    "add-ons on BOM_DEL_IX_1163 dropped: not a flight of this itinerary",
    "add-ons on BOM_DEL_IX_1163 dropped: not a flight of this itinerary"
  ]
}
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.
▸4. Seat mapPOST /flights/seat-map602 seats
What this step returned: 602 seats(click to expand)
  • 3 flight(s) with a seat map of 3 in the itinerary: (journey 0, segment 0) Airbus A32Y, 232 seats; (journey 1, segment 0) 7M8, 184 seats; (journey 1, segment 1) 32N, 186 seats
  • 602 seats available of 602; free: 16; paid: 586 (from 300 to 1,700)
  • Window 195, aisle 202, middle 202; exit row 22; extra leg room 36; infant allowed 0
Request body
{
  "itinerary_id": "e33a765e-a35e-4ee7-a72b-cf59d64e2eba"
}
Reply
{
  "itinerary_id": "e33a765e-a35e-4ee7-a72b-cf59d64e2eba",
  "segments": [
    {
      "journey_index": 0,
      "segment_index": 0,
      "airline_code": "IX",
      "flight_number": "1463",
      "from": "DEL",
      "to": "NMI"
    },
    {
      "journey_index": 1,
      "segment_index": 0,
      "airline_code": "IX",
      "flight_number": "1163",
      "from": "BOM",
      "to": "GOX"
    },
    {
      "journey_index": 1,
      "segment_index": 1,
      "airline_code": "IX",
      "flight_number": "2764",
      "from": "GOX",
      "to": "DEL"
    }
  ],
  "seats": [
    {
      "journey_index": 0,
      "segment_index": 0,
      "aircraft_type": "Airbus A32Y",
      "seats": [
        {
          "aisle": false,
          "amount": 1700,
          "code": "RA002831976283552470028339001309RUOIHE8BAWI|6265",
          "column": 1,
          "desc": "1A",
          "exit_row": false,
          "infant": false,
          "is_available": true,
          "leg_room": false,
          "middle": false,
          "near_wings": false,
          "reclining": false,
          "row": 9,
          "tax": 0,
          "window": true
        },
        {
          "aisle": false,
          "amount": 1700,
          "code": "RA002831976283552470028339001309RUOIHE8BAWI|6266",
          "column": 2,
          "desc": "1B",
          "exit_row": false,
          "infant": false,
          "is_available": true,
          "leg_room": false,
          "middle": true,
          "near_wings": false,
          "reclining": false,
          "row": 9,
          "tax": 0,
          "window": false
        },
        {
          "aisle": true,
          "amount": 1700,
          "code": "RA002831976283552470028339001309RUOIHE8BAWI|6267",
          "column": 3,
          "desc": "1C",
          "exit_row": false,
          "infant": false,
          "is_available": true,
          "leg_room": false,
          "middle": false,
          "near_wings": false,
          "reclining": false,
          "row": 9,
          "tax": 0,
          "window": false
        },
        "… 229 more (open the viewer)"
      ],
      "total_seats": 232
    },
    {
      "journey_index": 1,
      "segment_index": 0,
      "aircraft_type": "7M8",
      "seats": [
        {
          "aisle": false,
          "amount": 1700,
          "code": "WINDOW",
          "column": 1,
          "desc": "1A",
          "exit_row": false,
          "infant": false,
          "is_available": true,
          "leg_room": true,
          "middle": false,
          "near_wings": false,
          "reclining": false,
          "row": 1,
          "tax": 80,
          "window": true
        },
        {
          "aisle": false,
          "amount": 1700,
          "code": "MIDDLE",
          "column": 2,
          "desc": "1B",
          "exit_row": false,
          "infant": false,
          "is_available": true,
          "leg_room": true,
          "middle": true,
          "near_wings": false,
          "reclining": false,
          "row": 1,
          "tax": 80,
          "window": false
        },
        {
          "aisle": true,
          "amount": 1700,
          "code": "AISLE",
          "column": 3,
          "desc": "1C",
          "exit_row": false,
          "infant": false,
          "is_available": true,
          "leg_room": true,
          "middle": false,
          "near_wings": false,
          "reclining": false,
          "row": 1,
          "tax": 80,
          "window": false
        },
        "… 181 more (open the viewer)"
      ],
      "total_seats": 184
    },
    {
      "journey_index": 1,
      "segment_index": 1,
      "aircraft_type": "32N",
      "seats": [
        {
          "aisle": false,
          "amount": 1700,
          "code": "WINDOW",
          "column": 1,
          "desc": "1A",
          "exit_row": false,
          "infant": false,
          "is_available": true,
          "leg_room": true,
          "middle": false,
          "near_wings": false,
          "reclining": false,
          "row": 1,
          "tax": 80,
          "window": true
        },
        {
          "aisle": false,
          "amount": 1700,
          "code": "MIDDLE",
          "column": 2,
          "desc": "1B",
          "exit_row": false,
          "infant": false,
          "is_available": true,
          "leg_room": true,
          "middle": true,
          "near_wings": false,
          "reclining": false,
          "row": 1,
          "tax": 80,
          "window": false
        },
        {
          "aisle": true,
          "amount": 1700,
          "code": "AISLE",
          "column": 3,
          "desc": "1C",
          "exit_row": false,
          "infant": false,
          "is_available": true,
          "leg_room": true,
          "middle": false,
          "near_wings": false,
          "reclining": false,
          "row": 1,
          "tax": 80,
          "window": false
        },
        "… 183 more (open the viewer)"
      ],
      "total_seats": 186
    }
  ]
}
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
▸5. Book on holdPOST /flights/book1 passengers
What this step returned: 1 passengers(click to expand)
  • Booked on hold (is_hold True) with 1 passenger(s): ADULT 1
  • Status ONHOLD, booking_id AIOR432493, amount 5,743, pay_till given
  • GST details sent: no; ancillaries selected: 0
Request body
{
  "itinerary_id": "e33a765e-a35e-4ee7-a72b-cf59d64e2eba",
  "is_hold": true,
  "pax_details": [
    {
      "first_name": "Rohan",
      "last_name": "Pillai",
      "pax_type": "ADULT",
      "title": "Mr",
      "gender": "male",
      "dob": "1990-05-12",
      "phone": "9876543210",
      "email": "rohan.verma@example.com"
    }
  ]
}
Reply
{
  "booking_id": "AIOR432493",
  "itinerary_id": "e33a765e-a35e-4ee7-a72b-cf59d64e2eba",
  "status": "ONHOLD",
  "amount": 5742.94,
  "pay_till": "2026-10-21T03:28:00Z"
}
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.
▸6. Booking detailsPOST /flights/booking/details1 passengers
What this step returned: 1 passengers(click to expand)
  • Status ONHOLD, payment PENDING, route DOMESTIC, pay_till given
  • Journey 0 DEL-NMI: segment 0 IX 1463 DEL-NMI
  • passenger 0 ADULT Rohan: CONFIRMED, PNR SYJBUE, ticket BX21HJ00071-1, fare Value X/XNRA015, total 3,002, net 3,002, baggage hand 7kg, checkin 15kg
  • Journey 1 BOM-DEL: segment 0 IX 1163 BOM-GOX; segment 1 IX 2764 GOX-DEL
  • passenger 0 ADULT Rohan: CONFIRMED, PNR SZGN3C, ticket BX21HJ00071-1, fare Value EC/XNRA015, total 2,741, net 2,741, baggage hand 7kg, checkin 15kg
  • PNR on 2 of 2 passenger-journeys; 1 passenger(s): ADULT Rohan Pillai
  • Booking price: base 1,900, yq 1,700, other taxes 385, total 5,743, net 5,743
Request body
{
  "booking_id": "AIOR432493"
}
Reply
{
  "booking_id": "AIOR432493",
  "status": "ONHOLD",
  "payment_status": "PENDING",
  "created_at": "2026-10-21T00:28:35Z",
  "pay_till": "2026-10-21T03:28:00Z",
  "route_type": "DOMESTIC",
  "journeys": [
    {
      "journey_index": 0,
      "from": "DEL",
      "to": "NMI",
      "departure_time": "2026-11-20T06:00",
      "arrival_time": "2026-11-20T08:05",
      "segments": [
        {
          "segment_index": 0,
          "from": "DEL",
          "to": "NMI",
          "airline_code": "IX",
          "airline_name": "Air India Express",
          "flight_number": "1463",
          "departure_time": "2026-11-20T06:00",
          "arrival_time": "2026-11-20T08:05",
          "departure_terminal": "1",
          "duration": 125
        }
      ],
      "passengers": [
        {
          "passenger_index": 0,
          "first_name": "Rohan",
          "last_name": "Pillai",
          "pax_type": "ADULT",
          "title": "Mr",
          "gender": "male",
          "dob": "1990-05-12",
          "fare": {
            "base_fare": 899,
            "yq": 850,
            "airline_gst": 96,
            "booking_fee": 100,
            "other_taxes": 319,
            "total_fare": 3001.94,
            "net_fare": 3001.94
          },
          "status": "CONFIRMED",
          "pnr": "SYJBUE",
          "ticket_number": "BX21HJ00071-1",
          "fare_ref": "Value",
          "refundable_type": "PARTIALLY_REFUNDABLE",
          "cabin_class": "Economy",
          "booking_class": "X",
          "fare_basis": "XNRA015",
          "baggage": {
            "hand": {
              "kg": 7
            },
            "checkin": {
              "kg": 15
            }
          }
        }
      ]
    },
    {
      "journey_index": 1,
      "from": "BOM",
      "to": "DEL",
      "departure_time": "2026-11-25T20:00",
      "arrival_time": "2026-11-26T00:25",
      "segments": [
        {
          "segment_index": 0,
          "from": "BOM",
          "to": "GOX",
          "airline_code": "IX",
          "airline_name": "Air India Express",
          "flight_number": "1163",
          "departure_time": "2026-11-25T20:00",
          "arrival_time": "2026-11-25T21:25",
          "departure_terminal": "2",
          "duration": 85
        },
        {
          "segment_index": 1,
          "from": "GOX",
          "to": "DEL",
          "airline_code": "IX",
          "airline_name": "Air India Express",
          "flight_number": "2764",
          "departure_time": "2026-11-25T21:45",
          "arrival_time": "2026-11-26T00:25",
          "arrival_terminal": "1",
          "duration": 160
        }
      ],
      "passengers": [
        {
          "passenger_index": 0,
          "first_name": "Rohan",
          "last_name": "Pillai",
          "pax_type": "ADULT",
          "title": "Mr",
          "gender": "male",
          "dob": "1990-05-12",
          "fare": {
            "base_fare": 1001,
            "yq": 850,
            "airline_gst": 106,
            "booking_fee": 100,
            "other_taxes": 66,
            "total_fare": 2741,
            "net_fare": 2741
          },
          "status": "CONFIRMED",
          "pnr": "SZGN3C",
          "ticket_number": "BX21HJ00071-1",
          "fare_ref": "Value",
          "cabin_class": "Economy",
          "booking_class": "EC",
          "fare_basis": "XNRA015",
          "baggage": {
            "hand": {
              "kg": 7
            },
            "checkin": {
              "kg": 15
            }
          }
        }
      ]
    }
  ],
  "price": {
    "base_fare": 1900,
    "yq": 1700,
    "airline_gst": 202,
    "booking_fee": 200,
    "other_taxes": 385,
    "agent_markup": 100,
    "total_fare": 5742.94,
    "net_fare": 5742.94
  }
}
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.
▸7. Release the holdPOST /flights/booking/release1 released
What this step returned: 1 released(click to expand)
  • Status after release: PNR_RELEASED
Request body
{
  "booking_id": "AIOR432493"
}
Reply
{
  "booking_id": "AIOR432493",
  "status": "PNR_RELEASED",
  "pnr": "SZGN3C"
}
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.