# KAYAK Car Rental Scraper (`solidcode/kayak-scraper`) Actor

\[💰 $1.3 / 1K] Extract car rental offers from KAYAK — vehicle class, rental agency, daily and total prices, mileage and fuel policies, cancellation terms, and direct booking links. Search by location and dates or paste KAYAK URLs.

- **URL**: https://apify.com/solidcode/kayak-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** Travel, Automation, Developer tools
- **Stats:** 50 total users, 16 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.30 / 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.
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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## KAYAK Car Rental Scraper

Pull live car-rental offers from KAYAK at scale — vehicle class, rental agency, booking provider, daily and total prices, mileage and fuel policies, free-cancellation terms, and a direct booking link for every offer. Search by city, airport code, or a pasted KAYAK URL, with one-way trips, custom pickup and return times, and 20 pricing currencies all supported. Built for travel agencies, price-comparison sites, and fleet and corporate-travel analysts who need clean, structured rental pricing without hand-crafting KAYAK URLs or babysitting a browser.

### Why This Scraper?

- **Both the rental agency and the booking provider on every offer** — each row names the agency (Hertz, Avis, Budget, Enterprise…) *and* the provider it's bookable through (Priceline, Expedia, the agency direct…), so you see who supplies the car and who sells it.
- **9 car classes you can filter** — Small/Economy, Medium/Intermediate, Large/Full-size, SUV, Van/Minivan, Luxury, Special, Pickup Truck, and Convertible.
- **One-way rentals fully supported** — set a different drop-off location and the actor builds the correct cross-city search, no manual URL surgery.
- **20 pricing currencies, plus the currency the agency actually bills in** — price a whole result set in USD, EUR, GBP, JPY, AED or 15 more codes at live conversion rates. Every row carries both `currencyCode` (the currency of the price shown) and `providerCurrencyCode` (what the rental company itself charges), so you always know who is doing the converting.
- **Complete rental terms per offer** — mileage policy (limited or unlimited, with the actual mileage cap), fuel policy, known fees, payment type (prepay vs. pay-at-counter), and free-cancellation terms — all inline, no second lookup.
- **Direct booking link on every row** — a deep `bookingUrl` that lands on the exact offer, plus the supplier's own `siteUrl`, ready to drop into a "Book now" button.
- **Whole-market coverage from a single search** — set Max Results to 0 and the actor paginates a city to exhaustion. Published inventory measured in August 2026: 1,835 offers in Los Angeles, 1,748 in Miami, 1,173 in New York, 705 in Atlanta.
- **4 sort modes, with a genuine cheapest-first guarantee** — Recommended, Cheapest first, Closest pickup, and Best value. Cheapest first is ordered row by row, so row 1 really is the lowest total for your dates rather than merely the cheapest car group.
- **Zero hand-built URLs** — type a city or airport code and pick your dates; the actor resolves the location and assembles the search for you, or paste any KAYAK car-rental URL to scrape it directly.

### Use Cases

**Travel Agencies & OTAs**

- Power a car-rental comparison page with live agency-vs-provider pricing
- Surface the cheapest qualifying offer per car class for a client itinerary
- Quote one-way rentals between two cities in seconds
- Show full rental terms (mileage, fuel, cancellation) before a customer commits

**Price Monitoring & Revenue Management**

- Track daily and total rental rates across agencies for the same dates
- Watch how prices shift by pickup time, lead time, and day of week
- Benchmark your fleet's pricing against Hertz, Avis, Budget, and Enterprise
- Detect when a competitor undercuts you on a key route

**Corporate & Fleet Travel**

- Build approved-supplier rate sheets for employee bookings
- Compare prepay vs. pay-at-counter totals for expense forecasting
- Identify unlimited-mileage offers for long-distance assignments
- Audit which agencies serve a given airport and at what price

**Market Research & Data Products**

- Analyze car-class availability and pricing across destinations
- Map which booking providers carry which agencies in each market
- Feed structured rental data into dashboards, BI tools, and pricing models
- Study seasonal and day-of-week pricing patterns at scale

### Getting Started

#### Simple — search a city for two weeks out

Just a pickup location; dates default to two weeks from today for a one-week rental.

```json
{
    "pickupLocation": "Los Angeles"
}
```

#### Filtered — SUVs only, cheapest first, specific dates

```json
{
    "pickupLocation": "LAX",
    "pickupDate": "2026-07-15",
    "returnDate": "2026-07-22",
    "carType": ["SUV"],
    "sortBy": "cheapest",
    "maxResults": 100
}
```

#### Advanced — one-way rental, custom pickup and return times

```json
{
    "pickupLocation": "Los Angeles",
    "dropoffLocation": "San Diego",
    "pickupDate": "2026-08-01",
    "pickupTime": "08:00",
    "returnDate": "2026-08-05",
    "returnTime": "18:00",
    "sortBy": "best",
    "currency": "USD",
    "maxResults": 200
}
```

#### Power-user — scrape pasted KAYAK URLs directly

```json
{
    "startUrls": [
        "https://www.kayak.com/cars/Los-Angeles,CA/2026-07-15/2026-07-22"
    ],
    "maxResults": 0
}
```

### Input Reference

#### Search

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `pickupLocation` | string | `"Los Angeles"` | City, airport code, or place to pick up the car (e.g. "Los Angeles", "LAX", "Paris"). |
| `dropoffLocation` | string | *(empty)* | Where to return the car for a one-way rental (e.g. "San Diego", "SAN"). Leave empty to return it to the pickup location. |

#### Dates & Driver

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `pickupDate` | string | *(today + 14 days)* | Pickup date in YYYY-MM-DD format. Dates in the past are automatically moved forward. |
| `pickupTime` | select | `10:00 AM` | Time of day you pick up the car (hourly options from Midnight to 11:00 PM). |
| `returnDate` | string | *(pickup + 7 days)* | Return date in YYYY-MM-DD format. Must be on or after the pickup date. |
| `returnTime` | select | `10:00 AM` | Time of day you return the car (hourly options from Midnight to 11:00 PM). |
| `driverAge` | integer | `30` | Age of the main driver (18–99), recorded on the search URL every row carries. KAYAK's US site quotes the same cars at the same prices for every age, so this labels your export rather than changing it. |

#### Filters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `sortBy` | select | `Recommended` | Result ranking: Recommended, Cheapest first, Closest pickup, or Best value. |
| `carType` | multi-select | *(all types)* | Keep only these vehicle classes: Small/Economy, Medium/Intermediate, Large/Full-size, SUV, Van/Minivan, Luxury, Special, Pickup truck, Convertible. Leave empty for every car type. |

#### Localization

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `currency` | select | `US Dollar (USD)` | Prices every result in the currency you pick, from 20 ISO options (USD, EUR, GBP, JPY, AED and 15 more). Each row also reports the currency the rental company itself bills in, whenever that differs. |

#### Options

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `maxResults` | integer | `50` | Maximum rental offers to collect per search. Set to 0 to collect every available offer. Pages are sized to the limit you set, so a small value returns close to that many offers — with a modest overshoot (measured at up to 25%) because a page already in flight is never cut short. |

#### Advanced

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `startUrls` | string\[] | `[]` | Paste full KAYAK car-rental result URLs to scrape them directly. When provided, these override the search fields above. Expired dates are automatically moved forward. |

### Output

One row per rental offer (a single car × provider pairing). Here's a representative result:

```json
{
    "resultId": "c-9f3a17b2e4",
    "searchId": "Rk0aXyZ9pQ",
    "sourceType": "AGENCY",
    "providerName": "Priceline",
    "providerCode": "PRIC",
    "agencyName": "Hertz",
    "agencyCode": "ZE",
    "carType": "Toyota Corolla or similar",
    "carTypeGroups": ["small", "economy"],
    "pricePerDay": { "price": 36, "currency": "USD", "localizedPrice": "$36" },
    "priceTotal": { "price": 254, "currency": "USD", "localizedPrice": "$254" },
    "price": { "price": 254, "currency": "USD", "localizedPrice": "$254" },
    "currencyCode": "USD",
    "providerCurrencyCode": "USD",
    "knownFees": [{ "feeType": "securityDeposit", "feeStatus": "notIncluded", "isIncludedInTotal": false }],
    "paymentType": "PAY_AT_COUNTER",
    "mileagePolicyType": "UNLIMITED",
    "mileageTotalLimit": "Unlimited mileage",
    "fuelPolicy": { "type": "FULL_TO_FULL" },
    "freeCancellationPolicy": { "isFree": true, "deadline": "2026-07-14" },
    "pickupLocation": "Los Angeles",
    "pickupDate": "2026-07-15",
    "returnDate": "2026-07-22",
    "pickupLocationDetails": { "name": "Los Angeles Intl Airport (LAX)", "displayDistance": "At airport" },
    "bookingUrl": "https://www.kayak.com/in?...",
    "siteUrl": "https://www.hertz.com/...",
    "vehicleDetail": { "doors": 4, "seats": 5, "bags": 2, "transmission": "AUTOMATIC" },
    "image": "https://content.r9cdn.net/...",
    "sourceUrl": "https://www.kayak.com/cars/Los-Angeles,CA-c16078/2026-07-15/2026-07-22?sort=rank_a"
}
```

#### Core Fields

| Field | Type | Description |
|-------|------|-------------|
| `resultId` | string | Unique identifier for this offer |
| `searchId` | string | KAYAK search identifier the offer came from |
| `sourceType` | string | Offer source category (e.g. agency rate type) |
| `agencyName` | string | Rental agency display name (Hertz, Avis, Budget…) |
| `agencyCode` | string | Rental agency code |
| `providerName` | string | Booking provider the offer is sold through |
| `providerCode` | string | Booking provider code |
| `carType` | string | Vehicle name and class (e.g. "Toyota Corolla or similar") |
| `carTypeGroups` | string\[] | Vehicle category groups (small, suv, luxury…) |
| `vehicleDetail` | object | Vehicle specifications (doors, seats, bags, transmission class) where provided by KAYAK |
| `image` | string | Vehicle image URL |

#### Pricing & Fees

| Field | Type | Description |
|-------|------|-------------|
| `pricePerDay` | object | Daily price (amount, currency, localized display string) |
| `priceTotal` | object | Total price for the full rental period |
| `price` | object | Primary price KAYAK highlights for the offer |
| `currencyCode` | string | ISO currency code the prices on this row are actually in |
| `providerCurrencyCode` | string | Currency the rental provider itself bills in, when it differs from the displayed price |
| `knownFees` | array | Fee line items KAYAK publishes for the offer, each with its type and whether the total already includes it (most commonly a security deposit) |
| `paymentType` | string | Payment mode (prepay, pay-at-counter, deposit) |

#### Rental Policies

| Field | Type | Description |
|-------|------|-------------|
| `mileagePolicyType` | string | Mileage policy: limited or unlimited |
| `mileageTotalLimit` | string | Human-readable mileage limit text |
| `fuelPolicy` | object | Fuel policy details (e.g. full-to-full) |
| `freeCancellationPolicy` | object | Free-cancellation terms and deadline |

#### Location & Trip

| Field | Type | Description |
|-------|------|-------------|
| `pickupLocation` | string | Requested pickup location |
| `pickupDate` | string | Pickup date (ISO) |
| `returnDate` | string | Return date (ISO) |
| `pickupLocationDetails` | object | Location context (airport name/code, distance from terminal) |

#### Links

| Field | Type | Description |
|-------|------|-------------|
| `bookingUrl` | string | Deep link to book this specific offer |
| `siteUrl` | string | Supplier's own website URL |
| `sourceUrl` | string | The KAYAK search URL the row came from |

### Tips for Best Results

- **Treat the quoted total as the 26–65 rate** — KAYAK's US listings carry one price per offer for every driver age, and a young-driver or senior surcharge is added by the rental agency at the counter, so budget for it separately on under-25 and over-70 renters.
- **When filtering to a rare car class, keep Max Results generous** — car-type filtering is applied across the whole result set, so a narrow class like Convertible or Special may sit deep in the list; allow enough results for the matches to surface.
- **Use Cheapest first to find the price floor** — it ranks offers low-to-high so the very first rows are the lowest qualifying totals for your dates.
- **Match pickup and return times to the real trip** — KAYAK returns different inventory and pricing for an 8:00 AM pickup versus a 6:00 PM pickup, so set the times you'd actually rent at.
- **Set Max Results to 0 to capture a whole market** — the actor paginates to exhaustion. A large city runs to roughly 1,000–1,900 offers across every agency and class (Los Angeles measured at 1,835 in August 2026), so allow budget and time for the full sweep.
- **Pick your currency once and every price follows it** — set `currency` to any of the 20 supported codes and the whole result set is priced in it, converted for you. `currencyCode` on each row always states the currency that row's prices are in, and `providerCurrencyCode` tells you what the rental company itself bills in, which is useful when you want to know who is doing the conversion.
- **Paste competitor or saved KAYAK URLs** — the Advanced URLs field accepts full result links and even heals expired dates, so old bookmarks keep working without edits.

### Pricing

**From $1.30 per 1,000 results** — pay only for the offers you actually receive. No compute charges.

Apify's loyalty discount tiers lower your rate automatically as your account tier rises:

| Results | No discount | Bronze | Silver | Gold |
|---------|-------------|--------|--------|------|
| 100 | $0.15 | $0.14 | $0.14 | $0.13 |
| 1,000 | $1.55 | $1.45 | $1.40 | $1.30 |
| 10,000 | $15.50 | $14.50 | $14.00 | $13.00 |
| 100,000 | $155.00 | $145.00 | $140.00 | $130.00 |

A "result" is a single rental offer row in your dataset. These tiered rates take effect on **6 September 2026**; until then every account pays the Gold rate of $1.30 per 1,000 results. Apify platform plan fees may apply separately.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

This actor is designed for legitimate travel research, price comparison, and market analysis. You are responsible for complying with applicable laws and KAYAK's Terms of Service. Use the data responsibly, respect rate and volume limits, and do not use it for spam, misrepresentation, or any unlawful purpose. Always verify final prices and rental terms with the agency before booking.

# Actor input Schema

## `pickupLocation` (type: `string`):

City, airport code, or place to pick up the car (e.g. 'Los Angeles', 'LAX', 'Paris'). Leave the Advanced URLs field empty to use this.

## `dropoffLocation` (type: `string`):

Where to return the car for a one-way rental (e.g. 'San Diego', 'SAN'). Leave empty to return the car to the same place you picked it up.

## `pickupDate` (type: `string`):

Date you pick up the car, in YYYY-MM-DD format (e.g. 2026-07-15). Leave empty to default to two weeks from today. Dates in the past are automatically moved forward.

## `pickupTime` (type: `string`):

Time of day you pick up the car.

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

Date you return the car, in YYYY-MM-DD format. Leave empty to default to one week after the pickup date. Must be on or after the pickup date.

## `returnTime` (type: `string`):

Time of day you return the car.

## `driverAge` (type: `integer`):

Age of the main driver. It is written into the KAYAK search URL the run uses and sent with the search, and that URL is on every row, so your export records which age it was collected for. It does NOT change what you get back: KAYAK's US site has no driver-age option of its own and quotes the same cars at the same prices for every age from 18 to 99, with no young-driver surcharge published. Those surcharges are set by the rental agency at the counter.

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

How to rank the rental offers. Cheapest first orders every offer row by total price, lowest first. The other three keep KAYAK's own ranking.

## `carType` (type: `array`):

Only keep these vehicle classes in the results. Leave empty to include every car type. Note: KAYAK has no server-side car-type filter, so the actor fetches the search and keeps only the matching offers — pick a smaller Max Results when filtering to a rare class.

## `currency` (type: `string`):

Currency to price the results in (ISO 4217 code). Every price in the output is converted to your choice, and each row's 'currencyCode' field confirms what its prices are in. Rows also carry 'providerCurrencyCode' — the currency the rental company itself bills in — whenever that differs from the price you see.

## `maxResults` (type: `integer`):

Maximum number of rental offers to collect per search. Set to 0 to collect every available offer. Pages are sized to the limit you set, so a small value returns close to that many offers — expect a modest overshoot (measured at up to 25%) because a page already in flight is never cut short.

## `startUrls` (type: `array`):

Advanced: paste one or more full KAYAK car-rental result URLs to scrape them directly (e.g. 'https://www.kayak.com/cars/Los-Angeles,CA/2026-07-15/2026-07-22'). When provided, these override the search fields above. Expired dates are automatically moved forward.

## Actor input object example

```json
{
  "pickupLocation": "Los Angeles",
  "pickupTime": "10:00",
  "returnTime": "10:00",
  "driverAge": 30,
  "sortBy": "recommended",
  "carType": [],
  "currency": "USD",
  "maxResults": 50,
  "startUrls": []
}
```

# Actor output Schema

## `overview` (type: `string`):

Table of car rental offers with vehicle, agency, and price.

# 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 = {
    "pickupLocation": "Los Angeles",
    "pickupTime": "10:00",
    "returnTime": "10:00",
    "driverAge": 30,
    "sortBy": "recommended",
    "carType": [],
    "currency": "USD",
    "maxResults": 50,
    "startUrls": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/kayak-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 = {
    "pickupLocation": "Los Angeles",
    "pickupTime": "10:00",
    "returnTime": "10:00",
    "driverAge": 30,
    "sortBy": "recommended",
    "carType": [],
    "currency": "USD",
    "maxResults": 50,
    "startUrls": [],
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/kayak-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 '{
  "pickupLocation": "Los Angeles",
  "pickupTime": "10:00",
  "returnTime": "10:00",
  "driverAge": 30,
  "sortBy": "recommended",
  "carType": [],
  "currency": "USD",
  "maxResults": 50,
  "startUrls": []
}' |
apify call solidcode/kayak-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,solidcode/kayak-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/fdsoJdzde2mEBiBh5/builds/o5uE5ykI7llje3Z8y/openapi.json
