Add route-explorer.com integration: connection finder + departures board
- RouteExplorerClient: anonymous HMAC token (route-explorer.com/api/token,
IP rate-limited 10/min), POST /api/flight-search with X-API-Token; auto
retry on 401/403 token rotation. Wraps the SuperJSON {json:{...}} envelope
for the upstream tRPC endpoints.
- RouteExplorerModels: Codable types for /route, /departures responses
(RouteConnection, RouteFlight, cabins, appendix). Custom ISO-8601
decoder for the dateTime-with-offset timestamps. Bridge helper
RouteFlight.toFlightSchedule(...) so route-explorer legs reuse the
existing FlightLoadDetailView and AirlineLoadService flow for
supported carriers (UA/AA/NK/KE/B6/AS/EK/XE).
- RoutePlannerView: feature (a) — direct + multi-stop A→B routing via
/route with maxStops 0/1/2, sortBy departure_time/duration, optional
interline-only filter. Renders one ConnectionRow per itinerary with
chained legs and layover indicators.
- WhereToGoView: feature (b) — "where can I go" departures board for an
airport over a 2/4/6/12/24h window. Capacity pills (F/J/W/Y), color-
coded countdown, cross-midnight rollover. Tap any leg → load detail.
- IATAAirportPicker: lightweight local-only picker against
AirportDatabase (no flightconnections roundtrip needed since
route-explorer keys on IATA, not FC IDs).
- ContentView: two new entry-point cards (Find Connections, Where can I
go?) above the favorites list.
- api_docs/route_explorer_api.md + captures: full endpoint reference and
representative response samples (DFW→LAS direct, DFW→KOA 1-stop,
LBB→KOA 2-stop, AA2178 schedule, DFW departures).
No tests yet — project has no test target and adding TDD would require
scaffolding XCTest first. Worth backfilling tests for the date decoder,
layover math, and toFlightSchedule bridge using the saved fixtures.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"json": {
|
||||
"flights": [
|
||||
{
|
||||
"flightNumber": 2178,
|
||||
"flightSuffix": null,
|
||||
"departure": {
|
||||
"airportIata": "DFW",
|
||||
"dateTime": "2026-05-01T16:45:00-05:00",
|
||||
"terminal": "0"
|
||||
},
|
||||
"arrival": {
|
||||
"airportIata": "LAS",
|
||||
"dateTime": "2026-05-01T17:46:00-07:00",
|
||||
"terminal": "1"
|
||||
},
|
||||
"durationMinutes": 181,
|
||||
"equipmentIata": "32Q",
|
||||
"serviceType": "J",
|
||||
"isCodeshare": false,
|
||||
"stops": 0,
|
||||
"stopCodes": null,
|
||||
"totalSeats": 196,
|
||||
"classes": {
|
||||
"first": {
|
||||
"seats": 0,
|
||||
"mealCodes": []
|
||||
},
|
||||
"business": {
|
||||
"seats": 20,
|
||||
"mealCodes": [
|
||||
"D"
|
||||
]
|
||||
},
|
||||
"premiumEconomy": {
|
||||
"seats": 0,
|
||||
"mealCodes": []
|
||||
},
|
||||
"economy": {
|
||||
"seats": 176,
|
||||
"mealCodes": [
|
||||
"R",
|
||||
"D"
|
||||
]
|
||||
}
|
||||
},
|
||||
"inFlightService": [
|
||||
12,
|
||||
18,
|
||||
22,
|
||||
23,
|
||||
24,
|
||||
26,
|
||||
27,
|
||||
28,
|
||||
29,
|
||||
31
|
||||
],
|
||||
"id": "AA_2178_DFW_2026_05_01",
|
||||
"carrierIata": "AA",
|
||||
"carrierIcao": "AAL",
|
||||
"isWetlease": false,
|
||||
"codeshares": []
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,773 @@
|
||||
{
|
||||
"json": {
|
||||
"connections": [
|
||||
{
|
||||
"durationMinutes": 736,
|
||||
"score": 1636,
|
||||
"flights": [
|
||||
{
|
||||
"flightNumber": 543,
|
||||
"flightSuffix": null,
|
||||
"departure": {
|
||||
"airportIata": "DFW",
|
||||
"dateTime": "2026-04-28T06:20:00-05:00",
|
||||
"terminal": "E"
|
||||
},
|
||||
"arrival": {
|
||||
"airportIata": "SEA",
|
||||
"dateTime": "2026-04-28T08:52:00-07:00",
|
||||
"terminal": null
|
||||
},
|
||||
"durationMinutes": 272,
|
||||
"equipmentIata": "73J",
|
||||
"serviceType": "J",
|
||||
"isCodeshare": false,
|
||||
"stops": 0,
|
||||
"stopCodes": null,
|
||||
"totalSeats": 178,
|
||||
"classes": {
|
||||
"first": {
|
||||
"seats": 0,
|
||||
"mealCodes": []
|
||||
},
|
||||
"business": {
|
||||
"seats": 16,
|
||||
"mealCodes": [
|
||||
"B"
|
||||
]
|
||||
},
|
||||
"premiumEconomy": {
|
||||
"seats": 0,
|
||||
"mealCodes": []
|
||||
},
|
||||
"economy": {
|
||||
"seats": 162,
|
||||
"mealCodes": [
|
||||
"B"
|
||||
]
|
||||
}
|
||||
},
|
||||
"inFlightService": [
|
||||
3,
|
||||
12,
|
||||
18
|
||||
],
|
||||
"id": "AS_543_DFW_2026_04_28",
|
||||
"carrierIata": "AS",
|
||||
"carrierIcao": "ASA",
|
||||
"isWetlease": false,
|
||||
"codeshares": []
|
||||
},
|
||||
{
|
||||
"flightNumber": 204,
|
||||
"flightSuffix": null,
|
||||
"departure": {
|
||||
"airportIata": "SEA",
|
||||
"dateTime": "2026-04-28T10:04:00-07:00",
|
||||
"terminal": null
|
||||
},
|
||||
"arrival": {
|
||||
"airportIata": "KOA",
|
||||
"dateTime": "2026-04-28T13:36:00-10:00",
|
||||
"terminal": null
|
||||
},
|
||||
"durationMinutes": 392,
|
||||
"equipmentIata": "7M9",
|
||||
"serviceType": "J",
|
||||
"isCodeshare": false,
|
||||
"stops": 0,
|
||||
"stopCodes": null,
|
||||
"totalSeats": 178,
|
||||
"classes": {
|
||||
"first": {
|
||||
"seats": 0,
|
||||
"mealCodes": []
|
||||
},
|
||||
"business": {
|
||||
"seats": 16,
|
||||
"mealCodes": [
|
||||
"L"
|
||||
]
|
||||
},
|
||||
"premiumEconomy": {
|
||||
"seats": 0,
|
||||
"mealCodes": []
|
||||
},
|
||||
"economy": {
|
||||
"seats": 162,
|
||||
"mealCodes": [
|
||||
"L"
|
||||
]
|
||||
}
|
||||
},
|
||||
"inFlightService": [
|
||||
3,
|
||||
12,
|
||||
18
|
||||
],
|
||||
"id": "AS_204_SEA_2026_04_28",
|
||||
"carrierIata": "AS",
|
||||
"carrierIcao": "ASA",
|
||||
"isWetlease": false,
|
||||
"codeshares": []
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"durationMinutes": 736,
|
||||
"score": 1736,
|
||||
"flights": [
|
||||
{
|
||||
"flightNumber": 474,
|
||||
"flightSuffix": null,
|
||||
"departure": {
|
||||
"airportIata": "DFW",
|
||||
"dateTime": "2026-04-28T07:10:00-05:00",
|
||||
"terminal": "0"
|
||||
},
|
||||
"arrival": {
|
||||
"airportIata": "PHX",
|
||||
"dateTime": "2026-04-28T07:54:00-07:00",
|
||||
"terminal": "4"
|
||||
},
|
||||
"durationMinutes": 164,
|
||||
"equipmentIata": "321",
|
||||
"serviceType": "J",
|
||||
"isCodeshare": false,
|
||||
"stops": 0,
|
||||
"stopCodes": null,
|
||||
"totalSeats": 190,
|
||||
"classes": {
|
||||
"first": {
|
||||
"seats": 0,
|
||||
"mealCodes": []
|
||||
},
|
||||
"business": {
|
||||
"seats": 20,
|
||||
"mealCodes": []
|
||||
},
|
||||
"premiumEconomy": {
|
||||
"seats": 0,
|
||||
"mealCodes": []
|
||||
},
|
||||
"economy": {
|
||||
"seats": 170,
|
||||
"mealCodes": []
|
||||
}
|
||||
},
|
||||
"inFlightService": [
|
||||
4,
|
||||
12,
|
||||
18,
|
||||
22,
|
||||
23,
|
||||
26,
|
||||
27,
|
||||
28,
|
||||
31
|
||||
],
|
||||
"id": "AA_474_DFW_2026_04_28",
|
||||
"carrierIata": "AA",
|
||||
"carrierIcao": "AAL",
|
||||
"isWetlease": false,
|
||||
"codeshares": []
|
||||
},
|
||||
{
|
||||
"flightNumber": 663,
|
||||
"flightSuffix": null,
|
||||
"departure": {
|
||||
"airportIata": "PHX",
|
||||
"dateTime": "2026-04-28T10:58:00-07:00",
|
||||
"terminal": "4"
|
||||
},
|
||||
"arrival": {
|
||||
"airportIata": "KOA",
|
||||
"dateTime": "2026-04-28T14:26:00-10:00",
|
||||
"terminal": null
|
||||
},
|
||||
"durationMinutes": 388,
|
||||
"equipmentIata": "32Q",
|
||||
"serviceType": "J",
|
||||
"isCodeshare": false,
|
||||
"stops": 0,
|
||||
"stopCodes": null,
|
||||
"totalSeats": 196,
|
||||
"classes": {
|
||||
"first": {
|
||||
"seats": 0,
|
||||
"mealCodes": []
|
||||
},
|
||||
"business": {
|
||||
"seats": 20,
|
||||
"mealCodes": [
|
||||
"L"
|
||||
]
|
||||
},
|
||||
"premiumEconomy": {
|
||||
"seats": 0,
|
||||
"mealCodes": []
|
||||
},
|
||||
"economy": {
|
||||
"seats": 176,
|
||||
"mealCodes": [
|
||||
"F",
|
||||
"L"
|
||||
]
|
||||
}
|
||||
},
|
||||
"inFlightService": [
|
||||
12,
|
||||
18,
|
||||
22,
|
||||
23,
|
||||
24,
|
||||
26,
|
||||
27,
|
||||
28,
|
||||
29,
|
||||
31
|
||||
],
|
||||
"id": "AA_663_PHX_2026_04_28",
|
||||
"carrierIata": "AA",
|
||||
"carrierIcao": "AAL",
|
||||
"isWetlease": false,
|
||||
"codeshares": []
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"durationMinutes": 795,
|
||||
"score": 1795,
|
||||
"flights": [
|
||||
{
|
||||
"flightNumber": 644,
|
||||
"flightSuffix": null,
|
||||
"departure": {
|
||||
"airportIata": "DFW",
|
||||
"dateTime": "2026-04-28T07:15:00-05:00",
|
||||
"terminal": "E"
|
||||
},
|
||||
"arrival": {
|
||||
"airportIata": "DEN",
|
||||
"dateTime": "2026-04-28T08:35:00-06:00",
|
||||
"terminal": null
|
||||
},
|
||||
"durationMinutes": 140,
|
||||
"equipmentIata": "319",
|
||||
"serviceType": "J",
|
||||
"isCodeshare": false,
|
||||
"stops": 0,
|
||||
"stopCodes": null,
|
||||
"totalSeats": 126,
|
||||
"classes": {
|
||||
"first": {
|
||||
"seats": 0,
|
||||
"mealCodes": [
|
||||
"S"
|
||||
]
|
||||
},
|
||||
"business": {
|
||||
"seats": 12,
|
||||
"mealCodes": [
|
||||
"S"
|
||||
]
|
||||
},
|
||||
"premiumEconomy": {
|
||||
"seats": 0,
|
||||
"mealCodes": [
|
||||
"G"
|
||||
]
|
||||
},
|
||||
"economy": {
|
||||
"seats": 114,
|
||||
"mealCodes": [
|
||||
"G"
|
||||
]
|
||||
}
|
||||
},
|
||||
"inFlightService": [],
|
||||
"id": "UA_644_DFW_2026_04_28",
|
||||
"carrierIata": "UA",
|
||||
"carrierIcao": "UAL",
|
||||
"isWetlease": false,
|
||||
"codeshares": []
|
||||
},
|
||||
{
|
||||
"flightNumber": 1758,
|
||||
"flightSuffix": null,
|
||||
"departure": {
|
||||
"airportIata": "DEN",
|
||||
"dateTime": "2026-04-28T12:15:00-06:00",
|
||||
"terminal": null
|
||||
},
|
||||
"arrival": {
|
||||
"airportIata": "KOA",
|
||||
"dateTime": "2026-04-28T15:30:00-10:00",
|
||||
"terminal": null
|
||||
},
|
||||
"durationMinutes": 435,
|
||||
"equipmentIata": "777",
|
||||
"serviceType": "J",
|
||||
"isCodeshare": false,
|
||||
"stops": 0,
|
||||
"stopCodes": null,
|
||||
"totalSeats": 364,
|
||||
"classes": {
|
||||
"first": {
|
||||
"seats": 0,
|
||||
"mealCodes": [
|
||||
"M"
|
||||
]
|
||||
},
|
||||
"business": {
|
||||
"seats": 28,
|
||||
"mealCodes": [
|
||||
"M"
|
||||
]
|
||||
},
|
||||
"premiumEconomy": {
|
||||
"seats": 0,
|
||||
"mealCodes": [
|
||||
"M"
|
||||
]
|
||||
},
|
||||
"economy": {
|
||||
"seats": 336,
|
||||
"mealCodes": [
|
||||
"M"
|
||||
]
|
||||
}
|
||||
},
|
||||
"inFlightService": [],
|
||||
"id": "UA_1758_DEN_2026_04_28",
|
||||
"carrierIata": "UA",
|
||||
"carrierIcao": "UAL",
|
||||
"isWetlease": false,
|
||||
"codeshares": []
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"durationMinutes": 651,
|
||||
"score": 1551,
|
||||
"flights": [
|
||||
{
|
||||
"flightNumber": 520,
|
||||
"flightSuffix": null,
|
||||
"departure": {
|
||||
"airportIata": "DFW",
|
||||
"dateTime": "2026-04-28T08:35:00-05:00",
|
||||
"terminal": "0"
|
||||
},
|
||||
"arrival": {
|
||||
"airportIata": "PHX",
|
||||
"dateTime": "2026-04-28T09:25:00-07:00",
|
||||
"terminal": "4"
|
||||
},
|
||||
"durationMinutes": 170,
|
||||
"equipmentIata": "738",
|
||||
"serviceType": "J",
|
||||
"isCodeshare": false,
|
||||
"stops": 0,
|
||||
"stopCodes": null,
|
||||
"totalSeats": 172,
|
||||
"classes": {
|
||||
"first": {
|
||||
"seats": 0,
|
||||
"mealCodes": []
|
||||
},
|
||||
"business": {
|
||||
"seats": 16,
|
||||
"mealCodes": []
|
||||
},
|
||||
"premiumEconomy": {
|
||||
"seats": 0,
|
||||
"mealCodes": []
|
||||
},
|
||||
"economy": {
|
||||
"seats": 156,
|
||||
"mealCodes": []
|
||||
}
|
||||
},
|
||||
"inFlightService": [
|
||||
12,
|
||||
18,
|
||||
22,
|
||||
23,
|
||||
26
|
||||
],
|
||||
"id": "AA_520_DFW_2026_04_28",
|
||||
"carrierIata": "AA",
|
||||
"carrierIcao": "AAL",
|
||||
"isWetlease": false,
|
||||
"codeshares": []
|
||||
},
|
||||
{
|
||||
"flightNumber": 663,
|
||||
"flightSuffix": null,
|
||||
"departure": {
|
||||
"airportIata": "PHX",
|
||||
"dateTime": "2026-04-28T10:58:00-07:00",
|
||||
"terminal": "4"
|
||||
},
|
||||
"arrival": {
|
||||
"airportIata": "KOA",
|
||||
"dateTime": "2026-04-28T14:26:00-10:00",
|
||||
"terminal": null
|
||||
},
|
||||
"durationMinutes": 388,
|
||||
"equipmentIata": "32Q",
|
||||
"serviceType": "J",
|
||||
"isCodeshare": false,
|
||||
"stops": 0,
|
||||
"stopCodes": null,
|
||||
"totalSeats": 196,
|
||||
"classes": {
|
||||
"first": {
|
||||
"seats": 0,
|
||||
"mealCodes": []
|
||||
},
|
||||
"business": {
|
||||
"seats": 20,
|
||||
"mealCodes": [
|
||||
"L"
|
||||
]
|
||||
},
|
||||
"premiumEconomy": {
|
||||
"seats": 0,
|
||||
"mealCodes": []
|
||||
},
|
||||
"economy": {
|
||||
"seats": 176,
|
||||
"mealCodes": [
|
||||
"F",
|
||||
"L"
|
||||
]
|
||||
}
|
||||
},
|
||||
"inFlightService": [
|
||||
12,
|
||||
18,
|
||||
22,
|
||||
23,
|
||||
24,
|
||||
26,
|
||||
27,
|
||||
28,
|
||||
29,
|
||||
31
|
||||
],
|
||||
"id": "AA_663_PHX_2026_04_28",
|
||||
"carrierIata": "AA",
|
||||
"carrierIcao": "AAL",
|
||||
"isWetlease": false,
|
||||
"codeshares": []
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"durationMinutes": 952,
|
||||
"score": 2252,
|
||||
"flights": [
|
||||
{
|
||||
"flightNumber": 365,
|
||||
"flightSuffix": null,
|
||||
"departure": {
|
||||
"airportIata": "DFW",
|
||||
"dateTime": "2026-04-28T09:00:00-05:00",
|
||||
"terminal": "E"
|
||||
},
|
||||
"arrival": {
|
||||
"airportIata": "SEA",
|
||||
"dateTime": "2026-04-28T11:27:00-07:00",
|
||||
"terminal": null
|
||||
},
|
||||
"durationMinutes": 267,
|
||||
"equipmentIata": "73J",
|
||||
"serviceType": "J",
|
||||
"isCodeshare": false,
|
||||
"stops": 0,
|
||||
"stopCodes": null,
|
||||
"totalSeats": 178,
|
||||
"classes": {
|
||||
"first": {
|
||||
"seats": 0,
|
||||
"mealCodes": []
|
||||
},
|
||||
"business": {
|
||||
"seats": 16,
|
||||
"mealCodes": [
|
||||
"B"
|
||||
]
|
||||
},
|
||||
"premiumEconomy": {
|
||||
"seats": 0,
|
||||
"mealCodes": []
|
||||
},
|
||||
"economy": {
|
||||
"seats": 162,
|
||||
"mealCodes": [
|
||||
"B"
|
||||
]
|
||||
}
|
||||
},
|
||||
"inFlightService": [
|
||||
3,
|
||||
12,
|
||||
18
|
||||
],
|
||||
"id": "AS_365_DFW_2026_04_28",
|
||||
"carrierIata": "AS",
|
||||
"carrierIcao": "ASA",
|
||||
"isWetlease": false,
|
||||
"codeshares": []
|
||||
},
|
||||
{
|
||||
"flightNumber": 238,
|
||||
"flightSuffix": null,
|
||||
"departure": {
|
||||
"airportIata": "SEA",
|
||||
"dateTime": "2026-04-28T16:27:00-07:00",
|
||||
"terminal": null
|
||||
},
|
||||
"arrival": {
|
||||
"airportIata": "KOA",
|
||||
"dateTime": "2026-04-28T19:52:00-10:00",
|
||||
"terminal": null
|
||||
},
|
||||
"durationMinutes": 385,
|
||||
"equipmentIata": "7M9",
|
||||
"serviceType": "J",
|
||||
"isCodeshare": false,
|
||||
"stops": 0,
|
||||
"stopCodes": null,
|
||||
"totalSeats": 178,
|
||||
"classes": {
|
||||
"first": {
|
||||
"seats": 0,
|
||||
"mealCodes": []
|
||||
},
|
||||
"business": {
|
||||
"seats": 16,
|
||||
"mealCodes": [
|
||||
"D"
|
||||
]
|
||||
},
|
||||
"premiumEconomy": {
|
||||
"seats": 0,
|
||||
"mealCodes": []
|
||||
},
|
||||
"economy": {
|
||||
"seats": 162,
|
||||
"mealCodes": [
|
||||
"D"
|
||||
]
|
||||
}
|
||||
},
|
||||
"inFlightService": [
|
||||
3,
|
||||
12,
|
||||
18
|
||||
],
|
||||
"id": "AS_238_SEA_2026_04_28",
|
||||
"carrierIata": "AS",
|
||||
"carrierIcao": "ASA",
|
||||
"isWetlease": false,
|
||||
"codeshares": []
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"appendix": {
|
||||
"airports": [
|
||||
{
|
||||
"iataCode": "DFW",
|
||||
"name": "Dallas Dallas/Fort Worth Intl Apt",
|
||||
"cityCode": "DFW",
|
||||
"countryCode": "US",
|
||||
"stateCode": "TX",
|
||||
"latitude": 32.896944,
|
||||
"longitude": -97.038056,
|
||||
"timezone": "America/Chicago",
|
||||
"locationType": "A",
|
||||
"locationCategory": "A",
|
||||
"icaoCode": "KDFW",
|
||||
"cityName": "Dallas",
|
||||
"countryName": "United States"
|
||||
},
|
||||
{
|
||||
"iataCode": "SEA",
|
||||
"name": "Seattle-Tacoma International Apt",
|
||||
"cityCode": "SEA",
|
||||
"countryCode": "US",
|
||||
"stateCode": "WA",
|
||||
"latitude": 47.448889,
|
||||
"longitude": -122.309444,
|
||||
"timezone": "America/Los_Angeles",
|
||||
"locationType": "A",
|
||||
"locationCategory": "A",
|
||||
"icaoCode": "KSEA",
|
||||
"cityName": "Seattle",
|
||||
"countryName": "United States"
|
||||
},
|
||||
{
|
||||
"iataCode": "KOA",
|
||||
"name": "Kona",
|
||||
"cityCode": "KOA",
|
||||
"countryCode": "US",
|
||||
"stateCode": "HI",
|
||||
"latitude": 19.738889,
|
||||
"longitude": -156.045556,
|
||||
"timezone": "Pacific/Honolulu",
|
||||
"locationType": "L",
|
||||
"locationCategory": "A",
|
||||
"icaoCode": "PHKO",
|
||||
"cityName": "Kona",
|
||||
"countryName": "United States"
|
||||
},
|
||||
{
|
||||
"iataCode": "PHX",
|
||||
"name": "Phoenix Sky Harbor Intl Apt",
|
||||
"cityCode": "PHX",
|
||||
"countryCode": "US",
|
||||
"stateCode": "AZ",
|
||||
"latitude": 33.434167,
|
||||
"longitude": -112.011667,
|
||||
"timezone": "America/Phoenix",
|
||||
"locationType": "A",
|
||||
"locationCategory": "A",
|
||||
"icaoCode": "KPHX",
|
||||
"cityName": "Phoenix",
|
||||
"countryName": "United States"
|
||||
},
|
||||
{
|
||||
"iataCode": "DEN",
|
||||
"name": "Denver Intl Apt",
|
||||
"cityCode": "DEN",
|
||||
"countryCode": "US",
|
||||
"stateCode": "CO",
|
||||
"latitude": 39.861667,
|
||||
"longitude": -104.673056,
|
||||
"timezone": "America/Denver",
|
||||
"locationType": "A",
|
||||
"locationCategory": "A",
|
||||
"icaoCode": "KDEN",
|
||||
"cityName": "Denver",
|
||||
"countryName": "United States"
|
||||
}
|
||||
],
|
||||
"airlines": [
|
||||
{
|
||||
"iataCode": "AS",
|
||||
"icaoCode": "ASA",
|
||||
"name": "Alaska Airlines",
|
||||
"countryCode": "US",
|
||||
"alliance": "oneworld",
|
||||
"isLowCost": false,
|
||||
"isControlledDuplicate": false,
|
||||
"websiteUrl": "https://www.alaskaair.com",
|
||||
"webCheckinUrl": "https://webselfservice.alaskaair.com/checkinweb/default.aspx?language=",
|
||||
"mobileCheckinUrl": "https://m.alaskaair.com/checkin",
|
||||
"baggageUrl": "https://www.alaskaair.com/content/travel-info/baggage/overview",
|
||||
"foundedYear": 1932,
|
||||
"callsign": "ALASKA"
|
||||
},
|
||||
{
|
||||
"iataCode": "AA",
|
||||
"icaoCode": "AAL",
|
||||
"name": "American Airlines",
|
||||
"countryCode": "US",
|
||||
"alliance": "oneworld",
|
||||
"isLowCost": false,
|
||||
"isControlledDuplicate": false,
|
||||
"websiteUrl": "https://www.aa.com",
|
||||
"webCheckinUrl": "https://www.aa.com/reservation/flightCheckInViewReservationsAccess.do",
|
||||
"mobileCheckinUrl": null,
|
||||
"baggageUrl": "https://www.aa.com/i18n/travel-info/baggage/baggage.jsp?anchorEvent=false&from=Nav",
|
||||
"foundedYear": 1926,
|
||||
"callsign": "AMERICAN"
|
||||
},
|
||||
{
|
||||
"iataCode": "UA",
|
||||
"icaoCode": "UAL",
|
||||
"name": "United Airlines",
|
||||
"countryCode": "US",
|
||||
"alliance": "star-alliance",
|
||||
"isLowCost": false,
|
||||
"isControlledDuplicate": false,
|
||||
"websiteUrl": "https://www.united.com/en/us/",
|
||||
"webCheckinUrl": "https://www.united.com/travel/checkin/start.aspx",
|
||||
"mobileCheckinUrl": null,
|
||||
"baggageUrl": "https://www.united.com/en/us/fly/baggage.html",
|
||||
"foundedYear": 1926,
|
||||
"callsign": "UNITED"
|
||||
}
|
||||
],
|
||||
"equipment": [
|
||||
{
|
||||
"iataCode": "73J",
|
||||
"icaoCode": null,
|
||||
"generalCode": "737",
|
||||
"name": "Boeing 737-900 (Winglets) Passenger",
|
||||
"equipmentType": "J",
|
||||
"bodyType": "N",
|
||||
"isSurfaceTransport": false
|
||||
},
|
||||
{
|
||||
"iataCode": "7M9",
|
||||
"icaoCode": null,
|
||||
"generalCode": "737",
|
||||
"name": "Boeing 737 MAX 9 Passenger",
|
||||
"equipmentType": "J",
|
||||
"bodyType": "N",
|
||||
"isSurfaceTransport": false
|
||||
},
|
||||
{
|
||||
"iataCode": "321",
|
||||
"icaoCode": null,
|
||||
"generalCode": "32S",
|
||||
"name": "Airbus A321 Passenger",
|
||||
"equipmentType": "J",
|
||||
"bodyType": "N",
|
||||
"isSurfaceTransport": false
|
||||
},
|
||||
{
|
||||
"iataCode": "32Q",
|
||||
"icaoCode": null,
|
||||
"generalCode": "32S",
|
||||
"name": "Airbus A321neo/LR/XLR Passenger",
|
||||
"equipmentType": "J",
|
||||
"bodyType": "N",
|
||||
"isSurfaceTransport": false
|
||||
},
|
||||
{
|
||||
"iataCode": "319",
|
||||
"icaoCode": null,
|
||||
"generalCode": "32S",
|
||||
"name": "Airbus A319 Passenger",
|
||||
"equipmentType": "J",
|
||||
"bodyType": "N",
|
||||
"isSurfaceTransport": false
|
||||
},
|
||||
{
|
||||
"iataCode": "777",
|
||||
"icaoCode": null,
|
||||
"generalCode": "777",
|
||||
"name": "Boeing 777 Passenger",
|
||||
"equipmentType": "J",
|
||||
"bodyType": "W",
|
||||
"isSurfaceTransport": false
|
||||
},
|
||||
{
|
||||
"iataCode": "738",
|
||||
"icaoCode": null,
|
||||
"generalCode": "737",
|
||||
"name": "Boeing 737-800 Passenger",
|
||||
"equipmentType": "J",
|
||||
"bodyType": "N",
|
||||
"isSurfaceTransport": false
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,556 @@
|
||||
{
|
||||
"json": {
|
||||
"flights": [
|
||||
{
|
||||
"flightNumber": 2178,
|
||||
"flightSuffix": null,
|
||||
"departure": {
|
||||
"airportIata": "DFW",
|
||||
"dateTime": "2026-04-24T16:45:00-05:00",
|
||||
"terminal": "0"
|
||||
},
|
||||
"arrival": {
|
||||
"airportIata": "LAS",
|
||||
"dateTime": "2026-04-24T17:46:00-07:00",
|
||||
"terminal": "1"
|
||||
},
|
||||
"durationMinutes": 181,
|
||||
"equipmentIata": "32Q",
|
||||
"serviceType": "J",
|
||||
"isCodeshare": false,
|
||||
"stops": 0,
|
||||
"stopCodes": null,
|
||||
"totalSeats": 196,
|
||||
"classes": {
|
||||
"first": {
|
||||
"seats": 0,
|
||||
"mealCodes": []
|
||||
},
|
||||
"business": {
|
||||
"seats": 20,
|
||||
"mealCodes": [
|
||||
"D"
|
||||
]
|
||||
},
|
||||
"premiumEconomy": {
|
||||
"seats": 0,
|
||||
"mealCodes": []
|
||||
},
|
||||
"economy": {
|
||||
"seats": 176,
|
||||
"mealCodes": [
|
||||
"R",
|
||||
"D"
|
||||
]
|
||||
}
|
||||
},
|
||||
"inFlightService": [
|
||||
12,
|
||||
18,
|
||||
22,
|
||||
23,
|
||||
24,
|
||||
26,
|
||||
27,
|
||||
28,
|
||||
29,
|
||||
31
|
||||
],
|
||||
"id": "AA_2178_DFW_2026_04_24",
|
||||
"carrierIata": "AA",
|
||||
"carrierIcao": "AAL",
|
||||
"isWetlease": false,
|
||||
"codeshares": []
|
||||
},
|
||||
{
|
||||
"flightNumber": 2178,
|
||||
"flightSuffix": null,
|
||||
"departure": {
|
||||
"airportIata": "DFW",
|
||||
"dateTime": "2026-04-25T16:45:00-05:00",
|
||||
"terminal": "0"
|
||||
},
|
||||
"arrival": {
|
||||
"airportIata": "LAS",
|
||||
"dateTime": "2026-04-25T17:46:00-07:00",
|
||||
"terminal": "1"
|
||||
},
|
||||
"durationMinutes": 181,
|
||||
"equipmentIata": "32Q",
|
||||
"serviceType": "J",
|
||||
"isCodeshare": false,
|
||||
"stops": 0,
|
||||
"stopCodes": null,
|
||||
"totalSeats": 196,
|
||||
"classes": {
|
||||
"first": {
|
||||
"seats": 0,
|
||||
"mealCodes": []
|
||||
},
|
||||
"business": {
|
||||
"seats": 20,
|
||||
"mealCodes": [
|
||||
"D"
|
||||
]
|
||||
},
|
||||
"premiumEconomy": {
|
||||
"seats": 0,
|
||||
"mealCodes": []
|
||||
},
|
||||
"economy": {
|
||||
"seats": 176,
|
||||
"mealCodes": [
|
||||
"R",
|
||||
"D"
|
||||
]
|
||||
}
|
||||
},
|
||||
"inFlightService": [
|
||||
12,
|
||||
18,
|
||||
22,
|
||||
23,
|
||||
24,
|
||||
26,
|
||||
27,
|
||||
28,
|
||||
29,
|
||||
31
|
||||
],
|
||||
"id": "AA_2178_DFW_2026_04_25",
|
||||
"carrierIata": "AA",
|
||||
"carrierIcao": "AAL",
|
||||
"isWetlease": false,
|
||||
"codeshares": []
|
||||
},
|
||||
{
|
||||
"flightNumber": 2178,
|
||||
"flightSuffix": null,
|
||||
"departure": {
|
||||
"airportIata": "DFW",
|
||||
"dateTime": "2026-04-26T16:45:00-05:00",
|
||||
"terminal": "0"
|
||||
},
|
||||
"arrival": {
|
||||
"airportIata": "LAS",
|
||||
"dateTime": "2026-04-26T17:46:00-07:00",
|
||||
"terminal": "1"
|
||||
},
|
||||
"durationMinutes": 181,
|
||||
"equipmentIata": "32Q",
|
||||
"serviceType": "J",
|
||||
"isCodeshare": false,
|
||||
"stops": 0,
|
||||
"stopCodes": null,
|
||||
"totalSeats": 196,
|
||||
"classes": {
|
||||
"first": {
|
||||
"seats": 0,
|
||||
"mealCodes": []
|
||||
},
|
||||
"business": {
|
||||
"seats": 20,
|
||||
"mealCodes": [
|
||||
"D"
|
||||
]
|
||||
},
|
||||
"premiumEconomy": {
|
||||
"seats": 0,
|
||||
"mealCodes": []
|
||||
},
|
||||
"economy": {
|
||||
"seats": 176,
|
||||
"mealCodes": [
|
||||
"R",
|
||||
"D"
|
||||
]
|
||||
}
|
||||
},
|
||||
"inFlightService": [
|
||||
12,
|
||||
18,
|
||||
22,
|
||||
23,
|
||||
24,
|
||||
26,
|
||||
27,
|
||||
28,
|
||||
29,
|
||||
31
|
||||
],
|
||||
"id": "AA_2178_DFW_2026_04_26",
|
||||
"carrierIata": "AA",
|
||||
"carrierIcao": "AAL",
|
||||
"isWetlease": false,
|
||||
"codeshares": []
|
||||
},
|
||||
{
|
||||
"flightNumber": 2178,
|
||||
"flightSuffix": null,
|
||||
"departure": {
|
||||
"airportIata": "DFW",
|
||||
"dateTime": "2026-04-27T16:45:00-05:00",
|
||||
"terminal": "0"
|
||||
},
|
||||
"arrival": {
|
||||
"airportIata": "LAS",
|
||||
"dateTime": "2026-04-27T17:46:00-07:00",
|
||||
"terminal": "1"
|
||||
},
|
||||
"durationMinutes": 181,
|
||||
"equipmentIata": "32Q",
|
||||
"serviceType": "J",
|
||||
"isCodeshare": false,
|
||||
"stops": 0,
|
||||
"stopCodes": null,
|
||||
"totalSeats": 196,
|
||||
"classes": {
|
||||
"first": {
|
||||
"seats": 0,
|
||||
"mealCodes": []
|
||||
},
|
||||
"business": {
|
||||
"seats": 20,
|
||||
"mealCodes": [
|
||||
"D"
|
||||
]
|
||||
},
|
||||
"premiumEconomy": {
|
||||
"seats": 0,
|
||||
"mealCodes": []
|
||||
},
|
||||
"economy": {
|
||||
"seats": 176,
|
||||
"mealCodes": [
|
||||
"R",
|
||||
"D"
|
||||
]
|
||||
}
|
||||
},
|
||||
"inFlightService": [
|
||||
12,
|
||||
18,
|
||||
22,
|
||||
23,
|
||||
24,
|
||||
26,
|
||||
27,
|
||||
28,
|
||||
29,
|
||||
31
|
||||
],
|
||||
"id": "AA_2178_DFW_2026_04_27",
|
||||
"carrierIata": "AA",
|
||||
"carrierIcao": "AAL",
|
||||
"isWetlease": false,
|
||||
"codeshares": []
|
||||
},
|
||||
{
|
||||
"flightNumber": 2178,
|
||||
"flightSuffix": null,
|
||||
"departure": {
|
||||
"airportIata": "DFW",
|
||||
"dateTime": "2026-04-28T16:45:00-05:00",
|
||||
"terminal": "0"
|
||||
},
|
||||
"arrival": {
|
||||
"airportIata": "LAS",
|
||||
"dateTime": "2026-04-28T17:46:00-07:00",
|
||||
"terminal": "1"
|
||||
},
|
||||
"durationMinutes": 181,
|
||||
"equipmentIata": "32Q",
|
||||
"serviceType": "J",
|
||||
"isCodeshare": false,
|
||||
"stops": 0,
|
||||
"stopCodes": null,
|
||||
"totalSeats": 196,
|
||||
"classes": {
|
||||
"first": {
|
||||
"seats": 0,
|
||||
"mealCodes": []
|
||||
},
|
||||
"business": {
|
||||
"seats": 20,
|
||||
"mealCodes": [
|
||||
"D"
|
||||
]
|
||||
},
|
||||
"premiumEconomy": {
|
||||
"seats": 0,
|
||||
"mealCodes": []
|
||||
},
|
||||
"economy": {
|
||||
"seats": 176,
|
||||
"mealCodes": [
|
||||
"R",
|
||||
"D"
|
||||
]
|
||||
}
|
||||
},
|
||||
"inFlightService": [
|
||||
12,
|
||||
18,
|
||||
22,
|
||||
23,
|
||||
24,
|
||||
26,
|
||||
27,
|
||||
28,
|
||||
29,
|
||||
31
|
||||
],
|
||||
"id": "AA_2178_DFW_2026_04_28",
|
||||
"carrierIata": "AA",
|
||||
"carrierIcao": "AAL",
|
||||
"isWetlease": false,
|
||||
"codeshares": []
|
||||
},
|
||||
{
|
||||
"flightNumber": 2178,
|
||||
"flightSuffix": null,
|
||||
"departure": {
|
||||
"airportIata": "DFW",
|
||||
"dateTime": "2026-04-29T16:45:00-05:00",
|
||||
"terminal": "0"
|
||||
},
|
||||
"arrival": {
|
||||
"airportIata": "LAS",
|
||||
"dateTime": "2026-04-29T17:46:00-07:00",
|
||||
"terminal": "1"
|
||||
},
|
||||
"durationMinutes": 181,
|
||||
"equipmentIata": "32Q",
|
||||
"serviceType": "J",
|
||||
"isCodeshare": false,
|
||||
"stops": 0,
|
||||
"stopCodes": null,
|
||||
"totalSeats": 196,
|
||||
"classes": {
|
||||
"first": {
|
||||
"seats": 0,
|
||||
"mealCodes": []
|
||||
},
|
||||
"business": {
|
||||
"seats": 20,
|
||||
"mealCodes": [
|
||||
"D"
|
||||
]
|
||||
},
|
||||
"premiumEconomy": {
|
||||
"seats": 0,
|
||||
"mealCodes": []
|
||||
},
|
||||
"economy": {
|
||||
"seats": 176,
|
||||
"mealCodes": [
|
||||
"R",
|
||||
"D"
|
||||
]
|
||||
}
|
||||
},
|
||||
"inFlightService": [
|
||||
12,
|
||||
18,
|
||||
22,
|
||||
23,
|
||||
24,
|
||||
26,
|
||||
27,
|
||||
28,
|
||||
29,
|
||||
31
|
||||
],
|
||||
"id": "AA_2178_DFW_2026_04_29",
|
||||
"carrierIata": "AA",
|
||||
"carrierIcao": "AAL",
|
||||
"isWetlease": false,
|
||||
"codeshares": []
|
||||
},
|
||||
{
|
||||
"flightNumber": 2178,
|
||||
"flightSuffix": null,
|
||||
"departure": {
|
||||
"airportIata": "DFW",
|
||||
"dateTime": "2026-04-30T16:45:00-05:00",
|
||||
"terminal": "0"
|
||||
},
|
||||
"arrival": {
|
||||
"airportIata": "LAS",
|
||||
"dateTime": "2026-04-30T17:46:00-07:00",
|
||||
"terminal": "1"
|
||||
},
|
||||
"durationMinutes": 181,
|
||||
"equipmentIata": "32Q",
|
||||
"serviceType": "J",
|
||||
"isCodeshare": false,
|
||||
"stops": 0,
|
||||
"stopCodes": null,
|
||||
"totalSeats": 196,
|
||||
"classes": {
|
||||
"first": {
|
||||
"seats": 0,
|
||||
"mealCodes": []
|
||||
},
|
||||
"business": {
|
||||
"seats": 20,
|
||||
"mealCodes": [
|
||||
"D"
|
||||
]
|
||||
},
|
||||
"premiumEconomy": {
|
||||
"seats": 0,
|
||||
"mealCodes": []
|
||||
},
|
||||
"economy": {
|
||||
"seats": 176,
|
||||
"mealCodes": [
|
||||
"R",
|
||||
"D"
|
||||
]
|
||||
}
|
||||
},
|
||||
"inFlightService": [
|
||||
12,
|
||||
18,
|
||||
22,
|
||||
23,
|
||||
24,
|
||||
26,
|
||||
27,
|
||||
28,
|
||||
29,
|
||||
31
|
||||
],
|
||||
"id": "AA_2178_DFW_2026_04_30",
|
||||
"carrierIata": "AA",
|
||||
"carrierIcao": "AAL",
|
||||
"isWetlease": false,
|
||||
"codeshares": []
|
||||
},
|
||||
{
|
||||
"flightNumber": 2178,
|
||||
"flightSuffix": null,
|
||||
"departure": {
|
||||
"airportIata": "DFW",
|
||||
"dateTime": "2026-05-01T16:45:00-05:00",
|
||||
"terminal": "0"
|
||||
},
|
||||
"arrival": {
|
||||
"airportIata": "LAS",
|
||||
"dateTime": "2026-05-01T17:46:00-07:00",
|
||||
"terminal": "1"
|
||||
},
|
||||
"durationMinutes": 181,
|
||||
"equipmentIata": "32Q",
|
||||
"serviceType": "J",
|
||||
"isCodeshare": false,
|
||||
"stops": 0,
|
||||
"stopCodes": null,
|
||||
"totalSeats": 196,
|
||||
"classes": {
|
||||
"first": {
|
||||
"seats": 0,
|
||||
"mealCodes": []
|
||||
},
|
||||
"business": {
|
||||
"seats": 20,
|
||||
"mealCodes": [
|
||||
"D"
|
||||
]
|
||||
},
|
||||
"premiumEconomy": {
|
||||
"seats": 0,
|
||||
"mealCodes": []
|
||||
},
|
||||
"economy": {
|
||||
"seats": 176,
|
||||
"mealCodes": [
|
||||
"R",
|
||||
"D"
|
||||
]
|
||||
}
|
||||
},
|
||||
"inFlightService": [
|
||||
12,
|
||||
18,
|
||||
22,
|
||||
23,
|
||||
24,
|
||||
26,
|
||||
27,
|
||||
28,
|
||||
29,
|
||||
31
|
||||
],
|
||||
"id": "AA_2178_DFW_2026_05_01",
|
||||
"carrierIata": "AA",
|
||||
"carrierIcao": "AAL",
|
||||
"isWetlease": false,
|
||||
"codeshares": []
|
||||
}
|
||||
],
|
||||
"appendix": {
|
||||
"airports": [
|
||||
{
|
||||
"iataCode": "DFW",
|
||||
"name": "Dallas Dallas/Fort Worth Intl Apt",
|
||||
"cityCode": "DFW",
|
||||
"countryCode": "US",
|
||||
"stateCode": "TX",
|
||||
"latitude": 32.896944,
|
||||
"longitude": -97.038056,
|
||||
"timezone": "America/Chicago",
|
||||
"locationType": "A",
|
||||
"locationCategory": "A",
|
||||
"icaoCode": "KDFW",
|
||||
"cityName": "Dallas",
|
||||
"countryName": "United States"
|
||||
},
|
||||
{
|
||||
"iataCode": "LAS",
|
||||
"name": "Las Vegas Harry Reid Intl",
|
||||
"cityCode": "LAS",
|
||||
"countryCode": "US",
|
||||
"stateCode": "NV",
|
||||
"latitude": 36.08,
|
||||
"longitude": -115.152222,
|
||||
"timezone": "America/Los_Angeles",
|
||||
"locationType": "A",
|
||||
"locationCategory": "A",
|
||||
"icaoCode": "KLAS",
|
||||
"cityName": "Las Vegas",
|
||||
"countryName": "United States"
|
||||
}
|
||||
],
|
||||
"airlines": [
|
||||
{
|
||||
"iataCode": "AA",
|
||||
"icaoCode": "AAL",
|
||||
"name": "American Airlines",
|
||||
"countryCode": "US",
|
||||
"alliance": "oneworld",
|
||||
"isLowCost": false,
|
||||
"isControlledDuplicate": false,
|
||||
"websiteUrl": "https://www.aa.com",
|
||||
"webCheckinUrl": "https://www.aa.com/reservation/flightCheckInViewReservationsAccess.do",
|
||||
"mobileCheckinUrl": null,
|
||||
"baggageUrl": "https://www.aa.com/i18n/travel-info/baggage/baggage.jsp?anchorEvent=false&from=Nav",
|
||||
"foundedYear": 1926,
|
||||
"callsign": "AMERICAN"
|
||||
}
|
||||
],
|
||||
"equipment": [
|
||||
{
|
||||
"iataCode": "32Q",
|
||||
"icaoCode": null,
|
||||
"generalCode": "32S",
|
||||
"name": "Airbus A321neo/LR/XLR Passenger",
|
||||
"equipmentType": "J",
|
||||
"bodyType": "N",
|
||||
"isSurfaceTransport": false
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user