Shopping endpoints in development

The Shopping API endpoints are currently under active development. Request/response shapes may change.

Shopping

Search offers

The core flight search — one request, every connected airline, ranked cheapest first.

POST/v1/shopping/offersRequires X-API-Key
This is the primary entry point for flight shopping. Send a single JSON payload with origin, destination, dates and passenger counts, and Norba fans it out to every registered NDC airline connector in parallel — no need to call each airline individually.What you get back:
- Offers aggregated, deduplicated by OfferID, and ranked cheapest-first

- Full slice and segment detail for every offer

- Transparent price breakdown: base_fare + taxes_fees = total_amount

- Fare family branding (e.g. saver, smart, flex)

- Baggage inclusion flag

- Cabin class (economy, premium_economy, business, first)

- expires_at timestamp — the price is guaranteed until then
Capabilities:
- One-way and round-trip itineraries

- Multiple passenger types: adults (ADT), children 2–11 (CHD), infants under 2 (INF)

- Cabin class preference across all four classes

- Currency selection (ISO 4217)

- Airline filtering to restrict results to specific carriers

- Max stops filter (0 = nonstop only)
Use this endpoint whenever a user hits "Search" on your flight booking UI.

Request example

curl --request POST \
  --url https://api.norba.io/v1/shopping/offers \
  --header "X-API-Key: $NORBA_KEY" \
  --header "Content-Type: application/json" \
  --data '{ "origin": "DUB", "destination": "JFK", "departure_date": "2026-07-15", "return_date": "2026-07-22", "adults": 2, "children": 1, "cabin_class": "economy", "currency": "EUR", "airlines": ["AA", "LH"] }'

Response example

Response example
{
  "offers": [
    {
      "offer_id": "aa_offer-abc123",
      "airline": "AA",
      "currency": "EUR",
      "total_amount": 249,
      "base_fare": 199,
      "taxes_fees": 50,
      "cabin_class": "economy",
      "baggage_included": true,
      "fare_family": {
        "id": "smart",
        "name": "Smart"
      },
      "slices": [
        {
          "id": "OD1",
          "origin": "DUB",
          "destination": "JFK",
          "departure_utc": "2026-07-15T14:30:00Z",
          "arrival_utc": "2026-07-15T17:15:00Z",
          "duration_minutes": 405,
          "stops": 0,
          "segments": [
            {
              "segment_id": "seg-1",
              "flight_number": "AA100",
              "marketing_carrier": "AA",
              "operating_carrier": "AA",
              "aircraft": "333",
              "origin": "DUB",
              "destination": "JFK",
              "departure_utc": "2026-07-15T14:30:00Z",
              "arrival_utc": "2026-07-15T17:15:00Z",
              "duration_minutes": 405
            }
          ]
        }
      ],
      "expires_at": "2026-07-01T14:30:00Z"
    }
  ],
  "meta": {
    "request_id": "01HVN9M5K...",
    "airlines_queried": [
      "AA",
      "LH"
    ],
    "airlines_responded": [
      "AA"
    ],
    "total": 1
  }
}

Authorization

X-API-KeystringRequired
Opaque API key issued from the Norba dashboard. Sent on every request as the X-API-Key HTTP header. Missing or invalid keys are rejected with 401 Unauthorized.

Request body

originstringRequired
IATA airport code for departure (3 letters, e.g. DUB, LHR, JFK).
Example: DUB
destinationstringRequired
IATA airport code for arrival.
Example: JFK
departure_datestring (YYYY-MM-DD)Required
Outbound travel date in ISO 8601 format.
Example: 2026-07-15
return_datestring (YYYY-MM-DD)
Return travel date for round-trip itineraries. Omit this field for one-way searches.
Example: 2026-07-22
adultsintegerRequired
Number of adult passengers (12+ years). Must be ≥ 1.
Example: 2
childreninteger
Number of children aged 2–11. Lap infants use the infants field.
Example: 1
infantsinteger
Number of infants under 2 years (lap child, no separate seat).
Example: 0
cabin_classstring
Preferred cabin: economy, premium_economy, business, or first. Airlines may not offer all classes on all routes.
Example: economy
currencystring
ISO 4217 currency code for pricing preference (e.g. EUR, USD, GBP). Airlines may override with their native currency.
Example: EUR
airlinesarray<string>
IATA codes to restrict the search to specific carriers. Omit or leave empty to search all connected airlines.
Example: ["AA","LH"]
max_stopsinteger
Maximum number of stops. 0 = nonstop only, 1 = up to 1 connection, etc. Omit for any number of stops.
Example: 0

Response fields

offer_idstringRequired
Canonical offer ID. Use this value in subsequent price-lock, order creation, and servicing calls.
airlinestringRequired
IATA airline code (2 letters) of the operating carrier.
currencystringRequired
ISO 4217 currency code for all monetary values in this offer.
total_amountnumberRequired
Total price including taxes and fees. This is what the traveler pays.
base_farenumberRequired
Base fare before government taxes and carrier-imposed fees.
taxes_feesnumberRequired
Sum of all taxes and carrier fees (airport tax, security fee, fuel surcharge, etc.).
cabin_classstringRequired
Cabin class for this offer: economy, premium_economy, business, or first.
baggage_includedbooleanRequired
Whether checked baggage is included in the fare. true = at least one checked bag is free.
fare_familyobject
Branded fare details: id (programmatic identifier, e.g. saver) and name (human-readable, e.g. Saver).
slices[]arrayRequired
Itinerary slices. One-way = 1 slice, round-trip = 2 slices. Each slice represents a one-way journey.
slices[].segments[]arrayRequired
Flight segments within a slice. Nonstop = 1 segment, connecting = 2+ segments.
slices[].segments[].flight_numberstringRequired
Flight number with IATA carrier prefix (e.g. EI105, BA178).
slices[].segments[].aircraftstring
IATA aircraft type code (e.g. 333 for A330-300, 77W for 777-300ER).
expires_atstring (RFC 3339)Required
Offer expiry timestamp. The price is guaranteed until this time. Re-price after expiry.
Search offers · Norba API