Skip to main content

Make a test booking (NDC/XML)

This walkthrough creates a booking using our NDC/XML API:

  1. Get an access token
  2. AirShopping: search for flights
  3. OfferPrice: price the selected offer
  4. OrderCreate: book and pay
  5. OrderRetrieve: retrieve completed order

The request and response samples come from our test environment. Only the API key and bearer token are redacted.

Before you start

Test base URLhttps://api-staging.flybreeze.com/breeze-offer-order
Production base URLhttps://api.flybreeze.com/breeze-offer-order
Route usedPVU → SNA (Provo → Orange County) — operates daily, so any date works
Passenger1 adult, paying with the sandbox Visa test card 4111 1111 1111 1111

NDC versions. The examples use /ndc/v21.3/…. To run the same flow on another version, change the version segment (/ndc/v25.4/…). Requests are identical on every version, and through 25.4 so are these responses — only the <VersionNumber> in PayloadAttributes differs. On 26.2 the payment sections change shape; see the version differences. Each message also has a reference page covering the full schema: AirShopping, OfferPrice, OrderCreate, OrderRetrieve.

All POST requests need two headers:

Authorization: Bearer <access token from step 0>
Content-Type: application/xml

Step 0 — Get an access token

Exchange your API key for a JWT. The token is valid for 30 minutes (expires_in: 1800); when a request starts returning 401, fetch a new one.

curl -X POST "https://api-staging.flybreeze.com/breeze-offer-order/auth/token" \
-H "x-api-key: <your-api-key>"
Response — 200 OK
{
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…",
"token_type": "Bearer",
"expires_in": 1800
}

Send the token on every following request as Authorization: Bearer <access_token>.

Step 1 — AirShopping — search for flights

POST /ndc/v21.3/AirShopping

The DistributionChain identifies you (the seller) and Breeze (MX, the carrier); use your own seller OrgID in place of BZ. The Request carries the origin/destination criteria and the passenger list.

IATA_AirShoppingRQ
<?xml version="1.0" encoding="UTF-8"?>
<IATA_AirShoppingRQ 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>
<FlightRequest xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<FlightRequestOriginDestinationsCriteria>
<OriginDestCriteria>
<DestArrivalCriteria>
<IATA_LocationCode>SNA</IATA_LocationCode>
</DestArrivalCriteria>
<OriginDepCriteria>
<Date>2026-09-15</Date>
<IATA_LocationCode>PVU</IATA_LocationCode>
</OriginDepCriteria>
</OriginDestCriteria>
</FlightRequestOriginDestinationsCriteria>
</FlightRequest>
<PaxList xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<Pax>
<PaxID>PX1</PaxID>
<PTC>ADT</PTC>
</Pax>
</PaxList>
</Request>
</IATA_AirShoppingRQ>

The response contains one Offer per fare product per flight (this search returned 8: four fare tiers on each of two flights). Everything an offer references — segments, journeys, price classes, service definitions — lives in DataLists.

From the offer you want, capture two values for the next step:

  • OfferIDOF-ce9e1a3b-6e36-43bd-92f6-3046eff2b8b7
  • OfferItemIDOFI-ce9e1a3b-6e36-43bd-92f6-3046eff2b8b7-0-ADT

Offers expire at OfferExpirationTimeLimitDateTime (about 30 minutes). If you take longer, just search again.

IATA_AirShoppingRS — 200 OK (one offer shown, 7 elided)
<?xml version="1.0" encoding="UTF-8"?>
<IATA_AirShoppingRS xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersMessage">
<Response>
<DataLists xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<!-- BaggageAllowanceList, BaggageDisclosureList, PriceClassList,
SeatProfileList and ServiceDefinitionList elided -->
<DatedMarketingSegmentList>
<DatedMarketingSegment>
<Arrival>
<AircraftScheduledDateTime>2026-09-15T20:30:00</AircraftScheduledDateTime>
<IATA_LocationCode>SNA</IATA_LocationCode>
</Arrival>
<CarrierDesigCode>MX</CarrierDesigCode>
<DatedMarketingSegmentId>DMS-UFZVU05BfDIwMjYwOTE1fE1YMTY0NA</DatedMarketingSegmentId>
<DatedOperatingSegmentRefId>DOS-UFZVU05BfDIwMjYwOTE1fE1YMTY0NA</DatedOperatingSegmentRefId>
<Dep>
<AircraftScheduledDateTime>2026-09-15T19:31:00</AircraftScheduledDateTime>
<IATA_LocationCode>PVU</IATA_LocationCode>
</Dep>
<MarketingCarrierFlightNumberText>1644</MarketingCarrierFlightNumberText>
</DatedMarketingSegment>
<!-- second flight elided -->
</DatedMarketingSegmentList>
<OriginDestList>
<OriginDest>
<DestCode>SNA</DestCode>
<OriginCode>PVU</OriginCode>
<OriginDestID>OD-UFZVU05BfDIwMjYwOTE1</OriginDestID>
<PaxJourneyRefID>JOU-UFZVU05BfDIwMjYwOTE1fE1YMTY0NA</PaxJourneyRefID>
</OriginDest>
</OriginDestList>
<PaxJourneyList>
<PaxJourney>
<Duration>PT1H59M</Duration>
<PaxJourneyID>JOU-UFZVU05BfDIwMjYwOTE1fE1YMTY0NA</PaxJourneyID>
<PaxSegmentRefID>SEG-UFZVU05BfDIwMjYwOTE1fE1YMTY0NA</PaxSegmentRefID>
</PaxJourney>
</PaxJourneyList>
<PaxList>
<Pax>
<PaxID>PX1</PaxID>
<PTC>ADT</PTC>
</Pax>
</PaxList>
<PaxSegmentList>
<PaxSegment>
<CabinTypeAssociationChoice>
<SegmentCabinType>
<CabinTypeCode>5</CabinTypeCode>
<CabinTypeName>Economy</CabinTypeName>
</SegmentCabinType>
</CabinTypeAssociationChoice>
<DatedMarketingSegmentRefId>DMS-UFZVU05BfDIwMjYwOTE1fE1YMTY0NA</DatedMarketingSegmentRefId>
<PaxSegmentID>SEG-UFZVU05BfDIwMjYwOTE1fE1YMTY0NA</PaxSegmentID>
</PaxSegment>
</PaxSegmentList>
</DataLists>
<OffersGroup xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<CarrierOffers>
<Offer>
<BaggageDisclosureRefID>BDISC-UEVSU09OQUxfSVRFTQ</BaggageDisclosureRefID>
<BaggageDisclosureRefID>BDISC-Q0FSUllfT04</BaggageDisclosureRefID>
<BaggageDisclosureRefID>BDISC-Q0hFQ0tFRF9CQUc</BaggageDisclosureRefID>
<JourneyOverview>
<JourneyPriceClass>
<PaxJourneyRefID>JOU-UFZVU05BfDIwMjYwOTE1fE1YMTY0NA</PaxJourneyRefID>
</JourneyPriceClass>
</JourneyOverview>
<OfferExpirationTimeLimitDateTime>2026-08-17T15:25:39.540Z</OfferExpirationTimeLimitDateTime>
<OfferID>OF-ce9e1a3b-6e36-43bd-92f6-3046eff2b8b7</OfferID>
<OfferItem>
<FareDetail>
<FareComponent>
<CabinType>
<CabinTypeCode>5</CabinTypeCode>
<CabinTypeName>Economy</CabinTypeName>
</CabinType>
<FareBasisCode>CNO00</FareBasisCode>
<PaxSegmentRefID>SEG-UFZVU05BfDIwMjYwOTE1fE1YMTY0NA</PaxSegmentRefID>
<RBD>
<RBD_Code>C</RBD_Code>
</RBD>
</FareComponent>
<PaxRefID>PX1</PaxRefID>
<Price>
<BaseAmount CurCode="USD">13.58</BaseAmount>
<TaxSummary>
<TotalTaxAmount CurCode="USD">45.42</TotalTaxAmount>
</TaxSummary>
<TotalAmount CurCode="USD">59</TotalAmount>
</Price>
</FareDetail>
<MandatoryInd>true</MandatoryInd>
<OfferItemID>OFI-ce9e1a3b-6e36-43bd-92f6-3046eff2b8b7-0-ADT</OfferItemID>
<Price>
<BaseAmount CurCode="USD">13.58</BaseAmount>
<TaxSummary>
<TotalTaxAmount CurCode="USD">45.42</TotalTaxAmount>
</TaxSummary>
<TotalAmount CurCode="USD">59</TotalAmount>
</Price>
<Service>
<OfferServiceAssociation>
<PaxJourneyRef>
<PaxJourneyRefID>JOU-UFZVU05BfDIwMjYwOTE1fE1YMTY0NA</PaxJourneyRefID>
</PaxJourneyRef>
</OfferServiceAssociation>
<PaxRefID>PX1</PaxRefID>
<ServiceID>SVC-FL-Y2U5ZTFhM2ItNmUzNi00M2JkLTkyZjYtMzA0NmVmZjJiOGI3fDB8QURU</ServiceID>
</Service>
</OfferItem>
<OwnerCode>MX</OwnerCode>
<TotalPrice>
<BaseAmount CurCode="USD">13.58</BaseAmount>
<TaxSummary>
<TotalTaxAmount CurCode="USD">45.42</TotalTaxAmount>
</TaxSummary>
<TotalAmount CurCode="USD">59</TotalAmount>
</TotalPrice>
</Offer>
<!-- 7 more Offer elements elided -->
</CarrierOffers>
</OffersGroup>
<PaymentFunctions xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<PaymentSupportedMethod>
<PaymentBrandCode>VI</PaymentBrandCode>
<PaymentTypeCode>CC</PaymentTypeCode>
</PaymentSupportedMethod>
<!-- AX, DS, CA elided -->
</PaymentFunctions>
</Response>
<PayloadAttributes>
<Timestamp xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">2026-08-17T14:55:39.943Z</Timestamp>
<VersionNumber xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">21.3</VersionNumber>
</PayloadAttributes>
</IATA_AirShoppingRS>

Step 2 — OfferPrice — price the selected offer

POST /ndc/v21.3/OfferPrice

Reference the shopping offer by OfferRefID/OfferItemRefID and repeat the passenger list.

IATA_OfferPriceRQ
<?xml version="1.0" encoding="UTF-8"?>
<IATA_OfferPriceRQ 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>
<DataLists xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<PaxList>
<Pax>
<PaxID>PX1</PaxID>
<PTC>ADT</PTC>
</Pax>
</PaxList>
</DataLists>
<PricedOffer xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<SelectedOfferList>
<SelectedOffer>
<OfferRefID>OF-ce9e1a3b-6e36-43bd-92f6-3046eff2b8b7</OfferRefID>
<OwnerCode>MX</OwnerCode>
<SelectedOfferItem>
<OfferItemRefID>OFI-ce9e1a3b-6e36-43bd-92f6-3046eff2b8b7-0-ADT</OfferItemRefID>
<PaxRefID>PX1</PaxRefID>
</SelectedOfferItem>
</SelectedOffer>
</SelectedOfferList>
</PricedOffer>
</Request>
</IATA_OfferPriceRQ>
The priced offer has a NEW ID

OfferPrice returns a new OfferID/OfferItemID — here OF-6a15d613-…, not the OF-ce9e1a3b-… you sent. OrderCreate only accepts the priced IDs. Also capture the guaranteed <TotalAmount>: OrderCreate needs the exact amount.

The priced offer also carries fare rules (CancelRestrictions / ChangeRestrictions), tax breakdown, baggage disclosures, and a fresh OfferExpirationTimeLimitDateTime.

IATA_OfferPriceRS — 200 OK (trimmed)
<?xml version="1.0" encoding="UTF-8"?>
<IATA_OfferPriceRS xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersMessage">
<Response>
<DataLists xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<!-- same lists as AirShopping: segments, journeys, pax,
baggage disclosures, seat profiles — elided -->
</DataLists>
<PricedOffer xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<BaggageDisclosureRefID>BDISC-UEVSU09OQUxfSVRFTQ</BaggageDisclosureRefID>
<BaggageDisclosureRefID>BDISC-Q0FSUllfT04</BaggageDisclosureRefID>
<BaggageDisclosureRefID>BDISC-Q0hFQ0tFRF9CQUc</BaggageDisclosureRefID>
<JourneyOverview>
<JourneyPriceClass>
<PaxJourneyRefID>JOU-UFZVU05BfDIwMjYwOTE1fE1YMTY0NA</PaxJourneyRefID>
</JourneyPriceClass>
</JourneyOverview>
<OfferExpirationTimeLimitDateTime>2026-08-17T15:25:39.540Z</OfferExpirationTimeLimitDateTime>
<OfferID>OF-6a15d613-70e5-4277-a889-24e5b2acfbae</OfferID>
<OfferItem>
<FareDetail>
<FareComponent>
<CabinType>
<CabinTypeCode>5</CabinTypeCode>
<CabinTypeName>Economy</CabinTypeName>
</CabinType>
<CancelRestrictions>
<AllowedModificationInd>true</AllowedModificationInd>
<JourneyStageCode>Prior To Departure</JourneyStageCode>
</CancelRestrictions>
<CancelRestrictions>
<AllowedModificationInd>false</AllowedModificationInd>
<JourneyStageCode>No Show</JourneyStageCode>
</CancelRestrictions>
<ChangeRestrictions>
<AllowedModificationInd>false</AllowedModificationInd>
<ChangeTypeCode>Flight</ChangeTypeCode>
</ChangeRestrictions>
<FareBasisCode>CNO00</FareBasisCode>
<PaxSegmentRefID>SEG-UFZVU05BfDIwMjYwOTE1fE1YMTY0NA</PaxSegmentRefID>
<RBD>
<RBD_Code>C</RBD_Code>
</RBD>
</FareComponent>
<PaxRefID>PX1</PaxRefID>
<Price>
<BaseAmount CurCode="USD">13.58</BaseAmount>
<TaxSummary>
<Tax>
<Amount CurCode="USD">5.6</Amount>
<DescText>PVU-SNA</DescText>
<TaxCode>AY</TaxCode>
</Tax>
<Tax>
<Amount CurCode="USD">4.5</Amount>
<DescText>PVU-SNA</DescText>
<TaxCode>XF</TaxCode>
</Tax>
<Tax>
<Amount CurCode="USD">5.3</Amount>
<DescText>PVU-SNA</DescText>
<TaxCode>ZP</TaxCode>
</Tax>
<Tax>
<Amount CurCode="USD">1.02</Amount>
<DescText>PVU-SNA</DescText>
<TaxCode>US</TaxCode>
</Tax>
<Tax>
<Amount CurCode="USD">29</Amount>
<DescText>PVU-SNA</DescText>
<TaxCode>TDC</TaxCode>
</Tax>
<TotalTaxAmount CurCode="USD">45.42</TotalTaxAmount>
</TaxSummary>
<TotalAmount CurCode="USD">59</TotalAmount>
</Price>
</FareDetail>
<MandatoryInd>true</MandatoryInd>
<OfferItemID>OFI-6a15d613-70e5-4277-a889-24e5b2acfbae-0-ADT</OfferItemID>
<Price>
<!-- same amounts as FareDetail price — elided -->
<TotalAmount CurCode="USD">59</TotalAmount>
</Price>
<Service>
<OfferServiceAssociation>
<PaxJourneyRef>
<PaxJourneyRefID>JOU-UFZVU05BfDIwMjYwOTE1fE1YMTY0NA</PaxJourneyRefID>
</PaxJourneyRef>
</OfferServiceAssociation>
<PaxRefID>PX1</PaxRefID>
<ServiceID>SVC-FL-NmExNWQ2MTMtNzBlNS00Mjc3LWE4ODktMjRlNWIyYWNmYmFlfDB8QURU</ServiceID>
</Service>
</OfferItem>
<OwnerCode>MX</OwnerCode>
<TotalPrice>
<!-- same amounts as above — elided -->
<TotalAmount CurCode="USD">59</TotalAmount>
</TotalPrice>
</PricedOffer>
</Response>
<PayloadAttributes>
<Timestamp xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">2026-08-17T14:56:01.687Z</Timestamp>
<VersionNumber xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">21.3</VersionNumber>
</PayloadAttributes>
</IATA_OfferPriceRS>

Step 3 — OrderCreate — book and pay

POST /ndc/v21.3/OrderCreate

Three parts:

  • CreateOrder — accepts the priced offer (OF-6a15d613-… from step 2).
  • DataLists — the real passenger (name, birthdate, gender) and the booking primary contact. Leave the primary ContactInfo unreferenced by any Pax — a ContactInfoRefID on a passenger marks a per-passenger contact instead. See contacts. PaxID must match the ID used while shopping (PX1).
  • PaymentFunctions — card payment. Amount must equal the priced TotalAmount (CurCode USD). In the test environment use the Visa test card below; no real charge is made. See payments.
IATA_OrderCreateRQ
<?xml version="1.0" encoding="UTF-8"?>
<IATA_OrderCreateRQ 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>
<CreateOrder xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<AcceptSelectedQuotedOfferList>
<SelectedPricedOffer>
<OfferRefID>OF-6a15d613-70e5-4277-a889-24e5b2acfbae</OfferRefID>
<OwnerCode>MX</OwnerCode>
<SelectedOfferItem>
<OfferItemRefID>OFI-6a15d613-70e5-4277-a889-24e5b2acfbae-0-ADT</OfferItemRefID>
<PaxRefID>PX1</PaxRefID>
</SelectedOfferItem>
</SelectedPricedOffer>
</AcceptSelectedQuotedOfferList>
</CreateOrder>
<DataLists xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<ContactInfoList>
<ContactInfo>
<ContactInfoID>CT1</ContactInfoID>
<EmailAddress>
<EmailAddressText>[email protected]</EmailAddressText>
</EmailAddress>
<Phone>
<PhoneNumber>8015551212</PhoneNumber>
</Phone>
<PostalAddress>
<CityName>Los Angeles</CityName>
<CountryCode>US</CountryCode>
<CountrySubDivisionName>California</CountrySubDivisionName>
<PostalCode>90210</PostalCode>
<StreetText>123 Main St</StreetText>
</PostalAddress>
</ContactInfo>
</ContactInfoList>
<PaxList>
<Pax>
<Individual>
<Birthdate>1980-01-01</Birthdate>
<GenderCode>M</GenderCode>
<GivenName>John</GivenName>
<Surname>Doe</Surname>
</Individual>
<PaxID>PX1</PaxID>
<PTC>ADT</PTC>
</Pax>
</PaxList>
</DataLists>
<PaymentFunctions xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<PaymentProcessingDetails>
<Amount CurCode="USD">59.00</Amount>
<Payer>
<PayerName>
<IndividualName>
<GivenName>John</GivenName>
<Surname>Doe</Surname>
</IndividualName>
</PayerName>
<PaymentAddress>
<PostalAddress>
<CityName>Los Angeles</CityName>
<CountryCode>US</CountryCode>
<CountrySubDivisionName>California</CountrySubDivisionName>
<PostalCode>90210</PostalCode>
<StreetText>123 Main St</StreetText>
</PostalAddress>
</PaymentAddress>
</Payer>
<PaymentMethod>
<PaymentCard>
<CardBrandCode>VI</CardBrandCode>
<CardNumber>4111111111111111</CardNumber>
<CardSecurityCode>123</CardSecurityCode>
<ExpirationDate>1227</ExpirationDate>
</PaymentCard>
</PaymentMethod>
</PaymentProcessingDetails>
</PaymentFunctions>
</Request>
</IATA_OrderCreateRQ>

Success returns 201 with an IATA_OrderViewRS. The key fields:

  • OrderIDMXYTG780SE6I, the order's identity for every later call.
  • BookingIDJE88TR, the underlying reservation-system record locator.
  • Order StatusCodeOPENED; the flight service inside is CONFIRMED.
  • PaymentStatusCode — may still read PENDING in the create response while the charge settles; retrieve the order (step 4) to see it flip to SUCCESSFUL.
IATA_OrderViewRS — 201 Created
<?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>
<ContactInfo>
<ContactInfoID>CTC-UA</ContactInfoID>
<EmailAddress>
<EmailAddressText>[email protected]</EmailAddressText>
</EmailAddress>
<Phone>
<ContactTypeText>Other</ContactTypeText>
<PhoneNumber>+18015551212</PhoneNumber>
</Phone>
</ContactInfo>
</ContactInfoList>
<DatedMarketingSegmentList>
<DatedMarketingSegment>
<Arrival>
<AircraftScheduledDateTime>2026-09-15T20:30:00</AircraftScheduledDateTime>
<IATA_LocationCode>SNA</IATA_LocationCode>
</Arrival>
<CarrierDesigCode>MX</CarrierDesigCode>
<DatedMarketingSegmentId>DMS-UFZVU05BfDIwMjYwOTE1fE1YMTY0NA</DatedMarketingSegmentId>
<DatedOperatingSegmentRefId>DOS-UFZVU05BfDIwMjYwOTE1fE1YMTY0NA</DatedOperatingSegmentRefId>
<Dep>
<AircraftScheduledDateTime>2026-09-15T19:31:00</AircraftScheduledDateTime>
<IATA_LocationCode>PVU</IATA_LocationCode>
</Dep>
<MarketingCarrierFlightNumberText>1644</MarketingCarrierFlightNumberText>
</DatedMarketingSegment>
</DatedMarketingSegmentList>
<!-- DatedOperatingLegList, DatedOperatingSegmentList, OriginDestList,
PaxJourneyList, PaxSegmentList elided -->
<PaxList>
<Pax>
<ContactInfoRefID>CTC-UA</ContactInfoRefID>
<Individual>
<Birthdate>1980-01-01</Birthdate>
<GenderCode>M</GenderCode>
<GivenName>John</GivenName>
<IndividualID>PAX-QURULTE</IndividualID>
<Surname>Doe</Surname>
</Individual>
<PaxID>ADT-1</PaxID>
<PTC>ADT</PTC>
</Pax>
</PaxList>
</DataLists>
<Order xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<CreationDateTime>2026-08-17T14:57:57.337Z</CreationDateTime>
<LastModifiedDateTime>2026-08-17T14:57:57.337Z</LastModifiedDateTime>
<OrderID>MXYTG780SE6I</OrderID>
<OrderItem>
<FareDetail>
<FareComponent>
<CabinType>
<CabinTypeCode>5</CabinTypeCode>
<CabinTypeName>Economy</CabinTypeName>
</CabinType>
<FareBasisCode>CNO00</FareBasisCode>
<PaxSegmentRefID>SEG-UFZVU05BfDIwMjYwOTE1fE1YMTY0NA</PaxSegmentRefID>
<RBD>
<RBD_Code>C</RBD_Code>
</RBD>
</FareComponent>
<PaxRefID>ADT-1</PaxRefID>
</FareDetail>
<OrderItemID>OOI-FL-UHxQQVgtUVVSVUxURXxTfFBWVVNOQXwyMDI2MDkxNXxNWDE2NDQ</OrderItemID>
<OwnerCode>MX</OwnerCode>
<Price>
<BaseAmount CurCode="USD">13.58</BaseAmount>
<TaxSummary>
<Tax>
<Amount CurCode="USD">5.6</Amount>
<TaxCode>AY</TaxCode>
</Tax>
<Tax>
<Amount CurCode="USD">4.5</Amount>
<TaxCode>XF</TaxCode>
</Tax>
<Tax>
<Amount CurCode="USD">5.3</Amount>
<TaxCode>ZP</TaxCode>
</Tax>
<Tax>
<Amount CurCode="USD">1.02</Amount>
<TaxCode>US</TaxCode>
</Tax>
<Tax>
<Amount CurCode="USD">29</Amount>
<TaxCode>TDC</TaxCode>
</Tax>
<TotalTaxAmount CurCode="USD">45.42</TotalTaxAmount>
</TaxSummary>
<TotalAmount CurCode="USD">59</TotalAmount>
</Price>
<Service>
<BookingRef>
<BookingEntity>
<Carrier>
<AirlineDesigCode>MX</AirlineDesigCode>
</Carrier>
</BookingEntity>
<BookingID>JE88TR</BookingID>
<BookingRefTypeCode>6</BookingRefTypeCode>
</BookingRef>
<DeliveryStatusCode>CONFIRMED</DeliveryStatusCode>
<OrderServiceAssociation>
<PaxSegmentRef>
<PaxSegmentRefID>SEG-UFZVU05BfDIwMjYwOTE1fE1YMTY0NA</PaxSegmentRefID>
</PaxSegmentRef>
</OrderServiceAssociation>
<PaxRefID>ADT-1</PaxRefID>
<ServiceID>SVC-FL-UEFYLVFVUlVMVEV8UFZVU05BfDIwMjYwOTE1fE1YMTY0NA</ServiceID>
<StatusCode>CONFIRMED</StatusCode>
</Service>
<StatusCode>ACTIVE</StatusCode>
</OrderItem>
<OwnerCode>MX</OwnerCode>
<StatusCode>OPENED</StatusCode>
<TotalPrice>
<!-- same amounts as the order item — elided -->
<TotalAmount CurCode="USD">59</TotalAmount>
</TotalPrice>
</Order>
</Response>
<PayloadAttributes>
<Timestamp xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">2026-08-17T14:57:58.163Z</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>
<PaymentProcessingSummaryPaymentMethod>
<PaymentCard>
<CardBrandCode>VI</CardBrandCode>
<MaskedCardID>x1111</MaskedCardID>
</PaymentCard>
</PaymentProcessingSummaryPaymentMethod>
<PaymentStatusCode>PENDING</PaymentStatusCode>
</PaymentProcessingSummary>
</PaymentFunctions>
</IATA_OrderViewRS>

Step 4 — OrderRetrieve — read the order back

POST /ndc/v21.3/OrderRetrieve
IATA_OrderRetrieveRQ
<?xml version="1.0" encoding="UTF-8"?>
<IATA_OrderRetrieveRQ 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>
<OrderValidationFilterCriteria xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<OrderFilterCriteria>
<OrderID>MXYTG780SE6I</OrderID>
<OwnerCode>MX</OwnerCode>
</OrderFilterCriteria>
</OrderValidationFilterCriteria>
</Request>
</IATA_OrderRetrieveRQ>

The response is the same IATA_OrderViewRS shape as step 3, with the payment now settled:

IATA_OrderViewRS — 200 OK (payment section)
<PaymentFunctions>
<PaymentProcessingSummary xmlns="http://www.iata.org/IATA/2015/EASD/00/IATA_OffersAndOrdersCommonTypes">
<Amount CurCode="USD">59</Amount>
<PaymentCommitmentDateTime>2026-08-17T14:57:58.527Z</PaymentCommitmentDateTime>
<PaymentID>PAY-MQ</PaymentID>
<PaymentProcessingSummaryPaymentMethod>
<PaymentCard>
<CardBrandCode>VI</CardBrandCode>
<MaskedCardID>x1111</MaskedCardID>
</PaymentCard>
</PaymentProcessingSummaryPaymentMethod>
<PaymentStatusCode>SUCCESSFUL</PaymentStatusCode>
</PaymentProcessingSummary>
</PaymentFunctions>

That's it — you have a paid, confirmed test booking.

Troubleshooting

SymptomCause & fix
401 on any callToken expired (30-minute lifetime). Re-run step 0.
ERR-3000 / ERR-3001 on OfferPrice or OrderCreateThe referenced offer was not found or has expired. Start again from AirShopping.
ERR-4001 "order could not be created" on OrderCreateMost common in testing: a passenger with the same name already holds a booking on the same flight — the reservation system rejects duplicate passenger names. Change the passenger name or the travel date between test bookings.
Payment shows PENDING after createNot an error — retrieve the order and it will read SUCCESSFUL.

Next steps

Keep going with the same order: