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 confirmed with an empty tickets[] and a warning saying why. Read status and tickets[], 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-Key
Searches 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
        }
      ]
    }
  ]
}

Authorization

X-API-KeystringRequired
Opaque API key issued from the Norba dashboard. Sent on every request as the X-API-Key HTTP header. Missing or invalid keys are rejected with 401 Unauthorized.

Path parameters

orderIDstringRequired
Canonical order ID.
Example: AA001Y1XD7ZA6

Query parameters

airlinestring
IATA 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: AA

Request body

new_departure_datestring (RFC 3339)
Replacement outbound date.
new_return_datestring (RFC 3339)
Replacement return date.
new_originstring
Replacement origin IATA code.
new_destinationstring
Replacement destination IATA code.
partial_cancelboolean
With 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

400
invalid json, or airline does not match the order when a supplied ?airline= disagrees with the persisted carrier.
422
no_alternatives — the airline has no fares for that itinerary on those dates.
502
The airline rejected the reshop.
503
coming_soon — order writes disabled.
POST /v1/orders/{orderID}/reshop — Reshop order | Norba API