Adrasis™

Flights

Search, prebook, and book charter flights: one block-seat offer per flight, priced on typed passenger counts (adults, children, infants).

Flights are a single-product vertical (product_type 4) following the same search → prebook → book rhythm, on a departure date for a charter flight.

The Partner API endpoints on this page sell contracted charter seat blocks. They do not search connected flight suppliers or issue, void or refund airline tickets.

Charter flights differ from the other verticals in how the party is expressed:

  • The party uses typed counts, not ages: adults, children, and infants. There are no child ages or age brackets.
  • One offer is composed per flight by summing the per-passenger-type fares; each fare splits base + tax, and that breakdown survives onto the booking.
  • Seats are a mandatory block: adults and children each occupy a seat; an infant occupies no seat (at most one lap-infant per adult).
  • A round trip consists of two independent legs. Issue two separate queries.

All three endpoints require the distribution:booking scope.

POST /api/v1/flight/search

Composes the offer for the flight and the typed party. The offer is gated by the flight's operating-days calendar and the per-departure seat surface. currency_code is required and must be a three-letter uppercase ISO 4217 code. It is bound into the allocation_id and must be replayed unchanged at prebook.

language is a BCP 47 tag such as tr-TR; the server canonicalizes its casing, a malformed tag answers 400, and a well-formed tag the catalogue does not carry falls back to the default language.

curl -s -X POST \
  https://ari.console.adrasis.com/api/v1/flight/search \
  -H 'Authorization: Bearer eyJ...' \
  -H 'Content-Type: application/json' \
  -d '{
    "flight_public_id": "fl_IST_AYT_07",
    "departure_date": "2026-07-04",
    "adults": 2,
    "children": 1,
    "infants": 1,
    "currency_code": "EUR",
    "language": "en"
  }'
{
  "offers": [
    {
      "allocation_id": "alc_b685cab0e4d281a2397f46e85b30cf12",
      "flight_public_id": "fl_IST_AYT_07",
      "carrier": "XQ",
      "flight_number": "XQ2204",
      "cabin": 1,
      "direction": 1,
      "origin_zone_public_id": "zn_IST",
      "dest_zone_public_id": "zn_AYT",
      "departure_date": "2026-07-04",
      "base_selling_rate": "450.00",
      "tax_total": "90.00",
      "total_selling_rate": "540.00",
      "currency_id": 978,
      "currency_code": "EUR",
      "pax_breakdown": [
        {
          "pax_type": 1,
          "count": 2,
          "base_selling_rate": "180.00",
          "tax": "36.00",
          "subtotal": "432.00"
        },
        {
          "pax_type": 2,
          "count": 1,
          "base_selling_rate": "90.00",
          "tax": "18.00",
          "subtotal": "108.00"
        },
        {
          "pax_type": 3,
          "count": 1,
          "base_selling_rate": "0.00",
          "tax": "0.00",
          "subtotal": "0.00"
        }
      ]
    }
  ],
  "dropped": [],
  "trace_id": "0f2c9d6e-7b1a-4c3e-9a2f-1d6e7b1a4c3e"
}

pax_type is 1 adult, 2 child, 3 infant. Each line's base_selling_rate and tax are per passenger; subtotal multiplies their sum by count. Two adults at 180 EUR plus 36 EUR tax each total 432 EUR.

currency_code states the currency base_selling_rate, tax_total, total_selling_rate and every pax_breakdown line are denominated in. Flight search does not convert: it returns only fares already held in the currency you asked for, so currency_code always equals the requested currency_code. A flight whose fares are held solely in another currency returns no offers rather than a converted amount; ask for that currency instead. Every fare on one offer is in the same currency; a flight with fares split across currencies is refused as a data error rather than composed.

Exact remaining seat counts are not part of the partner contract. A returned offer has enough inventory for the requested party. When the flight cannot be offered (non-operating weekday or seats exhausted), the reason is returned under dropped rather than failing the request.

Step 2: Prebook

POST /api/v1/flight/prebook

Replays the exact flight search, resolves the chosen allocation, recomposes the typed-pax fare, re-applies the operating-days and seat gates, and mints a short-lived prebook token. A changed party or flight cannot fall through to another offer; a withdrawn or sold-out allocation returns 410 Gone.

curl -s -X POST \
  https://ari.console.adrasis.com/api/v1/flight/prebook \
  -H 'Authorization: Bearer eyJ...' \
  -H 'Content-Type: application/json' \
  -d '{
    "allocation_id": "alc_b685cab0e4d281a2397f46e85b30cf12",
    "flight_public_id": "fl_IST_AYT_07",
    "departure_date": "2026-07-04",
    "adults": 2,
    "children": 1,
    "infants": 1,
    "currency_code": "EUR",
    "language": "en"
  }'
{
  "match_status": "MATCHED",
  "prebook_token": "<PREBOOK_TOKEN>",
  "prebook_expires_at": "2026-07-01T12:30:00Z",
  "offer": {
    "allocation_id": "alc_b685cab0e4d281a2397f46e85b30cf12",
    "flight_public_id": "fl_IST_AYT_07",
    "carrier": "XQ",
    "flight_number": "XQ2204",
    "cabin": 1,
    "direction": 1,
    "origin_zone_public_id": "zn_IST",
    "dest_zone_public_id": "zn_AYT",
    "departure_date": "2026-07-04",
    "base_selling_rate": "450.00",
    "tax_total": "90.00",
    "total_selling_rate": "540.00",
    "currency_id": 978,
    "currency_code": "EUR",
    "pax_breakdown": [
      {
        "pax_type": 1,
        "count": 2,
        "base_selling_rate": "180.00",
        "tax": "36.00",
        "subtotal": "432.00"
      },
      {
        "pax_type": 2,
        "count": 1,
        "base_selling_rate": "90.00",
        "tax": "18.00",
        "subtotal": "108.00"
      },
      {
        "pax_type": 3,
        "count": 1,
        "base_selling_rate": "0.00",
        "tax": "0.00",
        "subtotal": "0.00"
      }
    ]
  },
  "trace_id": "0f2c9d6e-7b1a-4c3e-9a2f-1d6e7b1a4c3e"
}

Step 3: Book

Book requires your partner account to settle on account with the seller. Without those terms it returns 422 PAYMENT_INTENT_NOT_SUPPORTED before writing the booking. An optional payment_intent_kind may confirm the resolved INVOICE intent; it cannot select different terms. Omit it to use your account's terms. Search results and a prebook token do not replace this book-time check. See Booking payment terms.

POST /api/v1/flight/book

Verifies the prebook token and writes a single-product flight booking. The charter seat block decrements atomically (adults + children; infants take no seat). A seat race between prebook and book returns 410 Gone. The Idempotency-Key header is mandatory (replay → 200, conflict → 409; see Idempotency).

curl -s -X POST \
  https://ari.console.adrasis.com/api/v1/flight/book \
  -H 'Authorization: Bearer eyJ...' \
  -H 'Idempotency-Key: 9d8c7b6a-3e2f-4a8b-9c0d-1e2f3a4b5c6d' \
  -H 'Content-Type: application/json' \
  -d '{
    "prebook_token": "<PREBOOK_TOKEN>",
    "contact": {
      "first_name": "Ada",
      "last_name": "Lovelace",
      "email": "ada@example.io"
    },
    "agency_reference": "your-ref-12345"
  }'
{
  "booking": {
    "public_id": "bk_Fl63kZ0m",
    "booking_number": 100755,
    "status": "CONFIRMED",
    "product_type": 4,
    "total_amount": "540.00",
    "currency_code": "EUR"
  },
  "trace_id": "0f2c9d6e-7b1a-4c3e-9a2f-1d6e7b1a4c3e"
}

Cancellation

A flight booking cancels through the canonical two-phase cancel on /bookings/{public_id}. See The booking flow. To group an outbound and return leg (or a flight with a hotel + transfer) into one itinerary, see Trip bundling.