Skyscanner Flight Scraper — Fares, Legs & Agents
Pricing
from $0.60 / 1,000 flight itineraries
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
Maintained by CommunityActor 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.
| Field | Type | Default | Notes |
|---|---|---|---|
startUrls | array | — | /transport/flights/{from}/{to}/{YYMMDD}/{YYMMDD?}/ URLs. Route and dates come from the URL. |
departureAirport | string | — | IATA code (LHR) or city name (London). A code searches that airport only; a city searches all its airports. |
arrivalAirport | string | — | Same. |
departureDate | string | — | YYYY-MM-DD or YYMMDD. |
returnDate | string | — | Omit for one-way. |
cabinClass | string | economy | economy, premium_economy, business, first. |
adults / children / infants | integer | 1 / 0 / 0 | Children are priced at age 10, infants at age 1. |
multiCityLeg2Destination / ...Date | string | — | Adds a third leg. Leg3 adds a fourth. |
skyscannerMarket | string | US | Fares and available agents differ by market. |
skyscannerCurrency | string | USD | |
skyscannerLocale | string | en-US | |
resultSort | string | default | default, score, cheapest, fastest, departure. |
resultLimit | integer | no limit | Itineraries kept and billed per search. See the cost note below. |
filterNonStop / filterOneStop / filterTwoPlusStops | boolean | false | Additive. All three off means no stop filter. |
includeNearbyAirports | boolean | false | |
maxItems | integer | — | Alias of resultLimit. |
proxyConfiguration | object | Apify RESIDENTIAL | Required — see below. |
A residential proxy is required
Skyscanner's search API rejects datacenter exit IPs. Measured on the Apify platform:
| Exit tier | Search API |
|---|---|
| Raw Apify IP (no proxy) | Blocked by PerimeterX, every attempt |
| Apify datacenter proxy | Blocked by PerimeterX, every attempt |
| Apify RESIDENTIAL proxy | Passes 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:
| Event | Price |
|---|---|
| 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
priceandscrapedAtover time. - Agent/OTA price comparison —
pricingOptionsshows 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 orisChangeAllowed/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=csvgives you a flat table;legsandpricingOptionsstay nested because that is where the extra data lives. proxyConfigurationdefaults 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.
scrapedAton every record is what makes an old dataset interpretable. - Public flight pricing only. No personal data.