Changelog
2026-09-28 — Public developer portal
The docs are now public at ndc.retailaer.com/docs/.
The sandbox API uses https://ndc.retailaer.com/24.4/<Message>, OAuth tokens
use /oauth/token, and self-service notification subscriptions use /subscriptions.
API calls still require an airline-issued OAuth token or API key. The OpenAPI
specification and downloadable Postman environment use the same public host.
Changelog
This documentation is generated from @oms/ndc-24-4; the changelog tracks the
documented API surface and the docs site.
24.4 — updates since v2
Each entry turns a documented limit into working behaviour; the Capabilities page shows the current status and remaining limits.
-
Travel documents are kept in full (Order with instant payment — now Supported).
Pax/IdentityDocon anOrderCreateRQused to be reduced to a nationality and a masked number; everything else was dropped, so the airline could never produce APIS data for a booking it had sold. The whole document is now stored: its type (IATA PADIS code list 7365), number, citizenship, issuing and residence countries, issue and expiry dates, the given, middle, sur- and suffix names and the title as written on the document, birth date and birthplace, and gender (ICAO Doc 9303F/M/U/X). It is treated as sensitive personal data: the number is encrypted at rest, it is erased once the trip is past, and it is readable in the clear only by an airline senior agent or supervisor who states a reason — recorded as an audit action. Nothing changes on the wire about secrecy.OrderViewRSnow states the document the airline holds — type, citizenship, issuing country, expiry and holder surname — with the number masked. The number you send is in no response, not even to the seller that sent it. It rides theOrderViewRSfamily only:ServiceListRS,SeatAvailabilityRSandServiceDeliveryRSstate the passengers without it. A document the airline cannot name is refused rather than stored on a guess: new errorsidentity_document_type_unknown(PADIS 9321718),identity_document_country_invalid(109) andidentity_document_invalid(914, which also covers a value longer thanIdentityDocTypeallows) — see Errors. Theidentity_document_maskedwarning stays, and now says the document is stored in full and shown masked; the newidentity_document_not_shownwarning says when the airline holds a document it cannot name, so silence is never read as "no document on file". A document is taken atOrderCreateRQonly. One sent onOrderChangeRQ(includingUpdatePax) orOrderReshopRQis refused withidentity_document_not_updatablerather than read and dropped — you are never told a change succeeded while the airline discarded the document. How long it is kept is on the Capabilities page with the rest of the limits: erased once the trip is past the airline's retention window, re-derived from the order so a date change moves it. Also stated there, because they bound what this guarantee is worth: nothing files APIS data with a border authority or a DCS; the visas a document may nest (IdentityDoc/Visa),AddlName,RedressCaseandFOIDare not read; and the encryption key has no rotation path today. -
Fare rules before booking; offers quote the brand policy (Offer conditions and restrictions — still Partial, materially closer). Every flight offer now carries its fare brand's own conditions — the airline's brand policy, the terms it applies once booked — instead of the supplier's base-fare conditions: Light is not changeable, Plus is refundable, every brand is cancellable and renameable. An offer whose brand policy cannot be read keeps the supplier's conditions and says so. The supplier's single change / cancellation fee is no longer quoted on the offer (the airline's fees go by the time before departure). Those conditions are recorded on the order at booking, so a booking is serviced by the terms it was SOLD under and not by a later change to the policy; an order booked before they were recorded is answered from today's policy and says so. Changeability is answered per direction, so a round trip sold under two brands states each direction's terms rather than its outbound's alone, and an order holding an unused Flexibility service is changeable under that service's terms whatever its fare says.
OrderRulesRQalso answers aFareRef: a fare quoted on an offer and not booked yet. Fares are priced per offer, not filed, soFareRefTextcarries theOfferIDthe fare was quoted in, andFareBasisCode,DepandArrivalmust match that offer's fare. The answer holds the conditions the offer carries, the fare brand's conditions and the servicing terms per time-to-departure band — onePenaltyper band and kind, in the order's currency. NoPenalty(booked or quoted) states a fee for something the fare does not allow. New errors:fare_not_found(PADIS 9321913) andfare_not_changeable(76H, a reshop of a fare that is not changeable); aFareRefwithoutFareRefTextismissing_offer_id; new warningfare_conditions_supplier— see Errors. What keeps it Partial is on the Capabilities page: cutoffs and band edges read departure times as UTC because the platform holds no airport time zones; the change fee is not keyed by fare brand, so it is charged on a brand whose published benefits say changes are free; fee amounts are the same raw number in every currency; and only changes are judged per direction — a cancel's refundability still comes from the outbound.What changes for you. The fare's
changeableis now ENFORCED on this channel.OrderReshopRQand the change actions on an order sold under a fare brand that does not allow changes —lightin the seeded ladder — are refused withfare_not_changeable(76H) where they previously priced a change. This applies to orders already in your book, not only new ones. Two things still let such an order change: an open disruption (the airline moved the flight, so the fare does not bind), and an unused Flexibility service on the order. If you sell fares from thelightrung, check your change flows againstOrderRulesRQbefore this release reaches you: it states, per direction, exactly what each order may do. -
Offer content in your language (Localised offers — now Implemented). Send
ResponseParameters/LangUsage/LangCode(orPayloadAttributes/PrimaryLangID): the airline's content — fare-brand names and benefits, station, cabin, service and partner-product names, seat descriptions, promotion names, captions — comes back in that language wherever the airline has translated it, inAirShoppingRS,OfferPriceRS,OrderViewRS,OrderReshopRS,ServiceListRSandSeatAvailabilityRS, and in English where it has not.Processing/LangUsagestates the languages of the content; the newcontent_language_fallbackwarning names what stayed English.Error/WarningLangCodeis now lower-caseen, the formLangUsageuses. -
Seat maps and seat changes on a booked order (Seat map — now Implemented; Seat options — now Partial).
SeatAvailabilityRQaccepts anOrderRequest: the seat map of each of the order's flights. Availability — before and after the sale — is the flight's seat map less the seats any booking holds, whichever channel sold them (NDC, the web storefront, Manage-My-Booking, check-in); every channel claims its seat under the same lock, so one seat is sold once and the loser of a race is refused (over NDC:seat_unavailable) with nothing charged. A seat is chosen or changed withOrderReshopRQ(ServiceOrder/AddOfferItemswithSeatCriteriaon a booked flight) and accepted withOrderChangeRQandPaymentFunctions, or bought directly withOrderChangeRQAcceptSelectedQuotedOfferListfrom the order's seat map. The new seat comes back with its EMD; a paid seat given up is released under the cancellation terms and its value exchanged into the new seat (its EMD couponE). Not included: after the sale a seat change is one passenger, one seat and one flight per message, and seats are reshopped and bought apart from extras. -
Extras on a booked order (Reshop for ancillaries — now Partial).
OrderReshopRQwithServiceCriteriaon a booked flight prices the airline's extras as frozen offers, per passenger;OrderChangeRQaccepts one withPaymentFunctions, or buys an item of the order'sALaCarteOfferdirectly. The extras come back with their EMDs — issued only once the payment is captured. A change is paid by card token, voucher or the seller's settlement plan: a settlement-plan payment after the sale is its own charge against the order, authorised against the agency's credit before the change is made (sale_not_recorded, HTTP 503: the sale's recording has not landed yet — retry), with its own commission — the agreement's percentage, or tier in the agreement's currency, on the charge's amount — and its own clearance; a leg left unfinished is finished by reconciliation only where that is provable — captured when the commit recorded it as paying, voided when it pays for no commit, otherwise handed to staff — and each refund releases the credit once. Not included: ground-transport rides (SHPMOD) and partner products are not added to a booked order, and a change cannot be paid by settlement plan under a flat-amount commission agreement (commission_rule_undefined: the agreement states no rule for it) or a tiered one stated in another currency (commission_currency_mismatch). A change whose voucher or loyalty payment fails to capture stands unpaid (no EMD) for staff. -
What a booked order can buy (Shop for / with ancillaries — now Implemented).
ServiceListRQaccepts anOrderRequest: the extras the order can add — the airline's published ancillaries, as Manage-My-Booking sells them — priced per passenger and flight, with their taxonomy codes, as anALaCarteOfferthe seller can buy from directly;OfferCriteria/ServiceCriteriaselect among them as for an offer. Rides stay with Transportation ancillaries and partner products with 3rd-party ancillaries. -
The IATA Airline Taxonomy on airline services, seats, rides and partner products (Airline Taxonomy — Partial). Every airline service, the pre-reserved seat and every ride carries its node from the public IATA/EASD Airline Taxonomy Codeset in
AirlineTaxonomy— theTaxonomyCode, with the codeset path asDescText(e.g.Flight / Checked Baggage / Bag,1450) — on itsServiceDefinition, and a service or ride also on its offer / order item. Rides areGround / Transport / Train(2E7C),Bus(2FA8) orTaxi(2DB4).ServiceListRQnow honoursOfferCriteria/ServiceCriteria:TaxonomyCode(a parent node such as13ECChecked Baggage selects the nodes below it),RFICandRFISC, withIncludeIndfalseto exclude. Codes that changed: a checked bag is1450(was its parent13EC), a meal044C(03F0is not in the codeset), priority boarding25E4. Partner products (3rd-party ancillaries) carry the node of their marketplace category — lounge access1B58, fast track26AC, airport transfers2CEC(Ground / Transport: cars and trains), train and bus transfers2E7C/2FA8, car rental2D50, hotel vouchers3138, eSIM319C, travel insurance and baggage protection3200, carbon offset0E10— on theirServiceDefinition(withRFIC/RFISCwhere the table states them) and their offer, priced and order items, and criteria select them like any other. Still Partial: food and drink, duty free, retail, airport parking, destination experiences and partner vouchers carry no node, because the codeset's node for them depends on where they are consumed (on board, in the terminal, in a lounge) or on what each one is, which no partner product records — they are listed without one and criteria that select by node,RFICorRFISCdo not return them. -
Ancillaries at shop time and structured baggage (Shop for / with ancillaries). An
AirShoppingRQwithOfferCriteria/ServiceCriteriareturns each offer'sALaCarteOfferbeside it — the airline's own services with the same items, ids and pricesServiceListRSgives for them, orderable inOfferPriceRQ/OrderCreateRQ, narrowed byRFIC/RFISC/TaxonomyCode(ground transport and partner products stay onServiceListRQ). New Warningsservices_limited,services_unavailableandservices_refusedsay which offers came without them and why.IncludeIndfalse removes the offers whose fare brand includes that bag;service_criteria_partly_appliedsays what could not be judged. Fare brands now carry the airline's structured baggage allowance:BaggageAllowance(Checked/Carry on, pieces, kg per bag) withBaggageAssociationsinAirShoppingRSandOfferPriceRS, and inOrderViewRSas a service per passenger and segment plus the e-ticket coupons'BaggageAllowanceRefID. A brand without a set allowance states none. -
Personalised offers (now Implemented). Offers are priced for this airline's loyalty members and for your agreements as the authenticated seller — optionally with a negotiated programme's
OfferCriteria/ProgramCriteria/ProgamContract/ContractID. Member pricing needs every fare-paying passenger to carry this airline'sLoyaltyProgramAccounttogether with the account holder's name (Individual/GivenName+Surname); the airline checks both and looks the tier up itself. The order is bound to those accounts:OrderCreateRQmust carry them on the same travellers, or it is refused withmember_pricing_not_eligible(753); an offer priced for a seller can be booked by that seller only. Passenger types reach pricing as sent (SRC,STU, …) with ages. New warnings:member_pricing_applied,member_pricing_not_applied,loyalty_pricing_unavailable,program_criteria_not_applied,program_account_not_applied— see Errors. -
Price points with dynamic adjustments (now Implemented). The airline's NDC pricing rules apply to every shop, not only with a promotion code: discounts down and surcharges up, itemised in
Price/DiscountandPrice/Surcharge(a namedBreakdownper surcharge and itsTotalAmount) on the offer and on each offer item, inAirShoppingRS,OfferPriceRS(also with services selected) andOrderViewRS. A fixed amount defined in another currency than your offers is not applied (never converted). New warnings:price_adjustments_unavailable,price_adjustment_currency_not_applied. -
Every coupon on the e-ticket (Order retrieve — now Implemented). A traveller's trip with more than four flown segments is issued as a primary e-ticket plus conjunction tickets with consecutive numbers, four coupons each.
OrderViewRSandOrderSalesInformationNotifRQrender them as oneTicketDocInfoof up to fourTickets:CouponNumberrestarts at 1 on each ticket,CouponSeqNumberorders the coupons across the journey, andPrimaryDocIndmarks the primary ticket. -
Loyalty points pay (Mixed payment instruments and Payment summary — now Implemented).
PaymentFunctionsacceptsLoyaltyRedemptionbeside cards, vouchers and the settlement plan: the member'sLoyaltyProgramAccount/AccountNumberplus a redemption certificate (CertificateNumber) the member issues in their loyalty account — their consent, one-time, capped and expiring; the account number alone never redeems points. The airline values the points at its programme's redemption rate (LoyaltyCurAmount, when sent, must match). A refund goes back to every leg that paid, newest first — points included — andOrderViewRSlists each payment and refund with its form of payment, points with the masked account. New errors (PADIS 9321Code):loyalty_account_invalid(753),loyalty_certificate_invalid(706) andloyalty_points_insufficient(423) — see Errors. -
The public sandbox is live (Sandbox — now Implemented).
https://demo.retailaer.comanswers NDC 24.4 messages at/ndc/24.4/<Message>with OAuth 2.0 client-credentials tokens from/api/ndc-api/oauth/token; sandbox credentials are issued by the airline. The supply behind it is simulated and says so in every response. -
Settlement platform — limit restated. The remaining gap is the connection to IATA's BSP (the NDC services required by PAConf Resolution 850); settlement plans themselves work as documented.
-
Partner products (3rd-party ancillaries — now Partial).
ServiceListRQalso lists the partner products the airline offers NDC sellers for the offer's trip, each with aServiceDefinitionnaming the partner. A product's variants are separate offer items; a product with options is a service bundle whose options you choose withSelectedBundleServices(each option states what it adds to the price). Price them inOfferPriceRQand order them with the flight inOrderCreateRQ, paid by the same payment;OrderViewRSshows each with its delivery status. A product is sold once per order and needs a contact email to be delivered to. Not sold over NDC: Arcube-connected products and marketplace bundles; adding a partner product to a booked order is not yet supported. -
Fulfilment notifications for partner products (now Implemented). When a partner fulfils a partner product sold over NDC, subscribed sellers receive a
ServiceDeliveryNotifRQnaming only that item, with the partner as theDeliveryProvider. Services delivered with no ticket or EMD behind them (a seat sold for nothing) are notified as before. -
Ground transport timed to the flight (Transportation ancillaries — now Implemented).
ServiceListRQlists rail, coach and private-car rides to and from the airport, timed to the offer's departures and arrivals, priced per traveller (rail, coach) or per vehicle (car). Price them inOfferPriceRQand order them with the flight inOrderCreateRQ. Simulated ride supply is flagged with the simulated-inventory Warning. Adding a ride to a booked order is not yet supported.
24.4 — seller-grade NDC (v2)
What each capability covers, and its limits, is on the Capabilities page.
Sellers and access
- Credentials are issued per seller (OAuth 2.0 client credentials). Every message checks
the credentials' scopes, and the
DistributionChainnames the seller a call acts for — an aggregator may name the agencies it is granted. - Orders belong to the seller that booked them: another seller's order answers exactly like one that does not exist.
Shopping
AirShoppingRScarries fare brands, change and cancel conditions, promotions (promo codes) and multi-city / open-jaw journeys in typed DataLists.ServiceListRQlists the airline's ancillaries (bags, meals, wifi, priority, lounge, …) with IATA taxonomy codes where verified;SeatAvailabilityRQreturns seat maps with price points;OfferPriceRQre-prices an offer together with the services and seats chosen.
Ordering and payment
OrderCreateRQbooks one or more offers with services and seats, idempotent onCorrelationID+TrxID, and pays by PSP card token (with 3-D Secure), voucher, the seller's settlement plan, or a mix of them. Sent withoutPaymentFunctions, the order is held until its payment time limit and paid later withOrderChangeRQ.- Card numbers are refused (
pan_not_accepted): pay with a token. OrderViewRSshows passengers, segments, services, seats, tickets and EMDs with coupon status, payments, refunds and the seller's commission.OrderRetrieveRQ,OrderHistoryRQandOrderListRQ(the seller's own orders, cursor-paged) read it back.
Servicing
OrderReshopRQprices a date change, a name change or a cancellation (of the whole order or of items) as an offer with its differential, fees and refund;OrderChangeRQaccepts exactly that offer, pays a held order, or updates the booking contact.OrderRulesRQreturns a booked order's conditions, fees and cutoffs.- Refunds go back to the tenders that paid; a cancellation can return a reusable travel credit instead.
Notifications and delivery
- Self-service subscriptions with signed deliveries and replay:
OrderChangeNotifRQfor changes the airline makes (including an unpaid order cancelled at its payment time limit),ServiceStatusChangeNotifRQandServiceDeliveryNotifRQas services are delivered.ServiceDeliveryRQreports a booked order's delivery status.
Settlement and accounting
- The PaymentClearance messages (clearance, cancellation, list, clearing history) and their notifications, over a simulated clearance manager.
- The airline's accounting receives
OrderSalesInformationNotifRQon every sale, change, refund and void, andOrderClosingNotifRQwhen an order closes.
Sandbox and documentation
- The sandbox is live at
https://demo.retailaer.com(messages at/ndc/24.4/<Message>, token at/api/ndc-api/oauth/token); the Postman environment points at it. - Every reference page says whether the airline implements the message — Implemented, Partial or Not implemented — read from the gateway's capability registry, and the Capabilities page names the sandbox scenario behind each capability.
- New guides: Onboarding (credentials → shop → book and pay → cancel) and Notifications (subscribe, verify signatures, replay).
- A Postman Negative tests folder: one request per documented error, each held to its documented answer by the gateway's own tests.
- All 48 generated examples now validate against the original XSDs (the PaymentClearance family's types no longer collide with the Offers & Orders ones).
24.4 — initial release
- 48 NDC 24.4 services documented across seven domain groups: Shopping & Pricing, Order Management, Servicing & Delivery, Airline Profile, Interline, Payment Clearance, and Acknowledgement.
- A reference page per message with a generated, XSD-validated request example, the paired response example, the top-level field model, and a copy-paste SDK snippet.
- An OpenAPI 3.1 contract (/api/) rendered in-site with Redoc — one
POSToperation per request/notification, withapplication/xmlbodies. - A Postman v2.1 collection plus sandbox and production environments, with OAuth token handling and saved example responses.
- Narrative guides: getting started, core concepts, authentication, and errors.
Known limitations
- 38 of 48 generated examples validate against the original XSDs. The remaining ten
(eight Payment Clearance messages plus
OrderChangeNotifRQandOrderRulesRQ) carry a minimal sample pending choice-group-aware example generation; they are flagged on their reference pages.
A new documentation version is snapshotted when a future NDC schema set is adopted. Until then, 24.4 is the single published version.