After creating an order, retrieve available services by calling GET /air/orders/{order_id} and inspecting available_services[], or by having passed return_available_services=true on the offer request before ordering.
Each service has a type ('seat' or 'baggage'), id, total_amount, and for seats a designator (e.g. '14C') and disclosures[]; select the desired service ids.
Add services: POST /air/orders/{order_id}/services with data.add[]: [{id: service_id, quantity: 1}] and data.payment specifying the payment method; confirm the updated order object includes the service in services[].
To change passenger details (e.g. correct a name before ticketing), POST /air/orders/{order_id}/order_change_requests with the desired passenger updates; Duffel will return a change offer with a penalty amount.
Confirm a change by POSTing to /air/order_change_offers/{id}/actions/confirm with payment; the order will reflect the updated details.
For itinerary changes (e.g. adding a return leg), check if the airline supports order changes via Duffel — not all carriers do; if not supported, you must cancel and rebook.
Known gotchas
Seat availability returned at offer-request time may be stale by order time; always re-fetch available services after order creation before presenting seats to the user.
Name corrections are subject to airline-specific rules — some carriers allow one free correction before ticketing, others charge a fee or disallow it entirely; the change offer will show the penalty but not the reason.
Service additions after ticketing (EMD issuance) are less reliably supported across all carriers in Duffel's network; test with target carriers in the test environment before going live.
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp