In the sandbox these endpoints work against real carrier test inventory: a search returns real offers and you can create a real booking with a carrier PNR. Two things are worth knowing before you build against them.
- Sandbox orders are test reservations. Nobody flies on them, and they raise no fee. Cancel what you create; anything left over expires on its own payment time limit.
- Sandbox tickets are test documents. A paid order comes back
ticketedwith test ticket and EMD numbers intickets[]; a hold comes backconfirmedwith none. Readstatusandtickets[], not the HTTP code — that is the check production relies on too.
Quote a change
Structured servicing: price a voluntary change before committing to it.
/v1/orders/{orderID}/changeRequires X-API-KeyThe quote half of the structured quote → confirm change flow. Returns the same ChangeQuote as POST /v1/orders/{orderID}/quote — original fare, new fare, penalty, difference.
**Present the quote to the traveller, then call POST /v1/orders/{orderID}/change/confirm.**
The body is currently decoded and discarded: action, segment_ids and reason are accepted and validated as JSON, but the handler reprices the whole order regardless. Send {} and rely on the quote. Targeted per-segment change pricing is not implemented.
?airline= is optional: the airline comes from your stored order, not from this parameter. A value that disagrees with the persisted carrier is refused with 400 airline does not match the order.
Request example
curl --request POST \
--url https://api.norba.io/v1/orders/{orderID}/change \
--header "X-API-Key: $NORBA_KEY" \
--header "Content-Type: application/json" \
--data '{ "action": "reissue" }'Response example
{
"quote_id": "qte_01K2M8ZC3AC5N8",
"order_id": "AA001Y1XD7ZA6",
"original_fare": {
"amount": 380.62,
"currency": "EUR"
},
"new_fare": {
"amount": 380.62,
"currency": "EUR"
},
"penalty": {
"amount": 0,
"currency": "EUR"
},
"difference": {
"amount": 0,
"currency": "EUR"
},
"valid_until": "2026-08-14T10:15:00Z"
}Path parameters
orderIDstringRequiredCanonical order ID.
AA001Y1XD7ZA6Query parameters
airlinestringIATA code. Optional — inferred from your stored order. A value that disagrees with the persisted carrier is refused with 400 airline does not match the order.
AARequest body
actionstringreissue, ancillaries or cancel_segments. Accepted but not acted on.
segment_idsarray<string>Accepted but not acted on.
reasonstringAccepted but not acted on.
Error codes
400invalid json, or airline does not match the order when a supplied ?airline= disagrees with the persisted carrier.
502The airline rejected the quote.