Skip to main content

Capabilities

Generated from the gateway's capability registry (apps/ndc-api/src/capabilities.ts) — the same registry its /healthz reports and the IATA comparison sheet's column K is regenerated from (pnpm ndc:capabilities). 52 implemented, 8 partial, 10 not implemented.

Every implemented or partial capability names its sandbox scenario: an automated test under apps/ndc-api/test/ that sends the NDC XML in, checks the business content and the XSD validity of what comes out. Run them with pnpm --filter @oms/ndc-api test.

Shop​

SHPFLT — Shop for flights​

StatusImplemented
MessagesAirShoppingRQ, OfferPriceRQ
Sandbox scenarioapps/ndc-api/test/capabilities/SHPFLT.test.ts
Simulated supplyinventory

SHPOPE — Multi-city / open jaw​

StatusImplemented
MessagesAirShoppingRQ, OrderCreateRQ
Sandbox scenarioapps/ndc-api/test/capabilities/SHPOPE.test.ts
Simulated supplyinventory

SHPITL — Flights operated by other airlines​

StatusImplemented
MessagesAirShoppingRQ, OfferPriceRQ
Sandbox scenarioapps/ndc-api/test/capabilities/SHPITL.test.ts
Simulated supplyinventory

SHPANC — Shop for / with ancillaries​

StatusImplemented
MessagesAirShoppingRQ, ServiceListRQ, OfferPriceRQ, OrderCreateRQ, OrderRetrieveRQ
Sandbox scenarioapps/ndc-api/test/capabilities/SHPANC.test.ts
LimitsServiceListRS carries the full ServiceDefinitionList and priced à-la-carte items per segment / journey and passenger, for an offer and (post-sale) for a booked order. An AirShoppingRQ with OfferCriteria/ServiceCriteria also gets each offer's ALaCarteOffer of the airline's catalogue services — the same items and opaque ids ServiceList issues for them, orderable in OfferPrice / OrderCreate, narrowed to the requested RFIC / RFISC / Airline Taxonomy code — for the first NDC_SHOP_SERVICES_MAX_OFFERS offers, each read within a timeout and all within a deadline, fail-open (a Warning names what was not listed and whether it was transient); the rides (SHPMOD) and partner products (SHPAN3) ServiceList also lists are not shopped with the offers. An excluding criterion (IncludeInd false) removes the offers whose fare brand includes a classified bag it names; anything else a brand bundles is only text and is not filtered (a Warning says so). A fare brand's structured bag allowance (checked / cabin pieces and kg per piece, entered per fare family in the catalogue) is a BaggageAllowance (Checked / Carry on) in AirShoppingRS / OfferPriceRS / OrderViewRS for the fare-paying passengers; a brand the catalogue gives none states none. A booked order's ServiceList covers the airline's extras (Manage-My-Booking's catalogue, bought with ORDRE2); rides are SHPMOD and partner products SHPAN3.
Simulated supplyinventory

SHPAN2 — Airline ancillaries​

StatusImplemented
MessagesServiceListRQ, OfferPriceRQ, OrderCreateRQ
Sandbox scenarioapps/ndc-api/test/capabilities/SHPAN2.test.ts
LimitsThe Airline Product Catalog (bags, meals, wifi, priority, lounge, pets, flex) is listed, re-priced in OfferPrice by the ordering domain and ordered with the flight in OrderCreate; adding one to a booked order is ORDRE2.
Simulated supplyinventory

SHPAN3 — 3rd-party ancillaries​

StatusPartial
MessagesServiceListRQ, OfferPriceRQ, OrderCreateRQ, OrderRetrieveRQ
Sandbox scenarioapps/ndc-api/test/capabilities/SHPAN3.test.ts
LimitsPartner (marketplace) products an admin opted into the marketplace's ndc channel are listed for an offer's trip with the partner named — each variant its own offer item, a product's options chosen from its service bundle (SelectedBundleServices) — re-priced by the ordering domain in OfferPrice and ordered with the flight in OrderCreate (captured with the marketplace, paid by the same tenders, their fulfilment shown on the order). Not sold over NDC: Arcube-connected products (session-bound offers that need supplier-specific booking fields) and marketplace bundles (capture prices a bundle from its components against a snapshot discount, and the catalogue states no price for a sum-priced one). Each product is sold once per order, a partner product needs a contact email to be delivered to, and a partner product is not added to a booked order (ORDRE2 adds airline extras and seats only).
Simulated supplyinventory

SHPMOD — Transportation ancillaries​

StatusImplemented
MessagesServiceListRQ, OfferPriceRQ, OrderCreateRQ
Sandbox scenarioapps/ndc-api/test/capabilities/SHPMOD.test.ts
LimitsRail, coach and private-car rides timed to the offer's departures and arrivals (configured check-in / connection buffers) are listed, re-priced in OfferPrice by the ordering domain and ordered with the flight in OrderCreate; a ride cannot be added to a booked order (ORDRE2 adds airline extras and seats, not rides).
Simulated supplyinventory

SHPSRV — Airline Taxonomy​

StatusPartial
MessagesServiceListRQ, SeatAvailabilityRQ, OfferPriceRQ, OrderRetrieveRQ
Sandbox scenarioapps/ndc-api/test/capabilities/SHPSRV.test.ts
LimitsThe airline services, the pre-reserved seat, the rides (SHPMOD) and the partner products (SHPAN3) sold over NDC each carry their IATA Airline Taxonomy node, where one is classified (AirlineTaxonomy: TaxonomyCode + the codeset path as DescText), on their ServiceDefinition — and a service, ride or partner product also on its offer / priced / order item — from the versioned D8 table (packages/marketplace-shared airline-taxonomy), whose every code is checked against the public IATA/EASD Airline Taxonomy Codeset (page version 3 of 2026-02-11, checked in beside the table); a marketplace airline product is classified by what it is — its type, refined by its own attribute where its instances differ (priority scope, pet carriage, equipment type, IFE plan) — and a partner product by its marketplace category, stamped by the marketplace on its eligibility feed: lounge access (1B58), fast track (26AC), airport transfers (2CEC Ground / Transport — they are cars and trains), train and bus transfers (2E7C, 2FA8), car rental (2D50), hotel vouchers (3138), eSIM (319C), travel insurance and baggage protection (3200), carbon offset (0E10). ServiceListRQ ServiceCriteria select by TaxonomyCode (a parent node matches the nodes below it), RFIC or RFISC, partner products included. Sold with NO node — and so never returned to a criterion that selects by node, RFIC or RFISC, while an exclusion keeps them: a pet shipped as cargo (the codeset has no cargo concept), an airline product with no registered type, and every partner product whose node depends on what no partner product records. The codeset’s food, drink and shopping nodes are tied to where the product is consumed (on board, within the terminal, within a lounge) and the marketplace records no point of consumption for a partner product (only the airports it is offered at), so these carry none: food and drink (coffee shop, restaurant and pre-flight dining categories), duty free (on board, collected in the terminal or shipped home), retail (apparel, electronics, general: a terminal shop or shipped), airport parking (the codeset’s only parking node is offsite), destination experiences (passes, travelcards and meet & greets share no node) and the generic buckets (partner vouchers, services, travel services); a partner category added later carries none until the table keys it. Bilateral TaxonomyFeature sub-codes are not used.

SHPSTO — Seat options​

StatusPartial
MessagesSeatAvailabilityRQ, OfferPriceRQ, OrderCreateRQ, OrderReshopRQ, OrderChangeRQ
Sandbox scenarioapps/ndc-api/test/capabilities/SHPSTO.test.ts
LimitsSeats from each flight's seat map (SeatAvailability) are priced in OfferPrice and ordered with the flight in OrderCreate, sold once across every channel. After the sale a seat change is one passenger, one seat and one flight per message: an OrderReshopRQ names one flight (OriginDestCriteria), one passenger (PaxList) and one seat (SeatCriteria), and an OrderChangeRQ buying from the order's seat map selects one seat (SelectedSeat) for one passenger; seats are reshopped and bought apart from extras (SeatCriteria and ServiceCriteria in separate OrderReshopRQs, a seat and extras in separate OrderChangeRQs).
Simulated supplyinventory, payment

SHPSTA — Seat map and availability​

StatusImplemented
MessagesSeatAvailabilityRQ
Sandbox scenarioapps/ndc-api/test/capabilities/SHPSTA.test.ts
Simulated supplyinventory

SHPSTP — Seat price points​

StatusImplemented
MessagesSeatAvailabilityRQ
Sandbox scenarioapps/ndc-api/test/capabilities/SHPSTP.test.ts
Simulated supplyinventory

SHPPER — Personalised offers (PTC, loyalty, agreements)​

StatusImplemented
MessagesAirShoppingRQ
Sandbox scenarioapps/ndc-api/test/capabilities/SHPPER.test.ts
LimitsPassenger types (the request's PTC) and ages, the authenticated seller's agreements (optionally a ContractID from OfferCriteria/ProgramCriteria of this airline's programmes) and this airline's loyalty tiers price offers through the Staff Console promotions engine, for rules that target the NDC channel. Member pricing is all-or-nothing per party — a product choice, fail-closed: it applies only when every fare-paying passenger carries this airline's account with the account holder's name (checked by the platform; an unknown or unverified account is priced exactly as no account), otherwise the party is priced as guests with a Warning; there is no per-passenger tier pricing within a party. Every offer of a member-priced shop is bound to those accounts (kept internal, as keyed MACs): OrderCreate must carry them in the holders' names, else it is refused (753); the tier is the one priced at shop (the offer's lifetime) and is not re-read at OrderCreate. An offer priced for a seller can be booked by that seller only. Personalised pricing is given to the NDC gateway alone — a shop that does not present the gateway's own credential is priced as an anonymous public shop, with no adjustments at all. If the platform credentials the offer and ordering services share do not match, an offer's binding cannot be read and it is REFUSED at OrderCreate rather than booked unbound. Reshop alternatives (OrderReshop) are priced without member or agreement adjustments, so a flight change re-prices the changed bound at the public fare: a member or agreement discount carried on it is clawed back in the change quote (and any surcharge on it refunded). A ProgramCriteria without such a ContractID, and any ProgramAccount, is reported in a Warning, not applied.
Simulated supplyinventory

SHPLOC — Localised offers​

StatusImplemented
MessagesAirShoppingRQ, OfferPriceRQ, ServiceListRQ, SeatAvailabilityRQ, OrderCreateRQ, OrderRetrieveRQ, OrderChangeRQ, OrderReshopRQ
Sandbox scenarioapps/ndc-api/test/capabilities/SHPLOC.test.ts
LimitsPrices come in the requested currency. The airline’s content (fare-brand names and benefits, station, cabin, service and partner-product names, seat descriptions, promotion names, picture captions) comes in the requested language (LangUsage, else PrimaryLangID) where the airline has translated it in the Staff Console, otherwise in English with a content_language_fallback Warning naming it, and Processing/LangUsage states the languages of the content. The same applies to OrderViewRS, OrderReshopRS, ServiceListRS and SeatAvailabilityRS. Text the gateway composes (penalty, rule, ride and baggage-allowance descriptions, fee labels, warnings, errors) is English. Carrier, operator and aircraft names are proper names and are not translated. Languages are matched on the primary subtag, so zh-Hant and zh-Hans both resolve to zh, and pt-BR and pt-PT both to pt — a request for one script or region may be answered in the other. Text a supplier localised itself is passed through labelled en, whatever language it is actually in.
Simulated supplyinventory

SHPBND — Bundled offers​

StatusImplemented
MessagesAirShoppingRQ, OfferPriceRQ
Sandbox scenarioapps/ndc-api/test/capabilities/SHPBND.test.ts
Simulated supplyinventory

SHPREV — Price points with dynamic adjustments​

StatusImplemented
MessagesAirShoppingRQ, OfferPriceRQ
Sandbox scenarioapps/ndc-api/test/capabilities/SHPREV.test.ts
LimitsThe price points are the offer engine's fares and fare-brand ladder; the adjustments are the Staff Console promotions engine's auto-apply rules that explicitly target the NDC channel — discounts down and surcharges up — itemised as Discount and Surcharge per offer and item and recorded on the order (its lines at what they cost, so refunds, bound cancels and divides work from what was paid; OrderViewRS states the breakdown only while the order stands at the total it was recorded for). Whenever the promotions engine cannot be asked for a shop — promotion criteria not switched on, or the engine unreachable, slow or refusing — that shop is priced with NO adjustments at all and a Warning says so: it is all-or-nothing, so SURCHARGES are dropped along with discounts (an unpriced surcharge is never added later). A surcharge is part of what the order costs: the seller's commission and the traveller's loyalty earn are both computed on the order total INCLUDING it — a deliberate rule, not an oversight. A fixed amount or cap applies only to offers priced in its own currency (never converted): elsewhere the rule is not applied and a Warning says so. Reshop alternatives (OrderReshop) are priced without these adjustments, so a flight change re-prices the changed bound at the unadjusted fare: a surcharge carried on it is refunded in the change quote (and a discount on it clawed back). Continuous (demand-shaped) pricing is a separate capability, SHPCPR.
Simulated supplyinventory

SHPDSC — Discounts / promotions​

StatusImplemented
MessagesAirShoppingRQ, OfferPriceRQ, OrderCreateRQ
Sandbox scenarioapps/ndc-api/test/capabilities/SHPDSC.test.ts
Simulated supplyinventory

SHPRMD — Rich media​

StatusImplemented
MessagesAirShoppingRQ, OfferPriceRQ
Sandbox scenarioapps/ndc-api/test/capabilities/SHPRMD.test.ts
Simulated supplyinventory

SHPOR1 — Offer conditions and restrictions​

StatusPartial
MessagesAirShoppingRQ, OfferPriceRQ, OrderRulesRQ
Sandbox scenarioapps/ndc-api/test/capabilities/SHPOR1.test.ts
LimitsEvery flight offer on this channel carries its fare brand’s own conditions — the airline’s brand policy, the terms the servicing engine applies once booked: changeable and refundable from the policy, cancellable and renameable as the engine allows. An offer whose brand policy cannot be read keeps the supplier’s conditions and says so (fare_conditions_supplier). Those conditions are frozen onto the order at booking and read back by the engine, so a booking is serviced by the terms it was sold under and not by a later edit of the policy or a rename of the brand; an order booked before they were stored falls back to today’s policy and every quote and listing says so. Changeability is judged per direction, so a round trip sold Light out and Plus back is not refused on the strength of its outbound, and OrderRulesRS states each direction’s terms when they differ. An order holding an active, unused Flexibility service is changeable under that service’s terms whatever its fare says, and the service is consumed once. OrderRulesRQ answers a booked order (OrderStructureKey: its fare conditions, servicing fees, cutoffs and live eligibility) and a quoted fare before booking (FareRef, with the OfferID it was quoted in as FareRefText: the conditions its offer carries, the brand policy and the servicing terms per time-to-departure band). No Penalty states a fee for what the fare does not allow, and the machine channels refuse a change on a fare that is not changeable (fare_not_changeable). Fares are priced per offer, not filed: a fare basis alone is refused (missing_offer_id). STILL PARTIAL: (1) the platform holds no airport time zones — the only such data in the repo covers 62 of the 112 airports it sells and belongs to a storefront package — so departure times are read as UTC and every cutoff and band edge (72h / 24h) is out by the origin’s UTC offset, up to 13 hours; (2) the change fee the engine charges (25/50/75 by band) is not keyed by fare brand, so it is charged on Plus too, contradicting that brand’s published “Free changes” benefit — a data inconsistency between the catalogue and the rule table, not a mapping gap; (3) servicing fees are rule-table integers with no currency of their own and are charged as the same raw number in every currency, so 2500 is EUR 25.00 on one order and SEK 25.00 or JPY 2500 on another; (4) only CHANGES are judged per direction — a cancel’s refundability, and the conditions OrderRulesRS states for the order as a whole, still come from the outbound direction alone, so a round trip sold non-refundable out and refundable back is refunded as non-refundable. By design rather than a gap: the airline’s own staff are never refused by the fare. An agent may change a fare that forbids it, and the engine records the override on the quote and in the audit trail instead of turning the customer away; a customer’s Flexibility is spent only when the agent asks for it.
Simulated supplyinventory

SHPAFF — Affinity shopping​

StatusNot implemented
Not in scopeWe are the airline, not an OTA; offer-api requires an origin and destination.

SHPCMF — Comparative shopping (fares)​

StatusNot implemented
Not in scopeWe are the airline, not an OTA.

SHPCMA — Comparative shopping (ancillaries)​

StatusNot implemented
Not in scopeWe are the airline, not an OTA.

SHPCPR — Continuous pricing​

StatusNot implemented
Not in scopeRoadmap W3 (demand-shaped pricing) — needs a pricing engine, not a gateway mapping.

SHPDVC — Device types​

StatusNot implemented
Not in scopeNo commercial behaviour until personalisation consumes the device.

Order​

ORDWPM — Create order without payment​

StatusImplemented
MessagesOrderCreateRQ
Sandbox scenarioapps/ndc-api/test/capabilities/ORDWPM.test.ts
Simulated supplyinventory

ORDCRE — Order with instant payment​

StatusImplemented
MessagesOrderCreateRQ
Sandbox scenarioapps/ndc-api/test/capabilities/ORDCRE.test.ts
LimitsBooks one or more offers with airline services and seats for fully described passengers (title, birth date, loyalty, contact, travel documents), idempotent on CorrelationID + TrxID, paid through the payment ledger by card tokens, vouchers, the seller’s settlement plan or the member’s loyalty points (with the redemption certificate the member issues in their account); an order sent without PaymentFunctions is held unpaid (ORDWPM); ground transport (SHPMOD) and partner products (SHPAN3) are ordered with the flight in the same OrderCreate. A passenger’s IdentityDoc is stored IN FULL by the ordering module as sensitive personal data — 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 9303 F/M/U/X) — with the number encrypted at rest (AES-256-GCM) and readable in the clear ONLY by an airline senior agent or supervisor who names one document and states a reason, recorded as a pii.reveal audit action naming that document and never its value. The number is in NO response, not even to the seller that sent it. Where the document is shown at all it is shown masked — its type, citizenship, issuing country, expiry and holder surname — and it is shown in OrderViewRS ALONE (OrderCreate, OrderRetrieve, OrderChange). Every other message states the passengers without it: ServiceListRS, SeatAvailabilityRS, ServiceDeliveryRS, OrderReshopRS, the accounting view, and the pushed OrderChangeNotifRQ snapshot — that one is delivered to a subscription endpoint rather than to whoever supplied the document, and what changed on an order is not a reason to send it. A document held under a type this airline cannot name is not shown at all, and the response says so (identity_document_not_shown) rather than letting the seller read silence as "no document on file". A document the airline cannot name is REFUSED rather than stored on a guess: an IdentityDocTypeCode outside PADIS 7365 (identity_document_type_unknown), a country code that is not ISO 3166-1 alpha-2 (identity_document_country_invalid), a malformed date, a gender outside ICAO Doc 9303, a missing number or holder surname, or a value longer than IdentityDocType allows — names 64 (up to five GivenName, three MiddleName), SuffixName / TitleName 16, BirthplaceText 200, IdentityDocID 60 (identity_document_invalid). PADIS 7365 codes 711 and 9PT are refused with the rest: the Code Set Directory 24.4 states no meaning for either. A document is taken at OrderCreate ONLY. One sent on OrderChangeRQ (UpdatePax included) or OrderReshopRQ is REFUSED (identity_document_not_updatable), never read and dropped: those are the messages on which a seller could reasonably believe it was updating the stored document, and being told a change succeeded while the airline discarded the document is the failure this capability exists to remove. On the shopping and listing messages that also carry a PaxList — AirShoppingRQ, OfferPriceRQ, ServiceListRQ and SeatAvailabilityRQ — a document is IGNORED rather than refused: it is not stored, not returned and not logged, and nothing on those messages could be updating one. They are not refused because OrderViewRS hands back the masked document, so a seller echoing that PaxList into a follow-up ServiceListRQ or SeatAvailabilityRQ for the same order would otherwise be refused for quoting us to ourselves. Do not send a document on them. NOT read from the document: the visas it may nest (IdentityDoc/Visa), its additional names (AddlName), and the passenger’s own RedressCase and FOID. RETENTION AND ERASURE, stated plainly because they bound how long the airline holds this. A document is erased once its TRIP is past by the configured window (ORDER_TRAVEL_DOC_RETENTION_DAYS, default 30 days after travel ends; each operator sets its own). The deadline is re-derived from the order on every sweep, so a flight moved later moves it; an order whose travel dates the platform does not hold is HELD, never erased on a deadline counted from the booking date. Erasing an account erases the documents on its orders — but an order booked over NDC for a guest has no account (the platform mints a synthetic owner per idempotency key), so for those the erasure paths are the retention sweep and an airline supervisor’s erase action, not a customer deletion. NOT DONE, and no response pretends otherwise: nothing files APIS data with a border authority or a DCS — the platform stores it, it does not transmit it; the field-encryption key is an environment secret with no KMS and no version stamped on the ciphertext, so there is no rotation path short of a bulk re-encrypt; and the web funnel still keeps its own copy of a document number in the originating quote’s cart in clear, which this channel does not touch.
Simulated supplyinventory, payment

ORDMSK — Masked prices​

StatusNot implemented
MessagesOrderCreateRQ

ORDRSH — Change needing reshop​

StatusPartial
MessagesOrderReshopRQ, OrderChangeRQ
Sandbox scenarioapps/ndc-api/test/capabilities/ORDRSH.test.ts
LimitsNew flights on other dates for the booked O&D — the outbound, the return or both — each alternative a frozen quote priced by the differential and paid on acceptance; the legs of a multi-city order are not changed one by one, and a new route is agent-assisted.
Simulated supplyinventory, payment

ORDRE2 — Reshop for ancillaries​

StatusPartial
MessagesOrderReshopRQ, OrderChangeRQ, ServiceListRQ
Sandbox scenarioapps/ndc-api/test/capabilities/ORDRE2.test.ts
LimitsAirline extras (the booked order's catalogue — what Manage-My-Booking sells) and seats (its flights' seat maps) are reshopped as frozen quotes and accepted, or bought directly from the order's ServiceList / SeatAvailability; a seat is one passenger, one seat and one flight per message, and seats and extras are reshopped and bought in separate messages; ground-transport rides (SHPMOD) and partner products are not added to a booked order; a change paid by the seller's settlement plan is authorised against the agency's credit before it is made and refused under a flat-amount commission agreement, which states no rule for a charge made after the sale (commission_rule_undefined), or a tiered one stated in another currency than the change (commission_currency_mismatch); a change whose voucher or loyalty payment fails to capture stands, unpaid (no EMD), and goes to staff at once — it is not captured automatically; a loyalty hold the reconciler must give back instead (points that paid for no change) is retried for about half a day before it goes to staff, and lapses by itself at the hold's expiry.
Simulated supplypayment

ORDNAM — Name change via reshop​

StatusImplemented
MessagesOrderReshopRQ, OrderChangeRQ
Sandbox scenarioapps/ndc-api/test/capabilities/ORDNAM.test.ts

ORDPEN — Change / cancel with penalties​

StatusImplemented
MessagesOrderReshopRQ, OrderChangeRQ
Sandbox scenarioapps/ndc-api/test/capabilities/ORDPEN.test.ts

ORDFOR — Change / cancel with forfeited amounts​

StatusImplemented
MessagesOrderReshopRQ, OrderChangeRQ
Sandbox scenarioapps/ndc-api/test/capabilities/ORDFOR.test.ts

ORDPAX — Change without reshop​

StatusPartial
MessagesOrderChangeRQ
Sandbox scenarioapps/ndc-api/test/capabilities/ORDPAX.test.ts
LimitsUpdatePax changes the booking contact (email, phone) directly; loyalty accounts and SSRs are not updated this way, and a new name is reshopped (ORDNAM).

ORDCAN — Cancel order item​

StatusImplemented
MessagesOrderReshopRQ, OrderChangeRQ
Sandbox scenarioapps/ndc-api/test/capabilities/ORDCAN.test.ts

ORDREU — Cancel with reusable amount​

StatusImplemented
MessagesOrderReshopRQ, OrderChangeRQ
Sandbox scenarioapps/ndc-api/test/capabilities/ORDREU.test.ts

ORDCA2 — Cancel full order​

StatusImplemented
MessagesOrderChangeRQ, OrderReshopRQ
Sandbox scenarioapps/ndc-api/test/capabilities/ORDCA2.test.ts
Simulated supplypayment

ORDRET — Order retrieve​

StatusImplemented
MessagesOrderRetrieveRQ
Sandbox scenarioapps/ndc-api/test/capabilities/ORDRET.test.ts
LimitsThe full OrderViewRS (passengers, segments, journeys, services, seats, tickets / EMDs with coupon status, payments, refunds, statuses). An e-ticket carries all its coupons: past four flown segments the ordering module issues conjunction tickets with consecutive numbers, rendered as one TicketDocInfo of up to four Tickets — the schema maximum, so one traveller’s trip is documented up to 16 coupons.

ORDHIS — Order history​

StatusImplemented
MessagesOrderHistoryRQ
Sandbox scenarioapps/ndc-api/test/capabilities/ORDHIS.test.ts

ORDLST — Order list​

StatusImplemented
MessagesOrderListRQ
Sandbox scenarioapps/ndc-api/test/capabilities/ORDLST.test.ts

ORDOCN — Airline-initiated change notification​

StatusImplemented
Sent to youOrderChangeNotifRQ
Sandbox scenarioapps/ndc-api/test/capabilities/ORDOCN.test.ts

ORDOC2 — Notification with advanced features​

StatusImplemented
Sent to youOrderChangeNotifRQ
Sandbox scenarioapps/ndc-api/test/capabilities/ORDOC2.test.ts

ORDDEL — Fulfilment notification (no tickets / EMDs)​

StatusImplemented
Sent to youServiceDeliveryNotifRQ
Sandbox scenarioapps/ndc-api/test/capabilities/ORDDEL.test.ts
LimitsA service delivered with no ticket or EMD behind it is notified on its own: a seat sold for nothing when its flight flies, a partner (marketplace) product when its partner fulfils it (the marketplace's own fulfilment, delivered by the partner, read back every few minutes). Arcube connector offers are not sold over NDC (SHPAN3), so there is no fulfilment of theirs to notify.
Simulated supplyoperations

ORDSTS — Status change for service delivery​

StatusImplemented
MessagesServiceDeliveryRQ
Sent to youServiceStatusChangeNotifRQ
Sandbox scenarioapps/ndc-api/test/capabilities/ORDSTS.test.ts
Simulated supplyoperations

ORDST2 — Fulfilment notification to seller​

StatusImplemented
Sent to youServiceStatusChangeNotifRQ, ServiceDeliveryNotifRQ
Sandbox scenarioapps/ndc-api/test/capabilities/ORDST2.test.ts
Simulated supplyoperations

ORDGRP — Group orders​

StatusNot implemented
Not in scopeThe NDC group flow is its own design (next prompt).

ORDCWT — Orders without tickets / EMDs (standalone)​

StatusNot implemented
Not in scopeA flight-less NDC order is out of scope; marketplace lines ride on flight orders.

Payment​

PAYSET — Settlement platform​

StatusPartial
MessagesOrderCreateRQ, OrderChangeRQ
Sandbox scenarioapps/ndc-api/test/capabilities/PAYSET.test.ts
LimitsA SettlementPlan pays through the seller's active settlement account (CA BSP, DP ARC, MS direct bill) within its credit headroom; the sale is recorded with its settlement method — a post-sale change paid the same way (a seat, extras) as its own charge against the order: authorised (the credit reserved) before the change is made, captured after it, voided if it is not made — a leg left unfinished (an authorisation whose answer was lost, a capture or void that failed, a request that stopped) is finished by the reconciler only where that is provable: it captures a leg the commit recorded as paying for it (voiding it instead when the order or the change was cancelled since), voids a leg paying for no commit (agency-api refuses a charge arriving late under a voided reference, and a second capture for one change), and gives the rest — a change committed before its paying legs were recorded, a step still failing after its last attempt — to staff (reconcile_failed) — released per refund (every release, of the sale or of a charge, keyed so a retry gives nothing back twice), and commissioned at the agreement's percentage — or tier, in the agreement's own currency — on the charge's own amount; a flat-amount agreement states no rule for a charge made after the sale, so such a change is refused, as is one under a tiered agreement in another currency — and each is cleared under SwO by the simulated Clearance Manager (BSP by default, other methods once their clearance terms are configured). The platform is not connected to IATA's BSP: the BSP services PAConf Resolution 850 requires for NDC sales processed through BSP — NDC Onboarding (seller validation), the Agency Profile API (payment authorisation checks) and real-time sales reporting to BSP Risk Management in the EASD standard — are not implemented.
Simulated supplysettlement

PAYCPC — Customer card​

StatusImplemented
MessagesOrderCreateRQ
Sandbox scenarioapps/ndc-api/test/capabilities/PAYCPC.test.ts
Simulated supplypayment

PAYGTW — Payment gateway​

StatusNot implemented
MessagesOrderCreateRQ, OrderChangeRQ

PAYVCH — Vouchers​

StatusImplemented
MessagesOrderCreateRQ, OrderChangeRQ
Sandbox scenarioapps/ndc-api/test/capabilities/PAYVCH.test.ts

PAYORD — Pay for an unpaid order​

StatusImplemented
MessagesOrderChangeRQ
Sandbox scenarioapps/ndc-api/test/capabilities/PAYORD.test.ts
Simulated supplypayment

PAYREF — Refund amount on changes​

StatusImplemented
MessagesOrderReshopRQ, OrderChangeRQ
Sandbox scenarioapps/ndc-api/test/capabilities/PAYREF.test.ts
Simulated supplypayment

PAYMIX — Mixed payment instruments​

StatusImplemented
MessagesOrderCreateRQ
Sandbox scenarioapps/ndc-api/test/capabilities/PAYMIX.test.ts
LimitsUp to four legs — card tokens, vouchers, the seller’s settlement plan and the member’s loyalty points — pay one order together: authorised together, voided together on a decline, captured after booking; a refund goes back to every leg, newest first. Points are this airline’s programme only, redeemed with the redemption certificate the member issues in their account (never on the account number alone) and valued at the programme’s redemption rate.
Simulated supplypayment

PAY3D2 — Seller authenticates payer (3DS2)​

StatusImplemented
MessagesOrderCreateRQ
Sandbox scenarioapps/ndc-api/test/capabilities/PAY3D2.test.ts
Simulated supplypayment

PAYSUM — Payment transaction summary​

StatusImplemented
MessagesOrderRetrieveRQ, OrderCreateRQ, OrderChangeRQ
Sandbox scenarioapps/ndc-api/test/capabilities/PAYSUM.test.ts
LimitsEvery payment and refund on the order is listed in PaymentFunctions from the PaymentSession ledger: card brand + last four + PSP reference, masked voucher, settlement form of payment, loyalty points with the masked member account.
Simulated supplypayment

PAYRCV — Payment recovery​

StatusImplemented
MessagesOrderChangeRQ
Sent to youOrderChangeNotifRQ
Sandbox scenarioapps/ndc-api/test/capabilities/PAYRCV.test.ts
LimitsA declined payment leaves the order held within its payment time limit and the seller retries with OrderChangeRQ; at the limit the order is cancelled and the seller is sent an OrderChangeNotifRQ (order.payment_expired).
Simulated supplypayment

PAYCOM — Disclosure of commission​

StatusImplemented
MessagesOfferPriceRQ, OrderRetrieveRQ, OrderCreateRQ
Sandbox scenarioapps/ndc-api/test/capabilities/PAYCOM.test.ts

PAYCMT — Commitment for clearance of commission​

StatusNot implemented
Not in scopeDepends on clearance running against a real clearing house.

Settlement​

STTCAP — Payment clearance — capture​

StatusImplemented
MessagesPaymentClearanceRQ
Sent to youPaymentClearanceNotif
Sandbox scenarioapps/ndc-api/test/capabilities/STTCAP.test.ts
LimitsThe platform is the ORA and a simulated Clearance Manager (no real Settlement Manager is connected): a captured settlement-plan payment is requested for clearance at capture, and PaymentClearanceRQ clears one that is not yet — one clearance per payment, of exactly its amount.
Simulated supplysettlement

STTSUM — Payment clearance — summary​

StatusImplemented
MessagesPaymentClearanceListRQ
Sandbox scenarioapps/ndc-api/test/capabilities/STTSUM.test.ts
LimitsThe caller sees its own clearances, by ClearanceID, CommitmentID (the OrderID) or filter criteria; AgreementIDs are not recorded.
Simulated supplysettlement

STTCAN — Payment clearance — cancellation​

StatusImplemented
MessagesPaymentClearanceCancellationRQ
Sent to youPaymentClearanceNotif
Sandbox scenarioapps/ndc-api/test/capabilities/STTCAN.test.ts
Simulated supplysettlement

STTHST — Payment clearance — history​

StatusImplemented
MessagesPaymentClearingListRQ
Sent to youPaymentClearingNotif
Sandbox scenarioapps/ndc-api/test/capabilities/STTHST.test.ts
LimitsClearing is a scheduled simulated batch: no bank moves anything.
Simulated supplysettlement

Accounting​

ACCREP — Order sales information reporting​

StatusImplemented
Sent to youOrderSalesInformationNotifRQ
Sandbox scenarioapps/ndc-api/test/capabilities/ACCREP.test.ts
LimitsSent on every sale, change, refund and void to the subscriptions that name accounting.sales_info (the airline's ndc:accounting grant), for every order — NDC-sold or not.

ACCRE2 — Sales reporting without tickets / EMDs​

StatusImplemented
Sent to youOrderSalesInformationNotifRQ
Sandbox scenarioapps/ndc-api/test/capabilities/ACCRE2.test.ts
LimitsA ticketless line (a marketplace / partner product, a free seat) is reported by its services with their internal values.

ACCSTS — Status change for revenue recognition​

StatusImplemented
Sent to youOrderClosingNotifRQ
Sandbox scenarioapps/ndc-api/test/capabilities/ACCSTS.test.ts
LimitsAn order closes when every service is delivered, no-show or removed and the money is settled (payments captured, clearances cleared).
Simulated supplyoperations, settlement

Setup​

STPTST — Sandbox​

StatusImplemented
Sandbox scenarioapps/ndc-api/test/capabilities/STPTST.test.ts
LimitsThe public sandbox is https://ndc.retailaer.com: the NDC endpoints at /24.4/<Message>, the OAuth token at /oauth/token and these public docs at /docs/ (the Postman sandbox environment targets it). Sandbox clients are registered by the airline (client credentials); the supply behind it is simulated and flagged on the wire.
Simulated supplyinventory, payment

STPNEG — Negative test cases​

StatusImplemented
Sandbox scenarioapps/ndc-api/test/capabilities/STPNEG.test.ts
LimitsOne request per documented error (credentials, scope, foreign order, stale offer, card number, decline, 3-D Secure, payment time limit, rules unavailable, checked-in, stale reshop) in the Postman Negative tests folder; rules_unavailable cannot be forced in the sandbox.

STPNTF — Notification message setup​

StatusImplemented
Sent to youOrderChangeNotifRQ
Sandbox scenarioapps/ndc-api/test/capabilities/STPNTF.test.ts

STPDOC — Documentation​

StatusImplemented
Sandbox scenarioapps/ndc-api/test/capabilities/STPDOC.test.ts

STPDC2 — Documentation (message reference)​

StatusImplemented
Sandbox scenarioapps/ndc-api/test/capabilities/STPDC2.test.ts

STPOPM — Order-level permissions​

StatusImplemented
Sandbox scenarioapps/ndc-api/test/capabilities/STPOPM.test.ts