# Kiwi Flight Search Scraper (`ecomscrape/kiwi-flight-search-scraper`) Actor

Extract comprehensive flight data from Kiwi.com's virtual interlining platform. Access prices, routes, airlines, and booking options from 750+ carriers worldwide. Perfect for travel businesses, price comparison, and market research with detailed output including price, duration, and booking data.

- **URL**: https://apify.com/ecomscrape/kiwi-flight-search-scraper.md
- **Developed by:** [ecomscrape](https://apify.com/ecomscrape) (community)
- **Categories:** Travel, Developer tools, Automation
- **Stats:** 43 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## What's an Apify Actor?

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

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

## How to integrate an Actor?

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

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

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

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

# README

## Contact

If you encounter any issues or need to exchange information, please feel free to contact us through the following link:
[My profile](https://apify.com/ecomscrape)

## Kiwi Flight Scraper: Extract Flight Data & Prices Efficiently

### Introduction

Kiwi.com has revolutionized the travel industry with its innovative virtual interlining technology, connecting over 750 carriers that traditionally don't cooperate in online bookings. As an international online travel agency founded in 2012, Kiwi.com provides a fare aggregator and metasearch engine that combines itineraries from carriers using their unique "virtual interlining" concept. For businesses, researchers, and travel professionals who need to analyze flight data systematically, manual searching through Kiwi.com's extensive database becomes time-consuming and inefficient.

The Kiwi.com Flight Scraper addresses this challenge by automating the extraction of comprehensive flight information from search results. Whether you're conducting market research, building travel applications, or analyzing pricing trends across multiple routes, this scraper provides structured access to Kiwi.com's vast flight inventory, including low-cost carriers and unique route combinations that other platforms may not offer.

### Scraper Overview

The Kiwi.com Flight Scraper is designed to extract detailed flight information from Kiwi.com search result pages efficiently. This powerful tool captures not only basic flight details like prices and schedules but also advanced metadata that makes Kiwi.com unique, such as virtual interlining options, travel hacks, and multi-carrier combinations.

Key advantages of this scraper include its ability to handle Kiwi.com's dynamic content loading, extract complex multi-leg journeys, and capture the platform's specialized data fields like "Travel Hack" indicators and "Vanilla" flight classifications. The scraper is particularly valuable for travel industry professionals who need to monitor pricing across unconventional routes that combine different carriers.

Target users include travel agencies looking to compare competitive pricing, researchers analyzing flight market trends, price monitoring services, and developers building travel applications. The scraper's comprehensive data extraction capabilities make it suitable for both commercial use and academic research in transportation and tourism sectors.

#### Detailed Input and Output Specifications

##### Input Format

Example url 1: https://www.kiwi.com/en/search/results/london-united-kingdom/manchester-united-kingdom

Example url 2: https://www.kiwi.com/en/search/results/london-united-kingdom/mexico-city-mexico

Example url 3: https://www.kiwi.com/en/search/results/london-united-kingdom/berlin-germany

Example Screenshot of Flight list by query page:

![](https://i.ibb.co/jvwwdhVw/Screenshot-from-2025-08-18-11-55-05.png)

#### Input Format

The scraper accepts configuration through a JSON object with several key parameters:

##### Scrape with URLs:

```json
{
  "max_retries_per_url": 2, // Maximum number of retry attempts for each URL if scraping fails
  "proxy": { // Proxy configuration to avoid bot detection
    "useApifyProxy": false
  },
  "max_items_per_url": 20, // Limit the number of items to scrape per URL
  "urls": [ 
    "https://www.kiwi.com/en/search/results/london-united-kingdom/manchester-united-kingdom"
    // Add URLs of flight list pages you want to scrape
  ],
  "ignore_url_failures": true // Continue scraping even if some URLs fail
}
```

**The `urls` parameter**: Add the URLs of the flight list pages you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.

**The `ignore_url_failures` parameter**: If set to `true`, the scraper will continue running even if some URLs fail to be scraped after the maximum number of retries is reached. This ensures that one problematic URL doesn't stop your entire scraping job.

*When you provide a list of URLs for scraping, all options in the "Scrape with search filters" section will be disabled. The system will only collect data from the URLs you specified.*

##### Scrape with Search Filters:

```json
{
  "max_retries_per_url": 2, // Maximum number of retry attempts for each search request
  "proxy": { // Proxy configuration to avoid bot detection
    "useApifyProxy": false
  },
  "max_items_per_url": 20, // Total number of items you want to scrape
  "from_to": "london-united-kingdom/manchester-united-kingdom", // From and to locations
  "departure_date": "2025-11-27", // Departure date in YYYY-MM-DD format
  "return_date": "2025-12-03", // Return date in YYYY-MM-DD format
  "stop_num": "1", // Number of stops
  "adult_num": 1, // Number of adults
  "child_num": 0, // Number of children
  "infant_num": 0, // Number of infants
  "sort_by": "price" // Sort flights by specific criteria
}
```

**The `from_to` parameter**: Enter the location to search for items. Make sure the location is accurate by selecting a from location and to location on the website and then searching. Copy the location value directly from the URL. For example, for the URL `https://www.kiwi.com/en/search/results/london-united-kingdom/manchester-united-kingdom/2025-11-27/2025-12-03/`, the correct location is `london-united-kingdom/manchester-united-kingdom`.

**The `departure_date` parameter**: Select departure date in format YYYY-MM-DD (e.g., "2025-11-27").

**The `return_date` parameter**: Select return date in format YYYY-MM-DD (e.g., "2025-12-03").

**The `stop_num` parameter**: Select the number of stops:

- `""` - Any
- `"0"` - Direct
- `"1"` - Up to 1 stop
- `"2"` - Up to 2 stops

**The `adult_num` parameter**: Number of adults for the flight search.

**The `child_num` parameter**: Number of children for the flight search.

**The `infant_num` parameter**: Number of infants for the flight search.

**The `sort_by` parameter**: Select the sorting option:

- `""` - Best
- `"price"` - Cheapest
- `"duration"` - Fastest
- `"sourceTakeoffAsc"` - Other

*When using search filters for scraping, you need to leave the `urls` field empty in the "Scrape with URLs" configuration.*

##### General Options:

**The `max_items_per_url` parameter**: Limit the number of items per URL or search filters you want to scrape. The default value is 20, providing a manageable batch size while allowing for comprehensive data collection.

**The `max_retries_per_url` parameter**: Limit the number of retries for each URL or search filters if the scrape is detected as a bot or the page fails to load. The default value is 2, providing a good balance between thoroughness and efficiency.

**The `proxy` parameter**: Proxy configuration is essential for maintaining anonymity and avoiding detection. Select proxies to be used by your scraper.

#### Output Format

```json
[ // List of Flight information
  {
  "outbound": {
    "sector_segments": [
      {
        "segment": {
          "source": {
            "station": {
              "code": "LHR",
              "type": "AIRPORT",
              "city": {
                "name": "London",
                "id": "City:london_gb",
                "legacy_id": "london_gb"
              },
              "id": "Station:airport:LHR",
              "legacy_id": "LHR",
              "name": "Heathrow",
              "gps": {
                "lat": 51.4775,
                "lng": -0.4613889
              },
              "country": {
                "code": "GB",
                "id": "Country:GB"
              }
            },
            "local_time": "2025-12-15T19:05:00",
            "utc_time_iso": "2025-12-15T19:05:00Z"
          },
          "destination": {
            "station": {
              "code": "MAN",
              "type": "AIRPORT",
              "city": {
                "name": "Manchester",
                "id": "City:manchester_gb",
                "legacy_id": "manchester_gb"
              },
              "id": "Station:airport:MAN",
              "legacy_id": "MAN",
              "name": "Manchester",
              "gps": {
                "lat": 53.3536111,
                "lng": -2.275
              },
              "country": {
                "code": "GB",
                "id": "Country:GB"
              }
            },
            "local_time": "2025-12-15T20:10:00",
            "utc_time_iso": "2025-12-15T20:10:00Z"
          },
          "id": "Segment:6bcf2535bfa74605b976d2cf1c0f7e1aa2d6bbb2",
          "duration": 3900,
          "type": "FLIGHT",
          "code": "1380",
          "carrier": {
            "id": "Carrier:207",
            "name": "British Airways",
            "code": "BA"
          },
          "operating_carrier": {
            "id": "Carrier:207",
            "name": "British Airways",
            "code": "BA"
          },
          "cabin_class": "ECONOMY",
          "hidden_destination": null,
          "throwaway_destination": null
        },
        "guarantee": null,
        "layover": null
      }
    ],
    "id": "Sector:6bcf2535bfa74605b976d2cf1c0f7e1aa2d6bbb2~6bcf2535bfa74605b976d2cf1c0f7e1aa2d6bbb2",
    "duration": 3900
  },
  "inbound": {
    "sector_segments": [
      {
        "segment": {
          "destination": {
            "station": {
              "code": "LHR",
              "type": "AIRPORT",
              "city": {
                "name": "London",
                "id": "City:london_gb",
                "legacy_id": "london_gb"
              },
              "id": "Station:airport:LHR",
              "legacy_id": "LHR",
              "name": "Heathrow",
              "gps": {
                "lat": 51.4775,
                "lng": -0.4613889
              },
              "country": {
                "code": "GB",
                "id": "Country:GB"
              }
            },
            "local_time": "2025-12-22T17:30:00",
            "utc_time_iso": "2025-12-22T17:30:00Z"
          },
          "id": "Segment:71636e85e7dc022082765f18b97015b6be62cd83",
          "source": {
            "local_time": "2025-12-22T16:20:00",
            "utc_time_iso": "2025-12-22T16:20:00Z",
            "station": {
              "id": "Station:airport:MAN",
              "legacy_id": "MAN",
              "name": "Manchester",
              "code": "MAN",
              "type": "AIRPORT",
              "gps": {
                "lat": 53.3536111,
                "lng": -2.275
              },
              "city": {
                "legacy_id": "manchester_gb",
                "name": "Manchester",
                "id": "City:manchester_gb"
              },
              "country": {
                "code": "GB",
                "id": "Country:GB"
              }
            }
          },
          "duration": 4200,
          "type": "FLIGHT",
          "code": "1371",
          "carrier": {
            "id": "Carrier:207",
            "name": "British Airways",
            "code": "BA"
          },
          "operating_carrier": {
            "id": "Carrier:207",
            "name": "British Airways",
            "code": "BA"
          },
          "cabin_class": "ECONOMY",
          "hidden_destination": null,
          "throwaway_destination": null
        },
        "guarantee": null,
        "layover": null
      }
    ],
    "id": "Sector:71636e85e7dc022082765f18b97015b6be62cd83~71636e85e7dc022082765f18b97015b6be62cd83",
    "duration": 4200
  },
  "id": "ItineraryReturn:eyJwcm92aWRlcnMiOiJLSVdJLUJBU0lDOktJV0kiLCJyb3V0ZV9kYXRhIjoiQkE6MTM4MDpMSFI6MTc2NTgyNTUwMDpNQU46MTc2NTgyOTQwMDplY29ub215OkZhbHNlOjo6QkF8QkE6MTM3MTpNQU46MTc2NjQyMDQwMDpMSFI6MTc2NjQyNDYwMDplY29ub215OkZhbHNlOjo6QkEiLCJwcmljZSI6IjEyNSJ9",
  "share_id": "eyJyIjoiQkE6MTM4MDpMSFI6MTc2NTgyNTUwMDpNQU46MTc2NTgyOTQwMDplY29ub215OkZhbHNlOjo6QkF8QkE6MTM3MTpNQU46MTc2NjQyMDQwMDpMSFI6MTc2NjQyNDYwMDplY29ub215OkZhbHNlOjo6QkEiLCJpIjpbIjBmNjQwYTJiNGZkNTRmZGMxYTNiZWFmY18wIiwiMGY2NDBhMmI0ZmQ1NGZkYzFhM2JlYWZjXzEiXSwidGhjIjowLCJ0YXQiOjAsInZpIjowLCJ0IjoiUlQifQ==",
  "price": {
    "amount": "125",
    "price_before_discount": "125"
  },
  "price_eur": {
    "amount": "106.883284"
  },
  "provider": {
    "name": "Kiwi.com",
    "code": "KIWI-BASIC",
    "has_high_probability_of_price_change": false,
    "content_provider": null,
    "id": "ItineraryProvider:KIWI-BASIC"
  },
  "bags_info": {
    "included_checked_bags": 0,
    "included_hand_bags": 1,
    "has_no_baggage_supported": false,
    "has_no_checked_baggage": false,
    "checked_bag_tiers": [
      {
        "tier_price": {
          "amount": "105.76"
        },
        "bags": [
          {
            "weight": {
              "value": 23
            }
          }
        ]
      }
    ],
    "hand_bag_tiers": [
      {
        "tier_price": {
          "amount": "0"
        },
        "bags": [
          {
            "weight": {
              "value": 23
            }
          }
        ]
      }
    ],
    "included_personal_item": 1,
    "personal_item_tiers": [
      {
        "tier_price": {
          "amount": "0"
        },
        "bags": [
          {
            "weight": {
              "value": 23
            },
            "height": {
              "value": 30
            },
            "width": {
              "value": 15
            },
            "length": {
              "value": 40
            }
          }
        ]
      }
    ]
  },
  "booking_options": {
    "edges": [
      {
        "node": {
          "token": "HkiXZt_XIBQ-Vdh-9xXtismLvFG8-YohIQ3TsGY9GYG2rr8Rt0i2kLSdnL_wbnkbOTuSH-tlRg5wQNzKEJTucjKRUQiDx4VPHku7GBi5Fpvc_jXQKBaVQoCimOZLyYzTRf9j8HgOd9ctZiYRuT54yb9TM9VXSPktr-E-rDAHI3fHEgP1mCsPkB8pwQS0Sp2ZU7cxlWjTF5jslQfiotlWYutMiXR1VnRvH3xMeJzlqxlt2GIaltp884xDlIwgZLoIhpi4e9JXCOeig7l-ku1ozpGyDASL7W-aWb-Gm9Ydyr3gzQpy5lOTSm0s-iaxCRRHAi5bzCXxKJrbfHeB0cDYMPswI1vrTSR9MIkzwoZtkPd1yKjLofaOzYOM1FG-DsqRts8jGb0QjbgfpqU-iHX9OQRmbc43Bi2pxAGOtbUunOAOp9aF7jCgvM_jJxXTiYkc0FdqpIZkCvatDduuQwsompSsa5S0NN0TpUpcErIO9-FBuzvQanpzexQZfMDjhWsYLfbuU9UYh9X6ZNzawkEOoGZgJA6aaSp-lCVTT5HiwcNBMF2FlRXoOgg9AUpOUAr-vCyFvbC1ILHIZFhIh7-cAfxth6b1jYJM2aVBg5EDA9h39WJ_CseJYGMei-ZqFs1djX4akZXfPVOBUrfUAsDg5h70NoUhniV11TH45lzFjZvnFU0NM15A672sG4yj0i_mH3iam7oGnd8K-ju180EFop3Rv9dAIF2jh5H9A-0s1-2A-FTvu1OvifA2zLQyNfTTGVkaZMzjoTufbLQU2p1ZWtm7nkeVfv6kVg2LiBbWUckZ82-OZae-hl1wh4Ds_q85eUU960vyKRU_shAgYiseNBQsHFtRxO1p-L1H0--nK3j2lE0CCj07mXikG_mLsXPa6pK7e4wL5rRuIbRocz90Px7_QwijvN-NIe3wFQ_kufXrxAY47pDx8Dlcl2YSpdfih6Xg17I4SwHfWLIzjpgvje3kHQzXoivXcGuSXbCMarw3hO2k7uCqPGOhsQSLXx11MpPRankPcuo4PdxK6cn0TCUDULe77KhrlubqAZRCTHXrOGTV24Z71duJGb6Hg3Fbe1CVs9f0D7Mv8OMP-QzZDmJo-KEZAlQBbyIP5gEOxysVR4peVmCuYvaM9mD0onEeOAj64eRXykg0bLEMs-KvlRxxnKEllQjEk7tYdvApjjFQ=",
          "booking_url": "/en/booking/?direct=true&locale=en&currency=usd&passengers=1-0-0&token=HkiXZt_XIBQ-Vdh-9xXtismLvFG8-YohIQ3TsGY9GYG2rr8Rt0i2kLSdnL_wbnkbOTuSH-tlRg5wQNzKEJTucjKRUQiDx4VPHku7GBi5Fpvc_jXQKBaVQoCimOZLyYzTRf9j8HgOd9ctZiYRuT54yb9TM9VXSPktr-E-rDAHI3fHEgP1mCsPkB8pwQS0Sp2ZU7cxlWjTF5jslQfiotlWYutMiXR1VnRvH3xMeJzlqxlt2GIaltp884xDlIwgZLoIhpi4e9JXCOeig7l-ku1ozpGyDASL7W-aWb-Gm9Ydyr3gzQpy5lOTSm0s-iaxCRRHAi5bzCXxKJrbfHeB0cDYMPswI1vrTSR9MIkzwoZtkPd1yKjLofaOzYOM1FG-DsqRts8jGb0QjbgfpqU-iHX9OQRmbc43Bi2pxAGOtbUunOAOp9aF7jCgvM_jJxXTiYkc0FdqpIZkCvatDduuQwsompSsa5S0NN0TpUpcErIO9-FBuzvQanpzexQZfMDjhWsYLfbuU9UYh9X6ZNzawkEOoGZgJA6aaSp-lCVTT5HiwcNBMF2FlRXoOgg9AUpOUAr-vCyFvbC1ILHIZFhIh7-cAfxth6b1jYJM2aVBg5EDA9h39WJ_CseJYGMei-ZqFs1djX4akZXfPVOBUrfUAsDg5h70NoUhniV11TH45lzFjZvnFU0NM15A672sG4yj0i_mH3iam7oGnd8K-ju180EFop3Rv9dAIF2jh5H9A-0s1-2A-FTvu1OvifA2zLQyNfTTGVkaZMzjoTufbLQU2p1ZWtm7nkeVfv6kVg2LiBbWUckZ82-OZae-hl1wh4Ds_q85eUU960vyKRU_shAgYiseNBQsHFtRxO1p-L1H0--nK3j2lE0CCj07mXikG_mLsXPa6pK7e4wL5rRuIbRocz90Px7_QwijvN-NIe3wFQ_kufXrxAY47pDx8Dlcl2YSpdfih6Xg17I4SwHfWLIzjpgvje3kHQzXoivXcGuSXbCMarw3hO2k7uCqPGOhsQSLXx11MpPRankPcuo4PdxK6cn0TCUDULe77KhrlubqAZRCTHXrOGTV24Z71duJGb6Hg3Fbe1CVs9f0D7Mv8OMP-QzZDmJo-KEZAlQBbyIP5gEOxysVR4peVmCuYvaM9mD0onEeOAj64eRXykg0bLEMs-KvlRxxnKEllQjEk7tYdvApjjFQ%3D&searchType=return&searchBags=0.0",
          "tracking_pixel": "https://www.kiwi.com/pixel?affilid=skypicker&currency=USD&flightsId=0f640a2b4fd54fdc1a3beafc_0%7C0f640a2b4fd54fdc1a3beafc_1&from=LHR&lang=en&passengers=1&searchBags=0.0&to=MAN&booking_token=HkiXZt_XIBQ-Vdh-9xXtismLvFG8-YohIQ3TsGY9GYG2rr8Rt0i2kLSdnL_wbnkbOTuSH-tlRg5wQNzKEJTucjKRUQiDx4VPHku7GBi5Fpvc_jXQKBaVQoCimOZLyYzTRf9j8HgOd9ctZiYRuT54yb9TM9VXSPktr-E-rDAHI3fHEgP1mCsPkB8pwQS0Sp2ZU7cxlWjTF5jslQfiotlWYutMiXR1VnRvH3xMeJzlqxlt2GIaltp884xDlIwgZLoIhpi4e9JXCOeig7l-ku1ozpGyDASL7W-aWb-Gm9Ydyr3gzQpy5lOTSm0s-iaxCRRHAi5bzCXxKJrbfHeB0cDYMPswI1vrTSR9MIkzwoZtkPd1yKjLofaOzYOM1FG-DsqRts8jGb0QjbgfpqU-iHX9OQRmbc43Bi2pxAGOtbUunOAOp9aF7jCgvM_jJxXTiYkc0FdqpIZkCvatDduuQwsompSsa5S0NN0TpUpcErIO9-FBuzvQanpzexQZfMDjhWsYLfbuU9UYh9X6ZNzawkEOoGZgJA6aaSp-lCVTT5HiwcNBMF2FlRXoOgg9AUpOUAr-vCyFvbC1ILHIZFhIh7-cAfxth6b1jYJM2aVBg5EDA9h39WJ_CseJYGMei-ZqFs1djX4akZXfPVOBUrfUAsDg5h70NoUhniV11TH45lzFjZvnFU0NM15A672sG4yj0i_mH3iam7oGnd8K-ju180EFop3Rv9dAIF2jh5H9A-0s1-2A-FTvu1OvifA2zLQyNfTTGVkaZMzjoTufbLQU2p1ZWtm7nkeVfv6kVg2LiBbWUckZ82-OZae-hl1wh4Ds_q85eUU960vyKRU_shAgYiseNBQsHFtRxO1p-L1H0--nK3j2lE0CCj07mXikG_mLsXPa6pK7e4wL5rRuIbRocz90Px7_QwijvN-NIe3wFQ_kufXrxAY47pDx8Dlcl2YSpdfih6Xg17I4SwHfWLIzjpgvje3kHQzXoivXcGuSXbCMarw3hO2k7uCqPGOhsQSLXx11MpPRankPcuo4PdxK6cn0TCUDULe77KhrlubqAZRCTHXrOGTV24Z71duJGb6Hg3Fbe1CVs9f0D7Mv8OMP-QzZDmJo-KEZAlQBbyIP5gEOxysVR4peVmCuYvaM9mD0onEeOAj64eRXykg0bLEMs-KvlRxxnKEllQjEk7tYdvApjjFQ=",
          "itinerary_provider": {
            "code": "KIWI-BASIC",
            "name": "Kiwi.com",
            "subprovider": null,
            "has_high_probability_of_price_change": false,
            "content_provider": null,
            "provider_category": null,
            "id": "ItineraryProvider:KIWI-BASIC"
          },
          "price": {
            "amount": "125"
          },
          "price_eur": {
            "amount": "106.88"
          },
          "price_locks": {
            "price_locks_curr": [
              {
                "default": false,
                "price": {
                  "amount": "6.25",
                  "rounded_formatted_value": "$6"
                }
              },
              {
                "default": true,
                "price": {
                  "amount": "12.5",
                  "rounded_formatted_value": "$13"
                }
              },
              {
                "default": false,
                "price": {
                  "amount": "31.25",
                  "rounded_formatted_value": "$31"
                }
              }
            ],
            "price_locks_eur": [
              {
                "default": false,
                "price": {
                  "amount": "5.34",
                  "rounded_formatted_value": "5 €"
                }
              },
              {
                "default": true,
                "price": {
                  "amount": "10.69",
                  "rounded_formatted_value": "11 €"
                }
              },
              {
                "default": false,
                "price": {
                  "amount": "26.72",
                  "rounded_formatted_value": "27 €"
                }
              }
            ]
          },
          "kiwi_product": "KIWI_BASIC",
          "disruption_treatment": "NO_PROTECTION",
          "us_rules_apply": false
        }
      },
      {
        "node": {
          "token": "HD4_wbzR8oVG76Bgka71v3vpzQ1aSLQjSPzDpmE6KwIIJ1h7XP5APOqYSDeF0-9X0x0PyOoQN4T7xeqoz7CldYSucyEO1iz6L2ldJi4a2Hj_fI22IXgsX57FMwDDc3sU8ote6QKxRQCaz-1Wr5IClqIiot5eh4zGvzUojY9F7S7o1r9CE5-ls_CivAOE-nWYSp-eKdy7fE9hTkApuqVborXv3uz7gn5r-0vsIo9tp3T0xNvr2bjREpMUUHIEckHHxeUn8-b4USsW_P-o1a6aiMhSZwKWEGHkTBNuri5munjP86RB2O7MvpRdBuUOHU-Th3dV-c4MP-6hPfwnUfJp_o1eZXB6AGQeVvVCcbMjyH47glpKsJ1NYU2fSssmj9tLefLw6JQVosMMaal69EDe3A335ME1NB4a2DxuarurJMYM83JYVn8Q8KjvxveD2J5ZPFS9g1hVR_wtzRZoiMqtxAExU00LLXTdozOzAKsjRosAGpJm2syvdQ6Kg_yae4D2M6zKjLX0uJNAjkhw8KiriJxWqbfACmMMZdebHUYQDrtvDNxWGmNWfd9WYaFkbmt6rOk14B4-bW6gagjw-MsvOCZNoSO9CZn4fXt8FGA_is9jtwit4h1GPM1j5FdhAamFnBMrYBlJO0afHxJRqD3a07IbvGjUK3T20DT-1284rfszoxWFSZAbP4m2NNZ0AowHmO8cozi0kgkyyxKnjpz4qDlg2OCICoSlDeJQhw7SI9DYPq9UPOKJDqMJoAk7O5va-J5o3JD1VlJGB8pHHnRP9IRIc25nQFAn9a4sN5FyffpG4ip5VcEFd42H5j5P_4UCYYyoOdpum8zIk008hLHHsR6aHqeouD8dVJxzNJF9-aXSzP_BkU2M3t6SbpqYUrrSUXz9gt2NJljnrabHkP_3yKbNcfQjNiwL3YkzHnykUho6b0WACHXm1-61X6JouTCTS6HkNg9ehzPk9-D7zcfLg8gOAu_qwbdQCNvuTq-v2fKwQbQ5TNVSht1wZfUSMTC_Axo9ydkO_oD15EIGJkCQiW5KGrtfinWLdFVNpZYcgoMRzqWDeiazByc52L4AUk50G6fHRaoyUUY6MWgOZAIvlJGStrkXB8JuWRVHXNsqOt_iaSCTotH67k37D7xrdeUSsDE3xV9fJHs8eZM5cFZITA8ERXssocE7qbhR3EYjVwajXErqXFDM8yNmrCKEExUgc_ezgMoTov1CIfpwcqZ--3abe9jU64T_d_X3d6AiwPXel7oFCWIS_kKxO0mDTy2BbtzvW4XJjHIZgPaYkxHjm-dZSqdXSNxgpLuP5KghNHjN11ABX07uvSXqkTGG2DWYHOTZm9u6dvezoHzPf_I6tl6YLyLHdSa5N8k8YLawkMOVfAYU4PflWjuLNYC74plsu1xqNuzp1xH1yUsUgji6IiqCG-XDZuF3yPw3L6KBnrPI=",
          "booking_url": "/en/booking/?direct=true&locale=en&currency=usd&passengers=1-0-0&token=HD4_wbzR8oVG76Bgka71v3vpzQ1aSLQjSPzDpmE6KwIIJ1h7XP5APOqYSDeF0-9X0x0PyOoQN4T7xeqoz7CldYSucyEO1iz6L2ldJi4a2Hj_fI22IXgsX57FMwDDc3sU8ote6QKxRQCaz-1Wr5IClqIiot5eh4zGvzUojY9F7S7o1r9CE5-ls_CivAOE-nWYSp-eKdy7fE9hTkApuqVborXv3uz7gn5r-0vsIo9tp3T0xNvr2bjREpMUUHIEckHHxeUn8-b4USsW_P-o1a6aiMhSZwKWEGHkTBNuri5munjP86RB2O7MvpRdBuUOHU-Th3dV-c4MP-6hPfwnUfJp_o1eZXB6AGQeVvVCcbMjyH47glpKsJ1NYU2fSssmj9tLefLw6JQVosMMaal69EDe3A335ME1NB4a2DxuarurJMYM83JYVn8Q8KjvxveD2J5ZPFS9g1hVR_wtzRZoiMqtxAExU00LLXTdozOzAKsjRosAGpJm2syvdQ6Kg_yae4D2M6zKjLX0uJNAjkhw8KiriJxWqbfACmMMZdebHUYQDrtvDNxWGmNWfd9WYaFkbmt6rOk14B4-bW6gagjw-MsvOCZNoSO9CZn4fXt8FGA_is9jtwit4h1GPM1j5FdhAamFnBMrYBlJO0afHxJRqD3a07IbvGjUK3T20DT-1284rfszoxWFSZAbP4m2NNZ0AowHmO8cozi0kgkyyxKnjpz4qDlg2OCICoSlDeJQhw7SI9DYPq9UPOKJDqMJoAk7O5va-J5o3JD1VlJGB8pHHnRP9IRIc25nQFAn9a4sN5FyffpG4ip5VcEFd42H5j5P_4UCYYyoOdpum8zIk008hLHHsR6aHqeouD8dVJxzNJF9-aXSzP_BkU2M3t6SbpqYUrrSUXz9gt2NJljnrabHkP_3yKbNcfQjNiwL3YkzHnykUho6b0WACHXm1-61X6JouTCTS6HkNg9ehzPk9-D7zcfLg8gOAu_qwbdQCNvuTq-v2fKwQbQ5TNVSht1wZfUSMTC_Axo9ydkO_oD15EIGJkCQiW5KGrtfinWLdFVNpZYcgoMRzqWDeiazByc52L4AUk50G6fHRaoyUUY6MWgOZAIvlJGStrkXB8JuWRVHXNsqOt_iaSCTotH67k37D7xrdeUSsDE3xV9fJHs8eZM5cFZITA8ERXssocE7qbhR3EYjVwajXErqXFDM8yNmrCKEExUgc_ezgMoTov1CIfpwcqZ--3abe9jU64T_d_X3d6AiwPXel7oFCWIS_kKxO0mDTy2BbtzvW4XJjHIZgPaYkxHjm-dZSqdXSNxgpLuP5KghNHjN11ABX07uvSXqkTGG2DWYHOTZm9u6dvezoHzPf_I6tl6YLyLHdSa5N8k8YLawkMOVfAYU4PflWjuLNYC74plsu1xqNuzp1xH1yUsUgji6IiqCG-XDZuF3yPw3L6KBnrPI%3D&searchType=return&searchBags=0.0",
          "tracking_pixel": "https://www.kiwi.com/pixel?affilid=skypicker&currency=USD&flightsId=0f640a2b4fd54fdc1a3beafc_0%7C0f640a2b4fd54fdc1a3beafc_1&from=LHR&lang=en&passengers=1&searchBags=0.0&to=MAN&booking_token=HD4_wbzR8oVG76Bgka71v3vpzQ1aSLQjSPzDpmE6KwIIJ1h7XP5APOqYSDeF0-9X0x0PyOoQN4T7xeqoz7CldYSucyEO1iz6L2ldJi4a2Hj_fI22IXgsX57FMwDDc3sU8ote6QKxRQCaz-1Wr5IClqIiot5eh4zGvzUojY9F7S7o1r9CE5-ls_CivAOE-nWYSp-eKdy7fE9hTkApuqVborXv3uz7gn5r-0vsIo9tp3T0xNvr2bjREpMUUHIEckHHxeUn8-b4USsW_P-o1a6aiMhSZwKWEGHkTBNuri5munjP86RB2O7MvpRdBuUOHU-Th3dV-c4MP-6hPfwnUfJp_o1eZXB6AGQeVvVCcbMjyH47glpKsJ1NYU2fSssmj9tLefLw6JQVosMMaal69EDe3A335ME1NB4a2DxuarurJMYM83JYVn8Q8KjvxveD2J5ZPFS9g1hVR_wtzRZoiMqtxAExU00LLXTdozOzAKsjRosAGpJm2syvdQ6Kg_yae4D2M6zKjLX0uJNAjkhw8KiriJxWqbfACmMMZdebHUYQDrtvDNxWGmNWfd9WYaFkbmt6rOk14B4-bW6gagjw-MsvOCZNoSO9CZn4fXt8FGA_is9jtwit4h1GPM1j5FdhAamFnBMrYBlJO0afHxJRqD3a07IbvGjUK3T20DT-1284rfszoxWFSZAbP4m2NNZ0AowHmO8cozi0kgkyyxKnjpz4qDlg2OCICoSlDeJQhw7SI9DYPq9UPOKJDqMJoAk7O5va-J5o3JD1VlJGB8pHHnRP9IRIc25nQFAn9a4sN5FyffpG4ip5VcEFd42H5j5P_4UCYYyoOdpum8zIk008hLHHsR6aHqeouD8dVJxzNJF9-aXSzP_BkU2M3t6SbpqYUrrSUXz9gt2NJljnrabHkP_3yKbNcfQjNiwL3YkzHnykUho6b0WACHXm1-61X6JouTCTS6HkNg9ehzPk9-D7zcfLg8gOAu_qwbdQCNvuTq-v2fKwQbQ5TNVSht1wZfUSMTC_Axo9ydkO_oD15EIGJkCQiW5KGrtfinWLdFVNpZYcgoMRzqWDeiazByc52L4AUk50G6fHRaoyUUY6MWgOZAIvlJGStrkXB8JuWRVHXNsqOt_iaSCTotH67k37D7xrdeUSsDE3xV9fJHs8eZM5cFZITA8ERXssocE7qbhR3EYjVwajXErqXFDM8yNmrCKEExUgc_ezgMoTov1CIfpwcqZ--3abe9jU64T_d_X3d6AiwPXel7oFCWIS_kKxO0mDTy2BbtzvW4XJjHIZgPaYkxHjm-dZSqdXSNxgpLuP5KghNHjN11ABX07uvSXqkTGG2DWYHOTZm9u6dvezoHzPf_I6tl6YLyLHdSa5N8k8YLawkMOVfAYU4PflWjuLNYC74plsu1xqNuzp1xH1yUsUgji6IiqCG-XDZuF3yPw3L6KBnrPI=",
          "itinerary_provider": {
            "code": "KIWI",
            "name": "Kiwi.com",
            "subprovider": null,
            "has_high_probability_of_price_change": false,
            "content_provider": {
              "code": "KIWI"
            },
            "provider_category": null,
            "id": "ItineraryProvider:KIWI"
          },
          "price": {
            "amount": "143"
          },
          "price_eur": {
            "amount": "122.27"
          },
          "price_locks": {
            "price_locks_curr": [
              {
                "default": false,
                "price": {
                  "amount": "7.15",
                  "rounded_formatted_value": "$7"
                }
              },
              {
                "default": true,
                "price": {
                  "amount": "14.3",
                  "rounded_formatted_value": "$14"
                }
              },
              {
                "default": false,
                "price": {
                  "amount": "35.75",
                  "rounded_formatted_value": "$36"
                }
              }
            ],
            "price_locks_eur": [
              {
                "default": false,
                "price": {
                  "amount": "6.11",
                  "rounded_formatted_value": "6 €"
                }
              },
              {
                "default": true,
                "price": {
                  "amount": "12.23",
                  "rounded_formatted_value": "12 €"
                }
              },
              {
                "default": false,
                "price": {
                  "amount": "30.57",
                  "rounded_formatted_value": "31 €"
                }
              }
            ]
          },
          "kiwi_product": "KIWI_GUARANTEE",
          "disruption_treatment": "DISRUPTION_PROTECTION",
          "us_rules_apply": null
        }
      }
    ]
  },
  "travel_hack": {
    "is_true_hidden_city": false,
    "is_virtual_interlining": false,
    "is_throwaway_ticket": false
  },
  "is_vanilla": true,
  "duration": 8100,
  "pnr_count": 1,
  "legacy_id": "0f640a2b4fd54fdc1a3beafc_0-0f640a2b4fd54fdc1a3beafc_1",
  "stopover": {
    "nights_count": 7,
    "arrival": {
      "type": "AIRPORT",
      "city": {
        "name": "Manchester",
        "id": "City:manchester_gb"
      },
      "id": "Station:airport:MAN"
    },
    "departure": {
      "type": "AIRPORT",
      "city": {
        "name": "Manchester",
        "id": "City:manchester_gb"
      },
      "id": "Station:airport:MAN"
    },
    "duration": 9850
  },
  "last_available": {
    "seats_left": 9
  },
  "is_ryanair": false,
  "benefits_data": {
    "automatic_checkin_available": true,
    "instant_chat_support_available": true,
    "disruption_protection_available": true,
    "guarantee_available": true,
    "guarantee_fee": {
      "rounded_amount": "18"
    },
    "guarantee_fee_eur": {
      "amount": "15.391192"
    },
    "search_reference_price": {
      "rounded_amount": "125"
    }
  },
  "is_air_baggage_bundle_eligible": null,
  "from_url": "https://www.kiwi.com/en/search/results/london-united-kingdom/manchester-united-kingdom"
}, // ... Many other Flight details
] 
```

The scraper returns structured flight data with the following comprehensive fields:

**Outbound/Inbound**: Flight direction indicators crucial for understanding round-trip vs one-way journeys. Outbound refers to the departure flight, while Inbound indicates return flights in round-trip bookings.

**ID & Share ID**: Unique identifiers for each flight option. The ID serves as the primary identifier for the specific flight combination, while Share ID enables sharing or referencing the flight option within Kiwi.com's system.

**Price & Price EUR**: Original currency price and standardized Euro equivalent. This dual pricing format allows for easy comparison across different markets and currencies, essential for international travel analysis.

**Provider**: Indicates the booking source or airline provider. This field helps identify whether the flight is bookable directly through the carrier or requires Kiwi.com's virtual interlining service.

**Bags Info**: Detailed baggage allowance and pricing information. Given that many low-cost carriers have complex baggage policies, this field provides crucial cost transparency for complete trip pricing analysis.

**Booking Options**: Available booking channels and methods. This indicates whether the flight can be booked instantly online, requires phone confirmation, or has other booking restrictions.

**Travel Hack**: Identifies special booking techniques like hidden city ticketing or throwaway ticketing. Kiwi.com offers unique search options and travel hacks including self-transfer, hidden cities ticketing, and throwaway ticketing, making this field valuable for understanding unconventional booking strategies.

**Is Vanilla**: Boolean indicator for straightforward, traditional flight bookings versus complex multi-carrier combinations. Vanilla flights are typically easier to manage and have fewer connection risks.

**Duration**: Total journey time including layovers. Critical for evaluating flight convenience and planning connection times, especially important for virtual interlining connections.

**PNR Count**: Number of separate booking records required. Multiple PNRs indicate separate tickets that passengers must manage independently, affecting rebooking and refund policies.

**Stopover**: Information about intermediate airports and layover duration. Essential for understanding journey complexity and connection feasibility.

**Last Available**: Timestamp indicating when the fare was last confirmed available. Important for dynamic pricing analysis and booking urgency assessment.

**Is Ryanair**: Specific flag for Ryanair flights. Given Ryanair's 2024 partnership with Kiwi.com, this field helps identify flights from this major European low-cost carrier with its specific terms and conditions.

**Benefits Data**: Additional perks or services included with the booking. This might include priority boarding, seat selection, or other value-added services that affect total trip value.

**Is Air Baggage Bundle Eligible**: Indicates if bundled baggage options are available. This field helps identify cost-saving opportunities for travelers with luggage needs.

### Usage Guidelines

#### Option 1: Scraping with URLs

To effectively use the Kiwi.com Flight Scraper with URLs, start by constructing proper search URLs. Visit Kiwi.com manually and perform your desired searches, then copy the resulting URLs into the `urls` array in your input configuration. Ensure your URLs include specific origin-destination pairs rather than generic search pages.

Configure proxy settings appropriately for your target market. Using proxies helps ensure accurate local pricing and availability. Set reasonable retry limits and item counts to balance data completeness with scraping efficiency. Enable `ignore_url_failures` to ensure one problematic URL doesn't stop your entire scraping job.

Monitor output quality by checking for consistent data across similar routes. If certain fields frequently return empty values, consider adjusting the `max_retries_per_url` parameter or implementing delays between requests. For large-scale operations, implement rate limiting to avoid overwhelming Kiwi.com's servers.

#### Option 2: Scraping with Search Filters

##### Setting Up Your Search Criteria

Instead of manually creating URLs, use search filters to automatically generate flight searches. This method is ideal for systematic flight data collection across multiple routes and dates.

**Step 1: Define Route and Dates**

- Configure `from_to` parameter by copying the location path from Kiwi.com URL (e.g., `london-united-kingdom/manchester-united-kingdom`)
- Set `departure_date` and `return_date` in YYYY-MM-DD format
- Ensure dates are valid and in the future

**Step 2: Configure Passenger Details**

- Set `adult_num` for the number of adult passengers
- Add `child_num` if traveling with children
- Include `infant_num` for infants (typically under 2 years old)

**Step 3: Apply Flight Preferences**

- Use `stop_num` to filter by number of stops (`"0"` for direct flights, `"1"` for up to 1 stop, `"2"` for up to 2 stops)
- Configure `sort_by` to prioritize results by price, duration, or departure time

##### Best Practices for Filter-Based Scraping

**Route Planning**: Start with popular routes to test your configuration before expanding to less common destinations. Verify that your `from_to` location codes are correct by checking them on Kiwi.com first.

**Date Selection**: When scraping multiple date combinations, run separate sessions for each date pair rather than trying to scrape all dates in one run. This improves data accuracy and makes it easier to track which searches completed successfully.

**Passenger Configuration**: Be aware that passenger numbers significantly affect pricing. If you need data for different passenger configurations (solo travelers vs. families), run separate scraping sessions for each configuration.

**Sorting Strategy**: Use `sort_by` parameter strategically:

- `"price"` (Cheapest) for budget analysis
- `"duration"` (Fastest) for time-sensitive travel planning
- Leave empty for Kiwi.com's recommended results

**Pagination Handling**: The scraper automatically handles pagination up to your `max_items_per_url` limit. For comprehensive market analysis, set this higher (50-100), but be mindful of scraping time and server load.

##### Data Validation and Quality Control

After extraction, verify that:

- Flight routes match your `from_to` configuration
- Departure and return dates align with your specified dates
- Passenger counts in results match your `adult_num`, `child_num`, and `infant_num` settings
- Stop counts correspond to your `stop_num` filter
- Prices are reasonable and consistent with market expectations

##### Common Troubleshooting

**Dynamic Content Issues**: If flight data isn't loading properly, increase `max_retries_per_url` to allow more time for dynamic content to load.

**Invalid Date Combinations**: Ensure `return_date` is after `departure_date` and both dates are in the future. Invalid dates will cause the scraper to fail.

**Location Code Errors**: If searches return no results, verify your `from_to` parameter by manually searching on Kiwi.com and copying the exact location format from the URL.

**Proxy Configuration**: Configure proxy settings to match your target market for accurate pricing. Different regions may show different prices for the same flights.

**Rate Limiting**: For large-scale operations searching multiple routes or dates, implement delays between scraping sessions to avoid overwhelming Kiwi.com's servers.

#### General Best Practices

Always respect Kiwi.com's terms of service and consider reaching out for API access if your usage volume is substantial. Monitor your scraping jobs regularly and adjust parameters based on success rates and data quality. Store extracted data systematically with clear timestamps and search parameters for future reference and analysis.

### Benefits and Applications

The Kiwi.com Flight Scraper delivers significant time savings by automating what would otherwise require manual checking of hundreds of flight combinations. For travel agencies, this enables rapid competitive analysis and dynamic pricing strategies. Market researchers gain access to comprehensive data about route availability, pricing trends, and carrier competition across unconventional flight paths.

Real-world applications include building automated price monitoring systems, conducting academic research on aviation markets, developing travel recommendation engines, and analyzing the impact of virtual interlining on flight accessibility. The detailed baggage and booking information enables total cost of ownership analysis, while travel hack indicators provide insights into alternative booking strategies.

The business value extends to revenue optimization for travel companies, cost savings for corporate travel managers, and enhanced customer service through better flight option awareness. The comprehensive metadata captured by this scraper provides competitive intelligence that manual research cannot efficiently achieve.

### Conclusion

The Kiwi.com Flight Scraper transforms manual flight research into automated, comprehensive data collection. By extracting detailed information from one of the world's most innovative flight booking platforms, it provides valuable insights into modern aviation pricing and availability. Whether you're building travel applications, conducting market research, or optimizing business travel costs, this scraper delivers the structured data needed for informed decision-making in today's complex flight booking landscape.

## Your feedback

We are always working to improve Actors' performance. So, if you have any technical feedback about kiwi.com Flight Search Scraper or simply found a bug, please create an issue on the Actor's Issues tab in Apify Console.

# Actor input Schema

## `urls` (type: `array`):

Add the URLs of the flug list page urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.

## `ignore_url_failures` (type: `boolean`):

If true, the scraper will continue running even if some URLs fail to be scraped after the maximum number of retries is reached.

## `from_to` (type: `string`):

Enter the Location to search for items. Make sure the location is accurate by selecting a from location and to location on the website and then searching. Copy the location value directly from the URL. For example, for the URL 'https://www.kiwi.com/en/search/results/london-united-kingdom/manchester-united-kingdom/2025-11-27/2025-12-03/', the correct location is 'london-united-kingdom/manchester-united-kingdom'.

## `departure_date` (type: `string`):

Select departure date in format YYYY-MM-DD

## `return_date` (type: `string`):

Select rerturn date in format YYYY-MM-DD

## `stop_num` (type: `string`):

Select the number of stops

## `adult_num` (type: `integer`):

Number of adults for filters

## `child_num` (type: `integer`):

Number of children for filters

## `infant_num` (type: `integer`):

Number of infants for filters

## `sort_by` (type: `string`):

Select the sorting option

## `max_items_per_url` (type: `integer`):

Limit the number of items per URL or search filters you want to scrape

## `max_retries_per_url` (type: `integer`):

Limit the number of retries for each URL or search filters if the scrape is detected as a bot or the page fails to load

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

Select proxies to be used by your scraper.

## Actor input object example

```json
{
  "urls": [
    "https://www.kiwi.com/en/search/results/london-united-kingdom/manchester-united-kingdom"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20,
  "max_retries_per_url": 2,
  "proxy": {
    "useApifyProxy": false
  }
}
```

# 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 = {
    "urls": [
        "https://www.kiwi.com/en/search/results/london-united-kingdom/manchester-united-kingdom"
    ],
    "ignore_url_failures": true,
    "max_items_per_url": 20,
    "max_retries_per_url": 2,
    "proxy": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ecomscrape/kiwi-flight-search-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 = {
    "urls": ["https://www.kiwi.com/en/search/results/london-united-kingdom/manchester-united-kingdom"],
    "ignore_url_failures": True,
    "max_items_per_url": 20,
    "max_retries_per_url": 2,
    "proxy": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("ecomscrape/kiwi-flight-search-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 '{
  "urls": [
    "https://www.kiwi.com/en/search/results/london-united-kingdom/manchester-united-kingdom"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20,
  "max_retries_per_url": 2,
  "proxy": {
    "useApifyProxy": false
  }
}' |
apify call ecomscrape/kiwi-flight-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ecomscrape/kiwi-flight-search-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/aolemmpvEAwhQuQNQ/builds/mLUjDgbsUuPZNT6m1/openapi.json
