Skyscanner Flight Scraper — Fares, Legs & Agents avatar

Skyscanner Flight Scraper — Fares, Legs & Agents

Pricing

from $0.60 / 1,000 flight itineraries

Go to Apify Store
Skyscanner Flight Scraper — Fares, Legs & Agents

Skyscanner Flight Scraper — Fares, Legs & Agents

Drop-in compatible with memo23/skyscanner-scraper — cheaper and reliable. Flight itineraries from Skyscanner's own search API: price, all booking agents with their quotes, legs, segments, carriers, stops and derived layover durations. One-way, return and multi-city. No browser, no captcha solver.

Pricing

from $0.60 / 1,000 flight itineraries

Rating

0.0

(0)

Developer

DIOPSIDE AI

DIOPSIDE AI

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Drop-in compatible with memo23/skyscanner-scraper — cheaper on real result volumes, and it returns every agent's quote instead of just the cheapest one. Give it a route and dates (or paste a Skyscanner results URL) and it returns flight itineraries from Skyscanner's own search API: total price, every booking agent quoting that itinerary with its Skyscanner rating and deep link, all legs and segments, carriers, stop counts, and layover durations that Skyscanner itself never publishes.

No browser, no captcha solver, no login.

Why this one

It returns all the quotes, not just the cheapest. A single London–New York itinerary is typically sold by 10–12 different agents at prices spread over $80. Most Skyscanner actors flatten that to one number. This one gives you pricingOptions — every agent, its price, its Skyscanner rating, whether it is the airline itself, and its own booking link — so you can compare sellers, not just routes.

Layover durations are computed for you. Skyscanner sends segment times but never the gap between them. Every leg here carries a layovers array with the connecting airport and the wait in minutes, which is the field most people end up writing themselves.

Sorting happens before the limit. resultSort: "cheapest" with resultLimit: 20 gives you the 20 cheapest itineraries out of the 1,500 the route actually returned — not the first 20 in Skyscanner's default order. Several actors in this category apply the limit first, which quietly makes "cheapest" meaningless.

It fails loudly. Skyscanner's search API sits behind PerimeterX, which answers with a small JSON redirect stub — sometimes alongside an HTTP 200. Treating that as data is how a scraper "succeeds" with an empty dataset. This actor inspects the body, rotates to a new exit IP, and if it genuinely cannot get through it fails the run with the reason in the status message rather than reporting a successful run with nothing in it.

Input

Field names match memo23/skyscanner-scraper, so an existing input works unchanged.

FieldTypeDefaultNotes
startUrlsarray/transport/flights/{from}/{to}/{YYMMDD}/{YYMMDD?}/ URLs. Route and dates come from the URL.
departureAirportstringIATA code (LHR) or city name (London). A code searches that airport only; a city searches all its airports.
arrivalAirportstringSame.
departureDatestringYYYY-MM-DD or YYMMDD.
returnDatestringOmit for one-way.
cabinClassstringeconomyeconomy, premium_economy, business, first.
adults / children / infantsinteger1 / 0 / 0Children are priced at age 10, infants at age 1.
multiCityLeg2Destination / ...DatestringAdds a third leg. Leg3 adds a fourth.
skyscannerMarketstringUSFares and available agents differ by market.
skyscannerCurrencystringUSD
skyscannerLocalestringen-US
resultSortstringdefaultdefault, score, cheapest, fastest, departure.
resultLimitintegerno limitItineraries kept and billed per search. See the cost note below.
filterNonStop / filterOneStop / filterTwoPlusStopsbooleanfalseAdditive. All three off means no stop filter.
includeNearbyAirportsbooleanfalse
maxItemsintegerAlias of resultLimit.
proxyConfigurationobjectApify RESIDENTIALRequired — see below.

A residential proxy is required

Skyscanner's search API rejects datacenter exit IPs. Measured on the Apify platform:

Exit tierSearch API
Raw Apify IP (no proxy)Blocked by PerimeterX, every attempt
Apify datacenter proxyBlocked by PerimeterX, every attempt
Apify RESIDENTIAL proxyPasses on ~6 exits in 7

The default proxyConfiguration is already RESIDENTIAL. A run configured without it rotates through a dozen exits and then fails with an explicit message. (A headless and a headful stealth browser both hit a hard captcha on datacenter IPs, so this is a property of the exit IP, not of the client — a browser would not help.)

Output

One record per itinerary.

{
"id": "13554-2612080600--31799-1-12712-2612081315|12712-2612151935--31799-1-13554-2612160655",
"searchOrigin": "LHR",
"searchDestination": "JFK",
"departureDate": "2026-12-08",
"returnDate": "2026-12-15",
"cabinClass": "ECONOMY",
"adults": 1,
"currency": "USD",
"market": "US",
"price": 482,
"priceFormatted": "$482",
"pricePerAdult": 482,
"agentName": "Flightnetwork",
"bookingUrl": "https://www.skyscanner.com/transport_deeplink/4.0/US/en-US/USD/fnus/...",
"isDirect": false,
"stopCount": 1,
"totalDurationInMinutes": 1520,
"departure": "2026-12-08T06:00:00",
"arrival": "2026-12-08T13:15:00",
"carrierNames": ["SWISS"],
"legs": [
{
"origin": { "id": "LHR", "name": "London Heathrow", "city": "London", "country": "United Kingdom" },
"destination": { "id": "JFK", "name": "New York John F. Kennedy", "city": "New York", "country": "United States" },
"departure": "2026-12-08T06:00:00",
"arrival": "2026-12-08T13:15:00",
"durationInMinutes": 795,
"stopCount": 1,
"carriers": [{ "name": "SWISS", "logoUrl": "https://logos.skyscnr.com/images/airlines/favicon/LX.png" }],
"segments": [{ "flightNumber": "317", "marketingCarrier": { "name": "SWISS" }, "...": "..." }],
"layovers": [
{ "airport": "ZRH", "arrival": "2026-12-08T08:40:00", "departure": "2026-12-08T09:55:00", "durationInMinutes": 75 }
]
}
],
"pricingOptions": [
{ "agentId": "fnus", "agentName": "Flightnetwork", "agentRating": 4.51, "agentIsCarrier": false,
"price": 482, "bookingProposition": "PBOOK", "bookingUrl": "https://www.skyscanner.com/transport_deeplink/..." }
],
"pricingOptionCount": 10,
"isSelfTransfer": false,
"isChangeAllowed": false,
"isCancellationAllowed": false,
"tags": ["cheapest"],
"score": 0.584649,
"scrapedAt": "2026-09-20T00:42:02+00:00"
}

Missing upstream values are null, never a crash: Skyscanner omits farePolicy, score and whole pricing options on some itineraries.

Sizes and cost

A busy long-haul route returns a lot: LHR→JFK return produced 1,546 itineraries in one search, settling in about 30 seconds. Short-haul and thin routes return tens.

Pricing is per search plus per itinerary:

EventPrice
Actor start$0.00005
Flight search$0.025
Flight itinerary$0.0006

A search costs the same in bandwidth whether you keep 25 itineraries or all 1,546, so that fixed cost is billed as a fixed event instead of being buried in a per-result price that punishes large pulls. Against memo23/skyscanner-scraper ($0.007 start + $0.001 per result) that works out cheaper from roughly 50 results per search upward, and much cheaper on full pulls — 1,546 itineraries cost $0.95 here versus $1.55 there.

Use resultLimit. Without it, one search over a busy route bills 1,500+ itineraries. If you only want the cheapest few, set resultSort: "cheapest" and resultLimit: 20 — you still get the cheapest 20 of the whole result set.

Use cases

  • Fare monitoring — run a route on a schedule and track price and scrapedAt over time.
  • Agent/OTA price comparisonpricingOptions shows what each seller charges for the identical itinerary, and how Skyscanner rates them.
  • Route and schedule research — carriers, flight numbers, durations and layovers per segment.
  • Travel-policy checks — filter on isDirect, totalDurationInMinutes, layover length or isChangeAllowed / isCancellationAllowed.

Switching from memo23/skyscanner-scraper

Change the actor id. The input field names, date formats (YYYY-MM-DD and YYMMDD), cabin class values, stop filters and the startUrls / filter-fields precedence are all the same.

Two differences worth knowing:

  • Output field names are ours, not the incumbent's flattened 180-column shape. The dataset view or ?format=csv gives you a flat table; legs and pricingOptions stay nested because that is where the extra data lives.
  • proxyConfiguration defaults to RESIDENTIAL and is genuinely required (see above).

Notes

  • Skyscanner entity ids are resolved at run time through Skyscanner's own autosuggest service, so new or renamed airports work without an actor update, and nothing is hardcoded.
  • Fares move constantly. scrapedAt on every record is what makes an old dataset interpretable.
  • Public flight pricing only. No personal data.