Skyscanner Flights Scraper avatar

Skyscanner Flights Scraper

Pricing

from $1.20 / 1,000 flights

Go to Apify Store
Skyscanner Flights Scraper

Skyscanner Flights Scraper

Search Skyscanner one-way and return flights, apply baggage, stop, and time filters, and optionally collect booking-panel details.

Pricing

from $1.20 / 1,000 flights

Rating

0.0

(0)

Developer

Farhan Ali

Farhan Ali

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

21 hours ago

Last modified

Categories

Share

Skyscanner Flights Scraper creates a structured dataset of flight itineraries collected from Skyscanner. Each dataset item represents one itinerary and can include the price, currency, trip type, cabin, passengers, origin and destination airports, outbound and return times, duration, stops, carriers, the cheapest agent, a booking link, and — when enabled — booking-panel details such as baggage and amenities. Query the source using origin, destination, and dates, apply baggage, stop, and time filters, control the result limit with maxItems, and retrieve records through the Apify Dataset API or export them as JSON, CSV, or Excel.

Dataset at a glance

PropertyValue
Sourceskyscanner.com
Record unitOne flight itinerary
Input methodsOrigin + destination + dates, or multiple routes via searches
Main identifiersitineraryId
DeliveryApify Dataset and API
Export formatsJSON, CSV, Excel
Update modelFresh records per Actor run
PricingPay per event, from $1.50 per 1,000 flights

Coverage and available records

The Actor collects one-way and round-trip itineraries:

  • Single route — set origin, destination, and departDate; add returnDate for a round trip.
  • Multiple routes — pass a searches array of routes; a non-empty list replaces the single route while passenger, cabin, market, and filter settings still apply to every route.

Supported behavior:

  • Filters — cabin (economy, premiumeconomy, business, first), checked bag, cabin bag, stop counts, maximum duration, and outbound/return takeoff and landing windows.
  • Optional flight details (includeFlightDetails) loads the booking panel — agents, baggage, amenities, and booking links — billed as a separate flight-details event.
  • maxItems caps how many flights are saved (0 = no limit).

return* fields are null for one-way searches. agents, legs, and flightDetails are conditional on the corresponding option.

Data dictionary

FieldTypeNullableDescriptionExample
itineraryIdstringNoStable itinerary identifier11983-240106...
pricenumberNoCheapest fare312.40
currencystringNoPrice currencyEUR
priceFormattedstringNoDisplay price label€312
tripTypestringNoTrip typeroundTrip
cabinClassstringNoCabineconomy
adultsintegerNoAdult passenger count1
childAgesarrayNoChild ages[]
originCodestringNoDeparture airport codeBER
originNamestringYesDeparture airport nameBerlin Brandenburg
originCitystringNoDeparture cityBerlin
destinationCodestringNoArrival airport codeISB
destinationNamestringYesArrival airport nameIslamabad International
destinationCitystringNoArrival cityIslamabad
outboundDeparturestringNoOutbound departure time2027-01-06T06:30:00
outboundArrivalstringNoOutbound arrival time2027-01-06T15:45:00
outboundDurationMinutesintegerNoOutbound duration615
outboundStopsintegerNoOutbound stops1
outboundCarriersarrayNoOutbound airlines["Turkish Airlines"]
returnDeparturestringYesReturn departure (round trip)2027-02-14T10:00:00
returnArrivalstringYesReturn arrival2027-02-14T21:00:00
returnDurationMinutesintegerYesReturn duration660
returnStopsintegerYesReturn stops1
returnCarriersarrayYesReturn airlines["Turkish Airlines"]
cheapestAgentstringYesCheapest booking agentKiwi.com
bookingUrlstringYesBooking linkhttps://www.skyscanner.net/...
isSelfTransferbooleanNoSelf-transfer flagfalse
isChangeAllowedbooleanNoChanges allowedfalse
isCancellationAllowedbooleanNoCancellation allowedfalse
urlstringNoResults page URLhttps://www.skyscanner.net/...
searchUrlstringNoSearch URLhttps://www.skyscanner.net/...
scorenumberNoSkyscanner itinerary score0.9
agentsarrayYesOther agents with ratings[{...}]
legsarrayYesSegment detail per direction[{...}]
flightDetailsobjectYesBooking-panel details (enabled){...}

Use itineraryId as the stable field for deduplication across runs.

Example dataset record

{
"itineraryId": "11983-2401060615--31462-1-15436-2401061545",
"price": 312.40,
"currency": "EUR",
"priceFormatted": "€312",
"tripType": "roundTrip",
"cabinClass": "economy",
"adults": 1,
"childAges": [],
"originCode": "BER",
"originCity": "Berlin",
"destinationCode": "ISB",
"destinationCity": "Islamabad",
"outboundDeparture": "2027-01-06T06:30:00",
"outboundArrival": "2027-01-06T15:45:00",
"outboundDurationMinutes": 615,
"outboundStops": 1,
"outboundCarriers": ["Turkish Airlines"],
"returnDeparture": "2027-02-14T10:00:00",
"returnArrival": "2027-02-14T21:00:00",
"returnDurationMinutes": 660,
"returnStops": 1,
"returnCarriers": ["Turkish Airlines"],
"cheapestAgent": "Kiwi.com",
"isSelfTransfer": false,
"isChangeAllowed": false,
"isCancellationAllowed": false
}

This record was produced by a Berlin to Islamabad round-trip search with flight details disabled.

Query and input reference

InputTypeRequiredDefaultAccepted valuesDescription
originstringYesBerlinCity, airport, or IATADeparture point.
destinationstringYesIslamabadCity, airport, or IATAArrival point.
departDatestringYes—YYYY-MM-DDOutbound date.
returnDatestringNo—YYYY-MM-DDReturn date (round trip).
searchesarrayNo[]Route objectsReplaces the single route when non-empty.
adultsintegerNo11–8Adult passengers.
childAgesarrayNo[]0–17Child ages.
cabinClassstringNoeconomyeconomy, premiumeconomy, business, firstCabin.
marketstringNoDESkyscanner market codeMarket.
localestringNoen-GBLanguage-regionLocale.
currencystringNoEUREUR, USD, GBP, etc.Price currency.
checkedBagbooleanNofalsetrue / falseRequire checked bag.
cabinBagbooleanNofalsetrue / falseRequire cabin bag.
includeDirectbooleanNotruetrue / falseInclude non-stop.
includeOneStopbooleanNotruetrue / falseInclude one-stop.
includeTwoPlusStopsbooleanNotruetrue / falseInclude two-plus stops.
maxDurationMinutesintegerNo00 = no limitDrop longer itineraries.
outboundDepartureFrom / outboundDepartureTostringNo—HH:MMOutbound takeoff window.
outboundArrivalFrom / outboundArrivalTostringNo—HH:MMOutbound landing window.
returnDepartureFrom / returnDepartureTostringNo—HH:MMReturn takeoff window.
returnArrivalFrom / returnArrivalTostringNo—HH:MMReturn landing window.
includeFlightDetailsbooleanNofalsetrue / falseLoad booking panel (billed as flight-details).
maxItemsintegerNo200 = no limitMaximum flights to save.
proxyConfigurationobjectNoApify residentialProxy editorProxy settings.

Minimal request:

{ "origin": "Berlin", "destination": "Islamabad", "departDate": "2027-01-06" }

Advanced request (round trip with filters and details):

{
"origin": "Berlin",
"destination": "Islamabad",
"departDate": "2027-01-06",
"returnDate": "2027-02-14",
"cabinClass": "economy",
"currency": "EUR",
"checkedBag": true,
"includeDirect": true,
"includeOneStop": true,
"includeFlightDetails": true,
"maxItems": 20,
"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}

Retrieve the data through the API

  1. Start the Actor with a JSON input.
  2. Wait for the run to finish, or use the synchronous endpoint for small jobs.
  3. Retrieve items from the run's default dataset.
  4. Paginate or export the dataset.

Python example:

from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("datascrapers/skyscanner-scraper").call(
run_input={
"origin": "Berlin",
"destination": "Islamabad",
"departDate": "2027-01-06",
"maxItems": 10,
}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["price"], item["currency"])

For other languages, use the generated API tab on the Actor page.

Data quality and record handling

  • Completeness — core fields (price, originCode, destinationCode, times) are returned when Skyscanner exposes them; flightDetails, agents, and legs are conditional on the corresponding option.
  • Source changes — Skyscanner page structure changes can cause individual fields to come back empty.
  • Deduplication — the Actor writes one row per itinerary per run and does not persist dedup state across runs. Deduplicate on itineraryId when merging runs over time.
  • Retry/error behavior — a route that returns nothing is reported without discarding flights already saved.
  • Normalization — price is numeric with a separate currency code; priceFormatted keeps Skyscanner's display string.

Export and pipeline examples

DestinationRecommended methodTypical use
PostgreSQL/SupabaseDataset API or webhook consumerFare history for monitoring
Google SheetsApify integrationFare comparison sheets
S3/cloud storageScheduled export or integrationArchive daily fare snapshots

Pricing and cost examples

Billing is pay per event. You are not charged Apify platform usage on top of these events.

EventWhen chargedPrice
flightEach flight saved to the dataset$1.50 per 1,000
flight-detailsEach flight with booking-panel details fetched (when enabled)$1.50 per 1,000
RecordsEstimated base cost
1,000 flights$1.50
10,000 flights$15.00

Estimates assume flights only. Enabling includeFlightDetails adds one flight-details event per flight, and Apify plan discounts may reduce the per-event price.

Limitations and responsible data use

  • The Actor reads publicly accessible Skyscanner fare data.
  • Fares change frequently; results reflect the moment of the run and are not guaranteed to match a later booking.
  • No guarantee of historical snapshots unless you store results yourself.
  • You are responsible for compliance with applicable terms, privacy, and legal requirements when using the data.

Dataset questions

What does one dataset item represent?

One flight itinerary (a set of outbound and, when applicable, return legs sold together at one price).

Which field should I use as a unique identifier?

itineraryId is the stable identifier for comparing the same itinerary across runs.

Are fields nullable or conditional?

return* fields are null for one-way searches. agents, legs, and flightDetails are present only when the matching option is enabled.

Can I retrieve the records as CSV or JSON?

Yes. Export from the Output tab as JSON, CSV, or Excel, or read the dataset through the Apify API.

How do I paginate large datasets?

Use maxItems to cap saved flights. For API retrieval, paginate the default dataset items endpoint.

Does the Actor return historical data?

No. Each run captures fares at run time; store runs yourself to build history.

What counts as a billable result?

Each saved flight is a flight event. When enabled, each flight with booking-panel details is an additional flight-details event.

Data Scrapers support

Need an additional field, record type, or export workflow? Contact Data Scrapers at stardustspotlight@gmail.com. Include a sample source URL, required fields, expected record volume, and preferred delivery format.