NDC Primer
Background for engineers new to NDC (New Distribution Capability). You never write NDC with Norba; skip this if you know what AirShoppingRQ is.
What problem does NDC solve?
Airline content reached agencies through GDSs (global distribution systems) speaking EDIFACT, a 1980s messaging format that cannot describe branded fares and bundled extras.
NDC is the XML API standard of IATA (International Air Transport Association), run by each airline, so agencies can sell airline content directly.
What is NDC, technically?
- Schema: XML Schema Definitions published by IATA, versioned by year and release (17.2, 21.3, 24.1…).
- Transport: HTTPS POST with an XML body; each airline picks its own authentication.
- Envelope varies. Some airlines wrap messages in SOAP; the root element is always the operation (e.g. IATA_AirShoppingRQ).
- Every operation has a request (*RQ) and a response (*RS), one HTTP round trip.
Message families
NDC defines about 40 message pairs. These are the ones that matter:
Shopping (stateless, returns transient offers)
| Message | Purpose |
|---|---|
| AirShoppingRQ / RS | Find flights for a route and date; returns offers. |
| OfferPriceRQ / RS | Confirm an offer's price; returns a priced offer to book. |
| SeatAvailabilityRQ / RS | Seat map per segment. |
| ServiceListRQ / RS | List extras for an offer or an order. |
Order management (stateful, persists at the airline)
| Message | Purpose |
|---|---|
| OrderCancelRQ / RS | Cancel an order. |
| OrderChangeRQ / ViewRS | Change an order: pay, add extras, exchange flights. |
| OrderCreateRQ / ViewRS | Book a priced offer with passengers and, optionally, payment. |
| OrderReshopRQ / RS | Price alternatives or a refund for an existing order. |
| OrderRetrieveRQ / ViewRS | Fetch an order. |
Anatomy of an NDC message
Since 21.3 every message carries the distribution chain (who sells), payload attributes (schema version) and the request. A 21.3 AirShoppingRQ for one adult, Madrid to London:
<IATA_AirShoppingRQ
xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersMessage"
xmlns:cns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<DistributionChain>
<cns:DistributionChainLink>
<cns:Ordinal>1</cns:Ordinal>
<cns:OrgRole>Seller</cns:OrgRole>
<cns:ParticipatingOrg><cns:OrgID>MYAGENCY</cns:OrgID></cns:ParticipatingOrg>
</cns:DistributionChainLink>
</DistributionChain>
<PayloadAttributes>
<cns:VersionNumber>21.3</cns:VersionNumber>
</PayloadAttributes>
<Request>
<cns:FlightRequest>
<cns:FlightRequestOriginDestinationsCriteria>
<cns:OriginDestCriteria>
<cns:DestArrivalCriteria>
<cns:IATA_LocationCode>LHR</cns:IATA_LocationCode>
</cns:DestArrivalCriteria>
<cns:OriginDepCriteria>
<cns:Date>2027-03-15</cns:Date>
<cns:IATA_LocationCode>MAD</cns:IATA_LocationCode>
</cns:OriginDepCriteria>
</cns:OriginDestCriteria>
</cns:FlightRequestOriginDestinationsCriteria>
</cns:FlightRequest>
<cns:PaxList>
<cns:Pax><cns:PaxID>PAX1</cns:PaxID><cns:PTC>ADT</cns:PTC></cns:Pax>
</cns:PaxList>
</Request>
</IATA_AirShoppingRQ>How Norba abstracts NDC
You send JSON. One search to POST /v1/shopping/offers reaches every connected airline on the route and returns one list in one offer schema, cheapest first. Pricing, booking, payment and servicing use the same JSON contract for every airline.