# Skyscanner.com \[Only $1💰] scraper (`memo23/skyscanner-scraper`) Actor

💰$1 per 1000 results, unlimited extraction. Extract detailed flight itineraries from Skyscanner: prices, airlines, schedules, and routes. Search with a flights link or your parameters—one-way, round trip, cabin, passengers, multi-city legs. Filters and sorting refine results for your Apify dataset.

- **URL**: https://apify.com/memo23/skyscanner-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Travel, Agents, Lead generation
- **Stats:** 7 total users, 4 monthly users, 94.1% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

**Search Skyscanner for real itineraries and export structured flight data—ranked options, full result lists, or spreadsheet-ready rows.**

This Apify actor calls Skyscanner’s radar-style **unified search** API (mobile-style headers) for the route, dates, and passenger mix you configure, then normalizes the response for analysis, pricing workflows, or CSV.

---

### Why use this scraper?

- **Two ways to search** — Paste a **Skyscanner `/transport/flights/…`** URL (browser address bar) and route + dates are read from the link, **or** fill departure/arrival/dates in the form when using the homepage URL.
- **Configurable trips** — Origin and destination as city names or airport-style codes, flexible date formats, optional return date for round trips (filter mode).
- **Passengers** — Adults, children, and infants (placeholder ages in the API until the form exposes real ages).
- **Flexible output** — Default is **one dataset row per itinerary** with dashed column names for CSV. You can switch to nested JSON per row, or use advanced `outputFormat` modes (see below).
- **Rich aggregation** — Optional single-dataset “envelope” with `buckets` (Best, Cheapest, Fastest, Direct), `allFlights`, `carriers`, `airports`, and `stats`.
- **Proxy-friendly** — Works with Apify Proxy; residential groups are prefilled in the input schema.

---

### Overview

The actor is aimed at **developers, analysts, and travel or pricing teams** who need **bulk, structured flight quotes** from Skyscanner without maintaining their own mobile API integration.

**What you get**

- With **`flattenOutput: true`** (default), the dataset contains **one item per itinerary**, flat keys such as `price-raw`, `legs-0-origin-displayCode`, etc.
- With **`flattenOutput: false`**, each dataset item is a **nested itinerary object** (harvest shape).
- With **`outputFormat: "aggregated"`** (API-only), you get **one object per search** with `buckets`, `allFlights`, lookup maps, and `stats`.

Results reflect **what Skyscanner returns** for the search (availability, ranking, and pricing are theirs). This is not a booking engine; use it for discovery and analysis.

The radar payload can expose itineraries both in **named buckets** (e.g. Best / Cheapest) and in a top-level **`itineraries.results`** list; the actor merges both and **deduplicates by itinerary id** across poll snapshots so row counts reflect **unique** flights (not the same snapshot repeated). Skyscanner may still enforce a **maximum number of itineraries per search session** (often on the order of hundreds); going beyond that would require a different official API or product surface, not a header tweak.

---

### Supported inputs

The Apify input form uses **collapsible sections** (`sectionCaption` / `sectionDescription` in the schema), similar to “search by URL” vs “search by filters”:

1. **Scrape with Skyscanner URL** — `startUrls` with a full flights path.
2. **Scrape with search filters** — airports, dates, **cabin class**, passengers, and optional **market / currency / locale** (same collapsible section in the UI; cabin and region still apply when using a flights URL). Then **Output** and **General options** (limits, proxy).

**Priority:** For each start URL, if it matches  
`…/transport/flights/{origin}/{destination}/{YYMMDD}/{YYMMDD?}/`  
on `skyscanner.net` or `skyscanner.com`, **origin, destination, and dates from the URL win**; the filter fields are ignored for that request. **Adults / children / infants** still come from input (the URL does not drive passenger counts).

| Input | Required | Description |
| ----- | -------- | ----------- |
| `startUrls` | Yes | Homepage `https://www.skyscanner.net/` for **filter mode**, or a **transport/flights** URL for **URL mode** (see priority above). You can queue multiple URLs; each is resolved independently. |
| `departureAirport` | Yes* | Origin in filter mode only. |
| `arrivalAirport` | Yes* | Destination in filter mode only. |
| `departureDate` | Yes* | In filter mode: `YYYY-MM-DD` or `YYMMDD`. |
| `returnDate` | No | Filter mode: omit for one-way. URL mode: return segment comes from URL when present. |
| `cabinClass` | No | Default <code>economy</code>. <code>premium_economy</code> \| <code>business</code> \| <code>first</code>. Applies to every run (unified-search body). |
| `adults` | No | Default 1; minimum 1 in practice. |
| `children` / `infants` | No | Counts; API uses placeholder ages. |
| `flattenOutput` | No | Default `true` → dashed flat rows. `false` → nested itinerary JSON per row. |
| `skyscannerMarket` | No | Default `US`. UI: **select** with country/territory list (from `cat-guy-inputjson` via `npm run merge:cat-guy-enums`). `UK` in source files is stored as **GB**. Raw JSON may still use any 2-letter code; `UK` → `GB` at run time. |
| `skyscannerCurrency` | No | Default `USD`. UI: **select** with ISO 4217-style list (same merge script). Case normalized for API input. |
| `skyscannerLocale` | No | Default `en-US`. BCP-47 pattern in the UI (e.g. `bs-BA`, `zh-Hans-CN`); normalized at run time. |
| `maxItems` | No | See schema; non-paying Apify users may see stricter caps in logs. |
| `maxConcurrency` / `minConcurrency` / `maxRequestRetries` | No | Crawler tuning (effective caps are applied in code). |
| `proxy` | No | Apify Proxy recommended; defaults include `RESIDENTIAL`. |
| `resultSort` | No | Client-side only: `score`, `cheapest`, `fastest`, `departure`, or `default` (keep API merge order). Not sent on the unified-search POST. |
| `resultLimit` | No | Optional cap on rows **after** filters/sort. Omit for no cap; `0` yields an empty export. Separate from crawler `maxItems`. |
| `filterNonStop` / `filterOneStop` / `filterTwoPlusStops` | No | Client-side stop filters (OR). Uses total `stopCount` summed across legs. |
| `multiCityLeg2*` / `multiCityLeg3*` | No | Extra open-jaw legs built into the search payload (filter / harvest mode only). Ignored when the start URL is a transport/flights link; `returnDate` is ignored if leg 2 is set. |
| `includeNearbyAirports` | No | Logs a warning only; no extra fields are sent on unified-search. |
| `extraHttpHeaders` | No | Optional string→string map merged into POST and poll GET (overrides same header names). |

\*Alternatively you can set **`flightOrigin`**, **`flightDestination`**, and **`departureDate`** (and optional **`returnDate`**) instead of `departureAirport` / `arrivalAirport`; the actor resolves locations via autosuggest.

**Aggregated output note:** When any of `resultSort`, stop filters, or `resultLimit` is set, processed **`aggregated`** output collapses buckets into a single **`Results`** bucket so tabular/flattened exports match the filtered list.

**URL shape**

- Supported for auto-parsing: path like `/transport/flights/lax/las/251001/` (one-way) or `…/251001/251008/` (round trip). Other URL shapes may fall back to filter mode if parsing fails.
- Guarantees on avoiding blocks: use proxies and reasonable concurrency.

---

### Use cases

| Audience | Example use |
| -------- | ----------- |
| Travel tech / metasearch | Compare routes and price bands for many date pairs. |
| Revenue / pricing analysts | Snapshot itinerary sets and `stats.priceRange` for monitoring. |
| Agencies & consultants | One-off or scheduled exports for clients. |
| Researchers | Structured open-itinerary data for models or reports. |

---

### How it works

1. You provide **`startUrls`**. If the URL is a **transport/flights** link, the actor reads route and dates from it; otherwise it uses **trip filters** (or `flightOrigin` / `flightDestination` API fields). Passenger counts always come from input.
2. The actor resolves place IDs, builds the **unified-search** JSON payload, and POSTs to Skyscanner.
3. If the response is **incomplete**, it polls the session until the radar run finishes.
4. Raw responses are merged and passed through **`processFlightData`** → **`buckets`**, **`allFlights`**, **`carriers`**, **`airports`**, **`stats`**.
5. Depending on **`flattenOutput`** / **`outputFormat`**, results are pushed to the dataset as **flat rows**, **nested rows**, or a **single aggregated object**.

---

### How to run

**URL mode (recommended when you already searched on Skyscanner)**  
1. In the browser, run your search and copy the address bar URL (must include `/transport/flights/…`).  
2. Paste it under **Scrape with Skyscanner URL**.  
3. Set passengers and proxy; run. Filter fields can stay at defaults—they are ignored.

**Filter mode**  
1. Set **`startUrls`** to the homepage, e.g. `https://www.skyscanner.net/`.  
2. Fill **Scrape with search filters** (airports + dates).  
3. Set passengers, output, proxy; run.

For both modes: enable **Apify Proxy** when possible, then export **JSON** or **CSV**.

---

### Input configuration

Fields match **`.actor/input_schema.json`**. **`skyscannerMarket`**, **`skyscannerCurrency`**, and **`skyscannerLocale`** are optional; **`market`** and **`locale`** also feed the **flight autosuggest** URL used to resolve city/airport names to place IDs. **`skyscannerCurrency`** affects unified-search only. All three localization headers are sent on every unified-search request (initial POST and polling GET) so pricing and availability can match a specific Skyscanner region/locale in the browser.

Optional API-only fields (not in the visual schema) include:

| Field | Purpose |
| ----- | ------- |
| `flightOrigin` / `flightDestination` | Alternate names for origin/destination resolution. |
| `outputFormat` | `"tabular"` \| `"flattened"` \| `"aggregated"` \| `"both"` \| `"one_row"`. Overrides the simple `flattenOutput` mapping when set. `"both"` also writes `data-harvest.json` on disk during the run. |
| `passengers` | Deprecated; prefer top-level `adults`, `children`, `infants`. |

**Example A — URL mode (round trip from link, YYMMDD in path)**

```json
{
    "startUrls": [
        {
            "url": "https://www.skyscanner.net/transport/flights/atl/ist/260615/260622/"
        }
    ],
    "flattenOutput": true,
    "adults": 1,
    "children": 0,
    "infants": 0,
    "maxItems": 10000,
    "maxConcurrency": 100,
    "minConcurrency": 1,
    "maxRequestRetries": 30,
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": ["RESIDENTIAL"]
    }
}
````

**Example B — Filter mode (homepage + trip fields)**

```json
{
    "startUrls": [
        {
            "url": "https://www.skyscanner.net/"
        }
    ],
    "flattenOutput": true,
    "adults": 1,
    "children": 0,
    "infants": 0,
    "departureAirport": "Atlanta",
    "arrivalAirport": "Istanbul",
    "departureDate": "2026-06-15",
    "returnDate": "2026-06-22",
    "maxItems": 10000,
    "maxConcurrency": 100,
    "minConcurrency": 1,
    "maxRequestRetries": 30,
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
}
```

**One-way:** omit `returnDate` or set it to `null` / `""` so the payload only includes the outbound leg set.

***

### Output overview

- **Tabular (default)** — Many dataset items, one per itinerary; keys use **dashes** (e.g. `price-raw`, nested paths flattened).
- **Flattened (nested per row)** — One harvest-shaped itinerary object per dataset item (no full `buckets` envelope).
- **Aggregated** — One dataset item per search with:
  - **`buckets`** — `Best`, `Cheapest`, `Fastest`, `Direct`, each with an **`items`** array of itineraries in live output.
  - **`allFlights`** — Deduplicated list of itineraries.
  - **`carriers`** / **`airports`** — ID → metadata maps.
  - **`stats`** — e.g. `totalFlights`, `uniqueCarriers`, `priceRange`.

The sample below uses **real values** from the first object in `data-mine.json`, but **shortened**: bucket **`items`** arrays are replaced by **`itemsCount`** for readability; **`allFlights`** shows **one** itinerary with **only the outbound leg** and **two segments** (the full object has a return leg and more segments). **`carriers`** / **`airports`** are trimmed to entries present in the full run’s lookup maps for that sample.

***

### Output samples

With `flattenOutput: true`, the actor instead emits **one row per flight** with dashed field names suitable for CSV.

```json
{
  "buckets": {
    "Best": { "id": "Best", "name": "Best", "itemsCount": 138 },
    "Cheapest": { "id": "Cheapest", "name": "Cheapest", "itemsCount": 144 },
    "Fastest": { "id": "Fastest", "name": "Fastest", "itemsCount": 138 },
    "Direct": { "id": "Direct", "name": "Direct", "itemsCount": 16 }
  },
  "allFlights": [
    {
      "id": "9596-2606151035--32340-1-12585-2606162110|12585-2606222355--32340-2-9596-2606240855",
      "price": {
        "raw": 2080.85,
        "formatted": "$2,081",
        "pricingOptionId": "T7Ck9P5ZT5Zg"
      },
      "legs": [
        {
          "id": "9596-2606151035--32340-1-12585-2606162110",
          "origin": {
            "id": "ATL",
            "entityId": "95673800",
            "name": "Atlanta Hartsfield-Jackson",
            "displayCode": "ATL",
            "city": "Atlanta",
            "country": "United States",
            "isHighlighted": false
          },
          "destination": {
            "id": "IST",
            "entityId": "95673323",
            "name": "Istanbul",
            "displayCode": "IST",
            "city": "Istanbul",
            "country": "Türkiye (Turkey)",
            "isHighlighted": false
          },
          "durationInMinutes": 1655,
          "stopCount": 1,
          "isSmallestStops": false,
          "departure": "2026-06-15T10:35:00",
          "arrival": "2026-06-16T21:10:00",
          "timeDeltaInDays": 1,
          "carriers": {
            "marketing": [
              {
                "id": -32340,
                "alternateId": "ET",
                "logoUrl": "https://logos.skyscnr.com/images/airlines/favicon/ET.png",
                "name": "Ethiopian Airlines"
              }
            ],
            "operationType": "fully_operated"
          },
          "segments": [
            {
              "id": "9596-9252-2606151035-2606160750--32340",
              "origin": {
                "flightPlaceId": "ATL",
                "displayCode": "ATL",
                "parent": {
                  "flightPlaceId": "ATLA",
                  "displayCode": "ATL",
                  "name": "Atlanta",
                  "type": "City"
                },
                "name": "Atlanta Hartsfield-Jackson",
                "type": "Airport",
                "country": "United States"
              },
              "destination": {
                "flightPlaceId": "ADD",
                "displayCode": "ADD",
                "parent": {
                  "flightPlaceId": "ADDA",
                  "displayCode": "ADD",
                  "name": "Addis Ababa",
                  "type": "City"
                },
                "name": "Addis Ababa",
                "type": "Airport",
                "country": "Ethiopia"
              },
              "departure": "2026-06-15T10:35:00",
              "arrival": "2026-06-16T07:50:00",
              "durationInMinutes": 855,
              "flightNumber": "519",
              "marketingCarrier": {
                "id": -32340,
                "name": "Ethiopian Airlines",
                "alternateId": "ET",
                "allianceId": -31999,
                "displayCode": "ET"
              },
              "operatingCarrier": {
                "id": -32340,
                "name": "Ethiopian Airlines",
                "alternateId": "ET",
                "allianceId": -31999,
                "displayCode": "ET"
              }
            },
            {
              "id": "9252-12585-2606161525-2606162110--32340",
              "origin": {
                "flightPlaceId": "ADD",
                "displayCode": "ADD",
                "parent": {
                  "flightPlaceId": "ADDA",
                  "displayCode": "ADD",
                  "name": "Addis Ababa",
                  "type": "City"
                },
                "name": "Addis Ababa",
                "type": "Airport",
                "country": "Ethiopia"
              },
              "destination": {
                "flightPlaceId": "IST",
                "displayCode": "IST",
                "parent": {
                  "flightPlaceId": "ISTA",
                  "displayCode": "IST",
                  "name": "Istanbul",
                  "type": "City"
                },
                "name": "Istanbul",
                "type": "Airport",
                "country": "Türkiye (Turkey)"
              },
              "departure": "2026-06-16T15:25:00",
              "arrival": "2026-06-16T21:10:00",
              "durationInMinutes": 345,
              "flightNumber": "722",
              "marketingCarrier": {
                "id": -32340,
                "name": "Ethiopian Airlines",
                "alternateId": "ET",
                "allianceId": -31999,
                "displayCode": "ET"
              },
              "operatingCarrier": {
                "id": -32340,
                "name": "Ethiopian Airlines",
                "alternateId": "ET",
                "allianceId": -31999,
                "displayCode": "ET"
              }
            }
          ]
        },
        {
          "id": "12585-2606222355--32340-2-9596-2606240855",
          "origin": {
            "id": "IST",
            "entityId": "95673323",
            "name": "Istanbul",
            "displayCode": "IST",
            "city": "Istanbul",
            "country": "Türkiye (Turkey)",
            "isHighlighted": false
          },
          "destination": {
            "id": "ATL",
            "entityId": "95673800",
            "name": "Atlanta Hartsfield-Jackson",
            "displayCode": "ATL",
            "city": "Atlanta",
            "country": "United States",
            "isHighlighted": false
          },
          "durationInMinutes": 2400,
          "stopCount": 2,
          "isSmallestStops": false,
          "departure": "2026-06-22T23:55:00",
          "arrival": "2026-06-24T08:55:00",
          "timeDeltaInDays": 2,
          "carriers": {
            "marketing": [
              {
                "id": -32340,
                "alternateId": "ET",
                "logoUrl": "https://logos.skyscnr.com/images/airlines/favicon/ET.png",
                "name": "Ethiopian Airlines"
              }
            ],
            "operationType": "fully_operated"
          },
          "segments": [
            {
              "id": "12585-9252-2606222355-2606230515--32340",
              "origin": {
                "flightPlaceId": "IST",
                "displayCode": "IST",
                "parent": {
                  "flightPlaceId": "ISTA",
                  "displayCode": "IST",
                  "name": "Istanbul",
                  "type": "City"
                },
                "name": "Istanbul",
                "type": "Airport",
                "country": "Türkiye (Turkey)"
              },
              "destination": {
                "flightPlaceId": "ADD",
                "displayCode": "ADD",
                "parent": {
                  "flightPlaceId": "ADDA",
                  "displayCode": "ADD",
                  "name": "Addis Ababa",
                  "type": "City"
                },
                "name": "Addis Ababa",
                "type": "Airport",
                "country": "Ethiopia"
              },
              "departure": "2026-06-22T23:55:00",
              "arrival": "2026-06-23T05:15:00",
              "durationInMinutes": 320,
              "flightNumber": "721",
              "marketingCarrier": {
                "id": -32340,
                "name": "Ethiopian Airlines",
                "alternateId": "ET",
                "allianceId": -31999,
                "displayCode": "ET"
              },
              "operatingCarrier": {
                "id": -32340,
                "name": "Ethiopian Airlines",
                "alternateId": "ET",
                "allianceId": -31999,
                "displayCode": "ET"
              }
            },
            {
              "id": "9252-11493-2606232200-2606240330--32340",
              "origin": {
                "flightPlaceId": "ADD",
                "displayCode": "ADD",
                "parent": {
                  "flightPlaceId": "ADDA",
                  "displayCode": "ADD",
                  "name": "Addis Ababa",
                  "type": "City"
                },
                "name": "Addis Ababa",
                "type": "Airport",
                "country": "Ethiopia"
              },
              "destination": {
                "flightPlaceId": "FCO",
                "displayCode": "FCO",
                "parent": {
                  "flightPlaceId": "ROME",
                  "displayCode": "ROM",
                  "name": "Rome",
                  "type": "City"
                },
                "name": "Rome Fiumicino",
                "type": "Airport",
                "country": "Italy"
              },
              "departure": "2026-06-23T22:00:00",
              "arrival": "2026-06-24T03:30:00",
              "durationInMinutes": 390,
              "flightNumber": "518",
              "marketingCarrier": {
                "id": -32340,
                "name": "Ethiopian Airlines",
                "alternateId": "ET",
                "allianceId": -31999,
                "displayCode": "ET"
              },
              "operatingCarrier": {
                "id": -32340,
                "name": "Ethiopian Airlines",
                "alternateId": "ET",
                "allianceId": -31999,
                "displayCode": "ET"
              }
            },
            {
              "id": "11493-9596-2606240430-2606240855--32340",
              "origin": {
                "flightPlaceId": "FCO",
                "displayCode": "FCO",
                "parent": {
                  "flightPlaceId": "ROME",
                  "displayCode": "ROM",
                  "name": "Rome",
                  "type": "City"
                },
                "name": "Rome Fiumicino",
                "type": "Airport",
                "country": "Italy"
              },
              "destination": {
                "flightPlaceId": "ATL",
                "displayCode": "ATL",
                "parent": {
                  "flightPlaceId": "ATLA",
                  "displayCode": "ATL",
                  "name": "Atlanta",
                  "type": "City"
                },
                "name": "Atlanta Hartsfield-Jackson",
                "type": "Airport",
                "country": "United States"
              },
              "departure": "2026-06-24T04:30:00",
              "arrival": "2026-06-24T08:55:00",
              "durationInMinutes": 625,
              "flightNumber": "518",
              "marketingCarrier": {
                "id": -32340,
                "name": "Ethiopian Airlines",
                "alternateId": "ET",
                "allianceId": -31999,
                "displayCode": "ET"
              },
              "operatingCarrier": {
                "id": -32340,
                "name": "Ethiopian Airlines",
                "alternateId": "ET",
                "allianceId": -31999,
                "displayCode": "ET"
              }
            }
          ]
        }
      ],
      "isSelfTransfer": false,
      "isProtectedSelfTransfer": false,
      "farePolicy": {
        "isChangeAllowed": false,
        "isPartiallyChangeable": false,
        "isCancellationAllowed": false,
        "isPartiallyRefundable": false
      },
      "fareAttributes": {},
      "tags": [
        "cheapest",
        "shortest"
      ],
      "isMashUp": false,
      "hasFlexibleOptions": false,
      "score": 1
    }
  ],
  "carriers": {
    "-32340": {
      "id": -32340,
      "alternateId": "ET",
      "logoUrl": "https://logos.skyscnr.com/images/airlines/favicon/ET.png",
      "name": "Ethiopian Airlines"
    }
  },
  "airports": {
    "ATL": {
      "id": "ATL",
      "entityId": "95673800",
      "name": "Atlanta Hartsfield-Jackson",
      "displayCode": "ATL",
      "city": "Atlanta",
      "country": "United States",
      "isHighlighted": false
    },
    "IST": {
      "id": "IST",
      "entityId": "95673323",
      "name": "Istanbul",
      "displayCode": "IST",
      "city": "Istanbul",
      "country": "Türkiye (Turkey)",
      "isHighlighted": false
    }
  },
  "stats": {
    "totalFlights": 436,
    "totalBuckets": 4,
    "uniqueCarriers": 15,
    "uniqueAirports": 3,
    "priceRange": {
      "min": 1016,
      "max": 3959.23
    }
  }
}
```

**Tabular (illustrative)** — With `flattenOutput: true`, expect dashed keys derived from the itinerary tree, for example: `price-raw`, `price-formatted`, `legs-0-origin-displayCode`, `legs-0-segments-0-flightNumber`, etc. Exact keys depend on nesting depth and optional fields.

***

### Key output fields

| Group | Fields (high level) |
| ----- | ------------------- |
| **Itinerary** | `id`, `tags`, `score`, `isSelfTransfer`, `farePolicy`, `fareAttributes` |
| **Price** | `price.raw`, `price.formatted`, `price.pricingOptionId` |
| **Legs** | `legs[].origin` / `destination` (airport-level), `departure`, `arrival`, `durationInMinutes`, `stopCount`, `carriers.marketing` |
| **Segments** | `legs[].segments[]` — `flightNumber`, `marketingCarrier`, `operatingCarrier`, airport objects, times |
| **Buckets** | `buckets.Best` / `Cheapest` / `Fastest` / `Direct` — each with `items[]` of itineraries in full aggregated export |
| **Lookup maps** | `carriers` (numeric/string IDs), `airports` (IATA-style keys) |
| **Stats** | `totalFlights`, `uniqueCarriers`, `uniqueAirports`, `priceRange`, … |

***

### FAQ

**Which Skyscanner host does this use?**\
The integration targets **`www.skyscanner.net`** unified search (mobile-style client headers in code). **URL parsing** also accepts **`skyscanner.com`** links with the same `/transport/flights/…` path pattern.

**What is the difference between URL mode and filter mode?**\
If **`startUrls`** contains a parseable **`/transport/flights/{origin}/{destination}/{YYMMDD}/…`** link, **route and dates come from that URL** and the “Scrape with search filters” fields are ignored for that request. Otherwise use the homepage URL and fill airports + dates. Passenger counts always come from the input form.

**Can I run one-way searches?**\
**Filter mode:** leave **`returnDate`** empty or unset. **URL mode:** use a URL with only one **`YYMMDD`** segment after the airports (no second date segment), or omit the inbound segment if your copied link supports it.

**Why did my run return fewer rows than expected?**\
Non-paying Apify accounts may hit **stricter `maxItems` and `startUrls` limits** (see actor logs). Also check HTTP errors, proxy quality, and Skyscanner `errors` in the API body.

**Are prices guaranteed or bookable?**\
No. Values are **as returned by Skyscanner** for that search context; always validate on the airline or OTA before booking.

**What about child ages?**\
The API currently uses **placeholder ages** for children and infants until the input form exposes real ages.

**How do I get one big JSON blob instead of many rows?**\
Set **`outputFormat`** to **`aggregated`** in raw JSON input (not exposed in the default UI schema), or set **`flattenOutput`: false** for nested per-row objects without the full envelope.

**Can I trust bearer tokens in the repo?**\
Tokens in source may **expire**; if runs fail with auth errors, the actor may need refreshed headers—contact the maintainer or update the implementation.

***

### README image (optional)

For the Apify store listing, add a **“How it works”** diagram (input → unified search → dataset). Host the image on an **Apify key-value store** or **`raw.githubusercontent.com`**, not only a relative repo path, so it renders on the Console. See `readme-stuff/README-GUIDELINES.md` for sizing tips.

***

### Support

- For issues or feature requests, please use the [Issues](https://console.apify.com/actors/vOp9KqY3m59PdI4ES/issues) section of this actor.
- If you need customization or have questions, feel free to contact the author:
  - Author's website: <https://muhamed-didovic.github.io/>
  - Email: <muhamed.didovic@gmail.com>

### Additional Services

- Request customization or whole dataset: <muhamed.didovic@gmail.com>
- If you need anything else scraped, or this actor customized, email: <muhamed.didovic@gmail.com>
- For API services of this scraper (no Apify fee, just usage fee for the API), contact: <muhamed.didovic@gmail.com>

### Explore More Scrapers

If you found this Skyscanner scraper useful, be sure to check out other scrapers and actors on [memo23's Apify profile](https://apify.com/memo23).

# 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.

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

City or airport code. <strong>Ignored</strong> when a full flights URL is used.

## `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.

## `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).

## `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.

## `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>).

## `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.

## `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`):

Number of times the crawler will retry a failed request before giving up.

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

Specifies proxy servers that will be used by the scraper in order to hide its origin.<br><br>For details, see <a href='https://apify.com/apify/web-scraper#proxy-configuration' target='_blank' rel='noopener'>Proxy configuration</a> in README.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.skyscanner.net/transport/flights/atl/ist/260615/260622/"
    }
  ],
  "departureAirport": "Atlanta",
  "arrivalAirport": "Istanbul",
  "departureDate": "2026-06-15",
  "returnDate": "2026-06-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,
  "flattenOutput": true,
  "maxItems": 10000,
  "maxConcurrency": 100,
  "minConcurrency": 1,
  "maxRequestRetries": 30,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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/260615/260622/"
        }
    ],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// 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/260615/260622/" }],
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# 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("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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/260615/260622/"
    }
  ],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call memo23/skyscanner-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=memo23/skyscanner-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Skyscanner.com [Only $1💰] scraper",
        "description": "💰$1 per 1000 results, unlimited extraction. Extract detailed flight itineraries from Skyscanner: prices, airlines, schedules, and routes. Search with a flights link or your parameters—one-way, round trip, cabin, passengers, multi-city legs. Filters and sorting refine results for your Apify dataset.",
        "version": "0.0",
        "x-build-id": "1xm9yQ0JwrDdBUCq5"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/memo23~skyscanner-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-memo23-skyscanner-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/memo23~skyscanner-scraper/runs": {
            "post": {
                "operationId": "runs-sync-memo23-skyscanner-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/memo23~skyscanner-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-memo23-skyscanner-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "startUrls"
                ],
                "properties": {
                    "startUrls": {
                        "title": "Skyscanner flights URLs",
                        "type": "array",
                        "description": "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.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "departureAirport": {
                        "title": "Departure airport",
                        "type": "string",
                        "description": "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.",
                        "default": "Atlanta"
                    },
                    "arrivalAirport": {
                        "title": "Arrival airport",
                        "type": "string",
                        "description": "City or airport code. <strong>Ignored</strong> when a full flights URL is used.",
                        "default": "Istanbul"
                    },
                    "departureDate": {
                        "title": "Departure date",
                        "type": "string",
                        "description": "<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.",
                        "default": "2026-06-15"
                    },
                    "returnDate": {
                        "title": "Return date",
                        "type": "string",
                        "description": "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).",
                        "default": "2026-06-22"
                    },
                    "cabinClass": {
                        "title": "Cabin class",
                        "enum": [
                            "economy",
                            "premium_economy",
                            "business",
                            "first"
                        ],
                        "type": "string",
                        "description": "Sent as <code>cabinClass</code> on the unified-search JSON body. Applies to <strong>every</strong> run (URL and filter mode).",
                        "default": "economy"
                    },
                    "adults": {
                        "title": "Adults",
                        "minimum": 1,
                        "maximum": 9,
                        "type": "integer",
                        "description": "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.",
                        "default": 1
                    },
                    "children": {
                        "title": "Children",
                        "minimum": 0,
                        "maximum": 9,
                        "type": "integer",
                        "description": "Number of children. The API uses a placeholder child age until real ages are supported.",
                        "default": 0
                    },
                    "infants": {
                        "title": "Infants (on lap)",
                        "minimum": 0,
                        "maximum": 9,
                        "type": "integer",
                        "description": "Infants without their own seat (under ~2 years). Uses a placeholder age in the API.",
                        "default": 0
                    },
                    "skyscannerMarket": {
                        "title": "Skyscanner market (region code)",
                        "enum": [
                            "AF",
                            "AL",
                            "DZ",
                            "AS",
                            "AD",
                            "AO",
                            "AI",
                            "AG",
                            "AR",
                            "AM",
                            "AW",
                            "AU",
                            "AT",
                            "AZ",
                            "BS",
                            "BH",
                            "BD",
                            "BB",
                            "BY",
                            "BE",
                            "BZ",
                            "BJ",
                            "BM",
                            "BT",
                            "BO",
                            "BA",
                            "BW",
                            "BR",
                            "VG",
                            "BN",
                            "BG",
                            "BF",
                            "BI",
                            "KH",
                            "CM",
                            "CA",
                            "CV",
                            "KY",
                            "CF",
                            "TD",
                            "CL",
                            "CN",
                            "CX",
                            "CC",
                            "CO",
                            "KM",
                            "CG",
                            "CK",
                            "CR",
                            "HR",
                            "CU",
                            "CY",
                            "CZ",
                            "DK",
                            "DJ",
                            "DM",
                            "DO",
                            "CD",
                            "EC",
                            "EG",
                            "SV",
                            "GQ",
                            "ER",
                            "EE",
                            "SZ",
                            "ET",
                            "FK",
                            "FO",
                            "FJ",
                            "FI",
                            "FR",
                            "GF",
                            "PF",
                            "GA",
                            "GM",
                            "GE",
                            "DE",
                            "GH",
                            "GI",
                            "GR",
                            "GL",
                            "GD",
                            "GP",
                            "GU",
                            "GT",
                            "GG",
                            "GN",
                            "GW",
                            "GY",
                            "HT",
                            "HN",
                            "HK",
                            "HU",
                            "IS",
                            "IN",
                            "ID",
                            "IR",
                            "IQ",
                            "IE",
                            "IL",
                            "IT",
                            "CI",
                            "JM",
                            "JP",
                            "JO",
                            "KZ",
                            "KE",
                            "KI",
                            "KW",
                            "KG",
                            "LA",
                            "LV",
                            "LB",
                            "LS",
                            "LR",
                            "LY",
                            "LI",
                            "LT",
                            "LU",
                            "MO",
                            "MG",
                            "MW",
                            "MY",
                            "MV",
                            "ML",
                            "MT",
                            "MH",
                            "MQ",
                            "MR",
                            "MU",
                            "YT",
                            "MX",
                            "FM",
                            "MD",
                            "MC",
                            "MN",
                            "ME",
                            "MS",
                            "MA",
                            "MZ",
                            "MM",
                            "NA",
                            "NR",
                            "NP",
                            "NL",
                            "NC",
                            "NZ",
                            "NI",
                            "NE",
                            "NG",
                            "NU",
                            "KP",
                            "MK",
                            "MP",
                            "NO",
                            "OM",
                            "PK",
                            "PW",
                            "PS",
                            "PA",
                            "PG",
                            "PY",
                            "PE",
                            "PH",
                            "PL",
                            "PT",
                            "PR",
                            "QA",
                            "RE",
                            "RO",
                            "RU",
                            "RW",
                            "KN",
                            "LC",
                            "VC",
                            "WS",
                            "ST",
                            "SA",
                            "SN",
                            "RS",
                            "SC",
                            "SL",
                            "SG",
                            "SK",
                            "SI",
                            "SB",
                            "SO",
                            "ZA",
                            "GS",
                            "KR",
                            "ES",
                            "LK",
                            "SH",
                            "PM",
                            "SD",
                            "SR",
                            "SE",
                            "CH",
                            "SY",
                            "TW",
                            "TJ",
                            "TZ",
                            "TH",
                            "TG",
                            "TO",
                            "TT",
                            "TN",
                            "TR",
                            "TM",
                            "TC",
                            "TV",
                            "UG",
                            "UA",
                            "AE",
                            "GB",
                            "US",
                            "UY",
                            "VI",
                            "UZ",
                            "VU",
                            "VA",
                            "VE",
                            "VN",
                            "WF",
                            "YE",
                            "ZM",
                            "ZW"
                        ],
                        "type": "string",
                        "description": "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).",
                        "default": "US"
                    },
                    "skyscannerCurrency": {
                        "title": "Display currency",
                        "enum": [
                            "EUR",
                            "GBP",
                            "USD",
                            "AED",
                            "AFN",
                            "ALL",
                            "AMD",
                            "ANG",
                            "AOA",
                            "ARS",
                            "AUD",
                            "AWG",
                            "AZN",
                            "BAM",
                            "BBD",
                            "BDT",
                            "BGN",
                            "BHD",
                            "BIF",
                            "BMD",
                            "BND",
                            "BOB",
                            "BRL",
                            "BSD",
                            "BTN",
                            "BWP",
                            "BYN",
                            "BZD",
                            "CAD",
                            "CDF",
                            "CHF",
                            "CLP",
                            "CNY",
                            "COP",
                            "CRC",
                            "CUC",
                            "CUP",
                            "CVE",
                            "CZK",
                            "DJF",
                            "DKK",
                            "DOP",
                            "DZD",
                            "EGP",
                            "ERN",
                            "ETB",
                            "FJD",
                            "GEL",
                            "GHS",
                            "GIP",
                            "GMD",
                            "GNF",
                            "GTQ",
                            "GYD",
                            "HKD",
                            "HNL",
                            "HRK",
                            "HTG",
                            "HUF",
                            "IDR",
                            "ILS",
                            "INR",
                            "IQD",
                            "IRR",
                            "ISK",
                            "JMD",
                            "JOD",
                            "JPY",
                            "KES",
                            "KGS",
                            "KHR",
                            "KMF",
                            "KPW",
                            "KRW",
                            "KWD",
                            "KYD",
                            "KZT",
                            "LAK",
                            "LBP",
                            "LKR",
                            "LRD",
                            "LSL",
                            "LYD",
                            "MAD",
                            "MDL",
                            "MGA",
                            "MKD",
                            "MMK",
                            "MNT",
                            "MOP",
                            "MRO",
                            "MUR",
                            "MVR",
                            "MWK",
                            "MXN",
                            "MYR",
                            "MZN",
                            "NAD",
                            "NGN",
                            "NIO",
                            "NOK",
                            "NPR",
                            "NZD",
                            "OMR",
                            "PAB",
                            "PEN",
                            "PGK",
                            "PHP",
                            "PKR",
                            "PLN",
                            "PYG",
                            "QAR",
                            "RON",
                            "RSD",
                            "RUB",
                            "RWF",
                            "SAR",
                            "SBD",
                            "SCR",
                            "SDG",
                            "SEK",
                            "SGD",
                            "SHP",
                            "SLL",
                            "SOS",
                            "SRD",
                            "STD",
                            "SYP",
                            "SZL",
                            "THB",
                            "TJS",
                            "TMT",
                            "TND",
                            "TOP",
                            "TRY",
                            "TTD",
                            "TWD",
                            "TZS",
                            "UAH",
                            "UGX",
                            "UYU",
                            "UZS",
                            "VND",
                            "VUV",
                            "WST",
                            "XAF",
                            "XCD",
                            "XOF",
                            "XPF",
                            "YER",
                            "ZAR",
                            "ZMW"
                        ],
                        "type": "string",
                        "description": "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.",
                        "default": "USD"
                    },
                    "skyscannerLocale": {
                        "title": "Locale (language)",
                        "pattern": "^[a-zA-Z]{2,8}(-[a-zA-Z0-9]{2,8}){0,3}$",
                        "minLength": 2,
                        "maxLength": 35,
                        "type": "string",
                        "description": "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>).",
                        "default": "en-US"
                    },
                    "resultSort": {
                        "title": "Sort results (client-side)",
                        "enum": [
                            "default",
                            "score",
                            "cheapest",
                            "fastest",
                            "departure"
                        ],
                        "type": "string",
                        "description": "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).",
                        "default": "default"
                    },
                    "resultLimit": {
                        "title": "Max itineraries in dataset",
                        "minimum": 0,
                        "type": "integer",
                        "description": "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": {
                        "title": "Non-stop only",
                        "type": "boolean",
                        "description": "Keep itineraries where total stops across all legs = 0. Multiple stop checkboxes combine with <strong>OR</strong>.",
                        "default": false
                    },
                    "filterOneStop": {
                        "title": "One stop",
                        "type": "boolean",
                        "description": "Keep itineraries with total stops = 1.",
                        "default": false
                    },
                    "filterTwoPlusStops": {
                        "title": "Two or more stops",
                        "type": "boolean",
                        "description": "Keep itineraries with total stops ≥ 2.",
                        "default": false
                    },
                    "multiCityLeg2Destination": {
                        "title": "Multi-city — leg 2 destination",
                        "type": "string",
                        "description": "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": {
                        "title": "Multi-city — leg 2 date",
                        "type": "string",
                        "description": "Date for leg 2 (<code>YYYY-MM-DD</code> or <code>YYMMDD</code>)."
                    },
                    "multiCityLeg3Destination": {
                        "title": "Multi-city — leg 3 destination (optional)",
                        "type": "string",
                        "description": "Third segment from leg 2 city to this airport. Requires leg 2 and <strong>leg 3 date</strong>."
                    },
                    "multiCityLeg3Date": {
                        "title": "Multi-city — leg 3 date",
                        "type": "string",
                        "description": "Date for leg 3."
                    },
                    "includeNearbyAirports": {
                        "title": "Include nearby airports (informational)",
                        "type": "boolean",
                        "description": "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.",
                        "default": false
                    },
                    "extraHttpHeaders": {
                        "title": "Extra HTTP headers (advanced)",
                        "type": "object",
                        "description": "String keys and string values merged into unified-search POST and poll GET. Overrides duplicate header names. Use sparingly; wrong values can break requests."
                    },
                    "flattenOutput": {
                        "title": "Flatten output (spreadsheet columns)",
                        "type": "boolean",
                        "description": "Yes = one row per flight with dashed column names (<code>price-raw</code>, …). No = nested JSON per row.",
                        "default": true
                    },
                    "maxItems": {
                        "title": "Max results to return",
                        "type": "integer",
                        "description": "Crawler item limit. Non-paying Apify users may see additional caps at runtime—check the log if output looks truncated.",
                        "default": 10000
                    },
                    "maxConcurrency": {
                        "title": "Max Concurrency",
                        "type": "integer",
                        "description": "Maximum number of pages that can be processed at the same time.",
                        "default": 100
                    },
                    "minConcurrency": {
                        "title": "Min Concurrency",
                        "type": "integer",
                        "description": "Minimum number of pages that will be processed at the same time.",
                        "default": 1
                    },
                    "maxRequestRetries": {
                        "title": "Max Request Retries",
                        "type": "integer",
                        "description": "Number of times the crawler will retry a failed request before giving up.",
                        "default": 30
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Specifies proxy servers that will be used by the scraper in order to hide its origin.<br><br>For details, see <a href='https://apify.com/apify/web-scraper#proxy-configuration' target='_blank' rel='noopener'>Proxy configuration</a> in README.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
