Sandbox: real offers, real PNRs, no tickets
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 orders are never ticketed. A paid order comes back
confirmedwith an emptytickets[]and a warning saying why. Readstatusandtickets[], not the HTTP code — that is the check production relies on too.
Orders
Reshop order
Find alternative flights for an existing booking — disruption or voluntary change.
POST
/v1/orders/{orderID}/reshopRequires X-API-KeySearches the airline for alternatives to a booked itinerary and returns offers in the same canonical shape as flight search, wrapped as
{"offers": [...]}.Reshop does not modify the order. Apply a chosen alternative with POST /v1/orders/{orderID}/change/confirm (or PUT /v1/orders/{orderID} with action: "reissue" and the offer in offer_ids).Dropping part of the trip. {"partial_cancel": true, "segment_ids": [...]} asks what cancelling only those flights would return: the answer is a cancel offer whose total_amount is negative by the refund. POST /v1/orders/{orderID}/cancel with segment_ids wraps exactly this and hands back a CancellationQuote instead.> The two dates are RFC 3339 timestamps, not plain YYYY-MM-DD calendar dates — they decode into a time value, so send 2026-10-22T00:00:00Z.> What you leave out comes from the order. new_departure_date alone moves the outbound along the order's own route; new_return_date alone moves only the return; new_origin/new_destination override the route. An empty body {} or {"partial_cancel": true} returns the cancellation quote instead — an R…-prefixed offer whose total_amount is the refund, negative.> Whether the airline has an alternative depends on the market. The AA sandbox priced a DFW–ORD date change and answered No fares available or ticket(s) not eligible for this market on JFK–MAD; that refusal comes back as 422 no_alternatives with a readable message, not as a 502.?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}/reshop \
--header "X-API-Key: $NORBA_KEY" \
--header "Content-Type: application/json" \
--data '{ "partial_cancel": true }'Response example
Response example
{
"offers": [
{
"offer_id": "AA-X9F21AB03-…|X9F21AB03-…-1-1",
"airline": "AA",
"currency": "EUR",
"total_amount": 412.8,
"slices": [
{
"origin": "BCN",
"destination": "JFK",
"stops": 0
}
]
}
]
}Path parameters
orderIDstringRequiredCanonical order ID.
Example:
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.Example:
AARequest body
new_departure_datestring (RFC 3339)Replacement outbound date.
new_return_datestring (RFC 3339)Replacement return date.
new_originstringReplacement origin IATA code.
new_destinationstringReplacement destination IATA code.
partial_cancelbooleanWith
segment_ids and no new dates: quote dropping only those flights. Alone: the whole-order cancel offer.segment_idsarray<string>Segments to drop (
partial_cancel), or to replace when new dates are given.Error codes
400invalid json, or airline does not match the order when a supplied ?airline= disagrees with the persisted carrier.422no_alternatives — the airline has no fares for that itinerary on those dates.502The airline rejected the reshop.
503coming_soon — order writes disabled.