Skyscanner Flights Scraper
Pricing
from $1.20 / 1,000 flights
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
Maintained by CommunityActor 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
| Property | Value |
|---|---|
| Source | skyscanner.com |
| Record unit | One flight itinerary |
| Input methods | Origin + destination + dates, or multiple routes via searches |
| Main identifiers | itineraryId |
| Delivery | Apify Dataset and API |
| Export formats | JSON, CSV, Excel |
| Update model | Fresh records per Actor run |
| Pricing | Pay 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, anddepartDate; addreturnDatefor a round trip. - Multiple routes — pass a
searchesarray 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 separateflight-detailsevent. maxItemscaps 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
| Field | Type | Nullable | Description | Example |
|---|---|---|---|---|
itineraryId | string | No | Stable itinerary identifier | 11983-240106... |
price | number | No | Cheapest fare | 312.40 |
currency | string | No | Price currency | EUR |
priceFormatted | string | No | Display price label | €312 |
tripType | string | No | Trip type | roundTrip |
cabinClass | string | No | Cabin | economy |
adults | integer | No | Adult passenger count | 1 |
childAges | array | No | Child ages | [] |
originCode | string | No | Departure airport code | BER |
originName | string | Yes | Departure airport name | Berlin Brandenburg |
originCity | string | No | Departure city | Berlin |
destinationCode | string | No | Arrival airport code | ISB |
destinationName | string | Yes | Arrival airport name | Islamabad International |
destinationCity | string | No | Arrival city | Islamabad |
outboundDeparture | string | No | Outbound departure time | 2027-01-06T06:30:00 |
outboundArrival | string | No | Outbound arrival time | 2027-01-06T15:45:00 |
outboundDurationMinutes | integer | No | Outbound duration | 615 |
outboundStops | integer | No | Outbound stops | 1 |
outboundCarriers | array | No | Outbound airlines | ["Turkish Airlines"] |
returnDeparture | string | Yes | Return departure (round trip) | 2027-02-14T10:00:00 |
returnArrival | string | Yes | Return arrival | 2027-02-14T21:00:00 |
returnDurationMinutes | integer | Yes | Return duration | 660 |
returnStops | integer | Yes | Return stops | 1 |
returnCarriers | array | Yes | Return airlines | ["Turkish Airlines"] |
cheapestAgent | string | Yes | Cheapest booking agent | Kiwi.com |
bookingUrl | string | Yes | Booking link | https://www.skyscanner.net/... |
isSelfTransfer | boolean | No | Self-transfer flag | false |
isChangeAllowed | boolean | No | Changes allowed | false |
isCancellationAllowed | boolean | No | Cancellation allowed | false |
url | string | No | Results page URL | https://www.skyscanner.net/... |
searchUrl | string | No | Search URL | https://www.skyscanner.net/... |
score | number | No | Skyscanner itinerary score | 0.9 |
agents | array | Yes | Other agents with ratings | [{...}] |
legs | array | Yes | Segment detail per direction | [{...}] |
flightDetails | object | Yes | Booking-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
| Input | Type | Required | Default | Accepted values | Description |
|---|---|---|---|---|---|
origin | string | Yes | Berlin | City, airport, or IATA | Departure point. |
destination | string | Yes | Islamabad | City, airport, or IATA | Arrival point. |
departDate | string | Yes | — | YYYY-MM-DD | Outbound date. |
returnDate | string | No | — | YYYY-MM-DD | Return date (round trip). |
searches | array | No | [] | Route objects | Replaces the single route when non-empty. |
adults | integer | No | 1 | 1–8 | Adult passengers. |
childAges | array | No | [] | 0–17 | Child ages. |
cabinClass | string | No | economy | economy, premiumeconomy, business, first | Cabin. |
market | string | No | DE | Skyscanner market code | Market. |
locale | string | No | en-GB | Language-region | Locale. |
currency | string | No | EUR | EUR, USD, GBP, etc. | Price currency. |
checkedBag | boolean | No | false | true / false | Require checked bag. |
cabinBag | boolean | No | false | true / false | Require cabin bag. |
includeDirect | boolean | No | true | true / false | Include non-stop. |
includeOneStop | boolean | No | true | true / false | Include one-stop. |
includeTwoPlusStops | boolean | No | true | true / false | Include two-plus stops. |
maxDurationMinutes | integer | No | 0 | 0 = no limit | Drop longer itineraries. |
outboundDepartureFrom / outboundDepartureTo | string | No | — | HH:MM | Outbound takeoff window. |
outboundArrivalFrom / outboundArrivalTo | string | No | — | HH:MM | Outbound landing window. |
returnDepartureFrom / returnDepartureTo | string | No | — | HH:MM | Return takeoff window. |
returnArrivalFrom / returnArrivalTo | string | No | — | HH:MM | Return landing window. |
includeFlightDetails | boolean | No | false | true / false | Load booking panel (billed as flight-details). |
maxItems | integer | No | 20 | 0 = no limit | Maximum flights to save. |
proxyConfiguration | object | No | Apify residential | Proxy editor | Proxy 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
- Start the Actor with a JSON input.
- Wait for the run to finish, or use the synchronous endpoint for small jobs.
- Retrieve items from the run's default dataset.
- Paginate or export the dataset.
Python example:
from apify_client import ApifyClientclient = 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, andlegsare 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
itineraryIdwhen merging runs over time. - Retry/error behavior — a route that returns nothing is reported without discarding flights already saved.
- Normalization —
priceis numeric with a separatecurrencycode;priceFormattedkeeps Skyscanner's display string.
Export and pipeline examples
| Destination | Recommended method | Typical use |
|---|---|---|
| PostgreSQL/Supabase | Dataset API or webhook consumer | Fare history for monitoring |
| Google Sheets | Apify integration | Fare comparison sheets |
| S3/cloud storage | Scheduled export or integration | Archive daily fare snapshots |
Pricing and cost examples
Billing is pay per event. You are not charged Apify platform usage on top of these events.
| Event | When charged | Price |
|---|---|---|
flight | Each flight saved to the dataset | $1.50 per 1,000 |
flight-details | Each flight with booking-panel details fetched (when enabled) | $1.50 per 1,000 |
| Records | Estimated 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.
Related datasets from Data Scrapers
- Booking.com Scraper — Hotel listings that can be joined with flights for full trip planning.
- TripAdvisor Reviews Scraper — Destination and property reviews to complement travel research.
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.