Cancel an order (XML)
Cancel a paid order in two steps — quote, then commit:
OrderReshop— quote the cancellation (penalty and refund)OrderChange— accept the cancelled offer
There is no standalone OrderCancel operation in these NDC versions — cancellation rides IATA_OrderReshopRQ + IATA_OrderChangeRQ. This cancels the order built up in the previous walkthroughs ($59 fare + $14 seat + $35 bag = $108 paid). Examples were captured live on v21.3; v25.4 is identical apart from the URL segment and the response <VersionNumber>.
Step 1 — OrderReshop — quote the cancellation
POST /ndc/v21.3/OrderReshop
UpdateOrder carries an empty CancelOrderRef — quote cancelling the whole order:
<?xml version="1.0" encoding="UTF-8"?>
<IATA_OrderReshopRQ xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersMessage">
<DistributionChain>
<DistributionChainLink xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<Ordinal>1</Ordinal>
<OrgRole>Seller</OrgRole>
<ParticipatingOrg>
<OrgID>BZ</OrgID>
</ParticipatingOrg>
</DistributionChainLink>
<DistributionChainLink xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<Ordinal>2</Ordinal>
<OrgRole>Carrier</OrgRole>
<ParticipatingOrg>
<OrgID>MX</OrgID>
</ParticipatingOrg>
</DistributionChainLink>
</DistributionChain>
<Request>
<OrderRefID xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">MXYTG780SE6I</OrderRefID>
<UpdateOrder xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<CancelOrderRef/>
</UpdateOrder>
</Request>
</IATA_OrderReshopRQ>
The quote comes back as a reshop offer with one DeleteOrderItem per order item and a PriceDifferential. DifferentialTypeCode Refund with DiffPrice $108 means a full refund — this order was booked less than 24 hours ago for travel more than 7 days out. Capture the OfferID for step 2:
<?xml version="1.0" encoding="UTF-8"?>
<IATA_OrderReshopRS xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersMessage">
<Response>
<Order xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<OrderID>MXYTG780SE6I</OrderID>
<OwnerCode>MX</OwnerCode>
</Order>
<ReshopResults xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<ReshopOffers>
<Offer>
<OfferID>OF-b82ce552-bc1f-4ccb-a9bf-030d5b916661</OfferID>
<OwnerCode>MX</OwnerCode>
<DeleteOrderItem>
<ExistingOrderItem>
<OrderItemRefID>OOI-FL-UHxQQVgtUVVSVUxURXxTfFBWVVNOQXwyMDI2MDkxNXxNWDE2NDQ</OrderItemRefID>
</ExistingOrderItem>
<OfferItemID>OFI-CX-T09JLUZMLVVIeFFRVmd0VVZWU1ZVeFVSWHhUZkZCV1ZWTk9RWHd5TURJMk1Ea3hOWHhOV0RFMk5EUXww</OfferItemID>
<PriceDifferential>
<DifferentialTypeCode>Refund</DifferentialTypeCode>
<DiffPrice>
<Price>
<TotalAmount CurCode="USD">108.00</TotalAmount>
</Price>
</DiffPrice>
<NewPrice>
<Price>
<TotalAmount CurCode="USD">0.00</TotalAmount>
</Price>
</NewPrice>
<OldPrice>
<Price>
<TotalAmount CurCode="USD">108.00</TotalAmount>
</Price>
</OldPrice>
</PriceDifferential>
</DeleteOrderItem>
</Offer>
</ReshopOffers>
</ReshopResults>
</Response>
<PayloadAttributes>
<Timestamp xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">2026-08-17T15:29:38.424Z</Timestamp>
<VersionNumber xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">21.3</VersionNumber>
</PayloadAttributes>
</IATA_OrderReshopRS>
Outside the 24-hour window the refund follows the fare's cancellation policy. Applicable penalties are disclosed on every priced offer's CancelRestrictions. The value may be returned as flight credit rather than to the original form of payment.
Step 2 — OrderChange — commit the cancel
POST /ndc/v21.3/OrderChange
ChangeOrderChoice > AcceptCancelledOffer references just the quoted cancel offer's OfferID — a removal has no items to select:
<?xml version="1.0" encoding="UTF-8"?>
<IATA_OrderChangeRQ xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersMessage">
<DistributionChain>
<DistributionChainLink xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<Ordinal>1</Ordinal>
<OrgRole>Seller</OrgRole>
<ParticipatingOrg>
<OrgID>BZ</OrgID>
</ParticipatingOrg>
</DistributionChainLink>
<DistributionChainLink xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<Ordinal>2</Ordinal>
<OrgRole>Carrier</OrgRole>
<ParticipatingOrg>
<OrgID>MX</OrgID>
</ParticipatingOrg>
</DistributionChainLink>
</DistributionChain>
<Request>
<ChangeOrderChoice xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<AcceptCancelledOffer>
<OfferID>OF-b82ce552-bc1f-4ccb-a9bf-030d5b916661</OfferID>
<OwnerCode>MX</OwnerCode>
</AcceptCancelledOffer>
</ChangeOrderChoice>
<Order xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<OrderID>MXYTG780SE6I</OrderID>
<OwnerCode>MX</OwnerCode>
</Order>
</Request>
</IATA_OrderChangeRQ>
The order closes — StatusCode CLOSED, total $0, no order items — and one refund per original payment appears as a negative PaymentProcessingSummary back to the card:
<?xml version="1.0" encoding="UTF-8"?>
<IATA_OrderViewRS xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersMessage">
<Response>
<DataLists xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<!-- ContactInfoList and PaxList elided -->
</DataLists>
<Order xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<CreationDateTime>2026-08-17T14:57:57.337Z</CreationDateTime>
<LastModifiedDateTime>2026-08-17T15:30:07.29Z</LastModifiedDateTime>
<OrderID>MXYTG780SE6I</OrderID>
<OwnerCode>MX</OwnerCode>
<StatusCode>CLOSED</StatusCode>
<TotalPrice>
<BaseAmount CurCode="USD">0</BaseAmount>
<TotalAmount CurCode="USD">0</TotalAmount>
</TotalPrice>
</Order>
</Response>
<PayloadAttributes>
<Timestamp xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">2026-08-17T15:30:08.745Z</Timestamp>
<VersionNumber xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">21.3</VersionNumber>
</PayloadAttributes>
<PaymentFunctions>
<PaymentProcessingSummary xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<Amount CurCode="USD">59</Amount>
<PaymentID>PAY-MQ</PaymentID>
<PaymentStatusCode>SUCCESSFUL</PaymentStatusCode>
<!-- card details elided -->
</PaymentProcessingSummary>
</PaymentFunctions>
<!-- the original $14 and $35 payments elided -->
<PaymentFunctions>
<PaymentProcessingSummary xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<Amount CurCode="USD">-59</Amount>
<PaymentID>PAY-NA</PaymentID>
<PaymentStatusCode>PENDING</PaymentStatusCode>
<!-- card details elided -->
</PaymentProcessingSummary>
</PaymentFunctions>
<PaymentFunctions>
<PaymentProcessingSummary xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<Amount CurCode="USD">-14</Amount>
<PaymentID>PAY-NQ</PaymentID>
<PaymentStatusCode>PENDING</PaymentStatusCode>
</PaymentProcessingSummary>
</PaymentFunctions>
<PaymentFunctions>
<PaymentProcessingSummary xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<Amount CurCode="USD">-35</Amount>
<PaymentID>PAY-Ng</PaymentID>
<PaymentStatusCode>PENDING</PaymentStatusCode>
</PaymentProcessingSummary>
</PaymentFunctions>
</IATA_OrderViewRS>
Refund payments start PENDING and settle asynchronously. A cancelled order stays retrievable — OrderRetrieve keeps returning it with StatusCode CLOSED.
Notes
- Hold (unpaid) bookings don't need a quote — cancel them with
ChangeOrderChoice > CancelUnpaidOrderin a single OrderChange. - The quote is informational — the commit recomputes penalty and refund from live booking state at execution time.
POST /ndc/{version}/OrderCancelexists as a route but returnsERR-5000(501 Not Implemented) — use the flow above.
Full schema reference: OrderReshop and OrderChange.