# Kayak Flight, Hotel & Cheap Destination Finder (`vexaloom-labs/kayak-flight-hotel-and-cheap-destination-finder`) Actor

Searches Kayak for flight prices between two cities, cheap destinations from an origin airport, or hotel rates for a stay, with airline, price, duration and booking link per result.

- **URL**: https://apify.com/vexaloom-labs/kayak-flight-hotel-and-cheap-destination-finder.md
- **Developed by:** [vexaloom-labs](https://apify.com/vexaloom-labs) (community)
- **Categories:** Travel, Automation, Developer tools
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Kayak Flight, Hotel & Cheap Destination Finder

Kayak compares fares and rates from airlines, hotels and hundreds of travel sellers. This actor turns Kayak search pages into clean JSON: live flight itineraries, live hotel rates, cheap destinations from an origin airport, or any Kayak search URL you paste in.

### What this actor does

- **Search flights** between two airports or cities, on chosen dates and cabin, with nonstop/airline/price/duration/alliance filters, sorting and pagination.
- **Search hotels** for a city and stay dates, with star, guest-rating, price, free-cancellation, breakfast, internet, parking, amenity and property-type filters.
- **Explore cheap destinations** from an origin airport, optionally capped by budget, stops and trip length.
- **Scrape specific URLs**: paste Kayak flight, hotel, explore or flight-route URLs and the actor detects what each one is.
- **Rich records**: every itinerary includes all segments, airlines, flight numbers, aircraft, layovers, booking providers, baggage and a booking link; every hotel includes stars, guest rating, review count, coordinates, images, amenities, description and the cheapest provider.
- **Honest source labels**: each record has `accessMethod` (`live`, `flight-routes` or `wayback`) and, for archives, `archivedAt`. Route-page and archived prices are snapshots and are marked with `priceNote`.
- Omits fields that a particular result does not have, so records never contain blank placeholders.

### Modes

| Mode | What it returns |
|------|-----------------|
| `searchFlights` | Live itineraries for one route and date (or date range for a round trip). |
| `searchHotels` | Live hotel rates for a city and check-in/check-out dates. |
| `exploreDeals` | Cheap round-trip destinations from one origin airport. |
| `byUrls` | Records scraped from the Kayak URLs you provide. |

### Output per record

Every record starts with `recordType`, one of `kayakFlight`, `kayakHotel` or `kayakExplore`.

#### Flight records (`searchFlights`, `byUrls` flight URLs, `flight-routes` fallback)

| Field | Description |
|-------|-------------|
| `flightId` | Kayak result identifier (or a stable route/time key for route-page records). |
| `origin` / `destination` | Actual airport codes of the itinerary. |
| `originCity` / `destinationCity` | City names for the airports. |
| `originAirportName` / `destinationAirportName` | Full airport names. |
| `departDate` / `returnDate` | Departure and return dates. |
| `price` | Cheapest fare Kayak displays for the itinerary, in `currency`. |
| `currency` | Price currency for the selected Kayak site. |
| `airline` / `airlines` | First operating airline and all airlines in the itinerary. |
| `stops` / `returnStops` | Connections on the outbound and return legs (0 = nonstop). |
| `duration` / `durationMinutes` | Outbound duration as text and minutes. |
| `totalDurationMinutes` | Outbound + return duration. |
| `departTime` / `arrivalTime` | Outbound departure and arrival times. |
| `returnDepartTime` / `returnArrivalTime` | Return-leg times when present. |
| `outbound` / `return` | Full leg objects with every segment, layover, flight number and aircraft. |
| `flightNumbers`, `aircraft` | Convenience lists across the itinerary. |
| `cabinClass`, `tripType` | Search cabin and one-way/round-trip. |
| `providerName` / `providerCode` | Cheapest booking provider. |
| `providers` | Up to 20 booking options with price, total price, provider and booking link. |
| `baggage` | Carry-on/checked-bag restrictions and fees where Kayak reports them. |
| `deepLink` / `bookingUrl` | Best booking link. `shareableUrl` links back to the itinerary on Kayak. |
| `accessMethod` | `live`, `flight-routes` or `wayback`. |
| `sourceUrl` | URL the record was read from. |
| `priceNote` | Present on fallback records; explains that the price is a route-level snapshot. |
| `archivedAt` | Archive timestamp for `wayback` records. |
| `scrapedAt` | UTC timestamp when the record was produced. |

#### Hotel records (`searchHotels`, `byUrls` hotel URLs)

| Field | Description |
|-------|-------------|
| `hotelId` / `flightId` | Kayak hotel identifier. |
| `hotelName` / `airline` | Hotel name (`airline` is kept for backward compatibility). |
| `stars`, `rating`, `reviewCount`, `ratingCategory` | Star rating and guest reviews. |
| `price` / `totalPrice` | Nightly rate and total stay price. |
| `currency` | Rate currency. |
| `departDate` / `returnDate` | Check-in and check-out. |
| `checkIn` / `checkOut` / `nights` | Stay dates and number of nights. |
| `adults` / `rooms` | Occupancy used for the search. |
| `latitude` / `longitude`, `distanceFromCenter` | Location and distance from the city centre. |
| `city`, `propertyType`, `brandName` | Location and property classification. |
| `imageUrl` / `images` | Primary image and up to 10 image URLs. |
| `description` / `descriptionAttribution` | Hotel description and its source. |
| `amenities` / `amenityCodes` | Amenity names and Kayak codes. |
| `freeCancellation` / `freebies` | Cancellation and freebie information for the cheapest rate. |
| `providerName` / `providerCode`, `providers` | Cheapest provider plus up to 10 provider offers. |
| `bookingUrl` / `deepLink` | Booking link. `detailsUrl` opens the hotel on Kayak. |
| `accessMethod`, `sourceUrl`, `scrapedAt` | Source and timing metadata. |

#### Cheap-destination records (`exploreDeals`)

| Field | Description |
|-------|-------------|
| `flightId` | Origin-destination key. |
| `origin` / `destination` | Origin city/airport code and destination airport code. |
| `originCity` / `destinationCity` / `destinationCountry` | City and country names. |
| `destinationCountryCode`, `departureAirportCode`, `airportName` | Extra location detail. |
| `price` / `currency` | Lowest round-trip price shown. |
| `airline` / `airlineCode` | Airline on the cheapest itinerary. |
| `stops` / `duration` / `durationMinutes` | Connections and maximum itinerary duration. |
| `departDate` / `returnDate` / `tripDays` | Suggested travel dates and length of stay. |
| `imageUrl` / `deepLink` | Destination image and Kayak flight link. |
| `latitude` / `longitude` | Destination airport coordinates. |
| `accessMethod`, `sourceUrl`, `scrapedAt` | Source and timing metadata. |

### Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `mode` | String (select) | `searchFlights` | `searchFlights`, `searchHotels`, `exploreDeals` or `byUrls`. |
| `site` | String (select) | `kayak.com` | Country site, which also sets the currency. |
| `origin` | String | `NYC` | Origin airport or city for flights and explore. |
| `destination` | String | `LON` | Destination airport or city; in hotels mode, the city to stay in. |
| `departDate` | String | — | Departure date or hotel check-in (`YYYY-MM-DD`). Defaults to about 30 days from today. |
| `returnDate` | String | — | Return date or hotel check-out (`YYYY-MM-DD`). Defaults to seven days after departure. |
| `tripType` | String (select) | `round-trip` | `one-way` or `round-trip`. |
| `cabinClass` | String (select) | `economy` | `economy`, `premium-economy`, `business` or `first`. |
| `adults` | Integer | 1 | Adult travellers (1-9). |
| `children` | Integer | 0 | Children aged 2-17 (0-4). |
| `maxStops` | String (select) | `any` | `any`, `0`, `1`, `2` or `3`. |
| `airlines` | Array | – | Two-letter IATA airline codes. |
| `minPrice` / `maxPrice` | Integer | – | Price range in the site currency. |
| `maxDurationMinutes` | Integer | – | Maximum outbound flight duration. |
| `redeyeOnly` | Boolean | false | Overnight flights only. |
| `alliance` | String (select) | `any` | `any`, `STAR_ALLIANCE`, `ONEWORLD` or `SKYTEAM`. |
| `wifiOnly` | Boolean | false | Flights advertising Wi-Fi only. |
| `sortBy` | String (select) | `price` | `price`, `duration`, `departure`, `arrival` or `best`. |
| `hotelStars` | Array | – | Star ratings to include (`1`-`5`). |
| `rooms` | Integer | 1 | Hotel rooms (1-8). |
| `minRating` | String (select) | `any` | `any`, `6`, `7`, `8` or `9`. |
| `freeCancellation`, `freeBreakfast`, `freeInternet`, `freeParking`, `payLater` | Boolean | false | Rate/property filters. |
| `amenities` | Array | – | Kayak amenity IDs (for example `wifi`, `pool`). |
| `propertyType` | String (select) | `any` | `any`, `hotel` or `rental:apartment`. |
| `dealsOnly` | Boolean | false | Member/private deals only. |
| `hotelSortBy` | String (select) | `recommended` | `recommended`, `price_low`, `rating`, `distance` or `stars`. |
| `maxBudget` | Integer | – | Maximum explore-deal price. |
| `minTripDays` / `maxTripDays` | Integer | 1 / 30 | Explore trip-length range. |
| `destinationCountry` | String | – | Keep explore deals in one country (name or ISO code). |
| `urls` | Array | – | Kayak URLs for `byUrls` mode. |
| `maxItems` | Integer | 50 | Maximum records for the whole run (1-1000). |

#### Example: round-trip flight search

```json
{
  "mode": "searchFlights",
  "origin": "NYC",
  "destination": "LON",
  "departDate": "2026-12-10",
  "returnDate": "2026-12-17",
  "tripType": "round-trip",
  "cabinClass": "economy",
  "adults": 1,
  "maxStops": "0",
  "airlines": ["BA", "VS"],
  "sortBy": "price",
  "maxItems": 50
}
```

#### Example: hotels with filters

```json
{
  "mode": "searchHotels",
  "destination": "London",
  "departDate": "2026-12-10",
  "returnDate": "2026-12-17",
  "adults": 2,
  "rooms": 1,
  "hotelStars": ["4", "5"],
  "minRating": "8",
  "freeCancellation": true,
  "hotelSortBy": "price_low",
  "maxItems": 40
}
```

#### Example: cheap destinations under a budget

```json
{
  "mode": "exploreDeals",
  "origin": "NYC",
  "maxBudget": 500,
  "maxStops": "0",
  "minTripDays": 4,
  "maxTripDays": 10,
  "destinationCountry": "Spain",
  "maxItems": 30
}
```

#### Example: saved URLs

```json
{
  "mode": "byUrls",
  "urls": [
    "https://www.kayak.com/flights/NYC-LON/2026-12-10/2026-12-17",
    "https://www.kayak.com/hotels/London/2026-12-10/2026-12-17/2adults"
  ],
  "maxItems": 60
}
```

### How live access works

Kayak renders search results with JavaScript and streams them from its own internal search API. The actor opens the search in a real browser, captures the page's own session, and then reads the result pages directly. No account, cookie or proxy setup is required. If the direct search is blocked, the actor automatically retries through the platform's datacenter proxy.

When `origin` or `destination` is a city name such as `New York`, the actor resolves it to Kayak's metro or airport code (`NYC`) before searching. Three-letter IATA codes are used as-is.

If a **flight** search cannot be read live, the actor falls back to Kayak's public flight-route page for the same route. If that page is unavailable, it tries the Wayback Machine copy of the route page. Fallback records are real Kayak data but are **route-level snapshots, not date-specific live fares**; they carry `accessMethod` = `flight-routes` or `wayback` and a `priceNote` saying so. Hotel and explore searches have no such fallback and report the block in the run status message.

### Limitations

- Hotel and explore searches have no fallback when Kayak blocks live access; the run status message says when that happens.
- Route-page and Wayback fallback records are route-level snapshots. Price and airline filters apply to them; stop, duration and cabin filters and sorting do not.
- Kayak's hotel URL accepts adults and rooms, not child ages, so hotel searches use adults and rooms only.
- Time-of-day flight filters are not exposed because Kayak rejects them in the filter syntax; use `sortBy` `departure` or `arrival` instead.

### Use cases

- **Fare comparison**: compare airlines and providers for a route and dates.
- **Travel inspiration**: find cheap destinations from your home airport under a budget.
- **Hotel rate checks**: pull nightly and total rates with ratings and amenities.
- **Price tracking**: schedule the same search and store each run's dataset.
- **URL re-scraping**: turn saved Kayak search links into structured data.

### FAQ

**Do I need a Kayak account or API key?**
No. The actor reads publicly available search results and needs no credentials.

**Which currency will prices be in?**
The currency of the selected Kayak country site. Set `site` to `kayak.co.uk` for GBP, `kayak.de` for EUR, and so on.

**Why do some records say `accessMethod: flight-routes`?**
Kayak blocked the live search for that route. The record comes from Kayak's flight-route page and is a snapshot, so treat its price as indicative and re-run later for a live fare.

**What does `price` mean for hotels?**
`price` is the nightly rate from the cheapest provider; `totalPrice` is the total for the stay.

**Does `stops: 0` mean nonstop?**
Yes. Flights also have `returnStops` for the return leg.

**Can I search one-way flights?**
Yes. Set `tripType` to `one-way`; `returnDate` is ignored.

**How current are prices?**
`live` records are read from Kayak during the run. Route-page and `wayback` records are snapshots and can be stale; see `priceNote` and `archivedAt`.

**Is this affiliated with Kayak?**
No. This is an independent data extraction tool and is not affiliated with, endorsed by, or sponsored by Kayak Software Corporation.

# Actor input Schema

## `mode` (type: `string`):

Search live flights, search live hotel rates, discover cheap destinations from an airport, or scrape specific Kayak URLs.

## `site` (type: `string`):

Country site used for the search. It determines the currency and point of sale (for example kayak.co.uk returns GBP).

## `origin` (type: `string`):

Airport or city code to fly from, for example NYC, JFK or New York. Used by flights and cheap-destination modes.

## `destination` (type: `string`):

Airport or city code to fly to, for example LON, LHR or London. In hotels mode this is the city or area to stay in.

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

Departure date (flights) or check-in date (hotels) in YYYY-MM-DD format. Leave empty for about 30 days from today.

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

Return date (flights) or check-out date (hotels) in YYYY-MM-DD format. Leave empty for seven days after departure.

## `tripType` (type: `string`):

One-way or round-trip flight.

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

Cabin class for the flight search.

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

Number of adult travellers (1-9).

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

Number of children aged 2-17. Kayak is searched with child ages 8, 10, 12 and 14 for 1-4 children.

## `maxStops` (type: `string`):

Limit the number of connections. Applies to flights and cheap-destination searches.

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

Only include these airlines, using two-letter IATA codes such as DL, UA or BA. Leave empty for all airlines.

## `minPrice` (type: `integer`):

Minimum price per result in the site currency. Leave empty for no minimum.

## `maxPrice` (type: `integer`):

Maximum price per result (fare for flights, nightly rate for hotels) in the site currency.

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

Maximum outbound flight duration in minutes, for example 720 for 12 hours.

## `redeyeOnly` (type: `boolean`):

Return only overnight (red-eye) itineraries.

## `alliance` (type: `string`):

Restrict results to one airline alliance.

## `wifiOnly` (type: `boolean`):

Return only flights that advertise in-flight Wi-Fi.

## `sortBy` (type: `string`):

Order of flight results.

## `hotelStars` (type: `array`):

Only include hotels with these star ratings (1-5). Leave empty for all star ratings.

## `rooms` (type: `integer`):

Number of hotel rooms (1-8).

## `minRating` (type: `string`):

Minimum guest review score shown by Kayak.

## `freeCancellation` (type: `boolean`):

Only show rates that can be cancelled free of charge.

## `freeBreakfast` (type: `boolean`):

Only show rates that include free breakfast.

## `freeInternet` (type: `boolean`):

Only show properties with free internet.

## `freeParking` (type: `boolean`):

Only show properties with free parking.

## `payLater` (type: `boolean`):

Only show rates that can be paid at the property.

## `amenities` (type: `array`):

Kayak amenity IDs that must be present, for example wifi, pool, fitness, parking.

## `propertyType` (type: `string`):

Restrict hotel results to hotels or apartment-style rentals.

## `dealsOnly` (type: `boolean`):

Only show properties flagged as having member or private deals.

## `hotelSortBy` (type: `string`):

Order of hotel results.

## `maxBudget` (type: `integer`):

For cheap-destination mode, the maximum round-trip price per person in the site currency.

## `minTripDays` (type: `integer`):

Minimum number of days for an explore deal.

## `maxTripDays` (type: `integer`):

Maximum number of days for an explore deal.

## `destinationCountry` (type: `string`):

Optional country name or ISO code to keep only deals in that country, for example Spain or ES.

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

Flight, hotel or explore URLs copied from your browser, for example https://www.kayak.com/flights/NYC-LON/2026-12-10/2026-12-17.

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

Maximum number of records to save across the whole run.

## Actor input object example

```json
{
  "mode": "searchFlights",
  "site": "kayak.com",
  "origin": "NYC",
  "destination": "LON",
  "tripType": "round-trip",
  "cabinClass": "economy",
  "adults": 1,
  "children": 0,
  "maxStops": "any",
  "redeyeOnly": false,
  "alliance": "any",
  "wifiOnly": false,
  "sortBy": "price",
  "rooms": 1,
  "minRating": "any",
  "freeCancellation": false,
  "freeBreakfast": false,
  "freeInternet": false,
  "freeParking": false,
  "payLater": false,
  "propertyType": "any",
  "dealsOnly": false,
  "hotelSortBy": "recommended",
  "minTripDays": 1,
  "maxTripDays": 30,
  "maxItems": 3
}
```

# Actor output Schema

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

Dataset containing all scraped flight, hotel and destination-deal records.

## `dataset` (type: `string`):

Interactive view of the same records in the Apify Console.

# 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 = {
    "mode": "searchFlights",
    "site": "kayak.com",
    "origin": "NYC",
    "destination": "LON",
    "tripType": "round-trip",
    "cabinClass": "economy",
    "adults": 1,
    "children": 0,
    "maxStops": "any",
    "redeyeOnly": false,
    "alliance": "any",
    "wifiOnly": false,
    "sortBy": "price",
    "rooms": 1,
    "minRating": "any",
    "freeCancellation": false,
    "freeBreakfast": false,
    "freeInternet": false,
    "freeParking": false,
    "payLater": false,
    "propertyType": "any",
    "dealsOnly": false,
    "hotelSortBy": "recommended",
    "minTripDays": 1,
    "maxTripDays": 30,
    "maxItems": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("vexaloom-labs/kayak-flight-hotel-and-cheap-destination-finder").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 = {
    "mode": "searchFlights",
    "site": "kayak.com",
    "origin": "NYC",
    "destination": "LON",
    "tripType": "round-trip",
    "cabinClass": "economy",
    "adults": 1,
    "children": 0,
    "maxStops": "any",
    "redeyeOnly": False,
    "alliance": "any",
    "wifiOnly": False,
    "sortBy": "price",
    "rooms": 1,
    "minRating": "any",
    "freeCancellation": False,
    "freeBreakfast": False,
    "freeInternet": False,
    "freeParking": False,
    "payLater": False,
    "propertyType": "any",
    "dealsOnly": False,
    "hotelSortBy": "recommended",
    "minTripDays": 1,
    "maxTripDays": 30,
    "maxItems": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("vexaloom-labs/kayak-flight-hotel-and-cheap-destination-finder").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 '{
  "mode": "searchFlights",
  "site": "kayak.com",
  "origin": "NYC",
  "destination": "LON",
  "tripType": "round-trip",
  "cabinClass": "economy",
  "adults": 1,
  "children": 0,
  "maxStops": "any",
  "redeyeOnly": false,
  "alliance": "any",
  "wifiOnly": false,
  "sortBy": "price",
  "rooms": 1,
  "minRating": "any",
  "freeCancellation": false,
  "freeBreakfast": false,
  "freeInternet": false,
  "freeParking": false,
  "payLater": false,
  "propertyType": "any",
  "dealsOnly": false,
  "hotelSortBy": "recommended",
  "minTripDays": 1,
  "maxTripDays": 30,
  "maxItems": 3
}' |
apify call vexaloom-labs/kayak-flight-hotel-and-cheap-destination-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,vexaloom-labs/kayak-flight-hotel-and-cheap-destination-finder"
        }
    }
}
```

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/emd5iwBYTATSKu8eg/builds/pC10E3fvhtVcxxnKW/openapi.json
