# Flight Search: Google Flights, Kayak, Momondo & Cheapflights (`bowmark-ai/flight-search`) Actor

Search a flight route on Google Flights, Kayak, Momondo and Cheapflights at once. Give airports and dates, get every matching flight sorted by price, with the cheapest fare on each site and a booking link.

- **URL**: https://apify.com/bowmark-ai/flight-search.md
- **Developed by:** [Bowmark AI](https://apify.com/bowmark-ai) (community)
- **Categories:** Travel, MCP servers, Agents
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $141.00 / 1,000 flight searches

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

### What does Flight Search: Google Flights, Kayak, Momondo & Cheapflights do?

Flight Search looks up a flight route on **Google Flights, Kayak, Momondo and Cheapflights at the same time** and gives you one combined list, sorted by price.

Give it airports and dates. For every search it returns the cheapest fare, the cheapest fare each site showed, and every matching flight with its airlines, stops, times, duration and a link to book it. The same flight listed on several sites appears once, with every site that lists it.

It never books, buys or signs in anywhere. It only reads the public search results.

### Why use it?

- **Find the real cheapest fare.** The four sites often disagree. One search shows you all of them side by side, so you do not have to open four tabs.
- **Track prices on many routes.** Put dozens of routes and dates in one run, schedule it, and export the table to a spreadsheet.
- **AI agents.** Connect it as an MCP server and let an agent search flights while it plans a trip.

### How it works

For each search it reads, at the same time:

1. **Google Flights**
2. **Kayak**
3. **Momondo**
4. **Cheapflights**

Results are merged, duplicates removed, and sorted cheapest first. If one site does not answer in time, the row says which one, so a partial search never looks complete.

### Input

| Field | Required | Description |
|---|---|---|
| `searches` | Yes | One entry per route and date. Each needs `from` and `to` airport codes (like `JFK`) and a `depart` date (`YYYY-MM-DD`, or `"+30"` for 30 days from today). Optional: `return` for a round trip, `cabin` (`economy`, `business`, `first`), `stops` (`any`, `nonstop`, `1`). A line like `"JFK LAX 2026-12-10"` works too. |
| `maxConcurrency` | No | Searches run at once, 1 to 8. Default `4`. |

Example input:

```json
{
  "searches": [
    { "from": "JFK", "to": "LAX", "depart": "2026-12-10" },
    { "from": "LHR", "to": "BCN", "depart": "2026-12-04", "return": "2026-12-07" },
    { "from": "SEA", "to": "DEN", "depart": "+30", "stops": "nonstop" }
  ]
}
```

### Output

One dataset row per search. Download it as JSON, CSV, Excel or HTML, or read it through the Apify API.

```json
{
  "from": "LHR",
  "to": "BCN",
  "depart": "2026-12-04",
  "return": "2026-12-07",
  "status": "found",
  "cheapestPrice": 90,
  "currency": "USD",
  "cheapestAirlines": ["Vueling"],
  "cheapestStops": 0,
  "cheapestDepartTime": "9:55 AM",
  "cheapestArriveTime": "1:10 PM",
  "cheapestUrl": "https://www.kayak.com/flights/LHR-BCN/2026-12-04/2026-12-07?sort=price_a",
  "cheapestBySite": { "cheapflights": 90, "google_flights": 90, "kayak": 90, "momondo": 90 },
  "flightCount": 23,
  "flights": [
    {
      "price": 90, "currency": "USD", "airlines": ["Vueling"], "stops": 0,
      "date": "2026-12-04", "depart": "9:55 AM", "arrive": "1:10 PM", "durationMinutes": 135,
      "tripType": "round trip", "site": "kayak",
      "sites": ["cheapflights", "google_flights", "kayak", "momondo"],
      "url": "https://www.kayak.com/flights/LHR-BCN/2026-12-04/2026-12-07?sort=price_a",
      "sponsored": true
    }
  ],
  "warnings": [],
  "error": null
}
```

`status` is `found`, `not_found` or `error`. `not_found` means every site answered and none listed a flight for that route and date, which is a real answer (no service that day, or a filter like `nonstop` that nothing matches). For a round trip, times and duration describe the outbound flight.

### Pricing

**$0.141 per search**, with no monthly fee. One search covers all four sites and returns every matching flight, not one page of one site.

- A search that comes back `not_found` is charged, because all four sites were still searched.
- A search that fails with an error is not charged.
- Set a spending limit on the run and the Actor stops cleanly when it reaches it.
- On Apify's free plan, each run processes the first 10 searches (10 tool calls per MCP session). Any paid Apify plan removes the limit.

### Use it as an MCP server

This Actor also runs as an MCP server with one tool, `search_flights`. Point any MCP client (Claude, Cursor, ChatGPT, your own agent) at:

```
https://bowmark-ai--flight-search.apify.actor/mcp
```

with your Apify API token as a bearer token. Each tool call is billed like one search in a normal run.

### Limits and good practice

- It reads only **public** search results. It never signs in anywhere and never changes anything.
- Prices come from these four comparison sites, not from airlines' own websites, so an airline's own site can occasionally be cheaper.
- Premium economy is not supported yet. Searches for it are skipped rather than charged.
- Each search takes about 30 to 60 seconds. Use airport codes rather than city names, and dates in the future.
- The sites sometimes include a bus or train connection in a cheap result. Check `airlines` before booking.

### Questions or a wrong result?

Open an issue on the **Issues** tab with the input you used and what you expected. We read every one.

# Actor input Schema

## `searches` (type: `array`):

One entry per route and date, up to 500 per run (10 on Apify's free plan). Each needs from and to airport codes (IATA, like JFK) and a depart date (YYYY-MM-DD, or "+30" for 30 days from today). Add return for a round trip, and optionally cabin (economy, business, first) and stops (any, nonstop, 1). A line like "JFK LAX 2026-12-10" works too.

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

How many searches run in parallel.

## Actor input object example

```json
{
  "searches": [
    {
      "from": "JFK",
      "to": "LAX",
      "depart": "+30"
    }
  ],
  "maxConcurrency": 4
}
```

# Actor output Schema

## `results` (type: `string`):

One row per search: the cheapest fare, the cheapest on each site, and every matching flight.

# 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 = {
    "searches": [
        {
            "from": "JFK",
            "to": "LAX",
            "depart": "+30"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("bowmark-ai/flight-search").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 = { "searches": [{
            "from": "JFK",
            "to": "LAX",
            "depart": "+30",
        }] }

# Run the Actor and wait for it to finish
run = client.actor("bowmark-ai/flight-search").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 '{
  "searches": [
    {
      "from": "JFK",
      "to": "LAX",
      "depart": "+30"
    }
  ]
}' |
apify call bowmark-ai/flight-search --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,bowmark-ai/flight-search"
        }
    }
}
```

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/yhys5jF3iDsPTnKuU/builds/wXjHNyECblLqidOIE/openapi.json
