Live and bookable — pre-production, and no payment
These endpoints work against real American Airlines inventory: a search returns real offers and you can create a real booking with a carrier PNR. Two limits are worth knowing before you build against them.
- Orders are pre-production. They are genuine reservations in the airline's pre-production system, not commercial tickets — nobody flies on them. Cancel what you create; anything left over expires on its own payment time limit.
- Payment and ticketing cannot complete. An order is created as an unpaid hold, which is the normal agency flow, but ticketing is inhibited on this IATA number, so
POST /v1/orders/{orderID}/commitreturns502. Everything up to and including the reservation works.
Orders
Commit order
Finalise an upsell — add ancillaries and seats and settle payment on an existing order.
POST
/v1/orders/{orderID}/commitRequires X-API-KeyThe
OrderChange variant that closes out an upsell: ancillaries, seats and a payment in one call. **This is the closest thing to a "pay" endpoint — there is no POST /v1/orders/{orderID}/pay.**> Ticketing is inhibited on this account, so this call cannot currently succeed. A full card payload reaches the airline and comes back 502 americanairlines: orderchange (complete_payment) failed: [240000002] Document issuance failed. Root cause: IATA Ticketing Authority webservice error 200 (ticket rejected) - All Ticket related transactions have been inhibited for IATA number 00125576. The order is left untouched — still confirmed, zero tickets, zero payments — so the call is safe to attempt. The request path is verified end to end: the body decodes, routes and reaches the carrier; only the ticketing authority refuses.Seats added here are subject to the paid-seat limitation described on PUT /v1/orders/{orderID}. ?airline= is required.Request example
curl --request POST \
--url https://api.norba.io/v1/orders/{orderID}/commit \
--header "X-API-Key: $NORBA_KEY" \
--header "Content-Type: application/json" \
--data '{ "payment": { "method": "CARD", "currency": "EUR", "amount": 380.62 } }'Response example
Response example
{
"order_id": "AA001Y1XD7ZA6",
"pnr": "JBQGEY",
"status": "ticketed",
"total_amount": 380.62,
"tickets": [
{
"ticket_number": "001-1234567890",
"passenger_id": "PAX96101",
"status": "issued"
}
]
}Path parameters
orderIDstringRequiredCanonical order ID.
Example:
AA001Y1XD7ZA6Query parameters
airlinestringRequiredIATA code. Required.
Example:
AARequest body
paymentobjectmethod (CARD, TRANSFER, WALLET), currency, amount, and optional card (number, holder, expiry_month, expiry_year, cvv, brand).ancillariesarray<Ancillary>Ancillaries to add.
seatsarray<Seat>Seats to assign — see the paid-seat limitation.
Error codes
400invalid json, or unknown airline.502The airline rejected the commit.
503coming_soon — order writes disabled.