{"info":{"title":"Hermes","version":"0.1.0","summary":"Public REST API for Ryanair flight price history and route data.","description":"Hermes is an unofficial REST API for Ryanair flight prices, route data, and historical fares. Every active Ryanair route is scraped continuously so you can query the current cheapest fare, the full price history per route, recent price drops, and the airport network over a plain JSON API. No signup, no key required for guest access.","contact":{"name":"Hermes Maintainer","email":"victor@bmlabs.eu"},"license":{"name":"MIT","identifier":"MIT"}},"openapi":"3.1.0","paths":{"/api/v1/airports/":{"get":{"tags":["Hermes"],"operationId":"getAirportcontrollerApiV1Airports","parameters":[{"deprecated":false,"name":"country","in":"query","schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"}},{"deprecated":false,"name":"base_only","in":"query","schema":{"type":"boolean","title":"Base Only","default":false}},{"deprecated":false,"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"title":"Limit","default":100}},{"deprecated":false,"name":"offset","in":"query","schema":{"type":"integer","minimum":0,"title":"Offset","default":0}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AirportListEnvelope"}}}},"400":{"description":"Raised when request components cannot be parsed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"422":{"description":"Raised when returned response does not match the response schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"406":{"description":"Raised when provided `Accept` header cannot be satisfied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"429":{"description":"Raised when throttling rate was hit","headers":{"X-RateLimit-Limit":{"schema":{"type":"string"},"description":"The maximum number of requests permitted in the current time window","required":true},"X-RateLimit-Remaining":{"schema":{"type":"string"},"description":"The number of requests remaining in the current time window","required":true},"X-RateLimit-Reset":{"schema":{"type":"string"},"description":"The number of seconds until the current rate limit window resets","required":true},"Retry-After":{"schema":{"type":"string"},"description":"Indicates how long the user agent should wait before making a follow-up request","required":true}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}}},"deprecated":false}},"/api/v1/routes/":{"get":{"tags":["Hermes"],"operationId":"getRoutecontrollerApiV1Routes","parameters":[{"deprecated":false,"name":"origin","in":"query","schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin"}},{"deprecated":false,"name":"destination","in":"query","schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Destination"}},{"deprecated":false,"name":"active_only","in":"query","schema":{"type":"boolean","title":"Active Only","default":true}},{"deprecated":false,"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"title":"Limit","default":100}},{"deprecated":false,"name":"offset","in":"query","schema":{"type":"integer","minimum":0,"title":"Offset","default":0}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RouteListEnvelope"}}}},"400":{"description":"Raised when request components cannot be parsed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"422":{"description":"Raised when returned response does not match the response schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"406":{"description":"Raised when provided `Accept` header cannot be satisfied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"429":{"description":"Raised when throttling rate was hit","headers":{"X-RateLimit-Limit":{"schema":{"type":"string"},"description":"The maximum number of requests permitted in the current time window","required":true},"X-RateLimit-Remaining":{"schema":{"type":"string"},"description":"The number of requests remaining in the current time window","required":true},"X-RateLimit-Reset":{"schema":{"type":"string"},"description":"The number of seconds until the current rate limit window resets","required":true},"Retry-After":{"schema":{"type":"string"},"description":"Indicates how long the user agent should wait before making a follow-up request","required":true}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}}},"deprecated":false}},"/api/v1/routes/{origin}/{destination}/cheapest":{"get":{"tags":["Hermes"],"operationId":"getCheapestcontrollerApiV1RoutesOriginDestinationCheapest","parameters":[{"description":"Path parameters for /routes/{origin}/{destination}/...","deprecated":false,"name":"origin","in":"path","schema":{"type":"string","title":"Origin"},"required":true},{"description":"Path parameters for /routes/{origin}/{destination}/...","deprecated":false,"name":"destination","in":"path","schema":{"type":"string","title":"Destination"},"required":true},{"description":"``on=YYYY-MM-DD`` narrows to a single date inside the window.","deprecated":false,"name":"on","in":"query","schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"On"}}],"responses":{"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheapestNotFoundOut"}}}},"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheapestOut"}}}},"400":{"description":"Raised when request components cannot be parsed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"422":{"description":"Raised when returned response does not match the response schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"406":{"description":"Raised when provided `Accept` header cannot be satisfied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"429":{"description":"Raised when throttling rate was hit","headers":{"X-RateLimit-Limit":{"schema":{"type":"string"},"description":"The maximum number of requests permitted in the current time window","required":true},"X-RateLimit-Remaining":{"schema":{"type":"string"},"description":"The number of requests remaining in the current time window","required":true},"X-RateLimit-Reset":{"schema":{"type":"string"},"description":"The number of seconds until the current rate limit window resets","required":true},"Retry-After":{"schema":{"type":"string"},"description":"Indicates how long the user agent should wait before making a follow-up request","required":true}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}}},"deprecated":false}},"/api/v1/routes/{origin}/{destination}/history":{"get":{"tags":["Hermes"],"operationId":"getHistorycontrollerApiV1RoutesOriginDestinationHistory","parameters":[{"description":"Path parameters for /routes/{origin}/{destination}/...","deprecated":false,"name":"origin","in":"path","schema":{"type":"string","title":"Origin"},"required":true},{"description":"Path parameters for /routes/{origin}/{destination}/...","deprecated":false,"name":"destination","in":"path","schema":{"type":"string","title":"Destination"},"required":true},{"deprecated":false,"name":"from","in":"query","schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"From"}},{"deprecated":false,"name":"to","in":"query","schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"To"}},{"deprecated":false,"name":"outbound_date","in":"query","schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Outbound Date"}},{"deprecated":false,"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"title":"Limit","default":100}},{"deprecated":false,"name":"offset","in":"query","schema":{"type":"integer","minimum":0,"title":"Offset","default":0}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoryOut"}}}},"400":{"description":"Raised when request components cannot be parsed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"404":{"description":"Raised when path parameters do not match","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"422":{"description":"Raised when returned response does not match the response schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"406":{"description":"Raised when provided `Accept` header cannot be satisfied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"429":{"description":"Raised when throttling rate was hit","headers":{"X-RateLimit-Limit":{"schema":{"type":"string"},"description":"The maximum number of requests permitted in the current time window","required":true},"X-RateLimit-Remaining":{"schema":{"type":"string"},"description":"The number of requests remaining in the current time window","required":true},"X-RateLimit-Reset":{"schema":{"type":"string"},"description":"The number of seconds until the current rate limit window resets","required":true},"Retry-After":{"schema":{"type":"string"},"description":"Indicates how long the user agent should wait before making a follow-up request","required":true}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}}},"deprecated":false}},"/api/v1/anomalies/":{"get":{"tags":["Hermes"],"operationId":"getAnomalycontrollerApiV1Anomalies","parameters":[{"deprecated":false,"name":"since","in":"query","schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Since"}},{"deprecated":false,"name":"kind","in":"query","schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"}},{"deprecated":false,"name":"origin","in":"query","schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin"}},{"deprecated":false,"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"title":"Limit","default":100}},{"deprecated":false,"name":"offset","in":"query","schema":{"type":"integer","minimum":0,"title":"Offset","default":0}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnomalyListEnvelope"}}}},"400":{"description":"Raised when request components cannot be parsed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"422":{"description":"Raised when returned response does not match the response schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"406":{"description":"Raised when provided `Accept` header cannot be satisfied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"429":{"description":"Raised when throttling rate was hit","headers":{"X-RateLimit-Limit":{"schema":{"type":"string"},"description":"The maximum number of requests permitted in the current time window","required":true},"X-RateLimit-Remaining":{"schema":{"type":"string"},"description":"The number of requests remaining in the current time window","required":true},"X-RateLimit-Reset":{"schema":{"type":"string"},"description":"The number of seconds until the current rate limit window resets","required":true},"Retry-After":{"schema":{"type":"string"},"description":"Indicates how long the user agent should wait before making a follow-up request","required":true}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}}},"deprecated":false}},"/api/v1/explore":{"get":{"tags":["Hermes"],"operationId":"getExplorecontrollerApiV1Explore","parameters":[{"description":"Locale spec + date window for ``GET /api/v1/explore``.\n\nExactly one of ``country``, ``city``, or ``region`` must be set.\n``from_`` defaults to today; ``to`` defaults to today + 7. Guest tier\ncaps ``to`` at request-date + 7 days regardless of what is asked for.","deprecated":false,"name":"country","in":"query","schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"}},{"description":"Locale spec + date window for ``GET /api/v1/explore``.\n\nExactly one of ``country``, ``city``, or ``region`` must be set.\n``from_`` defaults to today; ``to`` defaults to today + 7. Guest tier\ncaps ``to`` at request-date + 7 days regardless of what is asked for.","deprecated":false,"name":"city","in":"query","schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"}},{"description":"Locale spec + date window for ``GET /api/v1/explore``.\n\nExactly one of ``country``, ``city``, or ``region`` must be set.\n``from_`` defaults to today; ``to`` defaults to today + 7. Guest tier\ncaps ``to`` at request-date + 7 days regardless of what is asked for.","deprecated":false,"name":"region","in":"query","schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"}},{"description":"Locale spec + date window for ``GET /api/v1/explore``.\n\nExactly one of ``country``, ``city``, or ``region`` must be set.\n``from_`` defaults to today; ``to`` defaults to today + 7. Guest tier\ncaps ``to`` at request-date + 7 days regardless of what is asked for.","deprecated":false,"name":"from","in":"query","schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"From"}},{"description":"Locale spec + date window for ``GET /api/v1/explore``.\n\nExactly one of ``country``, ``city``, or ``region`` must be set.\n``from_`` defaults to today; ``to`` defaults to today + 7. Guest tier\ncaps ``to`` at request-date + 7 days regardless of what is asked for.","deprecated":false,"name":"to","in":"query","schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"To"}},{"description":"Locale spec + date window for ``GET /api/v1/explore``.\n\nExactly one of ``country``, ``city``, or ``region`` must be set.\n``from_`` defaults to today; ``to`` defaults to today + 7. Guest tier\ncaps ``to`` at request-date + 7 days regardless of what is asked for.","deprecated":false,"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"title":"Limit","default":100}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExploreOut"}}}},"400":{"description":"Raised when request components cannot be parsed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"422":{"description":"Raised when returned response does not match the response schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"406":{"description":"Raised when provided `Accept` header cannot be satisfied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"429":{"description":"Raised when throttling rate was hit","headers":{"X-RateLimit-Limit":{"schema":{"type":"string"},"description":"The maximum number of requests permitted in the current time window","required":true},"X-RateLimit-Remaining":{"schema":{"type":"string"},"description":"The number of requests remaining in the current time window","required":true},"X-RateLimit-Reset":{"schema":{"type":"string"},"description":"The number of seconds until the current rate limit window resets","required":true},"Retry-After":{"schema":{"type":"string"},"description":"Indicates how long the user agent should wait before making a follow-up request","required":true}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}}},"deprecated":false}},"/api/v1/routes/{origin}/{destination}/availability":{"get":{"tags":["Hermes"],"operationId":"getAvailabilitycontrollerApiV1RoutesOriginDestinationAvailability","parameters":[{"deprecated":false,"name":"origin","in":"path","schema":{"type":"string","title":"Origin"},"required":true},{"deprecated":false,"name":"destination","in":"path","schema":{"type":"string","title":"Destination"},"required":true},{"description":"Query params for /availability.","deprecated":false,"name":"date_out","in":"query","schema":{"type":"string","format":"date","title":"Date Out"},"required":true},{"description":"Query params for /availability.","deprecated":false,"name":"flex_days","in":"query","schema":{"type":"integer","maximum":6,"minimum":0,"title":"Flex Days","default":2}},{"description":"Query params for /availability.","deprecated":false,"name":"adt","in":"query","schema":{"type":"integer","maximum":9,"minimum":1,"title":"Adt","default":1}},{"description":"Query params for /availability.","deprecated":false,"name":"chd","in":"query","schema":{"type":"integer","maximum":8,"minimum":0,"title":"Chd","default":0}},{"description":"Query params for /availability.","deprecated":false,"name":"teen","in":"query","schema":{"type":"integer","maximum":8,"minimum":0,"title":"Teen","default":0}},{"description":"Query params for /availability.","deprecated":false,"name":"inf","in":"query","schema":{"type":"integer","maximum":8,"minimum":0,"title":"Inf","default":0}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvailabilityOut"}}}},"400":{"description":"Raised when request components cannot be parsed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"404":{"description":"Raised when path parameters do not match","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"422":{"description":"Raised when returned response does not match the response schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"406":{"description":"Raised when provided `Accept` header cannot be satisfied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"429":{"description":"Raised when throttling rate was hit","headers":{"X-RateLimit-Limit":{"schema":{"type":"string"},"description":"The maximum number of requests permitted in the current time window","required":true},"X-RateLimit-Remaining":{"schema":{"type":"string"},"description":"The number of requests remaining in the current time window","required":true},"X-RateLimit-Reset":{"schema":{"type":"string"},"description":"The number of seconds until the current rate limit window resets","required":true},"Retry-After":{"schema":{"type":"string"},"description":"Indicates how long the user agent should wait before making a follow-up request","required":true}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}}},"deprecated":false}},"/api/v1/routes/{origin}/{destination}/fare-options":{"get":{"tags":["Hermes"],"operationId":"getFareoptionscontrollerApiV1RoutesOriginDestinationFareOptions","parameters":[{"deprecated":false,"name":"origin","in":"path","schema":{"type":"string","title":"Origin"},"required":true},{"deprecated":false,"name":"destination","in":"path","schema":{"type":"string","title":"Destination"},"required":true},{"description":"Query params for /fare-options.\n\nCaller must echo the ``flight_key`` and ``fare_key`` from a prior\n/availability response. flyan-booking will retrieve a fresh\n``x-flight-search-token`` from a single fresh availability call.","deprecated":false,"name":"flight_key","in":"query","schema":{"type":"string","title":"Flight Key"},"required":true},{"description":"Query params for /fare-options.\n\nCaller must echo the ``flight_key`` and ``fare_key`` from a prior\n/availability response. flyan-booking will retrieve a fresh\n``x-flight-search-token`` from a single fresh availability call.","deprecated":false,"name":"fare_key","in":"query","schema":{"type":"string","title":"Fare Key"},"required":true},{"description":"Query params for /fare-options.\n\nCaller must echo the ``flight_key`` and ``fare_key`` from a prior\n/availability response. flyan-booking will retrieve a fresh\n``x-flight-search-token`` from a single fresh availability call.","deprecated":false,"name":"adt","in":"query","schema":{"type":"integer","maximum":9,"minimum":1,"title":"Adt","default":1}},{"description":"Query params for /fare-options.\n\nCaller must echo the ``flight_key`` and ``fare_key`` from a prior\n/availability response. flyan-booking will retrieve a fresh\n``x-flight-search-token`` from a single fresh availability call.","deprecated":false,"name":"chd","in":"query","schema":{"type":"integer","maximum":8,"minimum":0,"title":"Chd","default":0}},{"description":"Query params for /fare-options.\n\nCaller must echo the ``flight_key`` and ``fare_key`` from a prior\n/availability response. flyan-booking will retrieve a fresh\n``x-flight-search-token`` from a single fresh availability call.","deprecated":false,"name":"teen","in":"query","schema":{"type":"integer","maximum":8,"minimum":0,"title":"Teen","default":0}},{"description":"Query params for /fare-options.\n\nCaller must echo the ``flight_key`` and ``fare_key`` from a prior\n/availability response. flyan-booking will retrieve a fresh\n``x-flight-search-token`` from a single fresh availability call.","deprecated":false,"name":"inf","in":"query","schema":{"type":"integer","maximum":8,"minimum":0,"title":"Inf","default":0}},{"description":"Query params for /fare-options.\n\nCaller must echo the ``flight_key`` and ``fare_key`` from a prior\n/availability response. flyan-booking will retrieve a fresh\n``x-flight-search-token`` from a single fresh availability call.","deprecated":false,"name":"date_out","in":"query","schema":{"type":"string","format":"date","title":"Date Out"},"required":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FareOptionsOut"}}}},"400":{"description":"Raised when request components cannot be parsed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"404":{"description":"Raised when path parameters do not match","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"422":{"description":"Raised when returned response does not match the response schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"406":{"description":"Raised when provided `Accept` header cannot be satisfied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"429":{"description":"Raised when throttling rate was hit","headers":{"X-RateLimit-Limit":{"schema":{"type":"string"},"description":"The maximum number of requests permitted in the current time window","required":true},"X-RateLimit-Remaining":{"schema":{"type":"string"},"description":"The number of requests remaining in the current time window","required":true},"X-RateLimit-Reset":{"schema":{"type":"string"},"description":"The number of seconds until the current rate limit window resets","required":true},"Retry-After":{"schema":{"type":"string"},"description":"Indicates how long the user agent should wait before making a follow-up request","required":true}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}}},"deprecated":false}},"/api/v1/aircraft/{model}/seatmap":{"get":{"tags":["Hermes"],"operationId":"getSeatmapcontrollerApiV1AircraftModelSeatmap","parameters":[{"deprecated":false,"name":"model","in":"path","schema":{"type":"string","title":"Model"},"required":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeatMapOut"}}}},"400":{"description":"Raised when request components cannot be parsed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"404":{"description":"Raised when path parameters do not match","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"422":{"description":"Raised when returned response does not match the response schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"406":{"description":"Raised when provided `Accept` header cannot be satisfied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"429":{"description":"Raised when throttling rate was hit","headers":{"X-RateLimit-Limit":{"schema":{"type":"string"},"description":"The maximum number of requests permitted in the current time window","required":true},"X-RateLimit-Remaining":{"schema":{"type":"string"},"description":"The number of requests remaining in the current time window","required":true},"X-RateLimit-Reset":{"schema":{"type":"string"},"description":"The number of seconds until the current rate limit window resets","required":true},"Retry-After":{"schema":{"type":"string"},"description":"Indicates how long the user agent should wait before making a follow-up request","required":true}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}}},"deprecated":false}}},"components":{"schemas":{"AirportListEnvelope":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AirportOut"},"type":"array","title":"Items"},"count":{"type":"integer","minimum":0,"title":"Count","default":0},"limit":{"type":"integer","minimum":0,"title":"Limit","default":0},"offset":{"type":"integer","minimum":0,"title":"Offset","default":0},"has_more":{"type":"boolean","title":"Has More","default":false},"generated_at":{"type":"string","format":"date-time","title":"Generated At"}},"type":"object","required":["items","generated_at"],"title":"AirportListEnvelope"},"AirportOut":{"properties":{"iata":{"type":"string","title":"Iata"},"name":{"type":"string","title":"Name"},"country_code":{"type":"string","title":"Country Code"},"city_code":{"type":"string","title":"City Code"},"region_code":{"type":"string","title":"Region Code"},"currency":{"type":"string","title":"Currency"},"time_zone":{"type":"string","title":"Time Zone"},"is_base":{"type":"boolean","title":"Is Base"},"latitude":{"type":"number","title":"Latitude"},"longitude":{"type":"number","title":"Longitude"}},"type":"object","required":["iata","name","country_code","city_code","region_code","currency","time_zone","is_base","latitude","longitude"],"title":"AirportOut"},"AnomalyListEnvelope":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AnomalyOut"},"type":"array","title":"Items"},"count":{"type":"integer","minimum":0,"title":"Count","default":0},"limit":{"type":"integer","minimum":0,"title":"Limit","default":0},"offset":{"type":"integer","minimum":0,"title":"Offset","default":0},"has_more":{"type":"boolean","title":"Has More","default":false},"generated_at":{"type":"string","format":"date-time","title":"Generated At"}},"type":"object","required":["items","generated_at"],"title":"AnomalyListEnvelope"},"AnomalyOut":{"properties":{"origin":{"type":"string","title":"Origin"},"destination":{"type":"string","title":"Destination"},"outbound_date":{"type":"string","format":"date","title":"Outbound Date"},"kind":{"type":"string","title":"Kind"},"baseline_price":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Baseline Price"},"observed_price":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Observed Price"},"delta_pct":{"type":"number","title":"Delta Pct"},"currency":{"type":"string","title":"Currency"},"detected_at":{"type":"string","format":"date-time","title":"Detected At"},"detected_age_seconds":{"type":"integer","minimum":0,"title":"Detected Age Seconds","default":0},"freshness":{"type":"string","title":"Freshness","default":"unknown"}},"type":"object","required":["origin","destination","outbound_date","kind","baseline_price","observed_price","delta_pct","currency","detected_at"],"title":"AnomalyOut"},"AvailabilityOut":{"properties":{"origin":{"type":"string","title":"Origin"},"destination":{"type":"string","title":"Destination"},"currency":{"type":"string","title":"Currency"},"date_out":{"type":"string","format":"date-time","title":"Date Out"},"flights":{"items":{"$ref":"#/components/schemas/FlightOut"},"type":"array","title":"Flights"}},"type":"object","required":["origin","destination","currency","date_out","flights"],"title":"AvailabilityOut","description":"``GET /api/v1/routes/{origin}/{destination}/availability``"},"CheapestNotFoundOut":{"properties":{"origin":{"type":"string","title":"Origin"},"destination":{"type":"string","title":"Destination"},"reason":{"type":"string","title":"Reason"},"message":{"type":"string","title":"Message"},"last_observed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Observed At"},"hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hint"}},"type":"object","required":["origin","destination","reason","message"],"title":"CheapestNotFoundOut","description":"Structured 404 body for the cheapest endpoint.\n\nTells the caller *why* there is nothing to return (\"route_unknown\"\nvs \"no_observations_yet\") and what to try next, so a UI doesn't have\nto fall back on string matching the message field."},"CheapestOut":{"properties":{"origin":{"type":"string","title":"Origin"},"destination":{"type":"string","title":"Destination"},"tier":{"type":"string","title":"Tier"},"window_start":{"type":"string","format":"date","title":"Window Start"},"window_end":{"type":"string","format":"date","title":"Window End"},"count":{"type":"integer","title":"Count","default":0},"generated_at":{"type":"string","format":"date-time","title":"Generated At"},"days":{"items":{"$ref":"#/components/schemas/DayCheapest"},"type":"array","title":"Days"}},"type":"object","required":["origin","destination","tier","window_start","window_end","generated_at","days"],"title":"CheapestOut","description":"30-day per-day cheapest fare response.\n\n``days`` is sorted by ``outbound_date`` ascending and contains at\nmost one entry per outbound date in ``[window_start, window_end]``.\nDays with no observations yet are simply absent from the list --\nconsumers shouldn't assume every date in the window will be there."},"DayCheapest":{"properties":{"outbound_date":{"type":"string","format":"date","title":"Outbound Date"},"fare":{"$ref":"#/components/schemas/FareOut"}},"type":"object","required":["outbound_date","fare"],"title":"DayCheapest","description":"One day's cheapest fare. The fare is the lowest-priced flight on\nthat outbound date, picked from each flight's most-recent observation\n-- so the response reflects the current bookable cheapest, not the\nlowest price ever seen."},"ErrorDetail":{"properties":{"msg":{"type":"string","title":"Msg"},"type":{"type":"string","title":"Type"},"loc":{"items":{"anyOf":[{"type":"integer"},{"type":"string"}]},"type":"array","title":"Loc"}},"type":"object","required":["msg"],"title":"ErrorDetail","description":"Base schema for error details description."},"ErrorModel":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ErrorDetail"},"type":"array","title":"Detail"}},"type":"object","required":["detail"],"title":"ErrorModel","description":"Default error response schema.\n\nCan be customized.\nSee :ref:`customizing-error-messages` for more details."},"ExploreDestination":{"properties":{"origin":{"type":"string","title":"Origin"},"destination":{"type":"string","title":"Destination"},"destination_name":{"type":"string","title":"Destination Name"},"destination_country":{"type":"string","title":"Destination Country"},"destination_city":{"type":"string","title":"Destination City"},"outbound_date":{"type":"string","format":"date","title":"Outbound Date"},"price":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Price"},"currency":{"type":"string","title":"Currency"},"flight_number":{"type":"string","title":"Flight Number"},"departure":{"type":"string","format":"date-time","title":"Departure"},"arrival":{"type":"string","format":"date-time","title":"Arrival"},"observed_at":{"type":"string","format":"date-time","title":"Observed At"}},"type":"object","required":["origin","destination","destination_name","destination_country","destination_city","outbound_date","price","currency","flight_number","departure","arrival","observed_at"],"title":"ExploreDestination","description":"One destination reachable from the requested locale."},"ExploreOut":{"properties":{"locale_type":{"type":"string","title":"Locale Type"},"locale_value":{"type":"string","title":"Locale Value"},"tier":{"type":"string","title":"Tier"},"window_from":{"type":"string","format":"date","title":"Window From"},"window_to":{"type":"string","format":"date","title":"Window To"},"n_origins":{"type":"integer","title":"N Origins"},"destinations":{"items":{"$ref":"#/components/schemas/ExploreDestination"},"type":"array","title":"Destinations"}},"type":"object","required":["locale_type","locale_value","tier","window_from","window_to","n_origins","destinations"],"title":"ExploreOut","description":"Response for ``GET /api/v1/explore``."},"FareOptionOut":{"properties":{"code":{"type":"string","title":"Code"},"amount":{"type":"number","title":"Amount"},"total":{"type":"number","title":"Total"},"included_ssrs":{"items":{"type":"string"},"type":"array","title":"Included Ssrs"},"offer_key":{"type":"string","title":"Offer Key"}},"type":"object","required":["code","amount","total","included_ssrs","offer_key"],"title":"FareOptionOut","description":"One fare-class option for a specific flight + base fare."},"FareOptionsOut":{"properties":{"flight_key":{"type":"string","title":"Flight Key"},"options":{"items":{"$ref":"#/components/schemas/FareOptionOut"},"type":"array","title":"Options"}},"type":"object","required":["flight_key","options"],"title":"FareOptionsOut","description":"``GET /api/v1/routes/{origin}/{destination}/fare-options``"},"FareOut":{"properties":{"origin":{"type":"string","title":"Origin"},"destination":{"type":"string","title":"Destination"},"outbound_date":{"type":"string","format":"date","title":"Outbound Date"},"departure":{"type":"string","format":"date-time","title":"Departure"},"arrival":{"type":"string","format":"date-time","title":"Arrival"},"price":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Price"},"currency":{"type":"string","title":"Currency"},"flight_number":{"type":"string","title":"Flight Number"},"observed_at":{"type":"string","format":"date-time","title":"Observed At"},"data_age_seconds":{"type":"integer","minimum":0,"title":"Data Age Seconds","default":0},"freshness":{"type":"string","title":"Freshness","default":"unknown"}},"type":"object","required":["origin","destination","outbound_date","departure","arrival","price","currency","flight_number","observed_at"],"title":"FareOut"},"FlightOut":{"properties":{"flight_number":{"type":"string","title":"Flight Number"},"flight_key":{"type":"string","title":"Flight Key"},"departure":{"type":"string","format":"date-time","title":"Departure"},"arrival":{"type":"string","format":"date-time","title":"Arrival"},"departure_utc":{"type":"string","format":"date-time","title":"Departure Utc"},"arrival_utc":{"type":"string","format":"date-time","title":"Arrival Utc"},"duration":{"type":"string","title":"Duration"},"fares_left":{"type":"integer","title":"Fares Left"},"infants_left":{"type":"integer","title":"Infants Left"},"fare":{"$ref":"#/components/schemas/FareOut"}},"type":"object","required":["flight_number","flight_key","departure","arrival","departure_utc","arrival_utc","duration","fares_left","infants_left","fare"],"title":"FlightOut","description":"One bookable flight from the live availability response."},"HistoryOut":{"properties":{"origin":{"type":"string","title":"Origin"},"destination":{"type":"string","title":"Destination"},"tier":{"type":"string","title":"Tier"},"window_start":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Window Start"},"count":{"type":"integer","title":"Count","default":0},"has_more":{"type":"boolean","title":"Has More","default":false},"generated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Generated At"},"points":{"items":{"$ref":"#/components/schemas/HistoryPoint"},"type":"array","title":"Points"}},"type":"object","required":["origin","destination","tier","window_start","points"],"title":"HistoryOut"},"HistoryPoint":{"properties":{"observed_at":{"type":"string","format":"date-time","title":"Observed At"},"price":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Price"},"currency":{"type":"string","title":"Currency"},"outbound_date":{"type":"string","format":"date","title":"Outbound Date"}},"type":"object","required":["observed_at","price","currency","outbound_date"],"title":"HistoryPoint"},"RouteListEnvelope":{"properties":{"items":{"items":{"$ref":"#/components/schemas/RouteOut"},"type":"array","title":"Items"},"count":{"type":"integer","minimum":0,"title":"Count","default":0},"limit":{"type":"integer","minimum":0,"title":"Limit","default":0},"offset":{"type":"integer","minimum":0,"title":"Offset","default":0},"has_more":{"type":"boolean","title":"Has More","default":false},"generated_at":{"type":"string","format":"date-time","title":"Generated At"}},"type":"object","required":["items","generated_at"],"title":"RouteListEnvelope"},"RouteOut":{"properties":{"origin":{"type":"string","title":"Origin"},"destination":{"type":"string","title":"Destination"},"seasonal":{"type":"boolean","title":"Seasonal"},"active":{"type":"boolean","title":"Active"},"priority":{"type":"integer","title":"Priority"}},"type":"object","required":["origin","destination","seasonal","active","priority"],"title":"RouteOut"},"SeatMapOut":{"properties":{"aircraft_model":{"type":"string","title":"Aircraft Model"},"seat_rows":{"items":{"items":{"anyOf":[{"$ref":"#/components/schemas/SeatOut"},{"type":"null"}]},"type":"array"},"type":"array","title":"Seat Rows"}},"type":"object","required":["aircraft_model","seat_rows"],"title":"SeatMapOut","description":"``GET /api/v1/aircraft/{model}/seatmap``\n\n``seat_rows`` is a 2-D grid; inner ``None`` represents an aisle gap."},"SeatOut":{"properties":{"designator":{"type":"string","title":"Designator"},"row":{"type":"integer","title":"Row"},"column":{"type":"string","title":"Column"},"group":{"type":"integer","title":"Group"},"extra_leg_room":{"type":"boolean","title":"Extra Leg Room"},"emergency_exit":{"type":"boolean","title":"Emergency Exit"},"window_seat":{"type":"boolean","title":"Window Seat"},"infant_allowed":{"type":"boolean","title":"Infant Allowed"},"child_allowed":{"type":"boolean","title":"Child Allowed"}},"type":"object","required":["designator","row","column","group","extra_leg_room","emergency_exit","window_seat","infant_allowed","child_allowed"],"title":"SeatOut","description":"One seat in a seat-map row."}},"securitySchemes":{}}}