The fast, robust, strongly-typed Google Flights scraper (API) implemented in Python.
Project description
✈️ faster-flights
Fast, strongly-typed Google Flights scraping for Python.
Documentation • Issues • PyPI
pip install faster-flights
Quick start
from fast_flights import FlightQuery, Passengers, create_query, get_flights
query = create_query(
flights=[
FlightQuery(
date="2026-03-31",
from_airport="TPE",
to_airport="NRT",
),
],
trip="one-way",
seat="economy", # economy / premium-economy / business / first
passengers=Passengers(adults=1),
language="en-US",
currency="USD",
)
results = get_flights(query)
for flight in results[:3]:
print(f"{flight.airlines} - ${flight.price}")
Current public API
The supported top-level API is the set exported from fast_flights:
FlightQueryPassengerscreate_query()andcreate_filter()(create_filteris a compatibility alias)get_flights()select_flight()get_return_flights()get_flights_multicity()get_flights_multicity_chained()fetch_flights_html()
Use IATA airport codes like "TPE", "NRT", or "JFK" in FlightQuery. The repository does not currently export a public airport search helper.
Round-trip searches
Round-trip search is a two-step flow:
- Query outbound options with
get_flights() - Select one outbound option and fetch return options with
get_return_flights()
from fast_flights import (
FlightQuery,
Passengers,
create_query,
get_flights,
get_return_flights,
select_flight,
)
query = create_query(
flights=[
FlightQuery(date="2026-03-31", from_airport="TPE", to_airport="NRT"),
FlightQuery(date="2026-04-05", from_airport="NRT", to_airport="TPE"),
],
trip="round-trip",
seat="business",
passengers=Passengers(adults=1),
language="en-US",
currency="USD",
)
outbound = get_flights(query)
return_query = select_flight(query, outbound[0])
returning = get_return_flights(return_query)
Each outbound result carries a hidden select_token. select_flight() wraps that token into a ReturnQuery.
Multi-city searches
There are three supported multi-city workflows.
1. Total trip price + first-leg options
Use get_flights_multicity_chained() when you want Google's bundled multi-city pricing in one RPC call.
from fast_flights import FlightQuery, get_flights_multicity_chained
legs = [
FlightQuery(date="2026-03-31", from_airport="TPE", to_airport="NRT"),
FlightQuery(date="2026-04-05", from_airport="NRT", to_airport="HKG"),
FlightQuery(date="2026-04-10", from_airport="HKG", to_airport="TPE"),
]
result = get_flights_multicity_chained(
legs,
seat="economy",
language="en-US",
currency="USD",
)
print(result[0].total_price)
print(len(result[0].flights)) # first-leg options only
2. Per-leg flight details
Use get_flights_multicity() when you want each leg as an independent one-way search.
from fast_flights import FlightQuery, Passengers, get_flights_multicity
legs = get_flights_multicity(
flights=[
FlightQuery(date="2026-03-31", from_airport="TPE", to_airport="NRT"),
FlightQuery(date="2026-04-05", from_airport="NRT", to_airport="HKG"),
FlightQuery(date="2026-04-10", from_airport="HKG", to_airport="TPE"),
],
seat="economy",
passengers=Passengers(adults=1),
language="en-US",
currency="USD",
)
This returns per-leg one-way pricing, not Google's bundled total trip price.
3. Hybrid workflow
Use get_flights(create_query(..., trip="multi-city")) for the first-leg bundled options, then get_flights_multicity() for detailed options on legs 2+.
from fast_flights import (
FlightQuery,
Passengers,
create_query,
get_flights,
get_flights_multicity,
)
legs = [
FlightQuery(date="2026-03-31", from_airport="TPE", to_airport="NRT"),
FlightQuery(date="2026-04-05", from_airport="NRT", to_airport="HKG"),
FlightQuery(date="2026-04-10", from_airport="HKG", to_airport="TPE"),
]
query = create_query(
flights=legs,
trip="multi-city",
seat="economy",
passengers=Passengers(adults=1),
language="en-US",
currency="USD",
)
leg1 = get_flights(query)
remaining = get_flights_multicity(
flights=legs[1:],
seat="economy",
passengers=Passengers(adults=1),
language="en-US",
currency="USD",
)
The round-trip return-flight API is not the supported way to fetch legs 2+ for multi-city itineraries. Google's HTML response for that path does not provide the required data.
Integrations and proxies
Fetching customization is done with integration= and proxy=. The current public API does not expose legacy fetch flags or a packaged local-browser mode.
Bright Data
from fast_flights import get_flights
from fast_flights.integrations import BrightData
integration = BrightData(api_key="...")
results = get_flights(query, integration=integration)
Custom integrations
Subclass fast_flights.integrations.base.Integration and implement fetch_html(q) -> str.
from fast_flights.integrations.base import Integration
class MyIntegration(Integration):
def fetch_html(self, q):
return "...html..."
Proxy support
results = get_flights(query, proxy="http://user:pass@proxy:8080")
get_flights_multicity() also forwards integration= and proxy= to each per-leg one-way search. RPC-based multi-city flows (get_flights(...trip="multi-city") and get_flights_multicity_chained()) support proxy= but not integration overrides.
Documentation
Contributing
Contributing is welcomed. A few notes though:
- please no ai slop. i am not reading all that.
- one change at a time. what your title says is what you've changed.
- no new dependencies unless it's related to the core parsing.
- really, i cant finish reading all of them, i have other projects and life to do. really sorry
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file faster_flights-3.5.0.tar.gz.
File metadata
- Download URL: faster_flights-3.5.0.tar.gz
- Upload date:
- Size: 19.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a45d2aa78b6c48b11949493c95e13b4f82677527a8b53d8246c65595d9ae7fbb
|
|
| MD5 |
c08f702e7b7addd23dca1f1b088c44c0
|
|
| BLAKE2b-256 |
6a73f440255d2331efa511d3cea0f13dc08c237f287ebafab5468530706d1d20
|
Provenance
The following attestation bundles were made for faster_flights-3.5.0.tar.gz:
Publisher:
workflow.yml on jamexhuang/flights
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
faster_flights-3.5.0.tar.gz -
Subject digest:
a45d2aa78b6c48b11949493c95e13b4f82677527a8b53d8246c65595d9ae7fbb - Sigstore transparency entry: 1054012116
- Sigstore integration time:
-
Permalink:
jamexhuang/flights@92b819730b9653695dcc5938865a7b9c5f4daf7e -
Branch / Tag:
refs/tags/v3.5.0 - Owner: https://github.com/jamexhuang
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
workflow.yml@92b819730b9653695dcc5938865a7b9c5f4daf7e -
Trigger Event:
release
-
Statement type:
File details
Details for the file faster_flights-3.5.0-py3-none-any.whl.
File metadata
- Download URL: faster_flights-3.5.0-py3-none-any.whl
- Upload date:
- Size: 21.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b558df78619131ab4e214c8bc7a5977c52d2293ee2b4c99fc9e28a0b417f3ef8
|
|
| MD5 |
3305568537198e7c714d85935c08c361
|
|
| BLAKE2b-256 |
8bb4f14b1ee1bdf8c7090b3146f4971e13495913b8f37aa360033df19d1b54e1
|
Provenance
The following attestation bundles were made for faster_flights-3.5.0-py3-none-any.whl:
Publisher:
workflow.yml on jamexhuang/flights
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
faster_flights-3.5.0-py3-none-any.whl -
Subject digest:
b558df78619131ab4e214c8bc7a5977c52d2293ee2b4c99fc9e28a0b417f3ef8 - Sigstore transparency entry: 1054012165
- Sigstore integration time:
-
Permalink:
jamexhuang/flights@92b819730b9653695dcc5938865a7b9c5f4daf7e -
Branch / Tag:
refs/tags/v3.5.0 - Owner: https://github.com/jamexhuang
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
workflow.yml@92b819730b9653695dcc5938865a7b9c5f4daf7e -
Trigger Event:
release
-
Statement type: