# Skyscanner Flights: Many Routes, Return & Multi-City (`nextgensda/skyscanner-flights`) Actor

Search Skyscanner flights for many routes in one run: one-way, return and multi-city trips, airports or whole cities. Prices, legs, flight numbers, carriers and booking links for every itinerary.

- **URL**: https://apify.com/nextgensda/skyscanner-flights.md
- **Developed by:** [Tauqeer Abbas](https://apify.com/nextgensda) (community)
- **Stats:** 2 total users, 1 monthly users, 84.6% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $40.00 / 1,000 search results

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 Flights Scraper: Many Routes, Return & Multi-City

![Skyscanner Flights Scraper: many routes, return and multi-city trips, with pay-per-event pricing shown as a departures board](https://api.apify.com/v2/key-value-stores/EXuaVrwqf0BEvdzOC/records/banner.png?signature=c4UbubK3VqYJJdD7nMSn)

Get every flight itinerary Skyscanner shows for **as many routes as you like in
one run**: one-way, return and **multi-city** trips, between airports or whole
cities. Each itinerary comes with its price, every leg and flight, carriers,
stops, durations and the booking options with their links.

### Why this scraper

- **Many routes per run.** List routes, or give origins and destinations and
  every pair is searched. One browser session serves all of them, so runs stay
  fast and cheap.
- **Return and multi-city trips**, up to 6 legs, not just one-way.
- **Complete results.** Each search runs until Skyscanner has finished it;
  `searchComplete` tells you that every itinerary it reported is in the
  dataset.
- **Cities or airports.** `LON` searches all London airports, `LHR` only
  Heathrow; names like `Barcelona` work too.
- **Booking options per itinerary**: every agent and airline offering it, with
  price and booking link, cheapest first.
- **Pay only for results.** A search that finds nothing costs nothing.

### Input

| Field | What it does |
|---|---|
| **Routes** | One search per entry (see the examples below). |
| **Origins / Destinations** | Every origin × destination on the same dates (shortcut for many routes). |
| **Departure / Return date** | Dates for the origins × destinations searches. A return date makes them return trips. |
| **Adults, Children's ages, Cabin class** | Apply to every search. |
| **Currency** | Optional ISO code (`EUR`, `GBP`, ...); default USD. |
| **Max itineraries per search / in total** | The cheapest itineraries first; caps your cost. |
| **Proxy** | Keep the default (Apify residential, US). |

Places are airport codes (`JFK`), city codes (`NYC`, `LON`) or names
(`Barcelona`). Dates are `YYYY-MM-DD`.

#### Example: three kinds of trip

```json
{
  "routes": [
    {"origin": "JFK", "destination": "LHR", "departDate": "2026-11-10"},
    {"origin": "NYC", "destination": "LON", "departDate": "2026-11-10", "returnDate": "2026-11-17"},
    {"legs": [
      {"origin": "NYC", "destination": "LON", "date": "2026-11-10"},
      {"origin": "LON", "destination": "PAR", "date": "2026-11-14"},
      {"origin": "PAR", "destination": "NYC", "date": "2026-11-20"}
    ]}
  ],
  "maxItemsPerSearch": 50
}
```

#### Example: compare many routes

```json
{
  "origins": ["NYC", "BOS", "CHI"],
  "destinations": ["LON", "PAR", "ROM"],
  "departDate": "2026-12-18",
  "returnDate": "2027-01-04",
  "maxItemsPerSearch": 20
}
```

That is 9 return searches with the 20 cheapest itineraries each.

### Output

One dataset item per itinerary, cheapest first within each search:

```json
{
  "trip": "KHI-DXB 2026-11-10",
  "tripType": "one-way",
  "price": 193.0,
  "priceFormatted": "$193",
  "currency": "USD",
  "legs": [
    {
      "origin": {"code": "KHI", "name": "Karachi", "city": "Karachi", "country": "Pakistan"},
      "destination": {"code": "DXB", "name": "Dubai", "city": "Dubai", "country": "United Arab Emirates"},
      "departure": "2026-11-10T16:25:00",
      "arrival": "2026-11-10T17:50:00",
      "durationMinutes": 145,
      "stops": 0,
      "carriers": ["flydubai"],
      "segments": [
        {
          "flightNumber": "FZ336",
          "origin": "KHI",
          "destination": "DXB",
          "departure": "2026-11-10T16:25:00",
          "arrival": "2026-11-10T17:50:00",
          "durationMinutes": 145,
          "marketingCarrier": {"code": "FZ", "name": "flydubai"},
          "operatingCarrier": {"code": "FZ", "name": "flydubai"}
        }
      ]
    }
  ],
  "tags": ["cheapest"],
  "isSelfTransfer": false,
  "bookingOptions": [
    {"agent": "Booking.com", "price": 193.0, "url": "https://www.skyscanner.com/transport_deeplink/..."},
    {"agent": "flydubai", "price": 193.88, "url": "https://www.skyscanner.com/transport_deeplink/..."}
  ],
  "searchUrl": "https://www.skyscanner.com/transport/flights/khi/dxb/261110/?adultsv2=1&cabinclass=economy&childrenv2=&rtn=0",
  "searchComplete": true,
  "searchIndex": 0,
  "id": "13030-2611101625--32301-0-11182-2611101750"
}
```

Return trips have two legs, multi-city trips one per leg. `searchIndex` is the
position of the search in your input. Turn on **Include raw itinerary** for
Skyscanner's full itinerary object.

### Pricing

Pay per event, platform usage included:

| Event | Price |
|---|---|
| Run start | $0.05 (at the default 2 GB memory) |
| Flight search that returned itineraries | $0.04 per search |
| Itinerary | $1.50 per 1,000 |

Examples:

| Run | Cost |
|---|---|
| 1 route, 100 itineraries | $0.24 |
| 10 routes, the 10 cheapest each | $0.60 |
| 10 routes, 100 each (1,000 itineraries) | $1.95 |

A search with no results is not charged, and the run stops at your spending
limit without charging for anything it didn't deliver. Use **Max itineraries
per search** to pay only for the cheapest options you need.

### Tips

- **Keep the default proxy** (Apify residential, US). Skyscanner is protected
  by PerimeterX and serves its US site to US visitors.
- **Busy routes return thousands of itineraries.** If you only compare prices,
  set **Max itineraries per search** to 10–20.
- **Later runs start faster.** The first run opens Skyscanner in a browser;
  the session is kept in your own key-value store, so runs in the next hours
  go straight to searching.

### FAQ

**Which Skyscanner site is searched?** skyscanner.com (US market). Prices are in
USD unless you set a currency.

**How fresh are the prices?** They are what Skyscanner shows at the time of the
run. Booking sites can change prices before you book.

**Can I run it on a schedule or through the API?** Yes, like any Apify Actor:
schedules, the Apify API, webhooks, and integrations (Make, Zapier, Google
Sheets, and others).

**Is it legal?** The Actor collects publicly shown flight prices and doesn't log
in or access personal data. You are responsible for using the data in line with
Skyscanner's terms and the laws that apply to you.

# Actor input Schema

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

One search per entry. <b>One-way</b>: <code>{"origin": "JFK", "destination": "LHR", "departDate": "2026-11-10"}</code>. <b>Return</b>: add <code>"returnDate"</code>. <b>Multi-city</b>: <code>{"legs": \[{"origin": "NYC", "destination": "LON", "date": "2026-11-10"}, {"origin": "LON", "destination": "PAR", "date": "2026-11-14"}]}</code> (up to 6 legs). Places are airport codes (<code>JFK</code>), city codes (<code>NYC</code>, <code>LON</code>: all the city's airports) or names (<code>Barcelona</code>).

## `origins` (type: `array`):

Shortcut for many routes on the same dates: every origin is searched to every destination. Needs destinations and a departure date.

## `destinations` (type: `array`):

Destinations for the origins above.

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

Departure date for the origins × destinations searches.

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

Optional: makes the origins × destinations searches return trips.

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

Adult passengers for every search.

## `childAges` (type: `array`):

One age (0 to 17) per child, e.g. <code>\[4, 9]</code>.

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

Cabin class for every search.

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

The Skyscanner site searched. <code>com</code>: www.skyscanner.com (US market, USD).

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

Optional ISO currency code for prices (e.g. <code>EUR</code>); defaults to the site's own.

## `maxItemsPerSearch` (type: `integer`):

Cheapest first. A busy route can have thousands of itineraries.

## `maxItems` (type: `integer`):

The run stops after this many itineraries.

## `includeRaw` (type: `boolean`):

Add Skyscanner's full itinerary object to every item (larger items).

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

Residential proxies are strongly recommended: Skyscanner is protected by PerimeterX. Keep the country on the site's market (US for skyscanner.com): Skyscanner geolocates visitors.

## `debug` (type: `boolean`):

Save a screenshot and the HTML of the page each browser session was opened on to the run's key-value store.

## Actor input object example

```json
{
  "routes": [
    {
      "origin": "NYC",
      "destination": "LON",
      "departDate": "2026-11-10",
      "returnDate": "2026-11-17"
    },
    {
      "origin": "LAX",
      "destination": "TYO",
      "departDate": "2026-12-01"
    }
  ],
  "adults": 1,
  "childAges": [],
  "cabinClass": "economy",
  "market": "com",
  "maxItemsPerSearch": 100,
  "maxItems": 1000,
  "includeRaw": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  },
  "debug": false
}
```

# Actor output Schema

## `itineraries` (type: `string`):

One row per itinerary: trip, price, legs with flights and carriers, tags and booking options.

## `allFields` (type: `string`):

Every field of every item.

# 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 = {
    "routes": [
        {
            "origin": "NYC",
            "destination": "LON",
            "departDate": "2026-11-10",
            "returnDate": "2026-11-17"
        },
        {
            "origin": "LAX",
            "destination": "TYO",
            "departDate": "2026-12-01"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("nextgensda/skyscanner-flights").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 = {
    "routes": [
        {
            "origin": "NYC",
            "destination": "LON",
            "departDate": "2026-11-10",
            "returnDate": "2026-11-17",
        },
        {
            "origin": "LAX",
            "destination": "TYO",
            "departDate": "2026-12-01",
        },
    ],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("nextgensda/skyscanner-flights").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 '{
  "routes": [
    {
      "origin": "NYC",
      "destination": "LON",
      "departDate": "2026-11-10",
      "returnDate": "2026-11-17"
    },
    {
      "origin": "LAX",
      "destination": "TYO",
      "departDate": "2026-12-01"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call nextgensda/skyscanner-flights --silent --output-dataset

```

## MCP server setup

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

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/6UlPxxsKTbMAadhVz/builds/5hN3ed41NPyiwqkOa/openapi.json
