Getting started · Errors

Errors & rate limits

Branch on `code`, never on the `error` sentence. Quote the `X-Request-Id` response header when you contact support.

D-202
RESPONSESHTTPCODEWHAT TO DO400invalid_searchFIXTHEREQUEST402payment_requiredADDACARD409order_busyRETRY,SAMEKEY422airline_refusedAIRLINESAIDNO429allowance_burstWAITORADDCARD502*_outcome_unknownDONOTRESEND503airline_unreachableWAIT,THENRETRYBranch on codeNever on the error sentenceOutcome unknownRead GET /v1/orders insteadSafe to retryAfter Retry-After, same key

Error response format

FieldTypeDescription
attempt_idstring*_outcome_unknown: the attempt to quote to support.
codestringStable reason to branch on, where the table lists one.
errorstringAlways present. A readable sentence.
limit / allowance_remainingnumber429s: the ceiling reached, or free requests left.
messagestringBilling and limit refusals: text to show the account holder.
statusstringOrder-state conflicts: the order's current status.
{ "error": "missing X-API-Key" }

{ "error": "departure_date must not be in the past", "code": "date_out_of_range" }

{
  "error": "the airline did not say whether this request took effect; it is being confirmed — do not send it again, and quote attempt_id to support",
  "code": "booking_outcome_unknown",
  "attempt_id": "5f0c2a3e-7b1d-4c9a-9e2f-1a2b3c4d5e6f"
}

Error codes

A dash means the body has only `error`. *_outcome_unknown stands for booking_, cancel_, change_, commit_, extras_ and refund_outcome_unknown.

HTTPcodeWhat to do
400action_requiredPUT /v1/orders/{id} without `action`.
400date_out_of_rangeDate in the past or more than 361 days ahead.
400idempotency_key_requiredA paying write needs an Idempotency-Key header.
400infants_exceed_adultsMore infants than adults.
400invalid_contact_emailA contact email is not one plain address.
400invalid_dateDate not YYYY-MM-DD, or multi-city legs out of order.
400invalid_searchA search field is invalid; `error` names it.
400passenger_capMore passengers than one order may carry; `error` gives the limit.
400payment_method_not_allowedPayment without a card. Only card payments are accepted.
400return_before_departurereturn_date is before departure_date.
400same_airportOrigin and destination are the same.
400too_many_passengersMore than 9 passengers.
400use_cancel_confirmCancel some flights with POST /v1/orders/{id}/cancel/confirm.
400—Any other invalid body or parameter; `error` names it.
401—Missing, invalid, revoked or expired key. See Authentication.
402delinquent, past_dueUnpaid invoices. Settle them in the dashboard.
402payment_method_requiredThis plan books in production only with a card on file.
402payment_requiredFree requests used up and no card on file. Add a card.
403booking_limit_exceededAbove the member's booking limit. An owner or admin can raise it.
403booking_limit_unverifiableThe booking's currency cannot be compared with the member's limit. An owner or admin can book it.
403carrier_agreement_requiredNot yet approved for this airline in production. Apply from Go Live.
403email_verification_requiredVerify your email, or add a card.
403unknown_planContact support.
403—A key restriction or permission refused the call. See Authentication.
404not_foundNo such route. Check the path and the /v1 prefix.
404offer_not_foundAn order id was sent where an offer id is expected.
404order_not_foundNo such order in this key's environment. May carry `did_you_mean`.
404seat_map_segment_not_foundNo seat map for that segment; see `segments_available`.
404—Offer not found or no longer available. Search again.
405method_not_allowedWrong method; the `Allow` header lists the right ones.
409already_paidThe order is already paid.
409attempt_settledSupport settled this request before it was sent. Nothing was sent; read the order.
409idempotency_key_in_flightA request with this key is still running. Retry after Retry-After.
409idempotency_key_reusedKey already used with a different body. Use a new key.
409illegal_transitionThe order's status does not allow this. `status` gives it.
409nothing_to_refundThe order was never paid. Cancel it instead.
409offer_already_orderedSame offer and travellers already booked. Read `order_id`.
409offer_not_pricedPrice the offer with POST /v1/offers/price before paying.
409order_busyAnother write on this order is running. Retry after Retry-After, same key.
409*_outcome_unknownAn earlier attempt with this key, or on this order, is still being confirmed. Do not resend.
409refund_not_requestedCancelled without a refund request. Ask the airline.
409self_transfer_unavailableThe self-transfer trip no longer connects. Search again.
409trip_not_madeThis key names a self-transfer trip that was not made. Price again and book with a new key.
413—Body over 1 MiB.
421misdirected_requestCall https://api.norba.io.
422airline_refusedThe airline declined the request. Nothing was booked or charged.
422extra_not_pricedSeat or extra not in the seat map or service list. Fetch it first.
422extras_not_supportedSeats or extras sent with a self-transfer trip. Add them to each order once booked.
422flights_unavailableThe flights are no longer available. Pick another offer.
422hold_expiredThe unpaid hold has expired. Search again.
422no_alternativesNo fares found for the requested change.
422offer_expiredThe offer has expired. Search and price again.
422partial_cancel_unavailableThese flights cannot be cancelled alone. Cancel or change the whole order.
422passenger_name_invalidA first or last name has no Latin letter. Send it in Latin script, as on the passport.
422—`payment.authentication` is not supported on this airline. Send the payment without it.
429allowance_burstToo many free requests at once. Wait, or add a card.
429*_limit_exceededdaily_search_, monthly_order_ or monthly_search_limit_exceeded: a ceiling agreed for your account. `limit` gives it.
429—Too many requests with an invalid key from one address. Fix the key.
500—Norba-side failure. Retry; quote the X-Request-Id if it persists.
501refund_not_supportedThis airline's ticketed refunds are not available through the API. Ask the airline.
501—Seat map or service list qualifiers not supported on this airline. Send without them.
502*_outcome_unknownThe write reached the airline but its answer was lost. Do not resend; check GET /v1/orders.
502—The airline could not answer. Safe to retry.
503airline_unreachableNothing reached the airline. Retry after Retry-After, same key.
503coming_soonBooking is not enabled in this environment yet. Reads work.
503ledger_unavailable, order_unreadableTemporarily unavailable; nothing was sent. Retry after Retry-After, same key.
503rls_unavailableTemporarily unavailable. Retry after Retry-After.
503service_restartingThe service is restarting. Retry after Retry-After.
503—Airline not available in this key's environment, or a temporary key check failure.

Safe to retry: 429 and 503 after Retry-After, 500, and 502 without a code. Never resend a request answered *_outcome_unknown. Idempotency keys.

Aviation Data errors

/v1/aviation/* and /v1/reference/* answer `{ data: null, meta, errors: [{ code, message }] }`. Key and billing refusals keep the plain `{ error }` shape.

HTTPcodeWhat to do
400invalid_airlineairline is not a 2-character IATA code.
400invalid_pagepage is above 1000. A page past the data is an empty list.
400invalid_routeorigin and destination must both be 3-letter IATA codes.
404not_foundNo record with that id.
500db_errorRetry.
503db_not_configuredRetry later.

Rate limits

Requests with a valid key are not rate-limited. A 429 comes only from a volume ceiling agreed for your account, the free-allowance burst guard, or repeated invalid keys from one address. Wait for Retry-After.

Billing refusals and the free allowance: Billing & Payments · Look-to-book: Pricing.

API Error Codes & HTTP Status Reference | Norba Docs