{"description":"Ryanair's fare finder from one airport to anywhere: for every destination Ryanair flies to in a date window, the cheapest one-way fare for one adult, or the cheapest return trip of a given number of nights. Each result has the destination airport, city and country, the price (total and per leg for returns), departure and arrival times and a link to Ryanair's flight selection. Optionally only one destination country and a price cap. Sorted cheapest first.","effect":"read","id":"ryanair.com/cheapest-fares","keywords":["ryanair","cheap flights","anywhere","where to fly","weekend trip","city break","fare finder","billigflug","günstige flüge","wohin fliegen","kurztrip","vuelos baratos","voli economici","tanie loty","low cost","airline"],"output":{"schema":{"properties":{"currency":{"type":"string"},"destinations":{"items":{"properties":{"airport":{"type":"string"},"arrival":{"type":"string"},"city":{"type":["string","null"]},"country":{"type":["string","null"]},"country_code":{"type":["string","null"]},"currency":{"type":"string"},"departure":{"description":"Outbound departure, local time at the airport","type":"string"},"destination":{"description":"IATA code","type":"string"},"flight_number":{"type":["string","null"]},"nights":{"type":["integer","null"]},"outbound_price":{"type":["number","null"]},"price":{"description":"Cheapest fare for one adult, before bags and seats; for returns the total of both legs","type":"number"},"return_arrival":{"type":["string","null"]},"return_departure":{"type":["string","null"]},"return_price":{"type":["number","null"]},"url":{"description":"Ryanair's flight selection for these days","type":"string"}},"type":"object"},"type":"array"},"origin":{"type":"string"},"trip":{"enum":["one_way","return"],"type":"string"}},"required":["origin","trip","currency","destinations"],"type":"object"},"value":"let $rt = steps.fares[0].f.kind == 'roundTripFares', $o = upper(params.origin), $cur = params.currency || 'EUR' in {origin: $o, trip: $rt && 'return' || 'one_way', currency: $cur, destinations: map(&(let $x = @ in {destination: $x.outbound.arrivalAirport.iataCode, airport: $x.outbound.arrivalAirport.name, city: $x.outbound.arrivalAirport.city.name || `null`, country: $x.outbound.arrivalAirport.countryName || `null`, country_code: $x.outbound.arrivalAirport.city.countryCode && upper($x.outbound.arrivalAirport.city.countryCode) || `null`, price: $x.summary.price.value || $x.outbound.price.value, currency: $x.summary.price.currencyCode || $x.outbound.price.currencyCode || $cur, departure: $x.outbound.departureDate, arrival: $x.outbound.arrivalDate, flight_number: $x.outbound.flightNumber || `null`, return_departure: $x.inbound.departureDate || `null`, return_arrival: $x.inbound.arrivalDate || `null`, nights: $x.summary.tripDurationDays || `null`, outbound_price: $x.outbound.price.value || `null`, return_price: $x.inbound.price.value || `null`, url: join('', ['https://www.ryanair.com/gb/en/trip/flights/select?adults=1&teens=0&children=0&infants=0&dateOut=', $x.outbound.departureDate[0:10], $x.inbound.departureDate && join('', ['&dateIn=', $x.inbound.departureDate[0:10]]) || '', '&isConnectedFlight=false&isReturn=', $x.inbound && 'true' || 'false', '&discount=0&originIata=', $o, '&destinationIata=', $x.outbound.arrivalAirport.iataCode])}), steps.fares[0].fares || `[]`)}"},"params":{"additionalProperties":false,"properties":{"country":{"description":"Only destinations in this country, ISO code, e.g. 'es', 'it', 'pt'","pattern":"^[A-Za-z]{2}$","type":"string"},"currency":{"default":"EUR","enum":["EUR","GBP","PLN","HUF","CZK","SEK","NOK","DKK","CHF","MAD","RON","BGN"],"type":"string"},"date_from":{"description":"Earliest departure day, YYYY-MM-DD","pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"},"date_to":{"description":"Latest departure day, YYYY-MM-DD (default: date_from)","pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"},"max_price":{"description":"Price cap in the chosen currency (the whole trip for returns)","minimum":0,"type":"number"},"nights_max":{"description":"Return trip: most nights away (default: nights_min)","maximum":30,"minimum":1,"type":"integer"},"nights_min":{"description":"Return trip: fewest nights away. Leave out both nights params for one way","maximum":30,"minimum":1,"type":"integer"},"origin":{"description":"Departure airport IATA code, e.g. 'BER' (Berlin), 'STN' (London Stansted), 'DUB' (Dublin), 'BGY' (Milan Bergamo)","pattern":"^[A-Za-z]{3}$","type":"string"}},"required":["origin","date_from"],"type":"object"},"provenance":{"method":"browser-inspect","notes":"Ryanair's fare finder ('cheap flights from …') calls /api/farfnd/v4/oneWayFares and /api/farfnd/v4/roundTripFares with departureAirportIataCode, outbound (and inbound) date windows, durationFrom/durationTo (nights), arrivalCountryCode, priceValueTo, currency, market and adultPaxCount. One entry per destination, cheapest first; summary.price is the trip total, tripDurationDays the nights. market en-gb gives English airport and country names. Prices are for one adult before bags, seats and fees; the booking availability API answers servers with 409, so the link opens Ryanair's own flight selection. Answers servers.","recorded_at":"2026-11-07T21:34:00+01:00","recorded_by":"C4"},"requires_login":false,"schema":"https://wield.run/schema/recipe/v1.json","site":{"country":"IE","id":"ryanair.com","language":"en","name":"Ryanair","origin":"https://www.ryanair.com","origins":["https://www.ryanair.com"]},"steps":[{"description":"The fare finder's own API: oneWayFares, or roundTripFares with the trip length in nights. The one-item foreach picks the endpoint and the inbound window (the outbound window plus 30 days, bounded by the nights).","expect":{"assert":"body.fares != `null`","content_type":"json","status":[200]},"extract":{"json":{"fares":"fares"}},"foreach":{"as":"f","in":"let $rt = (params.nights_min || params.nights_max) && `true` || `false` in [{kind: $rt && 'roundTripFares' || 'oneWayFares', origin: upper(params.origin), out_to: params.date_to || params.date_from, in_from: $rt && params.date_from || `null`, in_to: $rt && (params.date_to || params.date_from) || `null`, nights_min: $rt && (params.nights_min || params.nights_max) || `null`, nights_max: $rt && (params.nights_max || params.nights_min) || `null`, country: params.country && lower(params.country) || `null`}]","max":1},"id":"fares","request":{"headers":{"Accept":"application/json"},"method":"GET","query":{"adultPaxCount":"1","arrivalCountryCode":"{{f.country}}","currency":"{{params.currency}}","departureAirportIataCode":"{{f.origin}}","durationFrom":"{{f.nights_min}}","durationTo":"{{f.nights_max}}","inboundDepartureDateFrom":"{{f.in_from}}","inboundDepartureDateTo":"{{f.in_to | add_days:30}}","market":"en-gb","outboundDepartureDateFrom":"{{params.date_from}}","outboundDepartureDateTo":"{{f.out_to}}","priceValueTo":"{{params.max_price}}"},"url":"/api/farfnd/v4/{{f.kind}}"}}],"task":"Find the cheapest Ryanair destinations from an airport","tos":{"notes":"Ryanair's website terms allow private, non-commercial use and forbid automated extraction for commercial purposes (screen scraping). One request per search, the same one the fare finder makes. robots.txt disallows /api for crawlers. Booking stays on ryanair.com.","reviewed":false},"verify":{"checks":["length(output.destinations) > `5`","output.trip == 'one_way'","length(output.destinations[?starts_with(departure, '2027-01') && price > `0` && currency == 'EUR' && starts_with(url, 'https://www.ryanair.com/')]) == length(output.destinations)","output.destinations[0].price <= output.destinations[-1].price","length(output.destinations[?return_departure != `null`]) == `0`"],"example_params":{"date_from":"2027-01-08","date_to":"2027-01-31","origin":"BER"},"max_ms":4000},"version":1}