Certification
Certification is automatic. Run your own client against the test environment and Breeze scores every request you send against the catalog below. There is nothing to trigger and no test window. When every case that applies to you has passed, your integration is certified for that API version.
How It Works
Section titled “How It Works”- Your Breeze contact sets your partner profile: the fare products, passenger types, ancillaries, payment methods and functions you plan to support, plus the API surface and version you are certifying on.
- You exercise your integration in the test environment as you normally would. Each request that matches a case is scored as it arrives. A case needs the response to contain what the table says, or, for the negative paths, to carry the expected error code.
- You read your progress at any time:
GET /json/v1/certificationGET /json/v1/certification/status/{surface}/{apiVersion}The same status, with each run’s request and response, is in the sandbox Pro Booking under Account → Certification. Your Breeze contact sends the sign-in invite.
The first scores the target on your profile, the second any surface (ndc or json) and version
you also exercise. Each case reports:
| Result | Meaning |
|---|---|
pass | Some request on this version passed the case. A later failure does not take it away. |
fail | Only failures so far. failed names the criteria that did not hold. |
untested | Nothing scored yet. An inventory case may carry a hint: a market and date where we last saw that product, seat or connection. |
n/a | Your profile does not declare what the case requires, so it is not asked of you. |
blocked | Declared, but seller configuration prevents it. blocked[] says what to fix with your contact. |
latestResult shows your most recent run of a case beside the kept pass, so a regression is
visible without losing the certificate. Every scored case carries a runId; fetch the request and
response Breeze saw with:
GET /json/v1/certification/runs/{runId}Card numbers and security codes are redacted. The catalog itself is at
GET /json/v1/certification/catalog/{surface}/{apiVersion}.
A 404 with “No certification target is set” means your partner profile is not finished yet. Ask
your Breeze contact.
Going live
Section titled “Going live”Certification happens only in staging. Staging and production are separate environments with separate API keys; staging keys do not work in production.
- When
certifiedistrue, tell your Breeze contact. - Breeze copies your profile, sellers, limits and results to production, then issues production API keys and, if you take notifications, registers your production webhook.
- Breeze switches you to live. Point your production deployment at
https://api.flybreeze.com/zephyr/breeze-offer-orderwith the production keys.
Keep testing in staging, and never send test traffic to production. Production records no runs: its
status shows the results copied from staging, with "source": "imported" and asOf from staging.
To add a fare product, payment method or function later, certify the new cases in staging first.
- Start from Make a test booking (JSON) or its NDC twin.
- Product, seat, bag and connection cases record only when the test environment offers that
inventory. Follow the
hinton an untested case rather than guessing a market. - Negative-path cases (
errors) ask you to provoke a rejection on purpose: search with an unknown passenger type, retrieve a locator that does not exist, book the same passenger twice on one flight, reshop a No Flex order. - Each API version certifies separately. Moving to a newer version starts a new score.
Cases, JSON API v1
Section titled “Cases, JSON API v1”| Function | Case | What to send | Through | Must hold | Requires |
|---|---|---|---|---|---|
| search | one_way | Search one origin-destination and receive offers | POST /json/{version}/offersPOST /json/{version}/offers/byJourney | at least one offer | always |
| search | round_trip | Search an outbound and its return and receive offers | POST /json/{version}/offersPOST /json/{version}/offers/byJourney | at least one offer | always |
| search | open_jaw | Search two or more origin-destinations that are not a round trip and receive offers | POST /json/{version}/offersPOST /json/{version}/offers/byJourney | at least one offer | always |
| search | connection | Search a market where a connecting (two-segment) itinerary is offered | POST /json/{version}/offersPOST /json/{version}/offers/byJourney | response present | itinerary:connection |
| pricing | priced | Price a shopped offer | POST /json/{version}/offers/price | priced offer present | always |
| booking_creation | pax_1 | Create an order for one passenger | POST /json/{version}/orders | order id present | function:booking_creation |
| booking_creation | pax_2_to_4 | Create an order for two to four passengers | POST /json/{version}/orders | order id present | pax:multi |
| booking_creation | child | Create an order that includes a child (CHD) and read the passenger back on the order | POST /json/{version}/orders | order id present CHD passenger present on order | pax:CHD |
| booking_creation | infant | Create an order that includes a lap infant (INF) and read the passenger back on the order | POST /json/{version}/orders | order id present INF passenger present on order | pax:INF |
| booking_creation | connection | Create an order on a connecting (two-segment) itinerary | POST /json/{version}/orders | order id present | itinerary:connection |
| cancellation | reshop_quote | Quote a cancellation (NDC: OrderReshop DeleteOrderItem; JSON: reshop CancelOrder) | POST /json/{version}/orders/{orderId}/reshop | cancellation quote present | function:cancellation |
| cancellation | commit | Commit a cancellation (NDC: AcceptCancelledOffer; JSON: POST cancel, AcceptCancelledOffer or CancelJourney) | POST /json/{version}/orders/{orderId}/cancelPATCH /json/{version}/orders/{orderId} | order id present | function:cancellation |
| voluntary_change | reshop | Shop replacement flights for an order (NDC: OrderReshop AddOfferItems; JSON: reshop ReshopItinerary) | POST /json/{version}/orders/{orderId}/reshop | reshop offer present | function:voluntary_change |
| voluntary_change | commit | Accept the repriced change (NDC: AcceptRepricedOrder; JSON: AcceptReshopOffer) | PATCH /json/{version}/orders/{orderId} | order id present | function:voluntary_change |
| hold | create | Create an order without payment (NDC: no PaymentFunctions; JSON: payment type Hold) | POST /json/{version}/orders | order id present | function:hold |
| hold | pay | Pay a held order (NDC: OrderChange with PaymentFunctions; JSON: PATCH with payment or ConfirmHold) | PATCH /json/{version}/orders/{orderId} | order id present | function:hold |
| hold | cancel_unpaid | Cancel a held order before payment (CancelUnpaidOrder) | PATCH /json/{version}/orders/{orderId} | order id present | function:hold |
| errors | validation | Send a search that fails validation (e.g. an unknown passenger type) and receive the structured error | POST /json/{version}/offersPOST /json/{version}/offers/byJourney | error ERR-1004error ERR-1005 | always |
| errors | unknown_order | Retrieve an order that does not exist and receive the not-found error | GET /json/{version}/orders/{orderId} | error ERR-1007error ERR-1008 | always |
| errors | cancelled_order | Retrieve a fully cancelled order and receive the order-cancelled error | GET /json/{version}/orders/{orderId} | error ERR-4008 | function:cancellation |
| errors | creation_rejected | Have an order creation rejected (e.g. the same passenger twice on one flight) and receive the rejection | POST /json/{version}/orders | error ERR-4001 | function:booking_creation |
| errors | change_not_permitted | Reshop a No Flex order and receive the flight-change-not-permitted error | POST /json/{version}/orders/{orderId}/reshop | error ERR-4003 | product:NO + function:voluntary_change |
| product | no_flex | Search a market and date where a No Flex offer is returned | POST /json/{version}/offersPOST /json/{version}/offers/byJourney | response present | product:NO |
| product | nice | Search a market and date where a Nice offer is returned | POST /json/{version}/offersPOST /json/{version}/offers/byJourney | response present | product:EZ:EZU |
| product | nicer | Search a market and date where a Nicer offer is returned | POST /json/{version}/offersPOST /json/{version}/offers/byJourney | response present | product:EZ:BZU |
| product | nicest | Search a market and date where a Nicest offer is returned | POST /json/{version}/offersPOST /json/{version}/offers/byJourney | response present | product:EZ:AZU |
| seat | free_quote | Request the seat map for a priced offer that returns free seats | POST /json/{version}/offers/{offerId}/seats | response present | seat:free |
| seat | paid_quote | Request the seat map for a priced offer that returns paid seats | POST /json/{version}/offers/{offerId}/seats | response present | seat:paid |
| seat | selection | Create an order (or AcceptOffer) that selects a seat and shows it on the order | POST /json/{version}/ordersPATCH /json/{version}/orders/{orderId} | order id present assigned seat present on order | seat:selection |
| bag | quote | Request the service list for a priced offer; a priced bag tier is returned | POST /json/{version}/offers/{offerId}/services | response present | bag |
| bag | selection | Create an order (or AcceptOffer) that adds a bag tier and shows it on the order | POST /json/{version}/ordersPATCH /json/{version}/orders/{orderId} | order id present bag service present on order | bag |
| assistance | quote | Request the service list for a priced offer; a special-assistance SSR (e.g. WCHR) is returned | POST /json/{version}/offers/{offerId}/services | response present | assistance |
| assistance | selection | Create an order (or AcceptOffer) that adds a special-assistance SSR and shows it on the order | POST /json/{version}/ordersPATCH /json/{version}/orders/{orderId} | order id present assistance service present on order | assistance |
| payment | visa | Pay an order (on create, or paying a hold) with a Visa card (brand VI) | POST /json/{version}/ordersPATCH /json/{version}/orders/{orderId} | order id present | payment:VI |
| payment | mastercard | Pay an order (on create, or paying a hold) with a Mastercard card (brand CA) | POST /json/{version}/ordersPATCH /json/{version}/orders/{orderId} | order id present | payment:CA |
| payment | discover | Pay an order (on create, or paying a hold) with a Discover card (brand DS) | POST /json/{version}/ordersPATCH /json/{version}/orders/{orderId} | order id present | payment:DS |
| payment | amex | Pay an order (on create, or paying a hold) with a American Express card (brand AX) | POST /json/{version}/ordersPATCH /json/{version}/orders/{orderId} | order id present | payment:AX |
| payment | uatp | Pay an order (on create, or paying a hold) with a UATP card (brand TP) | POST /json/{version}/ordersPATCH /json/{version}/orders/{orderId} | order id present | payment:TP |
| contact | agency | Send a named, emailed Agency contact (on create or as a contact update) and read it back on the order | POST /json/{version}/ordersPATCH /json/{version}/orders/{orderId} | order id present agency email returned on order | contact:agency |
| notification | webhook | Receive a schedule-change webhook delivery (any notifiable order change in staging produces one) | latest delivery answered 2xx | notification:webhook |
Cases, NDC/XML API v26.2
Section titled “Cases, NDC/XML API v26.2”| Function | Case | What to send | Through | Must hold | Requires |
|---|---|---|---|---|---|
| search | one_way | Search one origin-destination and receive offers | AirShopping | at least one offer | always |
| search | round_trip | Search an outbound and its return and receive offers | AirShopping | at least one offer | always |
| search | open_jaw | Search two or more origin-destinations that are not a round trip and receive offers | AirShopping | at least one offer | always |
| search | connection | Search a market where a connecting (two-segment) itinerary is offered | AirShopping | response present | itinerary:connection |
| pricing | priced | Price a shopped offer | OfferPrice | priced offer present | always |
| booking_creation | pax_1 | Create an order for one passenger | OrderCreate | order id present | function:booking_creation |
| booking_creation | pax_2_to_4 | Create an order for two to four passengers | OrderCreate | order id present | pax:multi |
| booking_creation | child | Create an order that includes a child (CHD) and read the passenger back on the order | OrderCreate | order id present CHD passenger present on order | pax:CHD |
| booking_creation | infant | Create an order that includes a lap infant (INF) and read the passenger back on the order | OrderCreate | order id present INF passenger present on order | pax:INF |
| booking_creation | connection | Create an order on a connecting (two-segment) itinerary | OrderCreate | order id present | itinerary:connection |
| cancellation | reshop_quote | Quote a cancellation (NDC: OrderReshop DeleteOrderItem; JSON: reshop CancelOrder) | OrderReshop | cancellation quote present | function:cancellation |
| cancellation | commit | Commit a cancellation (NDC: AcceptCancelledOffer; JSON: POST cancel, AcceptCancelledOffer or CancelJourney) | OrderChange | order id present | function:cancellation |
| voluntary_change | reshop | Shop replacement flights for an order (NDC: OrderReshop AddOfferItems; JSON: reshop ReshopItinerary) | OrderReshop | reshop offer present | function:voluntary_change |
| voluntary_change | commit | Accept the repriced change (NDC: AcceptRepricedOrder; JSON: AcceptReshopOffer) | OrderChange | order id present | function:voluntary_change |
| hold | create | Create an order without payment (NDC: no PaymentFunctions; JSON: payment type Hold) | OrderCreate | order id present | function:hold |
| hold | pay | Pay a held order (NDC: OrderChange with PaymentFunctions; JSON: PATCH with payment or ConfirmHold) | OrderChange | order id present | function:hold |
| hold | cancel_unpaid | Cancel a held order before payment (CancelUnpaidOrder) | OrderChange | order id present | function:hold |
| errors | validation | Send a search that fails validation (e.g. an unknown passenger type) and receive the structured error | AirShopping | error ERR-1004error ERR-1005 | always |
| errors | unknown_order | Retrieve an order that does not exist and receive the not-found error | OrderRetrieve | error ERR-1007error ERR-1008 | always |
| errors | cancelled_order | Retrieve a fully cancelled order and receive the order-cancelled error | OrderRetrieve | error ERR-4008 | function:cancellation |
| errors | creation_rejected | Have an order creation rejected (e.g. the same passenger twice on one flight) and receive the rejection | OrderCreate | error ERR-4001 | function:booking_creation |
| errors | change_not_permitted | Reshop a No Flex order and receive the flight-change-not-permitted error | OrderReshop | error ERR-4003 | product:NO + function:voluntary_change |
| product | no_flex | Search a market and date where a No Flex offer is returned | AirShopping | response present | product:NO |
| product | nice | Search a market and date where a Nice offer is returned | AirShopping | response present | product:EZ:EZU |
| product | nicer | Search a market and date where a Nicer offer is returned | AirShopping | response present | product:EZ:BZU |
| product | nicest | Search a market and date where a Nicest offer is returned | AirShopping | response present | product:EZ:AZU |
| seat | free_quote | Request the seat map for a priced offer that returns free seats | SeatAvailability | response present | seat:free |
| seat | paid_quote | Request the seat map for a priced offer that returns paid seats | SeatAvailability | response present | seat:paid |
| seat | selection | Create an order (or AcceptOffer) that selects a seat and shows it on the order | OrderCreate | order id present assigned seat present on order | seat:selection |
| bag | quote | Request the service list for a priced offer; a priced bag tier is returned | ServiceList | response present | bag |
| bag | selection | Create an order (or AcceptOffer) that adds a bag tier and shows it on the order | OrderCreate | order id present bag service present on order | bag |
| assistance | quote | Request the service list for a priced offer; a special-assistance SSR (e.g. WCHR) is returned | ServiceList | response present | assistance |
| assistance | selection | Create an order (or AcceptOffer) that adds a special-assistance SSR and shows it on the order | OrderCreate | order id present assistance service present on order | assistance |
| payment | visa | Pay an order (on create, or paying a hold) with a Visa card (brand VI) | OrderCreateOrderChange | order id present | payment:VI |
| payment | mastercard | Pay an order (on create, or paying a hold) with a Mastercard card (brand CA) | OrderCreateOrderChange | order id present | payment:CA |
| payment | discover | Pay an order (on create, or paying a hold) with a Discover card (brand DS) | OrderCreateOrderChange | order id present | payment:DS |
| payment | amex | Pay an order (on create, or paying a hold) with a American Express card (brand AX) | OrderCreateOrderChange | order id present | payment:AX |
| payment | uatp | Pay an order (on create, or paying a hold) with a UATP card (brand TP) | OrderCreateOrderChange | order id present | payment:TP |
| contact | agency | Send a named, emailed Agency contact (on create or as a contact update) and read it back on the order | OrderCreateOrderChange | order id present agency email returned on order | contact:agency |
| notification | webhook | Receive a schedule-change webhook delivery (any notifiable order change in staging produces one) | latest delivery answered 2xx | notification:webhook |
Cases, NDC/XML API v25.4 and v24.1
Section titled “Cases, NDC/XML API v25.4 and v24.1”Compared to v26.2, the older versions omit the product, seat, bag, assistance, card-brand, and
agency-contact cases, and use payment/card in place of the card brands.
| Function | Case | What to send | Through | Must hold | Requires |
|---|---|---|---|---|---|
| search | one_way | Search one origin-destination and receive offers | AirShopping | at least one offer | always |
| search | round_trip | Search an outbound and its return and receive offers | AirShopping | at least one offer | always |
| search | open_jaw | Search two or more origin-destinations that are not a round trip and receive offers | AirShopping | at least one offer | always |
| search | connection | Search a market where a connecting (two-segment) itinerary is offered | AirShopping | response present | itinerary:connection |
| pricing | priced | Price a shopped offer | OfferPrice | priced offer present | always |
| booking_creation | pax_1 | Create an order for one passenger | OrderCreate | order id present | function:booking_creation |
| booking_creation | pax_2_to_4 | Create an order for two to four passengers | OrderCreate | order id present | pax:multi |
| booking_creation | child | Create an order that includes a child (CHD) and read the passenger back on the order | OrderCreate | order id present CHD passenger present on order | pax:CHD |
| booking_creation | infant | Create an order that includes a lap infant (INF) and read the passenger back on the order | OrderCreate | order id present INF passenger present on order | pax:INF |
| booking_creation | connection | Create an order on a connecting (two-segment) itinerary | OrderCreate | order id present | itinerary:connection |
| payment | card | Create an order paid by card | OrderCreate | order id present | function:booking_creation |
| cancellation | reshop_quote | Quote a cancellation (NDC: OrderReshop DeleteOrderItem; JSON: reshop CancelOrder) | OrderReshop | cancellation quote present | function:cancellation |
| cancellation | commit | Commit a cancellation (NDC: AcceptCancelledOffer; JSON: POST cancel, AcceptCancelledOffer or CancelJourney) | OrderChange | order id present | function:cancellation |
| voluntary_change | reshop | Shop replacement flights for an order (NDC: OrderReshop AddOfferItems; JSON: reshop ReshopItinerary) | OrderReshop | reshop offer present | function:voluntary_change |
| voluntary_change | commit | Accept the repriced change (NDC: AcceptRepricedOrder; JSON: AcceptReshopOffer) | OrderChange | order id present | function:voluntary_change |
| hold | create | Create an order without payment (NDC: no PaymentFunctions; JSON: payment type Hold) | OrderCreate | order id present | function:hold |
| hold | pay | Pay a held order (NDC: OrderChange with PaymentFunctions; JSON: PATCH with payment or ConfirmHold) | OrderChange | order id present | function:hold |
| hold | cancel_unpaid | Cancel a held order before payment (CancelUnpaidOrder) | OrderChange | order id present | function:hold |
| errors | validation | Send a search that fails validation (e.g. an unknown passenger type) and receive the structured error | AirShopping | error ERR-1004error ERR-1005 | always |
| errors | unknown_order | Retrieve an order that does not exist and receive the not-found error | OrderRetrieve | error ERR-1007error ERR-1008 | always |
| errors | cancelled_order | Retrieve a fully cancelled order and receive the order-cancelled error | OrderRetrieve | error ERR-4008 | function:cancellation |
| errors | creation_rejected | Have an order creation rejected (e.g. the same passenger twice on one flight) and receive the rejection | OrderCreate | error ERR-4001 | function:booking_creation |
| errors | change_not_permitted | Reshop a No Flex order and receive the flight-change-not-permitted error | OrderReshop | error ERR-4003 | product:NO + function:voluntary_change |
| notification | webhook | Receive a schedule-change webhook delivery (any notifiable order change in staging produces one) | latest delivery answered 2xx | notification:webhook |