Skip to main content
Fli provides comprehensive filtering options to help you find exactly the flights you need. All filters can be combined to create highly targeted searches.

Cabin class

Filter flights by cabin class using the SeatType enum:
from fli.models import SeatType, FlightSearchFilters, PassengerInfo, FlightSegment, Airport

filters = FlightSearchFilters(
    passenger_info=PassengerInfo(adults=1),
    flight_segments=[
        FlightSegment(
            departure_airport=[[Airport.JFK, 0]],
            arrival_airport=[[Airport.LAX, 0]],
            travel_date="2026-04-15"
        )
    ],
    seat_type=SeatType.BUSINESS  # Filter for business class
)

Available cabin classes

  • SeatType.ECONOMY - Economy class (default)
  • SeatType.PREMIUM_ECONOMY - Premium economy
  • SeatType.BUSINESS - Business class
  • SeatType.FIRST - First class

Stops

Control the maximum number of stops using the MaxStops enum:
from fli.models import MaxStops

filters = FlightSearchFilters(
    # ... other parameters
    stops=MaxStops.NON_STOP  # Only direct flights
)

Available stop options

  • MaxStops.ANY - Any number of stops (default)
  • MaxStops.NON_STOP - Direct flights only
  • MaxStops.ONE_STOP_OR_FEWER - Maximum one stop
  • MaxStops.TWO_OR_FEWER_STOPS - Maximum two stops
The MaxStops enum uses internal values (0-3) but provides descriptive names for clarity.

Airlines

Restrict results to specific airlines by passing a list of Airline enums:
from fli.models import Airline

filters = FlightSearchFilters(
    # ... other parameters
    airlines=[Airline.BA, Airline.VS]  # British Airways and Virgin Atlantic only
)

Common airline codes

  • Airline.AA - American Airlines
  • Airline.BA - British Airways
  • Airline.DL - Delta Air Lines
  • Airline.UA - United Airlines
  • Airline.AF - Air France
  • Airline.LH - Lufthansa
  • Airline.VS - Virgin Atlantic
  • Airline.AC - Air Canada
  • Airline.JL - Japan Airlines
  • Airline.QF - Qantas
See the Airline enum for the complete list of supported airlines.
The airlines filter only includes flights operated by the specified carriers. Codeshare flights may not appear in results.

Time windows

Restrict departure and arrival times using TimeRestrictions. All times are in hours from midnight (0-23) in local time:
from fli.models import TimeRestrictions

filters = FlightSearchFilters(
    # ... other parameters
    flight_segments=[
        FlightSegment(
            departure_airport=[[Airport.JFK, 0]],
            arrival_airport=[[Airport.LAX, 0]],
            travel_date="2026-04-15",
            time_restrictions=TimeRestrictions(
                earliest_departure=6,   # 6:00 AM
                latest_departure=10,     # 10:00 AM
                earliest_arrival=12,     # 12:00 PM
                latest_arrival=18        # 6:00 PM
            )
        )
    ]
)

Time restriction parameters

  • earliest_departure - Earliest departure time (0-23)
  • latest_departure - Latest departure time (0-23)
  • earliest_arrival - Earliest arrival time (0-23)
  • latest_arrival - Latest arrival time (0-23)
All parameters are optional. You can specify only departure times, only arrival times, or any combination.
from datetime import datetime, timedelta
from fli.models import (
    Airport,
    FlightSearchFilters,
    FlightSegment,
    PassengerInfo,
    TimeRestrictions,
)
from fli.search import SearchFlights

filters = FlightSearchFilters(
    passenger_info=PassengerInfo(adults=1),
    flight_segments=[
        FlightSegment(
            departure_airport=[[Airport.JFK, 0]],
            arrival_airport=[[Airport.LAX, 0]],
            travel_date=(datetime.now() + timedelta(days=30)).strftime("%Y-%m-%d"),
            time_restrictions=TimeRestrictions(
                earliest_departure=6,  # 6 AM
                latest_departure=10,   # 10 AM
                earliest_arrival=12,   # 12 PM
                latest_arrival=18,     # 6 PM
            ),
        )
    ],
)

search = SearchFlights()
results = search.search(filters)

Sorting

Sort flight results using the SortBy enum:
from fli.models import SortBy

filters = FlightSearchFilters(
    # ... other parameters
    sort_by=SortBy.CHEAPEST  # Sort by lowest price
)

Available sorting options

  • SortBy.NONE - Default Google Flights sorting (default)
  • SortBy.TOP_FLIGHTS - Google’s recommended flights
  • SortBy.CHEAPEST - Lowest price first
  • SortBy.DEPARTURE_TIME - Earliest departure first
  • SortBy.ARRIVAL_TIME - Earliest arrival first
  • SortBy.DURATION - Shortest duration first
The TOP_FLIGHTS option uses Google’s algorithm to balance price, duration, and convenience.

Advanced filtering

Duration limits

Set a maximum total flight duration in minutes:
filters = FlightSearchFilters(
    # ... other parameters
    max_duration=720  # Maximum 12 hours (720 minutes)
)

Layover restrictions

Control layover airports and maximum layover duration:
from fli.models import LayoverRestrictions

filters = FlightSearchFilters(
    # ... other parameters
    layover_restrictions=LayoverRestrictions(
        airports=[Airport.BOS, Airport.ORD],  # Prefer these layover airports
        max_duration=180  # Maximum 3-hour layover (in minutes)
    )
)

Price limits

Set a maximum price for flights:
from fli.models import PriceLimit, Currency

filters = FlightSearchFilters(
    # ... other parameters
    price_limit=PriceLimit(
        max_price=500,
        currency=Currency.USD
    )
)
Currently only USD is supported for price limits.

Combining filters

All filters can be combined for highly specific searches:
from datetime import datetime, timedelta
from fli.models import (
    Airline,
    Airport,
    FlightSearchFilters,
    FlightSegment,
    LayoverRestrictions,
    MaxStops,
    PassengerInfo,
    SeatType,
    TimeRestrictions,
    SortBy,
)
from fli.search import SearchFlights

filters = FlightSearchFilters(
    passenger_info=PassengerInfo(adults=2, children=1, infants_on_lap=1),
    flight_segments=[
        FlightSegment(
            departure_airport=[[Airport.JFK, 0]],
            arrival_airport=[[Airport.LHR, 0]],
            travel_date=(datetime.now() + timedelta(days=30)).strftime("%Y-%m-%d"),
            time_restrictions=TimeRestrictions(
                earliest_departure=8,
                latest_departure=14
            )
        )
    ],
    seat_type=SeatType.BUSINESS,
    stops=MaxStops.ONE_STOP_OR_FEWER,
    airlines=[Airline.BA, Airline.VS],
    max_duration=720,
    layover_restrictions=LayoverRestrictions(
        airports=[Airport.BOS, Airport.ORD],
        max_duration=180
    ),
    sort_by=SortBy.CHEAPEST
)

search = SearchFlights()
results = search.search(filters)

Filter validation

Fli uses Pydantic models to validate all filter parameters. Invalid values will raise a ValidationError:
from pydantic import ValidationError

try:
    filters = FlightSearchFilters(
        passenger_info=PassengerInfo(adults=1),
        flight_segments=[
            FlightSegment(
                departure_airport=[[Airport.JFK, 0]],
                arrival_airport=[[Airport.JFK, 0]],  # Same as departure!
                travel_date="2026-04-15"
            )
        ]
    )
except ValidationError as e:
    print(e)  # "Departure and arrival airports must be different"
Common validation errors include:
  • Same departure and arrival airports
  • Travel dates in the past
  • Invalid time ranges (earliest > latest)
  • Missing required fields

Build docs developers (and LLMs) love