# Kiwi Flights — Cheap Search (`quakerish_quodlibet/kiwi-flights-cheap`) Actor

FROM $0.10 / 1,000 RESULTS

Search Kiwi.com for flights by origin/destination/date and return matching itineraries with prices, segments, and a booking link.

- **URL**: https://apify.com/quakerish_quodlibet/kiwi-flights-cheap.md
- **Developed by:** [Nout v L](https://apify.com/quakerish_quodlibet) (community)
- **Categories:** Travel, Developer tools, Integrations
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.10 / 1,000 results

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

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

## What's an Apify Actor?

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

## Kiwi Flights — Cheap Search

Search Kiwi.com for flights and get back matching itineraries with prices, segments, durations, and a booking deep link for each result.

### What it does

Given one or more origin airports, one or more destination airports, and departure dates, the Actor queries Kiwi.com's flight search API and returns the matching itineraries as structured rows.

### Input

| Field | Required | Default | Notes |
|---|---|---|---|
| `origins` | yes | — | One or more 3-letter IATA airport codes (e.g. `["AMS", "EIN"]`). |
| `destinations` | yes | — | One or more 3-letter IATA airport codes (e.g. `["BCN"]`). |
| `departDate` | yes | — | `YYYY-MM-DD`. |
| `returnDate` | no | — | `YYYY-MM-DD`. Omit for one-way. |
| `adults` / `children` / `infants` | no | `1` / `0` / `0` | Passenger counts. |
| `cabinClass` | no | `economy` | `economy` / `premium_economy` / `business` / `first`. |
| `maxStops` | no | — | 0 = direct only. |
| `maxDurationMinutes` | no | — | Filter: max journey duration. |
| `maxPriceEur` | no | — | Filter: max price per passenger. |
| `airlines` / `excludeAirlines` | no | — | Filter by IATA airline code. |
| `limit` | no | `25` | Cap on results. Capped at 200 by the upstream API. |
| `subId` | no | — | Optional per-run attribution tag, appended to the booking link. |

### Output

One row per matching itinerary:

```json
{
  "id": "abc123",
  "price": { "amount": 142.50, "currency": "EUR" },
  "totalDurationMinutes": 235,
  "outbound": { "durationMinutes": 235, "segments": [ /* … */ ] },
  "inbound": { /* … */ },
  "bookingUrl": "https://www.kiwi.com/…",
  "cached": false
}
```

`bookingUrl` is a direct deep link to the itinerary on Kiwi.com. `cached` is `true` when the row was served from the in-process cache (warm-container repeat query).

### How to run

#### Apify CLI

```bash
apify call <ACTOR_ID> -i '{"origins":["AMS"],"destinations":["BCN"],"departDate":"2026-07-01","limit":5}'
```

#### Apify API

```bash
curl -X POST https://api.apify.com/v2/acts/<ACTOR_ID>/runs \
  -H "Authorization: Bearer <APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"origins":["AMS"],"destinations":["BCN"],"departDate":"2026-07-01","limit":5}'
```

The run's dataset is available at the URL printed in the response, or via the API at `/v2/actor-runs/<run-id>/dataset`.

### Data handling

The Actor does not persist input or output beyond the run's default dataset. No third-party services receive the input. The Actor makes outbound HTTPS calls to Kiwi.com's flight-search API to fulfill the query.

### License

MIT. Use at your own risk. Respect Kiwi.com's terms of service when running this Actor.

# Actor input Schema

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

One or more 3-letter IATA airport codes the passenger can depart from (e.g. \['AMS', 'EIN']).

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

One or more 3-letter IATA airport codes to fly into (e.g. \['BCN']).

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

Outbound departure date in YYYY-MM-DD.

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

Return flight date. Omit for one-way searches.

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

Number of adult passengers (12+).

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

Number of child passengers (2-11).

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

Number of infant passengers (under 2).

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

Preferred cabin class.

## `maxStops` (type: `integer`):

Filter: maximum number of stops (0 = direct only).

## `maxDurationMinutes` (type: `integer`):

Filter: maximum total journey duration in minutes.

## `maxPriceEur` (type: `number`):

Filter: maximum total price per passenger in EUR.

## `airlines` (type: `array`):

Filter: only these airline codes (e.g. \['KL', 'AF']).

## `excludeAirlines` (type: `array`):

Filter: hide these airline codes.

## `limit` (type: `integer`):

Cap on the number of results returned. Capped at 200 by the upstream API.

## `subId` (type: `string`):

Optional sub-id merged into the TravelPayouts marker as `<affiliateId>.<subId>`. Use for per-run attribution.

## Actor input object example

```json
{
  "origins": [
    "AMS",
    "EIN"
  ],
  "destinations": [
    "BCN"
  ],
  "departDate": "2026-07-01",
  "returnDate": "2026-07-08",
  "adults": 1,
  "children": 0,
  "infants": 0,
  "cabinClass": "economy",
  "airlines": [
    "KL",
    "AF"
  ],
  "excludeAirlines": [
    "FR"
  ],
  "limit": 25
}
```

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("quakerish_quodlibet/kiwi-flights-cheap").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("quakerish_quodlibet/kiwi-flights-cheap").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 '{}' |
apify call quakerish_quodlibet/kiwi-flights-cheap --silent --output-dataset

```

## MCP server setup

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

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/XeSxZHpTvchrflJAD/builds/mJnQOug6ydubHxMI4/openapi.json
