# Skyscanner Flight Scraper API 💰$1/1k — Fares & Multi-City (`memo23/skyscanner-scraper`) Actor

💰$1 per 1000 results, unlimited extraction. Skyscanner Flight Scraper API — itineraries, fares, schedules & routes by flights URL or search filters. One-way, round-trip & multi-city. 180+ fields per itinerary: legs, segments, carriers, stops, layovers, Best/Cheapest/Fastest tags. Pure HTTP.

- **URL**: https://apify.com/memo23/skyscanner-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Travel, Agents, Lead generation
- **Stats:** 316 total users, 81 monthly users, 84.5% runs succeeded, 1 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.00 / 1,000 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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Skyscanner Flight Scraper API — Itineraries, Fares & Multi-City

<p align="center">
  <img src="https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/skyscanner-card.png" alt="Skyscanner Flight Scraper" width="760">
</p>

**Scrape flight itineraries, fares, schedules and routes from Skyscanner — by URL or search filters — at $1 per 1,000 results.** Paste any `/transport/flights/…` link, or just give an origin, destination and dates. One-way, round-trip and multi-city all supported. Pure HTTP — no browser, no CAPTCHA solver, no third-party bypass service. Output is CSV-ready flat rows or nested itinerary JSON, straight into your Apify dataset.

### Why Use This Scraper?

- **$1 / 1,000 results** — the cheapest dedicated Skyscanner flight feed on the Apify Store, with no monthly rental.
- **Two ways to search** — paste a Skyscanner flights URL *or* fill route filters. No need to construct API payloads yourself.
- **Full trip coverage** — one-way, round-trip, and true multi-city / open-jaw (legs 2 and 3).
- **Deep itinerary data** — 180+ columns per itinerary: per-leg origin/destination, segments, carriers + logos, stops, layovers, duration, departure/arrival timestamps, and price (raw + formatted).
- **Best / Cheapest / Fastest** — itineraries carry Skyscanner's own tags and score so you can rank instantly.
- **Global** — 200+ markets, 150+ currencies, and BCP-47 locales. Scrape `skyscanner.net`, `skyscanner.com.tw`, or any regional host.
- **Spreadsheet or JSON** — flatten to dashed columns (`price-raw`, `legs-0-origin-city`…) for Excel/Sheets, or keep nested objects for pipelines.

### Overview

This Actor calls Skyscanner's unified-search (mobile) API to harvest structured flight itineraries for a route, date range and passenger mix. It resolves place identifiers via autosuggest, builds and posts the unified-search payload, polls the session until results are complete, merges the poll snapshots, and deduplicates itineraries by identity.

Output is **one row per itinerary** (not per flight or per segment). Each itinerary nests its legs, and each leg nests its segments and carriers. With `flattenOutput` on (default), all of that is dashed into spreadsheet columns; with it off you get nested JSON objects. There's also an aggregated mode that returns a single search object with `Best / Cheapest / Fastest / Direct` buckets plus carrier/airport lookup maps and summary stats.

### Supported Inputs

| Input | What it does |
|---|---|
| **Skyscanner flights URL** | Paste a full `…/transport/flights/{origin}/{destination}/{YYMMDD}/{YYMMDD?}/` link. Route and dates are read from the URL. |
| **Search filters** | Give `departureAirport`, `arrivalAirport`, `departureDate` (+ optional `returnDate`). City names or IATA codes both work. |
| **Multi-city** | Set `multiCityLeg2Destination` + `multiCityLeg2Date` (and optionally leg 3) for open-jaw itineraries. |

Example URL: `https://www.skyscanner.net/transport/flights/fra/icn/270315/270406/`

**Not supported:** hotel or car-hire search (this Actor is flights-only), seat maps, live booking/checkout, and fare-rule PDFs.

### Use Cases

| Audience | What they do with it |
|---|---|
| **Travel aggregators / OTAs** | Power a price-comparison page or fare table with multi-date, multi-route Skyscanner data. |
| **Fare-alert products** | Track a route + date daily and notify users when the cheapest itinerary drops below a threshold. |
| **Revenue / pricing teams** | Snapshot competitor fares and price bands across many city pairs over time. |
| **Data & ML pipelines** | Ingest structured fare data daily to model and predict price movement. |
| **Travel agencies & consultants** | Export structured itinerary sets for clients on demand or on a schedule. |
| **Researchers** | Build open itinerary datasets for connectivity, pricing or route analysis. |

### How It Works

![How the Skyscanner Flight Scraper works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-skyscanner.png)

1. **Your input** — a Skyscanner flights URL, or route filters (origin, destination, dates, passengers, cabin, multi-city legs, market/currency/locale).
2. **Unified search** — the Actor resolves places via autosuggest, POSTs the unified-search payload, polls the session to completion, merges snapshots, dedupes by itinerary ID, then applies your sort and stop/result filters.
3. **Your dataset** — flat rows or nested JSON with price, legs, segments, carriers, times, durations, layovers and Best/Cheapest/Fastest tags — CSV-ready or JSON.

### Input Configuration

| Field | Type | Required | Notes |
|---|---|---|---|
| `startUrls` | array | ✅ | Skyscanner flights URLs (URL mode) or the homepage (filter mode). |
| `departureAirport` | string | — | City or IATA code. Ignored when a full flights URL is given. |
| `arrivalAirport` | string | — | City or IATA code. Ignored when a full flights URL is given. |
| `departureDate` | string | — | `YYYY-MM-DD` or `YYMMDD`. Required for filter mode. A date in the past is auto-advanced to the next year (see FAQ). |
| `returnDate` | string | — | Omit for one-way. Shifted by the same amount as `departureDate` when a past date is auto-advanced, so the trip length is preserved. |
| `cabinClass` | enum | — | `economy` · `premium_economy` · `business` · `first`. |
| `adults` | integer | — | 12+ years. Minimum 1. |
| `children` | integer | — | Default 0. |
| `infants` | integer | — | On-lap infants. Default 0. |
| `skyscannerMarket` | enum | — | Region code (e.g. `US`, `GB`, `DE`). 200+ supported. |
| `skyscannerCurrency` | enum | — | ISO 4217 (e.g. `USD`, `EUR`, `GBP`). 150+ supported. |
| `skyscannerLocale` | string | — | BCP-47 tag (e.g. `en-US`, `de-DE`). |
| `resultSort` | enum | — | `default` · `score` · `cheapest` · `fastest` · `departure`. |
| `resultLimit` | integer | — | Keep at most N itineraries after filters/sort. |
| `filterNonStop` / `filterOneStop` / `filterTwoPlusStops` | boolean | — | Stop filters combine with OR. |
| `multiCityLeg2Destination` / `multiCityLeg2Date` | string | — | Open-jaw leg 2. |
| `multiCityLeg3Destination` / `multiCityLeg3Date` | string | — | Open-jaw leg 3. |
| `flattenOutput` | boolean | — | `true` = dashed spreadsheet columns; `false` = nested JSON. Default `true`. |
| `maxItems` | integer | — | Crawler item cap. Default 10000. |
| `proxy` | object | — | Defaults to Apify Residential. |

#### Example input

```json
{
  "startUrls": [
    { "url": "https://www.skyscanner.net/transport/flights/fra/icn/270315/270406/" }
  ],
  "cabinClass": "economy",
  "adults": 1,
  "skyscannerMarket": "US",
  "skyscannerCurrency": "EUR",
  "resultSort": "cheapest",
  "flattenOutput": true,
  "maxItems": 100,
  "proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

Filter mode (no URL):

```json
{
  "startUrls": [ { "url": "https://www.skyscanner.net/" } ],
  "departureAirport": "Atlanta",
  "arrivalAirport": "Istanbul",
  "departureDate": "2027-03-15",
  "returnDate": "2027-03-22",
  "adults": 2,
  "cabinClass": "economy"
}
```

### Output Overview

One row per **itinerary**. Each itinerary contains one or more **legs** (outbound, return, plus extra legs for multi-city); each leg contains **segments** and **carriers**. In flattened mode these nest into dashed column names like `legs-0-origin-city` and `legs-0-carriers-marketing-0-name`. A full round-trip itinerary is ~180 columns.

### Output Samples

Flattened row (abbreviated — real rows carry ~182 columns):

```jsonc
{
  "id": "11616-2608161850--31731-0-12409-2608171400|17075-2610062250-...",
  "price-raw": 1326.04,
  "price-formatted": "1.327 €",
  "price-pricingOptionId": "_F6klu03slCM",
  "legs-0-origin-displayCode": "FRA",
  "legs-0-origin-city": "Frankfurt am Main",
  "legs-0-destination-displayCode": "ICN",
  "legs-0-destination-city": "Seoul",
  "legs-0-durationInMinutes": 730,
  "legs-0-stopCount": 0,
  "legs-0-departure": "2026-08-16T18:50:00",
  "legs-0-arrival": "2026-08-17T14:00:00",
  "legs-0-carriers-marketing-0-name": "T'way Air",
  "legs-0-carriers-marketing-0-logoUrl": "https://logos.skyscnr.com/images/airlines/favicon/9R.png",
  "tags-0": "second_shortest",
  "score": 0.998
  // …legs-1-* for the return leg, segment-level detail, etc.
}
```

Nested mode (`flattenOutput: false`) returns the same data as objects: `price: { raw, formatted, pricingOptionId }`, `legs: [ { origin, destination, carriers, segments, … } ]`.

### Key Output Fields

**Price**

- `price-raw` — numeric fare in the requested currency
- `price-formatted` — localized display string
- `price-pricingOptionId` — Skyscanner pricing-option token

**Itinerary**

- `id` — stable itinerary identifier (used for dedup)
- `score` — Skyscanner's ranking score (higher = better)
- `tags-0`, `tags-1` — `cheapest`, `fastest`, `shortest`, etc.

**Legs** (`legs-{n}-…`)

- `origin-displayCode` / `origin-city` / `destination-displayCode` / `destination-city`
- `departure` / `arrival` — ISO timestamps
- `durationInMinutes`, `stopCount`, `timeDeltaInDays`

**Carriers** (`legs-{n}-carriers-marketing-{m}-…`)

- `name`, `alternateId`, `logoUrl`

**Segments** (`legs-{n}-segments-{m}-…`)

- per-segment origin/destination, flight number, operating carrier

### FAQ

**Is this an official Skyscanner API?**
No. It's an independent scraper that reads publicly available Skyscanner flight search results. It is not affiliated with or endorsed by Skyscanner.

**URL mode or filter mode — which should I use?**
Use a `/transport/flights/…` URL when you already have one (route + dates come from it). Use filters when you're generating searches programmatically across many routes/dates.

**What happens if my departure date is in the past?**
Skyscanner only returns fares for today or later, so a past date is automatically advanced by whole years to the next valid date (e.g. `2026-06-15` → `2027-06-15`). The return date and any multi-city legs shift by the same amount, so the trip length is preserved. The run adds one `Date auto-adjusted` notice row at the top of the dataset (with `originalDepartureDate`, `adjustedDepartureDate`, and `yearsAdded`) and continues with real results. Pass a future date to control the exact day.

**Does it do multi-city?**
Yes — set leg-2 (and optionally leg-3) destination + date. When set, `returnDate` is ignored.

**Can I get prices in a specific currency / market?**
Yes — `skyscannerCurrency` (ISO 4217), `skyscannerMarket` (region), and `skyscannerLocale` (BCP-47). If unset they're derived from the URL host/params, falling back to USD / US / en-US.

**Flat rows or JSON?**
`flattenOutput: true` (default) gives dashed spreadsheet columns ideal for CSV/Excel. Set it `false` for nested JSON in data pipelines.

**Why do some itineraries have multiple legs and segments?**
A round-trip has 2 legs; multi-city has 3+. A leg with a connection has multiple segments. The scraper preserves the full structure.

**Do I need my own proxy?**
No — it defaults to Apify Residential. You can supply your own proxy config if you prefer.

**How many results can I get?**
Skyscanner returns a finite result set per search; `maxItems` and `resultLimit` cap how many you keep. Run many searches (route × date) to build a larger dataset.

**How am I billed?**
Pay-per-event. The main cost is $1 per 1,000 results, plus $0.007 per run start and a small per-search fee that scales with trip type — $0.002 one-way, $0.004 round-trip, $0.010 multi-city. The per-search fee still applies when a search returns 0 flights (you're not charged per result in that case).

### Support

Found a bug or need a field that isn't exposed? Open an issue on the Actor's **Issues** tab on Apify, or contact the developer through the Apify Store profile. Include your input JSON and the run ID so it can be reproduced quickly.

### Additional Services

Need a custom flight or travel data pipeline — a different source, a specific schema, scheduled delivery to S3/BigQuery, or fare monitoring with alerts? Custom scraping and data-engineering work is available; reach out via the Apify Store profile.

### Explore More Scrapers

**✈️ More flight scrapers:**

- [Google Flights Scraper](https://apify.com/memo23/google-flights-scraper) — fares, itineraries, booking options & multi-city
- [Ryanair Scraper](https://apify.com/memo23/ryanair-scraper) — budget fares & the cheapest routes the majors miss
- [Award Flights Scraper](https://apify.com/memo23/award-flights-scraper) — miles & points award availability (Flightpoints + Roame)

Also: [Expedia & Hotels.com Scraper](https://apify.com/memo23/expedia-scraper) · [140+ other scrapers](https://apify.com/memo23)

### 🤖 For AI Agents & LLM Apps

Compact reference for AI agents calling this actor via the [Apify MCP server](https://mcp.apify.com) or the Apify API (actor: `memo23/skyscanner-scraper`).

**Purpose:** Scrapes Skyscanner flight itineraries and fares (by flights URL or route filters) into one row per itinerary — per-leg/segment/carrier detail plus Best/Cheapest/Fastest tags — covering one-way, round-trip, and multi-city.

**Minimal input:**

```json
{
  "startUrls": [{ "url": "https://www.skyscanner.net/transport/flights/fra/icn/270315/270406/" }],
  "maxItems": 50
}
```

Filter mode instead: `{ "startUrls": [{ "url": "https://www.skyscanner.net/" }], "departureAirport": "Atlanta", "arrivalAirport": "Istanbul", "departureDate": "2027-03-15", "maxItems": 50 }` — `startUrls` is required in both modes (a flights URL, or the homepage when using route filters).

**Output:** one row per itinerary — id, score, tags, price {raw, formatted, pricingOptionId}, legs {origin/destination displayCode + city, departure, arrival, durationInMinutes, stopCount, timeDeltaInDays}, carriers {name, alternateId, logoUrl}, segments {origin, destination, flight number, operating carrier}. With `flattenOutput` on (default) these become dashed columns like `price-raw` and `legs-0-origin-city`.

**Behaviors an agent should know:**

- `startUrls` is required — a full flights URL supplies route + dates and overrides the filter fields; filter mode still needs the homepage URL there plus `departureAirport`/`arrivalAirport`/`departureDate`.
- Cap results with `maxItems` (default 10000) and/or `resultLimit` (itineraries kept after sort/filters).
- Multi-city: set `multiCityLeg2Destination` + `multiCityLeg2Date` (and optionally leg 3); `returnDate` is then ignored.
- A past `departureDate` is auto-advanced by whole years and adds one `Date auto-adjusted` notice row at the top of the dataset.
- `flattenOutput` defaults true (dashed spreadsheet columns); set false for nested JSON.
- Billing (pay-per-event): $1 per 1,000 results + $0.007 per run start + a per-search fee ($0.002 one-way, $0.004 round-trip, $0.010 multi-city).

### ⚠️ Disclaimer

This Actor accesses publicly available flight search data on Skyscanner for legitimate research, market-intelligence and business-analysis purposes. It is **not affiliated with, endorsed by, or sponsored by Skyscanner Ltd.** "Skyscanner" is a trademark of its respective owner; it is used here only to describe the data source. Use of this Actor must comply with Skyscanner's Terms of Service and all applicable laws, including data-protection regulations (GDPR, CCPA, etc.). The Actor's authors are not responsible for any misuse. Users must:

- Respect rate limits and avoid overloading Skyscanner's infrastructure
- Not use scraped data to violate user privacy or terms
- Use the data in compliance with applicable jurisdictions
- Not republish scraped content in violation of copyright

We do not store any scraped data; the Actor returns it directly to your Apify dataset for your authorized use.

### SEO Keywords

skyscanner scraper, skyscanner flight scraper, skyscanner api, skyscanner api alternative, flight price scraper, airfare scraper, flight data extraction, flight itinerary scraper, multi-city flight scraper, round-trip flight scraper, cheapest flight finder, flight price monitoring, fare alert data, travel data api, airline schedule scraper, flight comparison data, skyscanner json export, skyscanner csv export, flight deals scraper, apify flight scraper, travel aggregator data, flight price tracker, airfare monitoring api, flight route scraper

# Actor input Schema

## `startUrls` (type: `array`):

Add one or more URLs. <strong>URL mode:</strong> paste a full <strong>transport / flights</strong> URL from the browser (see prefill example). <strong>Filter mode:</strong> use the site homepage (e.g. <code>https://www.skyscanner.net/</code>) and fill <strong>Scrape with search filters</strong> below.<br><br><strong>Priority per URL:</strong> When this URL matches <code>…/transport/flights/{origin}/{destination}/{YYMMDD}/{YYMMDD?}/</code>, route and dates come from the URL for that request (filter fields are not used for that request). Otherwise route and dates come from the filters section.

## `departureAirport` (type: `string`):

City or IATA-style code (e.g. <code>Atlanta</code> or <code>LAX</code>). <strong>Ignored</strong> if you provided a full <code>/transport/flights/…</code> URL above. Required (with arrival + departure date) for filter mode.

## `arrivalAirport` (type: `string`):

City or airport code. <strong>Ignored</strong> when a full flights URL is used. Required (with departure airport + date) for filter mode.

## `departureDate` (type: `string`):

<code>YYYY-MM-DD</code> or <code>YYMMDD</code> (e.g. <code>261101</code> = 1 Nov 2026). <strong>Ignored</strong> when a full flights URL is used. Required for filter mode.

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

Optional for one-way. Same date formats as departure. <strong>Ignored</strong> when a full flights URL is used (return segment comes from the URL if present).

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

Sent as <code>cabinClass</code> on the unified-search JSON body. Applies to <strong>every</strong> run (URL and filter mode).

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

Number of adults (12+). Minimum 1. Used for <strong>every</strong> run (URL or filter mode); query params on the Skyscanner URL are not used for passenger counts.

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

Number of children. The API uses a placeholder child age until real ages are supported.

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

Infants without their own seat (under ~2 years). Uses a placeholder age in the API.

## `skyscannerMarket` (type: `string`):

Skyscanner <code>x-skyscanner-market</code> and flight autosuggest path. Same idea as country/market on the site. List imported from <code>cat-guy-inputjson</code>; <strong>GB</strong> is used for United Kingdom (ISO 3166-1 alpha-2). If left unset, derived from the start URL's host (e.g. <code>skyscanner.com.tw</code> → <code>TW</code>) and the URL's <code>market=</code> query param, falling back to <code>US</code>.

## `skyscannerCurrency` (type: `string`):

ISO 4217 codes for <code>x-skyscanner-currency</code>. List imported from <code>cat-guy-inputjson</code>. Case normalized at run time for raw JSON input. If left unset, derived from the start URL's <code>currency=</code> query param or the host TLD (e.g. <code>skyscanner.com.tw</code> → <code>TWD</code>), falling back to <code>USD</code>.

## `skyscannerLocale` (type: `string`):

BCP-47 tag (e.g. <code>en-US</code>, <code>bs-BA</code>, <code>zh-Hans-CN</code>): language subtag, then optional region/script segments. Max length 35. Normalized at run time (e.g. <code>en-us</code> → <code>en-US</code>). If left unset, derived from the start URL's <code>locale=</code> query param or the host TLD (e.g. <code>skyscanner.com.tw</code> → <code>zh-TW</code>), falling back to <code>en-US</code>.

## `resultSort` (type: `string`):

Applied <strong>after</strong> the API returns (unified-search POST does not take sort). <code>default</code> keeps merge/dedupe order. <code>score</code> uses Skyscanner itinerary score (higher first).

## `resultLimit` (type: `integer`):

After stop filters and sort, keep at most this many itineraries (omit for no cap; 0 = empty export). Does not change how many results Skyscanner returns.

## `filterNonStop` (type: `boolean`):

Keep itineraries where total stops across all legs = 0. Multiple stop checkboxes combine with <strong>OR</strong>.

## `filterOneStop` (type: `boolean`):

Keep itineraries with total stops = 1.

## `filterTwoPlusStops` (type: `boolean`):

Keep itineraries with total stops ≥ 2.

## `multiCityLeg2Destination` (type: `string`):

Open jaw / multi-city: after leg 1 (origin → destination from filters), fly to this place. Requires <strong>leg 2 date</strong>. <strong>Ignored</strong> if the start URL is a transport/flights link. When set, <code>returnDate</code> is ignored.

## `multiCityLeg2Date` (type: `string`):

Date for leg 2 (<code>YYYY-MM-DD</code> or <code>YYMMDD</code>).

## `multiCityLeg3Destination` (type: `string`):

Third segment from leg 2 city to this airport. Requires leg 2 and <strong>leg 3 date</strong>.

## `multiCityLeg3Date` (type: `string`):

Date for leg 3.

## `includeNearbyAirports` (type: `boolean`):

Logs a note only — the mobile unified-search body used here does not send alternate-airport flags. Results may still mention nearby airports in metadata.

## `extraHttpHeaders` (type: `object`):

String keys and string values merged into unified-search POST and poll GET. Overrides duplicate header names. Use sparingly; wrong values can break requests.

## `useDynamicPxToken` (type: `boolean`):

Off by default. The actor uses the fast built-in token as the primary path and automatically switches to a freshly-minted PerimeterX token only if a request gets blocked. Turn this ON to mint and use the dynamic token from the very first request. Note: as of mid-2026 Skyscanner blocks the dynamic path's endpoint, so forcing it on returns no results — leave it OFF.

## `flattenOutput` (type: `boolean`):

Yes = one row per flight with dashed column names (<code>price-raw</code>, …). No = nested JSON per row.

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

Crawler item limit. Non-paying Apify users may see additional caps at runtime—check the log if output looks truncated.

## `maxConcurrency` (type: `integer`):

Maximum number of pages that can be processed at the same time.

## `minConcurrency` (type: `integer`):

Minimum number of pages that will be processed at the same time.

## `maxRequestRetries` (type: `integer`):

How many times a failed request is retried before the run gives up on it. Raise it only for stubborn searches — every retry spends run time, and a high value is what turns a bad proxy hour into a timed-out run.

## `proxy` (type: `object`):

Leave empty — the actor already routes all traffic through its own built-in residential proxy at no extra cost to you. Only set this if you want to use your own proxies.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.skyscanner.net/transport/flights/atl/ist/270315/270322/"
    }
  ],
  "departureAirport": "Atlanta",
  "arrivalAirport": "Istanbul",
  "departureDate": "2027-03-15",
  "returnDate": "2027-03-22",
  "cabinClass": "economy",
  "adults": 1,
  "children": 0,
  "infants": 0,
  "skyscannerMarket": "US",
  "skyscannerCurrency": "USD",
  "skyscannerLocale": "en-US",
  "resultSort": "default",
  "filterNonStop": false,
  "filterOneStop": false,
  "filterTwoPlusStops": false,
  "includeNearbyAirports": false,
  "useDynamicPxToken": false,
  "flattenOutput": true,
  "maxItems": 10000,
  "maxConcurrency": 100,
  "minConcurrency": 1,
  "maxRequestRetries": 3
}
```

# 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 = {
    "startUrls": [
        {
            "url": "https://www.skyscanner.net/transport/flights/atl/ist/270315/270322/"
        }
    ],
    "departureAirport": "Atlanta",
    "arrivalAirport": "Istanbul",
    "departureDate": "2027-03-15",
    "returnDate": "2027-03-22",
    "skyscannerMarket": "US",
    "skyscannerCurrency": "USD",
    "skyscannerLocale": "en-US"
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/skyscanner-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 = {
    "startUrls": [{ "url": "https://www.skyscanner.net/transport/flights/atl/ist/270315/270322/" }],
    "departureAirport": "Atlanta",
    "arrivalAirport": "Istanbul",
    "departureDate": "2027-03-15",
    "returnDate": "2027-03-22",
    "skyscannerMarket": "US",
    "skyscannerCurrency": "USD",
    "skyscannerLocale": "en-US",
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/skyscanner-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 '{
  "startUrls": [
    {
      "url": "https://www.skyscanner.net/transport/flights/atl/ist/270315/270322/"
    }
  ],
  "departureAirport": "Atlanta",
  "arrivalAirport": "Istanbul",
  "departureDate": "2027-03-15",
  "returnDate": "2027-03-22",
  "skyscannerMarket": "US",
  "skyscannerCurrency": "USD",
  "skyscannerLocale": "en-US"
}' |
apify call memo23/skyscanner-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/skyscanner-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/2iAIqeBWFNo2izOlT/builds/3LYl40Ykinj7xdvjt/openapi.json
