seats.aero is one of the best tools to find award ticket availability. Specifically, it's great to search specific routes for specific periods of time. If, however, you want to go on a trip with flexible dates and flexible destinations, it can take a while to search all of the different dates and routes that you might be interested in. Additionally, it can be time consuming to search both legs of a trip at the same time. There may be outbound availability but no return availability.
This tool is meant to generate trip ideas based off of a departure airport(s) using seats.aero data.
There are probably a lot of bugs here as I wrote no tests and wrote the code quickly. Feel free to file issues as you come across them.
-
Install node and npm: https://nodejs.org/en/download
-
Install git: https://git-scm.com/downloads
-
Open a command prompt and run the following commands in a new folder:
-
cd SeatsAeroFinder
-
npm i
-
npm run (explore|tripsearch|routesearch)
Explore is the core command used to find trips from home airport(s). In this example, we will be searching for trips to two different cities from ORD.
$ npm run explore -- --from ord --class F J -d --exclude-regions "North America" -n 2
βββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Itinerary β Dates β Example Price β
βββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ORD-MUC-DXB-ORD β 2023-07-03 2023-07-04 β 63000/J/lifemiles - 87000/J/emirates - 138000/J/emirates β
βββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ORD-ZRH-DXB-ORD β 2023-07-04 2023-07-06 2023-07-07 ... 2023-07-18 β 63000/J/lifemiles - 87000/J/emirates - 138000/J/emirates β
βββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ORD-DUB-DXB-ORD β 2023-07-04 β 60000/J/aeroplan - 87000/J/emirates - 138000/J/emirates β
βββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ORD-ARN-DXB-ORD β 2023-07-14 β 63000/J/lifemiles - 61000/J/aeroplan - 138000/J/emirates β
βββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ORD-FRA-DXB-ORD β 2023-07-03 2023-07-04 2023-07-08 β 63000/J/lifemiles - 42000/J/lifemiles - 138000/J/emirates β
βββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ORD-ADD-GRU-ORD β 2023-06-06 β 90000/J/aeroplan - 80000/J/aeroplan - 50000/J/lifemiles β
βββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ORD-ADD-BRU-ORD β 2023-06-06 β 90000/J/aeroplan - 45000/J/aeroplan - 70000/J/aeroplan β
βββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ORD-ADD-ZRH-ORD β 2023-06-06 β 90000/J/aeroplan - 45000/J/aeroplan - 63000/J/lifemiles β
βββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ORD-ADD-VIE-ORD β 2023-06-06 β 90000/J/aeroplan - 45000/J/aeroplan - 63000/J/lifemiles β
βββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ORD-DOH-VIE-ORD β 2023-06-08 β 70000/J/american - 42500/J/american - 63000/J/lifemiles β
βββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ORD-DOH-WAW-ORD β 2023-06-08 2023-06-14 β 70000/J/american - 42500/J/american - 63000/J/lifemiles β
βββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ORD-DOH-ADD-ORD β 2023-06-08 2023-06-14 β 70000/J/american - 20000/J/aeroplan - 78000/J/lifemiles β
βββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ORD-DOH-DXB-ORD β 2023-06-08 2023-06-14 β 70000/J/american - 30000/F/american - 138000/J/emirates β
βββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ORD-DEL-ADD-ORD β 2023-06-05 β 88000/F/united - 69000/J/united - 78000/J/lifemiles β
βββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ORD-DXB-MAD-ORD β 2023-06-08 2023-06-13 2023-06-15 β 163500/F/emirates - 87000/J/emirates - 57500/J/american β
βββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ORD-FRA-DEL-ORD β 2023-07-03 2023-07-04 2023-07-08 β 63000/J/lifemiles - 45000/J/lifemiles - 88000/F/united β
βββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ORD-VIE-DEL-ORD β 2023-07-03 2023-07-05 β 63000/J/lifemiles - 45000/J/lifemiles - 88000/F/united β
βββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ORD-DEL-WAW-ORD β 2023-06-05 β 88000/F/united - 45000/J/lifemiles - 63000/J/lifemiles β
βββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ORD-DEL-VIE-ORD β 2023-06-05 β 88000/F/united - 45000/J/lifemiles - 63000/J/lifemiles β
βββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ORD-GRU-DXB-ORD β 2023-06-04 2023-06-05 2023-06-08 ... 2023-06-27 β 50000/J/lifemiles - 180000/F/emirates - 138000/J/emirates β
βββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ORD-FCO-DXB-ORD β 2023-06-04 β 78000/J/american - 102000/F/emirates - 138000/J/emirates β
βββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ORD-ADD-DXB-ORD β 2023-06-06 β 90000/J/aeroplan - 85500/F/emirates - 138000/J/emirates β
βββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ORD-BRU-DXB-ORD β 2023-07-09 2023-07-14 2023-07-16 2023-07-17 β 63000/J/lifemiles - 102000/F/emirates - 138000/J/emirates β
βββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ORD-IST-DXB-ORD β 2023-07-17 β 63000/J/lifemiles - 85500/F/emirates - 138000/J/emirates β
βββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ORD-DXB-VIE-ORD β 2023-06-04 2023-06-06 2023-06-08 β 163500/F/emirates - 45000/J/aeroplan - 63000/J/lifemiles β
βββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ORD-ADD-LHR-ORD β 2023-06-06 β 90000/J/aeroplan - 45000/J/aeroplan - 85000/F/american β
βββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ORD-DXB-DEL-ORD β 2023-06-13 2023-06-15 2023-06-24 ... 2023-07-12 β 163500/F/emirates - 54000/J/emirates - 88000/F/united β
βββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ORD-LHR-DXB-ORD β 2023-06-12 2023-07-02 2023-07-03 ... 2023-07-19 β 85000/F/alaska - 102000/F/emirates - 138000/J/emirates β
βββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ORD-LHR-DEL-ORD β 2023-06-12 2023-07-02 2023-07-03 ... 2023-07-11 β 85000/F/american - 42500/J/american - 88000/F/united β
βββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ORD-DXB-BRU-ORD β 2023-06-04 2023-06-06 β 163500/F/emirates - 102000/F/emirates - 70000/J/aeroplan β
βββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ORD-DXB-ADD-ORD β 2023-06-04 2023-06-06 2023-06-08 ... 2023-07-07 β 163500/F/emirates - 85500/F/emirates - 78000/J/lifemiles β
βββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ORD-DXB-MUC-ORD β 2023-06-04 2023-06-06 β 163500/F/emirates - 102000/F/emirates - 63000/J/lifemiles β
βββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ORD-DXB-ZRH-ORD β 2023-06-04 2023-06-06 β 163500/F/emirates - 102000/F/emirates - 63000/J/lifemiles β
βββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ORD-DXB-WAW-ORD β 2023-06-04 2023-06-06 2023-06-08 ... 2023-06-28 β 163500/F/emirates - 102000/F/emirates - 63000/J/lifemiles β
βββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ORD-DEL-DXB-ORD β 2023-06-05 2023-07-19 β 130000/F/aeroplan - 63000/F/emirates - 138000/J/emirates β
βββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ORD-DXB-LHR-ORD β 2023-06-04 2023-06-06 2023-06-08 ... 2023-07-09 β 163500/F/emirates - 102000/F/emirates - 85000/F/alaska β
βββββββββββββββββββ΄ββββββββββββββββββββββββββββββββββββββββββββββββββββββ΄ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Num results: 7416
After looking through the options, I noticed a particular trip that looks interesting for me:
ORD-ADD-ZRH-ORD β 2023-06-06 β 90000/J/aeroplan - 45000/J/aeroplan - 63000/J/lifemiles
To get more information about this itinerary, I perform a trip search. Note that JSeats=0 doesn't mean that there are no seats, just that there is no data around how many seats are available (but it's >=1).
$npm run tripsearch -- --from ord --to add zrh --class J -d
ββββββββββββββ¬βββββββ¬ββββββ¬βββββββββββ¬βββββββββ¬ββββββββ¬ββββββββββ
β Date β From β To β Source β JSeats β JCost β JDirect β
ββββββββββββββΌβββββββΌββββββΌβββββββββββΌβββββββββΌββββββββΌββββββββββ€
β 2023-06-06 β ORD β ADD β aeroplan β 0 β 90000 β true β
ββββββββββββββΌβββββββΌββββββΌβββββββββββΌβββββββββΌββββββββΌββββββββββ€
β 2023-06-14 β ADD β ZRH β united β 2 β 58500 β true β
ββββββββββββββΌβββββββΌββββββΌβββββββββββΌβββββββββΌββββββββΌββββββββββ€
β 2023-06-21 β ZRH β ORD β aeroplan β 0 β 70000 β true β
ββββββββββββββ΄βββββββ΄ββββββ΄βββββββββββ΄βββββββββ΄ββββββββ΄ββββββββββ
ββββββββββββββ¬βββββββ¬ββββββ¬ββββββββββββ¬βββββββββ¬ββββββββ¬ββββββββββ
β Date β From β To β Source β JSeats β JCost β JDirect β
ββββββββββββββΌβββββββΌββββββΌββββββββββββΌβββββββββΌββββββββΌββββββββββ€
β 2023-06-06 β ORD β ADD β aeroplan β 0 β 90000 β true β
ββββββββββββββΌβββββββΌββββββΌββββββββββββΌβββββββββΌββββββββΌββββββββββ€
β 2023-06-14 β ADD β ZRH β united β 2 β 58500 β true β
ββββββββββββββΌβββββββΌββββββΌββββββββββββΌβββββββββΌββββββββΌββββββββββ€
β 2023-06-21 β ZRH β ORD β lifemiles β 3 β 63000 β true β
ββββββββββββββ΄βββββββ΄ββββββ΄ββββββββββββ΄βββββββββ΄ββββββββ΄ββββββββββ
ββββββββββββββ¬βββββββ¬ββββββ¬βββββββββββ¬βββββββββ¬ββββββββ¬ββββββββββ
β Date β From β To β Source β JSeats β JCost β JDirect β
ββββββββββββββΌβββββββΌββββββΌβββββββββββΌβββββββββΌββββββββΌββββββββββ€
β 2023-06-06 β ORD β ADD β aeroplan β 0 β 90000 β true β
ββββββββββββββΌβββββββΌββββββΌβββββββββββΌβββββββββΌββββββββΌββββββββββ€
β 2023-06-14 β ADD β ZRH β aeroplan β 0 β 45000 β true β
ββββββββββββββΌβββββββΌββββββΌβββββββββββΌβββββββββΌββββββββΌββββββββββ€
β 2023-06-21 β ZRH β ORD β aeroplan β 0 β 70000 β true β
ββββββββββββββ΄βββββββ΄ββββββ΄βββββββββββ΄βββββββββ΄ββββββββ΄ββββββββββ
ββββββββββββββ¬βββββββ¬ββββββ¬ββββββββββββ¬βββββββββ¬ββββββββ¬ββββββββββ
β Date β From β To β Source β JSeats β JCost β JDirect β
ββββββββββββββΌβββββββΌββββββΌββββββββββββΌβββββββββΌββββββββΌββββββββββ€
β 2023-06-06 β ORD β ADD β aeroplan β 0 β 90000 β true β
ββββββββββββββΌβββββββΌββββββΌββββββββββββΌβββββββββΌββββββββΌββββββββββ€
β 2023-06-14 β ADD β ZRH β aeroplan β 0 β 45000 β true β
ββββββββββββββΌβββββββΌββββββΌββββββββββββΌβββββββββΌββββββββΌββββββββββ€
β 2023-06-21 β ZRH β ORD β lifemiles β 3 β 63000 β true β
ββββββββββββββ΄βββββββ΄ββββββ΄ββββββββββββ΄βββββββββ΄ββββββββ΄ββββββββββ
Num results: 4
Note that the "best" flights are attempted to be listed last.
Once you have a trip plan that you're interested in, it's best to check seats.aero to ensure that the data is fresh. This script only updates data from seats.aero once per day. Visit https://seats.aero/search for each leg of the journey and make sure the flights are all available and look correct.
Searches for any itineraries available from origin airports. This is useful if both dates and destinations are flexible. Note that using n > 2 may take a long time as this just does a simple brute force algorithm.
npm run explore -f {airport_codes}
Required
- --from {value...} (-f): List of airports to search from. Optionally add weights to each airport with a colon(:), e.g.
--from sea:1 sfo:2
. Weight defaults to 1 if omitted. Weights are described more below.
Optional
- --num-destinations {value} (-n): Number of destinations to visit on the trip. Defaults to 1.
- --exclude-airports {value...} (-e): Exclude airports from search.
- --exclude-regions {value...}: Exclude regions from search.
- --exclude-sources {value...}: Exclude sources (e.g. alaska, lifemiles) from search.
- --direct (-d): Only search for direct flights.
- --folder {value}: Folder to store flight data.
- --class {value...} (-c): List of classes to search. Defaults to all of Y, W, J, and F.
Full Example
explore -f sea sfo:2 lax:2 -n 2 -e doh lhr --exclude-regions "North America" --exclude-sources alaska united -d --folder /home/my-path/seatsaerodata -c J F
Weights
Routes that are the same without taking the from destinations into account will prioritize using airports with a lower priority.
For example, take into account the full example above with the -f field containing -f sea sfo:2 lax:2
. In this case, if there is a route for both:
SEA->LHR->SEA
and
SFO->LHR->SFO
then the results will only show the SEA->LHR->SEA route since the airports are listed at a lower priority (sea has a default priority of 1 and sfo has a priority of 2). This does not take into account trip price, so SFO->LHR->SFO would still be removed even if it is a cheaper price. If priorities are the same between routes, all of them will be returned. This means that omitting priority for all airports will return every possible result.
Finds an itinerary for flights originating and ending in one of the listed airports while visiting the "to" airports. Using multiple "from" airports could require repositioning flights.
npm run tripsearch -f {airport_codes} -t {airport_codes}
Required
- --from {value...} (-f): List of airports to search from
- --to {value...} (-t): List of airports to search to. Optionally specify the number of days to stay at each airport with a colon and then time range (e.g. '-to ZRH:5-10' to stay in ZRH between 5 and 10 days)
Optional
- --non-point-segments {value...}: Segments that the algorithm will allow for "free." Useful for short haul flights or allowing the algorithm to use multiple airports in a single city (e.g. HND-NRT or MEL-SYD).
- --start-date {value} (-s): Date to start search
- --end-data {value} (-e): Date to end search for the first flight. The entire trip may take go past this date.
- --direct (-d): Only search for direct flights.
- --folder {value}: Folder to store flight data.
- --class {value...} (-c): List of classes to search. Defaults to all of Y, W, J, and F.
Full Example
tripsearch -f sea sfo lax -t nan akl --non-point-segments nan-akl -s 2023-07-01 -e 2023-08-01 -d --folder /home/my-path/seatsaerodata -c J F
Finds flights from airport(s) to other airport(s). This is similar to the "search" functionality on seats.aero website. It's likely easier to use the website for this rather than this tool, but it's here to avoid context switching, and it can search more than 2 weeks at a time.
npm run routesearch -f {airport_codes} -t {airport_codes}
Required
- --from {value...} (-f): List of airports to search from
- --to {value...} (-t): List of airports to search to
Optional
- --start-date {value} (-s): Date to start search
- --end-data {value} (-e): Date to end search
- --direct (-d): Only search for direct flights
- --folder {value}: Folder to store flight data
- --class {value...} (-c): List of classes to search. Defaults to all of Y, W, J, and F
Full Example
routesearch -f sea sfo lax -t hnd nrt sin -s 2023-07-01 -e 2023-08-01 -d --folder /home/my-path/seatsaerodata -c J F