Reference · step 6 of 9
POST/flights/book
{{base_url}}/flights/book
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).
Headers
| Content-Type | application/json |
| Authorization | Bearer {{token}} |
Body (4 notes)
- 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 (1 notes)
- 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
| key | type | when present | importance | meaning |
|---|---|---|---|---|
| itinerary_id | string | required | must read | The itinerary_id from reprice, before its valid_till. |
| is_hold | boolean | optional, default false | must read | false: 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[] | array | required, one per passenger | must read | Every passenger of the search, adults first: first_name, last_name, pax_type (ADULT, CHILD, INFANT), title, gender, dob, phone and email. |
| pax_details[].passport_details | object | when reprice says passport_mandatory | useful | passport_number, passport_issue_date, passport_expiry_date, passport_issue_country, nationality. |
| pax_details[].ancillaries | object | optional | useful | What 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_details | object | optional; required when reprice says is_gst_mandatory | useful | The company on the invoice: name, number (GSTIN), address, email, mobile. |
| Total: 6 keys | ||||
Reply
| key | type | when present | importance | meaning |
|---|---|---|---|---|
| booking_id | string | always | must read | Your booking's id. Send it to booking details, confirm-hold and release. |
| status | string | always | must read | ONHOLD (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_till | datetime | on a hold | must read | Until when the hold can be confirmed; after it the airline releases the seats. |
| amount | number | always | must read | What the booking costs (INR); taken at once for a direct booking, at confirm-hold for a hold. |
| itinerary_id | string | always | informational | The itinerary that was booked. |
| Total: 5 keys | ||||
Errors this call answers with (7)
| HTTP | code | message | detail | when |
|---|---|---|---|---|
| 401 | 9001 | Authentication required | Invalid token | |
| 403 | 9002 | You do not have permission for this action | Role without bookings.create (Finance, Operation, Tech). | |
| 400 | 3000 | Invalid request | (the API's detail text) | |
| 400 | 9003 | Some fields are missing or invalid | Schema validation of the body (required fields, formats); errors[] lists them. | |
| 503 | 3003 | A service the API depends on is unavailable | (the API's text) | the API answered 5xx or did not answer. |
| 409 | 3101 | Hold booking limit reached | ||
| 500 | 9000 | Something went wrong | Payment 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.
Real captures of this call
- Domestic, one way, 1 adult · HTTP 200 · reply in the viewer
- Domestic, one way, 1 adult, 1 child, 1 infant · HTTP 200 · reply in the viewer
- Domestic, return, 1 adult · HTTP 200 · reply in the viewer
- Domestic, return, 1 adult, 1 child, 1 infant · HTTP 200 · reply in the viewer
- Book on hold, plain · HTTP 200 · reply in the viewer
- Book on hold with GST details · HTTP 200 · reply in the viewer
- Book on hold with a seat, a meal and a bag, one flight · HTTP 200 · reply in the viewer
- Book on hold with ancillaries on a two-flight journey · HTTP 200 · reply in the viewer
- Direct booking (paid, no hold), plain · HTTP 200 · reply in the viewer
- Direct booking (paid, no hold) with GST details · HTTP 200 · reply in the viewer
- Direct booking (paid, no hold) with a seat, a meal and a bag, one flight · HTTP 200 · reply in the viewer
- Direct booking (paid, no hold) with ancillaries on a two-flight journey · HTTP 200 · reply in the viewer
- Hold, then confirm (pay) the hold · HTTP 200 · reply in the viewer
- Hold, then release the hold · HTTP 200 · reply in the viewer
- Book after the itinerary expired · HTTP 410 · reply in the viewer