# Skyscanner Flight Scraper (`automly/skyscanner-flight-scraper`) Actor

Scrape Skyscanner flight prices for any route and date: airlines, flight numbers, stops, layovers, every booking site with price and link. One-way or round trip.

- **URL**: https://apify.com/automly/skyscanner-flight-scraper.md
- **Developed by:** [Automly](https://apify.com/automly) (community)
- **Categories:** Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 flights

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Skyscanner Flight Scraper ✈️

### What is Skyscanner Flight Scraper?

Skyscanner Flight Scraper is a tool that lets you scrape flight prices, airlines, flight numbers, departure and arrival times, stops, layovers and every booking site with its price and link from Skyscanner. Type where you fly from and to, pick your dates, press **Start**, and download the flights as JSON, CSV or Excel.

- ⚡ **Fast:** a one-way search finishes in about 5 seconds, a busy round trip in 10 to 30 seconds
- 🛫 **Every itinerary Skyscanner finds:** often 300 to 2,000 flights per route, not just the first page
- 💳 **Every seller:** each flight lists all the airlines and travel sites that sell it, cheapest first, with ratings and a booking link
- 🔓 **No login, no API key:** only public search results

### What can Skyscanner Flight Scraper do?

- **Search any route by airport code or city name.** `JFK`, `LHR`, `NYC`, `London` and `New York` all work. A city searches all of its airports.
- **One-way or round trip.** Leave the return date empty for one-way.
- **Many routes in one run.** Add as many searches as you need.
- **Dates that never go stale.** Enter a date, or a time from today such as `30 days`, so a saved task or schedule always searches ahead.
- **Travellers and cabin.** Adults, children, infants, and economy, premium economy, business or first class, for every route or route by route.
- **Sort like the website.** Best, Cheapest or Fastest, and keep only direct flights if you want.
- **Any Skyscanner country and currency.** Price in USD, EUR, GBP and more, from the US, UK, German or any other Skyscanner site.
- **Best, cheapest and fastest flags** on every row, so you can spot Skyscanner's top picks at a glance.

### What data can you extract from Skyscanner?

| ✈️ Flight | 🕒 Schedule | 💰 Price and booking |
|---|---|---|
| Airlines and flight numbers | Departure and arrival (local time) | Total price and price per person |
| Operating airline (codeshares) | Duration of each leg and in total | Price as shown on Skyscanner |
| Airports, cities and countries | Stops and layovers with their length | Cheapest seller and its link |
| Every segment of every leg | Overnight arrivals (day change) | Every seller with rating, reviews, price and link |
| Self-transfer itineraries | Airport changes during a layover | Change, cancellation and refund policy |

### How to scrape Skyscanner flights

1. Open **Skyscanner Flight Scraper** and go to the **Input** tab.
2. Type where you fly **From** and **To**: an airport code, a city code or a city name.
3. Pick a **Departure date**, and a **Return date** for a round trip.
4. Set travellers, cabin class, sort order and how many flights you want per route.
5. Press **Start**, then download the results from the **Output** tab as JSON, CSV, Excel or HTML.

### ⬇️ Input

| Field | What it does |
|---|---|
| **From** | Where you fly from: `JFK`, `NYC`, `New York` |
| **To** | Where you fly to: `LHR`, `LON`, `London` |
| **Departure date** | A date up to 13 months ahead, or a time from today such as `30 days` |
| **Return date** | Leave empty for one-way |
| **More routes** | Extra searches for the same run, each with its own dates, travellers and cabin if you like (see below) |
| **Adults / Children (2-11) / Infants (under 2)** | Who is travelling: up to 9 in all, at most one infant per adult |
| **Cabin class** | Economy, premium economy, business or first |
| **Sort by** | Best, Cheapest or Fastest, as on Skyscanner's tabs |
| **Direct flights only** | Keep only non-stop itineraries |
| **Max flights per route** | 1 to 5,000; the default is 100 |
| **Currency / Market / Language** | For example `USD` / `US` / `en-US`, or `GBP` / `UK` / `en-GB` |

A round trip from New York to London, a month from now:

```json
{
  "origin": "New York",
  "destination": "London",
  "departDate": "30 days",
  "returnDate": "37 days",
  "maxResults": 100
}
```

Several routes in one run. A route can set `origin`, `destination`, `departDate`, `returnDate`, `adults`, `children`, `infants` and `cabinClass`. A field left out of a route takes its value from the main fields, and `"returnDate": null` makes that route one-way. Sort, filters, max flights, currency, market and language apply to every route. A route with any other field fails with a message that lists the fields it can set:

```json
{
  "origin": "JFK",
  "destination": "London",
  "departDate": "2026-11-01",
  "returnDate": "2026-11-08",
  "routes": [
    { "origin": "LAX", "destination": "Tokyo", "returnDate": null },
    { "origin": "Chicago", "destination": "CDG", "departDate": "2026-12-10", "returnDate": "2026-12-17", "adults": 2, "cabinClass": "business" }
  ],
  "sortBy": "cheapest",
  "directOnly": true
}
```

### ⬆️ Output

One row per flight itinerary. A real one-way row from Los Angeles to Tokyo (shortened: a row lists every seller):

```json
{
  "route": "LAX-TYO",
  "origin": "LAX",
  "originName": "Los Angeles International",
  "destination": "TYO",
  "destinationName": "Tokyo",
  "departDate": "2026-11-12",
  "returnDate": null,
  "tripType": "one-way",
  "adults": 1,
  "cabinClass": "economy",
  "currency": "USD",
  "itineraryId": "13416-2611120930--30816-0-14788-2611131425",
  "price": 403.32,
  "pricePerPerson": 403.32,
  "priceFormatted": "$404",
  "isBest": true,
  "isCheapest": false,
  "isFastest": false,
  "totalDurationMinutes": 715,
  "maxStops": 0,
  "airlines": "Zipair",
  "outboundDeparture": "2026-11-12T09:30:00",
  "outboundArrival": "2026-11-13T14:25:00",
  "outboundStops": 0,
  "cheapestAgent": "Super.com",
  "bookingUrl": "https://www.skyscanner.com/transport_deeplink/4.0/US/en-US/USD/spus/1/13416.14788.2026-11-12/air/trava/flights?itinerary=...",
  "bookingOptionsCount": 14,
  "isSelfTransfer": false,
  "farePolicy": { "changeAllowed": false, "partlyChangeable": false, "cancellationAllowed": false, "partlyRefundable": false },
  "legs": [
    {
      "from": "LAX", "fromAirport": "Los Angeles International", "fromCity": "Los Angeles", "fromCountry": "United States",
      "to": "NRT", "toAirport": "Tokyo Narita", "toCity": "Tokyo", "toCountry": "Japan",
      "departure": "2026-11-12T09:30:00", "arrival": "2026-11-13T14:25:00",
      "durationMinutes": 715, "stops": 0, "dayChange": 1,
      "carriers": "Zipair", "operatedBy": "Zipair", "flightNumbers": "ZG23",
      "segments": [
        { "flightNumber": "ZG23", "airline": "Zipair", "airlineCode": "ZG", "operatedBy": "Zipair",
          "from": "LAX", "to": "NRT", "departure": "2026-11-12T09:30:00", "arrival": "2026-11-13T14:25:00", "durationMinutes": 715 }
      ],
      "layovers": []
    }
  ],
  "bookingOptions": [
    { "agentName": "Super.com", "agentId": "spus", "isAirline": false, "agentRating": 4.04, "agentReviewCount": 1781,
      "agentPrice": 403.32, "agentUrl": "https://www.skyscanner.com/transport_deeplink/4.0/US/en-US/USD/spus/1/..." },
    { "agentName": "Kissandfly", "agentId": "kfus", "isAirline": false, "agentRating": 3.49, "agentReviewCount": 711,
      "agentPrice": 410.0, "agentUrl": "https://www.skyscanner.com/transport_deeplink/4.0/US/en-US/USD/kfus/1/..." }
  ],
  "scrapedAt": "2026-09-27T11:13:42Z"
}
```

A round trip has two legs, and the `return...` fields are filled in. Each layover gives the airport, its length in minutes and whether you change airports. In the **Output** tab, switch between three tables: **Overview** (one line per flight), **Legs** (one line per leg) and **Booking options** (one line per seller).

`price` is the total for all travellers. `pricePerPerson` is that total divided by the number of travellers. Times are local to each airport, as on your ticket.

### Use cases

- **Fare tracking:** schedule a daily run on your routes and chart how prices move before departure.
- **Travel deals and alerts:** find the cheapest dates and sellers and send them to your audience.
- **Route and airline research:** see which airlines fly a route, how often, with how many stops and at what price.
- **Online travel agencies and price comparison:** compare what each seller charges for the same flight.
- **Corporate travel:** check fares for many city pairs at once before booking trips.
- **Data science:** build datasets of fares, durations and layovers across markets and currencies.

### Track prices over time

Save your input as a task, then use **Schedule** to run it every day. With dates like `30 days` and `37 days` the search always looks the same distance ahead. To follow one departure date instead, enter it as a fixed date. Each run adds a dated dataset you can compare, or send to Google Sheets, Slack or your own system with Apify integrations.

### Use it from your own code

Start a run and read the flights with the Apify API or client libraries:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("automly/skyscanner-flight-scraper").call(run_input={"origin": "JFK", "destination": "LHR", "departDate": "30 days"})
for flight in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(flight["price"], flight["airlines"], flight["outboundDeparture"], flight["bookingUrl"])
```

### ❓FAQ

**How much does it cost to scrape Skyscanner?**
See the **Pricing** tab. You pay per flight saved, so **Max flights per route** decides the cost of a run.

**How many flights can I get per route?**
As many as Skyscanner finds for that search, often a few hundred and up to about 2,000 on busy round trips between big cities. Set **Max flights per route** to keep only the top ones in your chosen order.

**Can I search a whole city or only one airport?**
Both. `LHR` searches Heathrow only; `LON` or `London` searches every London airport.

**Why is the price different from what I see on Skyscanner?**
Fares change by the minute and differ by country site and currency. Set **Market** and **Currency** to the ones you use on Skyscanner. Skyscanner also rounds prices up on screen (`$404` for 403.32).

**Does it include baggage allowance and fare brands?**
Not yet. The data covers flights, times, stops, sellers, prices and the change, cancellation and refund policy that Skyscanner shows in its results.

**Can I search multi-city trips or flexible dates?**
Each route is one-way or a round trip. For flexible dates, add one route per date under **More routes**; they all run in the same run.

**Do I need a Skyscanner account?**
No. The scraper reads only public search results, the same ones anyone sees without logging in.

**Is it legal to scrape Skyscanner?**
This scraper collects public flight data only, with no personal data. Check Skyscanner's terms and the rules that apply to your use. This tool is not affiliated with or endorsed by Skyscanner.

**Something does not work. Where can I get help?**
Open an issue in the **Issues** tab with your input and what you expected.

# Actor input Schema

## `origin` (type: `string`):

Enter where you fly from: an airport code (JFK), a city code (NYC, LON) or a city name (New York). A city searches all its airports.

## `destination` (type: `string`):

Enter where you fly to: an airport code (LHR), a city code (LON) or a city name (London).

## `departDate` (type: `string`):

Pick the departure date, up to 13 months ahead, or a time from today such as "30 days" so a saved task always searches ahead.

## `returnDate` (type: `string`):

Pick the return date for a round trip, or leave empty for one-way. A time from today such as "37 days" also works.

## `routes` (type: `array`):

Add more searches to the same run, e.g. \[{"origin": "LAX", "destination": "Tokyo", "departDate": "2026-12-01", "returnDate": null, "adults": 2, "cabinClass": "business"}]. A route can set origin, destination, departDate, returnDate, adults, children, infants and cabinClass. A field you leave out takes its value from the fields above, and returnDate null makes that route one-way. Sort, filters, max flights, currency, market and language apply to every route.

## `adults` (type: `integer`):

Set the number of adults (12 years and over). Skyscanner searches up to 9 travellers in all.

## `children` (type: `integer`):

Set the number of children aged 2 to 11.

## `infants` (type: `integer`):

Set the number of infants under 2 travelling on an adult's lap (at most one per adult).

## `cabinClass` (type: `string`):

Choose the cabin class.

## `sortBy` (type: `string`):

Choose which flights come first, as on Skyscanner's tabs.

## `directOnly` (type: `boolean`):

Enable to keep only itineraries where every leg is non-stop.

## `maxResults` (type: `integer`):

Set how many flights to save for each route, in the order chosen above.

## `currency` (type: `string`):

Enter the currency code for prices, e.g. USD, EUR, GBP.

## `market` (type: `string`):

Enter the Skyscanner country site to price from, as a 2-letter code: US, UK, DE, FR, IN... Prices and sellers can differ by market.

## `locale` (type: `string`):

Enter the language for airport and city names, e.g. en-US, en-GB, de-DE.

## `proxyConfiguration` (type: `object`):

Keep the default Apify Proxy (datacenter) setting; it is what this scraper is tuned for.

## Actor input object example

```json
{
  "origin": "New York",
  "destination": "London",
  "departDate": "30 days",
  "returnDate": "37 days",
  "adults": 1,
  "children": 0,
  "infants": 0,
  "cabinClass": "economy",
  "sortBy": "best",
  "directOnly": false,
  "maxResults": 100,
  "currency": "USD",
  "market": "US",
  "locale": "en-US",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `legs` (type: `string`):

No description

## `bookingOptions` (type: `string`):

No description

## `results` (type: `string`):

No description

## `report` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "origin": "New York",
    "destination": "London",
    "departDate": "30 days",
    "returnDate": "37 days",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("automly/skyscanner-flight-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "origin": "New York",
    "destination": "London",
    "departDate": "30 days",
    "returnDate": "37 days",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("automly/skyscanner-flight-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "origin": "New York",
  "destination": "London",
  "departDate": "30 days",
  "returnDate": "37 days",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call automly/skyscanner-flight-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automly/skyscanner-flight-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/ajbtqpDVC3IXgEhwK/builds/QWAMG8FfvUjtA92wj/openapi.json
