@voyant-travel/flights
v0.127.0
Published
Phase 3 of the catalog plane. The flights vertical is a partial-adoption module for live-API flight supplier search and booking in OTA, tour-operator, and DMC deployments.
Downloads
1,569
Readme
@voyant-travel/flights
Phase 3 of the catalog plane. The flights vertical is a partial-adoption module for live-API flight supplier search and booking in OTA, tour-operator, and DMC deployments.
Flights are modeled as supplier integrations and sourced inventory. Voyant is not positioned as an airline or flight-operator system.
See docs/architecture/catalog-flights-architecture.md
for the full design.
Install
pnpm add @voyant-travel/flightsWhat's in the box
./contract/types—FlightOffer,FlightOrder,FlightSegment,FlightSearchRequest,FlightBookRequest, capability ids,paymentIntentdiscriminated union. Shapes mirror voyant-cloud'sconnect-flight-contractso adapters are portable acrossvoyant-cloudand Voyant Catalog../contract/adapter—FlightConnectorAdapterinterface (5 core methods- optional capability-gated methods for holds, seat maps, post-book seat selection, check-in, exchange, refund, void, SSR, ancillaries, and order listing). Provider-agnostic; implementations come from Voyant Connect, third-party providers, or operator-built adapters.
./contract/schemas— zod schemas for the public flight contract request, response, enum, and value-object shapes. Use these at HTTP, queue, RPC, and adapter boundaries instead of re-declaring runtime validators../orchestration/fingerprint— Itinerary fingerprint helper. Two providers selling the same flight produce identical fingerprints../orchestration/fan-out— Multi-connection fan-out search: parallelsearchFlightsacross all of an operator's flight connections, per-provider timeout + circuit breaker, dedupe by itinerary fingerprint, merged result withcheapest+alternates[]../snapshot— Booking-time snapshot capture. Builds aCaptureSnapshotInputfor the catalog plane'scaptureSnapshot/captureSnapshotGraphfrom a flightFlightOffer+FlightOrderpair../reference/contract—ReferenceDataProvidercontract (airlines, airports, aircraft). Implementable at any layer../reference/local-postgres— Reference data from plain Postgres tables in the operator's own database. No external service, no network call. The simplest deployment option../reference/static-bundle— Reference data from a bundled JSON / CSV.
Phase relationship
Phase 3 is independent of Phase 2 (RAG). Either can ship first; both build on
Phase 1 (@voyant-travel/catalog).
Flights opt in to:
- Booking snapshot graph (the most important participation)
- Provenance shape
- Webhook events
- Source disconnection lifecycle
Flights opt out of:
- Search index projection (live fan-out replaces it)
- Editorial overlays (no marketing copy on a flight)
- Embeddings / RAG (Phase 2 explicitly excludes flights)
- Pricing tiers (built into the multi-connection fan-out itself)
- Drift detection (live by definition)
Usage
Multi-connection search
import { fanOutFlightSearch } from "@voyant-travel/flights/orchestration/fan-out"
const result = await fanOutFlightSearch({
adapters: [hiskyAdapter, amadeusAdapter, charterConsolidatorAdapter],
request: {
slices: [
{ origin: "LHR", destination: "JFK", departureDate: "2026-10-15" },
{ origin: "JFK", destination: "LHR", departureDate: "2026-10-22" },
],
passengers: { adults: 2 },
cabin: "economy",
},
perConnectionTimeoutMs: 5000,
})
// result.offers — merged offers across all connections, deduped by
// itinerary fingerprint, sorted by cheapest price ascending.
// result.perConnection — status + latency per connection.Runtime validation
import { flightBookRequestSchema } from "@voyant-travel/flights/contract/schemas"
import type { FlightBookRequest } from "@voyant-travel/flights/contract/types"
const request: FlightBookRequest = flightBookRequestSchema.parse(await req.json())Reference data — operator's own Postgres tables
import {
createLocalPostgresReferenceProvider,
createReferenceDataTables,
} from "@voyant-travel/flights/reference/local-postgres"
// Schema lives in the operator's own DB. No external service required.
const reference = createLocalPostgresReferenceProvider({ db })
const ba = await reference.getAirline("BA")
// → { iataCode: "BA", icaoCode: "BAW", name: "British Airways", country: "GB" }See docs/architecture/catalog-flights-architecture.md for the full design.
