Skip to main content
POST
Get live flight pricing — search by route, or re-price a known offer
Fetch live, bookable pricing for a specific route and date pair. Use it once the user has settled on exact travel dates, for example “Paris to New York departing June 1 returning June 8 in economy”. It also reprices an offer surfaced earlier by the calendar or destination tools so you can confirm availability before adding it to a trip.

Two modes, one endpoint

POST /v1/flight_search serves both modes:
  • Search mode: filter-based live search by origin, destination, departure_date, and passengers. Returns priced offers, each fare carrying a trip_item_token you can add to a trip.
  • Reprice mode: pass an offer_token from discovery (find_destination, flight_calendar) to re-price that specific offer before adding it to a trip. The other route fields are ignored when offer_token is present.
The CLI mirrors this: pass --offer-token for reprice mode, omit it for search mode.
Prices are in minor units. value is an integer — divide by 10 ** decimal_places to display it. { "value": 15977, "decimal_places": 2 } is **159.77,not159.77**, not 15,977. See Money & prices.

Authorizations

X-API-Key
string
header
required

Body

application/json
origin
string
Example:

"JFK"

destination
string
Example:

"LAX"

origin_type
enum<string>

How to read the code: city searches every airport of the metro area, airport only that one airport. Omit it to let the platform classify the code itself (metro codes → city, otherwise airport) — that is the safest choice, and forcing city on an airport code narrows the search wrongly.

Available options:
city,
airport
Example:

"airport"

destination_type
enum<string>

How to read the code: city searches every airport of the metro area, airport only that one airport. Omit it to let the platform classify the code itself (metro codes → city, otherwise airport) — that is the safest choice, and forcing city on an airport code narrows the search wrongly.

Available options:
city,
airport
Example:

"airport"

departure_date
string
Pattern: ^\d{4}-\d{2}-\d{2}$
return_date
string
Pattern: ^\d{4}-\d{2}-\d{2}$
trip_type
enum<string>
Available options:
oneway,
roundtrip
cabin_class
enum<string>

Preferred cabin. ADVISORY, not a filter: it is forwarded to the providers as a preference (Sabre CabinPref, TravelFusion TravelClass) and they may still return other cabins. It is NOT part of the applied/unapplied filter contract and never appears in applied_filters — read each fare’s own cabin_class to see what actually came back.

Available options:
economy,
premium_economy,
business,
first
Example:

"economy"

direct_only
boolean
deprecated

DEPRECATED — send max_stops: 0 instead. Still accepted: true is folded into max_stops: 0 before the search runs and only max_stops reaches the platform, so applied_filters / unapplied_filters always name max_stops, never direct_only. Setting it beside a non-zero max_stops is rejected.

Example:

false

max_stops
integer

Maximum stops per leg: 0 non-stop (the way to ask for direct flights), 1 one connection, 2 two. Applies to every leg of the trip.

Required range: 0 <= x <= 2
Example:

1

multi_fare
boolean

Branded fare ladder: several fares per itinerary (upsell options). Defaults to true when omitted; send false for a single fare per itinerary and a smaller response. Sabre-only effect; TravelFusion behavior is unchanged.

Example:

true

max_price
number

Drop fares whose total price (all passengers) exceeds this cap, in currency, major units. When the platform cannot convert to currency it reports max_price in unapplied_filters instead of guessing.

Required range: x > 0
Example:

800

include_carriers
string[]

Keep only itineraries marketed by these IATA carriers.

Pattern: ^[A-Za-z0-9]{2}$
Example:
exclude_carriers
string[]

Drop itineraries marketed by these IATA carriers. Must not overlap include_carriers.

Pattern: ^[A-Za-z0-9]{2}$
Example:
departure_time_range
object

Filter the OUTBOUND leg by local departure time-of-day.

arrival_time_range
object

Filter the OUTBOUND leg by local arrival time-of-day.

return_departure_time_range
object

Filter the RETURN leg by local departure time-of-day (round-trip only).

return_arrival_time_range
object

Filter the RETURN leg by local arrival time-of-day (round-trip only).

connection_time_min_minutes
integer

Shortest acceptable layover, in minutes, applied to every connection of every leg. Must not exceed connection_time_max_minutes.

Required range: x >= 0
Example:

60

connection_time_max_minutes
integer

Longest acceptable layover, in minutes, applied to every connection of every leg.

Required range: x >= 0
Example:

240

max_total_duration_minutes
integer

Cap each leg’s door-to-door elapsed travel time, in minutes.

Required range: x > 0
Example:

900

refundable_only
boolean

Keep only fares that can be cancelled before departure (with or without a fee). Conservative: a fare whose rules the platform cannot verify is DROPPED, so carriers that publish no rule data disappear under this filter. Each returned fare carries the resolved flag as is_refundable.

Example:

true

changeable_only
boolean

Keep only fares that allow a voluntary change. Conservative in the same way as refundable_only: unverifiable fares are dropped. Each returned fare carries the resolved flag as is_changeable.

Example:

true

checked_bag_included
boolean

Keep only fares whose price already includes a checked bag. Each returned fare carries the resolved flag as checked_bag_included.

Example:

true

single_carrier_only
boolean

Keep only itineraries marketed end-to-end by one carrier.

Example:

true

via_airports
string[]

Restrict connections to these airports — an itinerary qualifies when at least one connection is one of them. Non-stop itineraries have no connection to check and are kept.

Pattern: ^[A-Za-z]{3}$
Example:
exclude_via_airports
string[]

Ban connections at these airports. Must not overlap via_airports.

Pattern: ^[A-Za-z]{3}$
Example:
aircraft_types
string[]

Keep only itineraries whose every segment flies one of these IATA equipment codes.

Pattern: ^[A-Za-z0-9]{3}$
Example:
origin_alternate_airports
string[]

ADDITIONAL departure airports searched alongside origin. Widening only — the anchor in origin is always searched, so this can add results but never remove any. THE ANCHOR DECIDES RANKING AND TRUNCATION, which makes the two airports NOT interchangeable: measured on one route, anchor JFK with alternate EWR returned 15 JFK / 35 EWR, while anchor EWR with alternate JFK returned 2 JFK / 48 EWR — 13 itineraries differed between the two. Put the airport that matters most in origin. TAKES EFFECT ONLY WITH AN AIRPORT ANCHOR. A city anchor — origin_type: "city", or an origin code the platform resolves to a city — is accepted and searched as the city it is, but this list is then ignored and comes back in unapplied_filters with the reason, since a city already searches its whole metro area. On a round trip the platform mirrors the list onto the return leg, so it also covers where the return lands. Reported as origin in applied_filters / unapplied_filters — one entry per side, never under this field name. Sabre honours the list natively; TravelFusion cannot (single-station location) and reports it unapplied.

Pattern: ^[A-Za-z]{3}$
Example:
destination_alternate_airports
string[]

ADDITIONAL arrival airports searched alongside destination. Widening only — the anchor in destination is always searched, so this can add results but never remove any. THE ANCHOR DECIDES RANKING AND TRUNCATION, which makes the two airports NOT interchangeable the same way origin_alternate_airports describes: put the airport that matters most in destination. TAKES EFFECT ONLY WITH AN AIRPORT ANCHOR. A city anchor — destination_type: "city", or a destination code the platform resolves to a city — is accepted and searched as the city it is, but this list is then ignored and comes back in unapplied_filters with the reason, since a city already searches its whole metro area. On a round trip the platform mirrors the list onto the return leg, so it also covers where the return departs from. Reported as destination in applied_filters / unapplied_filters — one entry per side, never under this field name. Sabre honours the list natively; TravelFusion cannot (single-station location) and reports it unapplied.

Pattern: ^[A-Za-z]{3}$
Example:
nearby_airports
boolean

Also search the alternate airports around each leg’s origin and destination. Widening: more results, not fewer.

Example:

true

same_connection_airport_only
boolean

Keep only itineraries whose connections leave from the same airport they arrived at (no cross-town transfer).

Example:

true

same_origin_airport_only
boolean

Keep only round trips that return to the airport the trip departed from.

Example:

true

same_turnaround_airport_only
boolean

Keep only round trips whose return departs from the airport the outbound arrived at.

Example:

true

limit
integer

TOTAL number of flights to return (1–300), not a per-page size: limit: 5 returns at most five flights. Search mode only. Omit to let the platform choose (the cheapest flight plus its alternatives). Applied after the cross-provider merge and sort, so it only trims the returned set — the providers still bound the real count.

Required range: 1 <= x <= 300
Example:

20

adults
integer
default:1

Adult travelers (12+).

Required range: x >= 1
children
integer

Child travelers (2–11).

Required range: x >= 0
infants
integer

Infant travelers (under 2), traveling on an adult’s lap. Seated infants (own seat) are not supported.

Required range: x >= 0
currency
string
locale
string
offer_token
string
intent
object

Response

Priced offers

offers
object[]
required
applied_filters
string[]
required

The requested filters these results DO honor. Empty when the request carried no filters. Entries are request field names, with one exception: origin_alternate_airports / destination_alternate_airports are reported per side as origin and destination.

Example:
unapplied_filters
object[]
required

The requested filters these results do NOT honor, each with a reason. A filter listed here was not applied to the offers above — post-filter them yourself, or tell the user the constraint could not be met.

Example:
exact_match_found
boolean
Example:

true