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-KeyThis 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:
- Fare family branding (e.g.
- Baggage inclusion flag
- Cabin class (economy, premium_economy, business, first)
-
- 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.
- 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 thenCapabilities:- 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-KeystringRequiredOpaque 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
originstringRequiredIATA airport code for departure (3 letters, e.g.
DUB, LHR, JFK).Example:
DUBdestinationstringRequiredIATA airport code for arrival.
Example:
JFKdeparture_datestring (YYYY-MM-DD)RequiredOutbound travel date in ISO 8601 format.
Example:
2026-07-15return_datestring (YYYY-MM-DD)Return travel date for round-trip itineraries. Omit this field for one-way searches.
Example:
2026-07-22adultsintegerRequiredNumber of adult passengers (12+ years). Must be ≥ 1.
Example:
2childrenintegerNumber of children aged 2–11. Lap infants use the
infants field.Example:
1infantsintegerNumber of infants under 2 years (lap child, no separate seat).
Example:
0cabin_classstringPreferred cabin:
economy, premium_economy, business, or first. Airlines may not offer all classes on all routes.Example:
economycurrencystringISO 4217 currency code for pricing preference (e.g.
EUR, USD, GBP). Airlines may override with their native currency.Example:
EURairlinesarray<string>IATA codes to restrict the search to specific carriers. Omit or leave empty to search all connected airlines.
Example:
["AA","LH"]max_stopsintegerMaximum number of stops.
0 = nonstop only, 1 = up to 1 connection, etc. Omit for any number of stops.Example:
0Response fields
offer_idstringRequiredCanonical offer ID. Use this value in subsequent price-lock, order creation, and servicing calls.
airlinestringRequiredIATA airline code (2 letters) of the operating carrier.
currencystringRequiredISO 4217 currency code for all monetary values in this offer.
total_amountnumberRequiredTotal price including taxes and fees. This is what the traveler pays.
base_farenumberRequiredBase fare before government taxes and carrier-imposed fees.
taxes_feesnumberRequiredSum of all taxes and carrier fees (airport tax, security fee, fuel surcharge, etc.).
cabin_classstringRequiredCabin class for this offer:
economy, premium_economy, business, or first.baggage_includedbooleanRequiredWhether checked baggage is included in the fare.
true = at least one checked bag is free.fare_familyobjectBranded fare details:
id (programmatic identifier, e.g. saver) and name (human-readable, e.g. Saver).slices[]arrayRequiredItinerary slices. One-way = 1 slice, round-trip = 2 slices. Each slice represents a one-way journey.
slices[].segments[]arrayRequiredFlight segments within a slice. Nonstop = 1 segment, connecting = 2+ segments.
slices[].segments[].flight_numberstringRequiredFlight number with IATA carrier prefix (e.g.
EI105, BA178).slices[].segments[].aircraftstringIATA aircraft type code (e.g.
333 for A330-300, 77W for 777-300ER).expires_atstring (RFC 3339)RequiredOffer expiry timestamp. The price is guaranteed until this time. Re-price after expiry.