Duffel is a modern travel API for flights (NDC/GDS content from 300+ airlines) and stays, with REST/JSON and official SDKs. We built the client's booking adapter on top of it, plus an LLM travel concierge that turns plain-language requests into Duffel searches.
A corporate-travel SaaS wanted to embed multi-trip booking inside its spend-management platform, with a concierge that understood requests like "3-day trip to Atlanta next month, under $800". Integrating airlines directly meant wrestling antiquated GDS protocols and brittle SOAP feeds.
- Mapping natural-language trip requests onto Duffel's OfferRequest → Offer → Order resource model.
- Handling fast-expiring offers — fares go stale in seconds, so quotes had to be refreshed at the moment of selection.
- Collecting payment and ticketing reliably, then persisting the airline booking reference for post-booking changes.
We built an integration layer on the Duffel API using the @duffel/api SDK: an LLM extracts slices and passengers from chat, we POST /air/offer_requests, stream offers to the UI, re-fetch the chosen offer to beat staleness, collect payment, and POST /air/orders to ticket.
- An LLM concierge that parses chat into slices[].origin/destination/departure_date and passenger counts, then issues a Duffel offer request.
- A selection flow that re-fetches GET /air/offers/{id} at click-time so the customer never books a stale fare.
- A booking module that collects payment, calls POST /air/orders, and persists the airline booking_reference for seat, baggage, and refund workflows.
A customized view of the system we shipped for this engagement — the components and how requests and data flow between them.
Before — manual bottleneck flow
Coordinator emails carriers to check seats and fares for each corporate trip.
Agent blocks seats on legacy terminals and manually reconciles fare rules.
Tickets and confirmations are emailed out one traveler at a time.
After — automated optimized flow
Plain-language request becomes a Duffel offer request across 300+ airlines.
The chosen offer is re-fetched at click-time so the fare is always current.
Payment is collected, the order is created, and the booking reference is stored.
“What I cared about most was no stale fares at checkout, and that's exactly what we got. Users describe a trip in plain language and the booking holds — we stopped fielding 'the price changed' support tickets almost overnight.”

