Skip to main content

The first agentic flight search engine. Searches hundreds of routes in minutes, not hours.

Project description

opensky

The first agentic flight search engine. Define your origins, destinations, and dates, and opensky searches every combination for you, in minutes instead of hours.

$ opensky scan --config scan.toml

Scanning 6 origins x 6 destinations x 10 dates = 360 combos via google

Best per Destination
Destination   Price   Date         Duration   Route
Amsterdam     €289    Tue Mar 17   11h 20m    Bangkok → Amsterdam
Berlin        €312    Thu Mar 12   12h 45m    Kuala Lumpur → Berlin
Frankfurt     €298    Wed Mar 11   11h 50m    Bangkok → Frankfurt
Hamburg       €357    Tue Mar 10   13h 10m    Bangalore → Dubai → Hamburg
Munich        €315    Fri Mar 13   12h 30m    Delhi → Munich
Copenhagen    €345    Mon Mar 16   13h 10m    Singapore → Copenhagen

Doing this manually on Google Flights would take 360 individual searches. opensky does it in one command.

How it works

  1. You define a search space: origins, destinations, date range
  2. opensky searches every combination across up to three providers (Google Flights, Duffel, Amadeus)
  3. Results are deduplicated, scored, and presented as a price matrix with the cheapest options highlighted

It also works for single route searches:

opensky search bangalore hamburg tomorrow
opensky search BLR HAM next monday
opensky search BLR HAM mar 15

Install

Requires Python 3.11+.

pip install opensky

Or from source:

git clone https://github.com/federicodeponte/opensky.git
cd opensky
python -m venv .venv && source .venv/bin/activate
pip install -e .

Copy .env.example to .env and fill in any API keys you have (optional, Google Flights works without any keys).

Quick demo

See what opensky does without any API keys or network calls:

opensky demo

opensky demo

Usage

Multi-route scan (the power feature)

Search every combination of origins, destinations, and dates at once.

Interactive setup

opensky config init
opensky config init

Where are you flying from? (comma-separated cities or codes): bangalore, delhi, bangkok
  → BLR (Bangalore), DEL (Delhi), BKK (Bangkok)
Where to? (comma-separated cities or codes): hamburg, frankfurt, amsterdam
  → HAM (Hamburg), FRA (Frankfurt), AMS (Amsterdam)
Start date (YYYY-MM-DD): mar 15
End date (YYYY-MM-DD): mar 25
Currency [EUR]:

Created scan.toml. Next: opensky scan --config scan.toml

Then run:

opensky scan --config scan.toml

Quick template

opensky config init --quick    # dumps template, no prompts
# edit scan.toml with your routes and dates
opensky scan --config scan.toml

6 origins x 6 destinations x 10 dates = 360 searches, one command. You get:

  • Best per destination: cheapest flight to each city, with date and route
  • Price matrix: prices across all dates, cheapest highlighted
  • Stats: total flights found, price range
opensky scan --config scan.toml --all-flights    # show every flight, not just summary
opensky scan --config scan.toml --workers 5      # parallel workers (default: 3)
opensky scan --config scan.toml --json -o results.json

Scans are cached. If interrupted, re-run the same command to resume where it left off.

Scan config

[search]
origins = ["BLR", "DEL", "BOM", "KUL", "BKK", "SIN"]
destinations = ["HAM", "FRA", "MUC", "BER", "AMS", "CPH"]
cabin = "economy"
currency = "EUR"
stops = "any"

[search.date_range]
start = "2026-03-10"
end = "2026-03-20"

[scoring]
price_weight = 1.0
duration_weight = 0.5

# Optional: add ground transit time for scoring
[connections]
final_destination = "Hamburg"

[connections.transit_hours]
HAM = 0
BER = 2
FRA = 4

[safety]
risk_threshold = "high_risk"

Single route search

Use city names, IATA codes, or friendly dates:

opensky search bangalore hamburg tomorrow
opensky search BLR HAM next monday
opensky search BLR HAM mar 15 --class business
opensky search BLR HAM 2026-03-10 --source duffel
opensky search BLR HAM 2026-03-10 --json
opensky search BLR HAM 2026-03-10 --fresh

Options:

  • --class / --cabin: Travel class (economy, premium, business, first)
  • --stops: Max stops (nonstop, 1, 2, or any)
  • --max-price: Maximum price (0 = no limit)
  • --fresh / --no-cache: Skip cached results
  • --source / --provider: Flight data source (google, duffel, amadeus)
  • --include-risky: Include flights through conflict zones
  • --json / --csv: Machine-readable output
  • --output / -o: Save results to file
  • --currency / -c: Currency code (EUR, USD, GBP, etc.)

Providers

opensky aggregates results from up to three flight data sources. When multiple providers are configured, results are deduplicated (same flight from two sources keeps the cheapest price).

Provider Env vars Notes
Google Flights none (default) Scrapes Google Flights. Needs residential IP.
Duffel OPENSKY_DUFFEL_TOKEN Free unlimited searches.
Amadeus OPENSKY_AMADEUS_KEY + OPENSKY_AMADEUS_SECRET Free tier: 2,000 calls/month.

Conflict zones

opensky ships with a conflict zone database. By default, flights through high-risk airspace are filtered out. Use --include-risky to see all options.

opensky zones              # list active conflict zones
opensky zones --update     # fetch latest data

Limitations

  • Residential IP required: Google Flights blocks datacenter IPs. Use --proxy on servers. Duffel and Amadeus work from any IP.
  • Rate limits: All providers rate-limited to 10 req/sec. Default scan settings (3 workers, 1s delay) are conservative.
  • Price accuracy: Prices may differ from airline websites. Always verify before booking.

Credits

Flight data API based on fli by Punit Arani (MIT license). Airport metadata from airportsdata.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

opensky_cli-0.1.0.tar.gz (1.4 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

opensky_cli-0.1.0-py3-none-any.whl (42.1 kB view details)

Uploaded Python 3

File details

Details for the file opensky_cli-0.1.0.tar.gz.

File metadata

  • Download URL: opensky_cli-0.1.0.tar.gz
  • Upload date:
  • Size: 1.4 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.2

File hashes

Hashes for opensky_cli-0.1.0.tar.gz
Algorithm Hash digest
SHA256 f396de726d20f4f021ef8fc812012553dfd559ae2689b7e5b12aaeb165624e59
MD5 f311ea295f62e3eb704ea565ed7eacdf
BLAKE2b-256 cbe4f376e23704220e1c5cfe496a120da217bde5a7eac7291b54816f575ab155

See more details on using hashes here.

File details

Details for the file opensky_cli-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: opensky_cli-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 42.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.2

File hashes

Hashes for opensky_cli-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 5737df601757596755f540e5b89a5754b61b5b368547f0f1d23d9df07148da69
MD5 46d95c17da18e1cc392569e8895934b4
BLAKE2b-256 8fbb370b41a35f124d5650fe9c9da79748c9021beca3540c109bb2011530ef0e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page