Add Seats and Ancillaries
Open airline seat maps, queue and commit seat assignments, auto-select by fare and position, and add bags, services, SSRs, and loyalty numbers.
Seat maps
The seat map is the airline's live map for your itinerary — real occupancy, exact prices per seat, and the carrier's own product names for paid zones and seat products:
$MAP # Seat map for the current segment
$MAP1 # Seat map for segment 1

$MAP: the carrier's live seat map — free, priced, and occupied seats as the airline reports them.Assign and remove seats
$P1/12A # Seat 12A for passenger 1
$P2/14C # Seat 14C for passenger 2
$P1/X # Remove passenger 1's seat
The habit to build: seat selections queue — they don't fire. Each $P1/12A is local until you commit with ER, which sends every queued assignment to the airline in one change. Queue all the seats, then one ER. If you change your mind before committing, IR abandons the queue and re-retrieves the order untouched.
Auto-selection: the $AUTO family
$AUTO picks seats from the currently loaded seat map instead of you naming a seat number — it survives occupancy changes and cabins that differ per aircraft:
$AUTO # Front-most free seat for every passenger
$P1/AUTO # Front-most free seat, passenger 1 only
$AUTO/PAID # Cheapest priced seat, every passenger
$P1/AUTO/EXIT/AISLE # Exit-row aisle seat for passenger 1
$AUTO/PAID/S2 # Paid seats from segment 2's already-loaded map
Qualifiers narrow the pick along four independent axes, and you may use at most one qualifier per axis (WINDOW plus AISLE together is a parse error):
- Fare —
PAID(any priced seat, cheapest first, ranked by price) orFREE(the default) - Column —
WINDOW,AISLE, orMIDDLE - Zone —
FRONT,CENTER, orBACK - Flag —
EXITto restrict to exit rows
Across axes they compose freely: $AUTO/PAID/WINDOW is the cheapest priced window seat. If nothing matches, the error names the qualifiers it couldn't satisfy and points you back to $MAP — a bare $AUTO in an all-paid cabin reports the cheapest paid option rather than silently attaching a charge.
If you knew $PREF: it's been removed, with no replacement — it keyed on a carrier "preferred" code that means different things on different airlines. PAID, which ranks by actual price, is the reliable substitute.
Bags and services
The + prefix adds ancillaries directly:
+BAG1/25KG # One 25kg bag, last passenger added
+P1/BAG1/25KG # One 25kg bag for passenger 1
+P1/LOUNGE # Lounge access for passenger 1
For everything the airline actually sells on your itinerary, ask for the catalog:
SERVICES # The airline's full service catalog, numbered rows
SERVICES/3 # Select catalog row 3 — one passenger/segment item
SERVICES/P1/3 # Global row 3, restricted to passenger 1
SERVICES/12/48/60 # Select several global catalog rows
Each row represents a passenger and segment item. Row numbers stay the same when you filter the catalog: SERVICES/P1 shows passenger 1's items with their original numbers. A scope such as SERVICES/P1/3 restricts which passenger the selected row must belong to. Batch support varies by booking.
If a service needs details, selection opens a labelled form. Enter and save those fields there; keep payment in the separate FOP picker. Refresh the catalog after a purchase or partial result.
A quote-and-issue service flow is available only where the booking enables it: select rows, run WP for the quote, review ISSUE, then confirm the entire current selection with ISSUE/ALL or all displayed row numbers. Choose payment separately before confirming; this owned cart refuses partial scope and inline payment qualifiers. That new flow is not enabled for live agencies yet. Existing bookings retain their supported reservation or purchase workflow; follow the returned result rather than assuming every service uses a new quote.
SSRs
SSRs use the ! prefix, and the passenger target is always required — an SSR never defaults to anyone:
!P1/VGML # Vegetarian meal, passenger 1
!P2/WCHR # Wheelchair, passenger 2
!P1/S2/WCHR # Wheelchair for P1, segment 2 only
The codes are the IATA codes you already know. System-managed codes (ticket numbers, infant associations) are set by NDCTerm itself and rejected as manual entries.
Loyalty numbers
The % prefix files frequent-flyer numbers against a passenger:
%P1/UA/123456789 # P1's United loyalty number
%AA/987654321 # Last passenger's American loyalty number
Enter loyalty before pricing whenever it can affect eligibility or price. On a direct booking it travels with the same passenger through shopping, pricing, and order creation. If you add or replace a number after offers already exist, NDCTerm keeps the selected flights but clears the stale offers and tells you to run WP again.
Loyalty belongs to the passenger's whole itinerary. Older carrier, segment, and alliance suffixes are accepted for compatibility, but they do not create a narrower airline-side scope; the confirmation message says that explicitly. Use one correct account per passenger and program rather than relying on a suffix to limit where it is filed.
Paying for what you added
Free items confirm through the booking's supported commit. Paid seats and services follow the result returned for that booking: an item may need to be reserved and then issued, or the supported purchase flow may already return an issued document. A pending EMD must be issued and paid before it is settled. Choose payment separately with FOP. Where supported, FOP/FEES previews fees for the active payment method; it does not charge or purchase a service.
The pending items land in the same numbered cart as flight tickets, and the same ISSUE command settles them — see Issue and Verify Tickets for the cart, forms of payment, and how to verify the EMD numbers landed on the order.