Guides · API Reference

Public REST API

Everything Norba exposes to travel agencies. JSON-over-HTTPS.

Work in Progress

The Norba API is actively under development. New endpoints, data sources, and features are being added daily. Please report any discrepancies or issues you encounter at hello@norba.io. We appreciate your patience as we build this platform.

Base URL
api.norba.io
Version
v1
Protocol
HTTPS / JSON

Conventions

  • Base path/v1/
  • AuthAuthorization: Bearer <api-key> on every authenticated endpoint.
  • TimesRFC 3339 UTC — 2026-06-15T10:00:00Z
  • Money{ "amount": 542.10, "currency": "GBP" } — ISO 4217 currency.
  • IDsULID for internal entities; opaque strings for airline-owned IDs.
  • Errors{ "error": "<code>", "message": "<human>", "request_id": "<ulid>" }

Public endpoints (no auth)

MethodPathDescription
GET/v1/healthLiveness probe (DB + Redis ping). Returns 200 with { "status": "ok" }.

Aviation data

MethodPathDescription
GET/v1/airlinesList supported airlines from refdata.
GET/v1/airports?q=londAirport autocomplete (refdata).

Shopping

MethodPathDescription
POST/v1/shopping/offersSearch for flights. Returns ranked offers from all connected airlines.
POST/v1/shopping/offers/pricePrice-lock a specific offer (valid 5–15 min).
POST/v1/shopping/servicesAncillary catalogue — bags, meals, lounges.
POST/v1/shopping/seatsSeat map for a specific segment.

SearchRequest body

JSON·search-request.json
{
  "origin":         "MAD",
  "destination":    "LHR",
  "departure_date": "2026-06-15",
  "return_date":    "2026-06-22",
  "passengers":     [
    { "type": "ADT", "count": 2 },
    { "type": "CHD", "count": 1 }
  ],
  "cabin_class":    "economy",
  "currency":       "GBP",
  "airlines":       ["BA", "IB"]
}

Orders

MethodPathDescription
POST/v1/ordersCreate from a priced offer + passengers (+ optional payment).
GET/v1/orders/{id}Retrieve current state.
POST/v1/orders/{id}/paySubmit payment to ticket a pending order.
POST/v1/orders/{id}/changeVoluntary change of itinerary or passenger data.
POST/v1/orders/{id}/reshopGet alternatives (disruption or voluntary change).
POST/v1/orders/{id}/refundCancel and refund.
DELETE/v1/orders/{id}Cancel (no refund).
GET/v1/orders/{id}/historyAudit trail (order_events).
GET/v1/ordersList orders by agency, paginated.

Servicing

MethodPathDescription
POST/v1/orders/{id}/seatsAssign or change seats.
POST/v1/orders/{id}/ancillariesAdd bags, meals, lounges, or Wi-Fi.
POST/v1/orders/{id}/ssrsAdd Special Service Requests and APIS data.

Webhooks

MethodPathDescription
GET/v1/webhooks/subscriptionsList your subscriptions.
POST/v1/webhooks/subscriptionsCreate a subscription.
DELETE/v1/webhooks/subscriptions/{id}Remove a subscription.
GET/v1/webhooks/attempts?subscription_id=…Delivery log.
Webhook payloads

All events are JSON-over-HTTPS POST with a X-Norba-Signature header (HMAC-SHA256 of the raw body using your webhook secret). Verify this signature before processing any payload.

Error codes

HTTPError codeMeaning
400invalid_requestMissing or malformed field in the request body.
401unauthorizedMissing or invalid Bearer token.
403forbiddenToken valid but lacks permission for this resource.
404not_foundThe requested resource does not exist.
409offer_expiredThe OfferID is no longer valid — re-shop and try again.
422order_validation_failedPassenger data or payment data failed airline-side validation.
429rate_limitedYou have exceeded the rate limit. Retry-After header indicates when to retry.
502airline_errorThe upstream airline returned an error. The request_id is logged for diagnosis.
503circuit_openThe adapter for this airline is in open-circuit state. Retry after 30 s.