NDC Primer
Aimed at the engineer who has never seen an NDC message before. Skip this page if you already know what AirShoppingRQ is.
What problem does NDC solve?
Until ~2015, airline content reached travel agencies through three or four global distribution systems (Sabre, Amadeus, Travelport). Those GDSes spoke EDIFACT — a 1980s electronic data format excellent at "find me the cheapest fare" and terrible at "sell me this branded bundle with priority boarding and a 23 kg bag."
Airlines wanted to merchandise the way Amazon does. So IATA published NDC — a modern, XML-based, airline-controlled API standard. The airline runs the API itself, the agency calls it directly, and the GDS becomes optional.
What is NDC, technically?
- Schema family: a set of XML Schema Definitions published by IATA EDIST. Each version is dated (17.2, 21.3, 23.3…).
- Transport: HTTPS POST. Body is XML. Auth is whatever the airline picks — most use OAuth2 client-credentials, some HTTP Basic, a few mutual TLS.
- No SOAP envelope. The root element is the operation itself (e.g. AirShoppingRQ).
- Every operation has a request (*RQ) and response (*RS). The pair is one HTTP round trip.
Message families
NDC has ~40 message pairs in total. In practice, you only implement these:
Shopping (stateless, returns transient offers)
| Message | Purpose |
|---|---|
| AirShoppingRQ / RS | Find flights from A to B on date D. Returns AirlineOffers. |
| FlightPriceRQ / RS | Re-price a previously returned offer with the latest fare. |
| OfferPriceRQ / RS | Convert a non-binding offer into a priced offer ready to book. |
| ServiceListRQ / RS | List ancillaries available against a priced offer (bags, seats, meals). |
| SeatAvailabilityRQ / RS | Seat map per segment. |
Order management (stateful, persists at the airline)
| Message | Purpose |
|---|---|
| OrderCreateRQ / ViewRS | Create an order from priced offers + passenger data + payment. |
| OrderRetrieveRQ / ViewRS | Fetch current state of an order. |
| OrderChangeRQ / ViewRS | Mutate an order: add SSRs, exchange flights, add ancillaries. |
| OrderCancelRQ / CancelRS | Cancel (and refund if applicable). |
| OrderReshopRQ / RS | Find alternative flights for a disrupted order. |
| OrderHistoryRQ / RS | Airline-side audit log of changes. |
Anatomy of an NDC message
Every message shares the same outer shape:
<AirShoppingRQ xmlns="http://www.iata.org/IATA/EDIST/2021.3"
Version="21.3" CorrelationID="abc-123">
<Document>
<Name>NDC Aggregator</Name>
<ReferenceVersion>21.3</ReferenceVersion>
</Document>
<Party>
<Sender>
<TravelAgencySender>
<AgencyID>MYAGENCY</AgencyID>
</TravelAgencySender>
</Sender>
</Party>
<CoreQuery>
<OriginDestinations>
<OriginDestination>
<Departure><AirportCode>MAD</AirportCode><Date>2026-06-15</Date></Departure>
<Arrival><AirportCode>LHR</AirportCode></Arrival>
</OriginDestination>
</OriginDestinations>
</CoreQuery>
</AirShoppingRQ>How Norba abstracts NDC
You never write XML. The Norba API accepts a simple JSON SearchRequest, fans it out to every connected airline simultaneously, normalises all NDC responses into a single canonical Offer model, and returns a single ranked JSON array. The NDC complexity stays inside the adapters.