Guides · NDC

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)

MessagePurpose
AirShoppingRQ / RSFind flights from A to B on date D. Returns AirlineOffers.
FlightPriceRQ / RSRe-price a previously returned offer with the latest fare.
OfferPriceRQ / RSConvert a non-binding offer into a priced offer ready to book.
ServiceListRQ / RSList ancillaries available against a priced offer (bags, seats, meals).
SeatAvailabilityRQ / RSSeat map per segment.

Order management (stateful, persists at the airline)

MessagePurpose
OrderCreateRQ / ViewRSCreate an order from priced offers + passenger data + payment.
OrderRetrieveRQ / ViewRSFetch current state of an order.
OrderChangeRQ / ViewRSMutate an order: add SSRs, exchange flights, add ancillaries.
OrderCancelRQ / CancelRSCancel (and refund if applicable).
OrderReshopRQ / RSFind alternative flights for a disrupted order.
OrderHistoryRQ / RSAirline-side audit log of changes.

Anatomy of an NDC message

Every message shares the same outer shape:

XML·AirShoppingRQ.xml
<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.