air-routes.com

Public API

Scheduled passenger routes operating now, with seasonality labels. Not fares, not booking checkout, not date-specific schedules. Public JSON does not include evidence lists or snapshot names.

Base https://air-routes.com · No API key · Markdown · OpenAPI · llms.txt · MCP /mcp

Shared types

Airport codes: fields like airport_code, from, and to use the familiar 3-letter airport code (officially the IATA code — most travelers never need that name).

Airport

FieldTypeNotesExample
airport_codestring3-letter airport code (IATA), uppercase"LHR"
namestringairport name"London Heathrow Airport"
citystringcity name"London"
countrystringas stored in the snapshot"United Kingdom"
latnumber|nullWGS8451.47
lonnumber|nullWGS84-0.46
importanceinteger0–5 hub weight5

Booking

FieldTypeNotesExample
urlstringcanonical route page"https://air-routes.com/r/OTP-BCN"

Airline

Used on connection legs and on route detail (one shape everywhere).

FieldTypeNotesExample
airline_codestring2-letter airline code (IATA)"W6"
airlinestringairline name"Wizz Air"
fly_daysstring[]days of week the flight operates; subset of Mon…Sun["Wed", "Sat"]
dep_timesstring[]local HH:MM aligned with fly_days (dep_times[i] = departure on fly_days[i]); same length; empty when unknown["09:40", "18:15"]
seasonal_notestring|nullfree-text seasonal caveat when presentnull

Leg

FieldTypeNotesExample
route_idstringFROM-TO"CLJ-IST"
fromstringairport code"CLJ"
tostringairport code"IST"
flying_minintegerestimated block minutes105
seasonality_labelstring|nullhuman seasonality label"ends October"
airlinesAirline[]carriers on this leg[{"airline_code":"TK","airline":"Turkish Airlines",…}]
bookingBookingcanonical page for this leg{"url":"https://…/r/CLJ-IST"}

Option

FieldTypeNotesExample
total_flying_minintegersum of leg times (no layover math)425
stopsintegerlegs.length - 11
legsLeg[]ordered origin → destination[{…},{…}]

Destination

Same public fields as route detail — one direct flight from the queried origin (bulk hub schedule; prefer over N× /api/route).

FieldTypeNotesExample
route_idstringfrom-to"OTP-PMO"
fromstringorigin airport code"OTP"
tostringdestination airport code"PMO"
statusstringlifecycle status"active"
seasonality_labelstring|null"ends October"
distance_kmnumber|nullgreat-circle km1284.5
flying_mininteger150
airlinesAirline[]fly_days + dep_times[{"airline_code":"FR","airline":"Ryanair",…}]
bookingBooking{"url":"https://air-routes.com/r/OTP-PMO"}

1. Resolve airports

GET /api/airports · MCP resolve_airport

InputTypeRequiredNotesExample
qstringyescity, name, or airport code; min length 1; max 15 matches"london"

Response: { "airports": Airport[] }

curl 'https://air-routes.com/api/airports?q=london'
{
  "airports": [
    {
      "airport_code": "LHR",
      "name": "London Heathrow Airport",
      "city": "London",
      "country": "United Kingdom",
      "lat": 51.47,
      "lon": -0.46,
      "importance": 5
    },
    {
      "airport_code": "LGW",
      "name": "London Gatwick Airport",
      "city": "London",
      "country": "United Kingdom",
      "lat": 51.15,
      "lon": -0.19,
      "importance": 4
    }
  ]
}

2. Find connections

GET /api/connections · MCP find_connections

InputTypeRequiredDefaultNotesExample
fromstringyesorigin airport code"CLJ"
tostringyesdestination airport code"AMS"
max_stopsintegerno20…31
max_flying_minintegerno1440must be > 01440

Returns the fewest-stops tier that has any option — direct if available, else one-stop, else two-stop (up to max_stops), never a mix. Within that tier, options sort by total_flying_min (no layover math); layover tiers return at most 7 options, the direct tier is uncapped. Unknown airport → 404. Airport names and coordinates are not embedded — resolve airport codes with /api/airports?q=….

Response fieldTypeNotesExample
fromstringechoed airport code"CLJ"
tostringechoed airport code"AMS"
optionsOption[]may be empty[{ "total_flying_min": 425, … }]
curl 'https://air-routes.com/api/connections?from=CLJ&to=AMS&max_stops=1'
{
  "from": "CLJ",
  "to": "AMS",
  "options": [
    {
      "total_flying_min": 425,
      "stops": 1,
      "legs": [
        {
          "route_id": "CLJ-IST",
          "from": "CLJ",
          "to": "IST",
          "flying_min": 105,
          "seasonality_label": null,
          "airlines": [
            {
              "airline_code": "TK",
              "airline": "Turkish Airlines",
              "fly_days": ["Mon", "Thu", "Sat"],
              "dep_times": ["07:10", "14:15", "07:10"],
              "seasonal_note": null
            }
          ],
          "booking": { "url": "https://air-routes.com/r/CLJ-IST" }
        },
        {
          "route_id": "IST-AMS",
          "from": "IST",
          "to": "AMS",
          "flying_min": 230,
          "seasonality_label": null,
          "airlines": [
            {
              "airline_code": "TK",
              "airline": "Turkish Airlines",
              "fly_days": ["Mon", "Thu", "Sat"],
              "dep_times": ["07:10", "14:15", "07:10"],
              "seasonal_note": null
            }
          ],
          "booking": { "url": "https://air-routes.com/r/IST-AMS" }
        }
      ]
    }
  ]
}

3. Destinations (direct only)

GET /api/airport/{airport_code}/destinations · MCP airport_destinations

InputTypeRequiredNotesExample
airport_codestringyespath; 3-letter airport code (IATA); uppercased; unknown → 404"OTP"

Response: { "from": string, "destinations": Destination[] }

Dropped routes excluded. Each row is full public route detail (airlines with fly_days / dep_times, flying_min, booking) — one hub call instead of N× /api/route.

curl 'https://air-routes.com/api/airport/OTP/destinations'
{
  "from": "OTP",
  "destinations": [
    {
      "route_id": "OTP-BCN",
      "from": "OTP",
      "to": "BCN",
      "status": "active",
      "seasonality_label": null,
      "distance_km": 1970.0,
      "flying_min": 195,
      "airlines": [
        {
          "airline_code": "W6",
          "airline": "Wizz Air",
          "fly_days": ["Mon", "Wed", "Fri"],
          "dep_times": ["06:15", "12:40", "06:15"],
          "seasonal_note": null
        }
      ],
      "booking": { "url": "https://air-routes.com/r/OTP-BCN" }
    },
    {
      "route_id": "OTP-PMO",
      "from": "OTP",
      "to": "PMO",
      "status": "active",
      "seasonality_label": "ends October",
      "distance_km": 1284.5,
      "flying_min": 150,
      "airlines": [
        {
          "airline_code": "FR",
          "airline": "Ryanair",
          "fly_days": ["Wed", "Sat"],
          "dep_times": ["09:40", "18:15"],
          "seasonal_note": null
        }
      ],
      "booking": { "url": "https://air-routes.com/r/OTP-PMO" }
    }
  ]
}

4. Route detail

GET /api/route/{route_id} · MCP route_detail

InputTypeRequiredNotesExample
route_idstringyesFROM-TO; unknown → 404"OTP-PMO"
FieldTypeNotesExample
route_idstring"OTP-PMO"
fromstringairport code"OTP"
tostringairport code"PMO"
statusstringlifecycle status"active"
seasonality_labelstring|null"ends October"
distance_kmnumber|nullgreat-circle km1284.5
flying_mininteger150
airlinesAirline[][{"airline_code":"FR","airline":"Ryanair",…}]
bookingBooking{"url":"https://air-routes.com/r/OTP-PMO"}

Public responses do not include evidence lists.

curl 'https://air-routes.com/api/route/OTP-PMO'
{
  "route_id": "OTP-PMO",
  "from": "OTP",
  "to": "PMO",
  "status": "active",
  "seasonality_label": "ends October",
  "distance_km": 1284.5,
  "flying_min": 150,
  "airlines": [
    {
      "airline_code": "FR",
      "airline": "Ryanair",
      "fly_days": ["Wed", "Sat"],
      "dep_times": ["09:40", "18:15"],
      "seasonal_note": null
    }
  ],
  "booking": { "url": "https://air-routes.com/r/OTP-PMO" }
}

Errors

StatusBodyWhenExample
404{"detail": string}unknown airport or route{"detail":"unknown airport XXX; try /api/airports?q=…"}
422validation errormissing/invalid query paramsmissing from
429{"detail": string} + Retry-Afteronly if limits are re-enabled laterRetry-After: 12

← air-routes.com