# Kayak Car Rental Scraper (`khadinakbar/kayak-car-rental-scraper`) Actor

Scrape Kayak car rental offers by pickup location, dates, or Kayak car-search URLs. Returns agency, provider, vehicle class, price, cancellation, mileage, fuel, pickup-counter, score, and booking-link fields.

- **URL**: https://apify.com/khadinakbar/kayak-car-rental-scraper.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** Travel, MCP servers, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.60 / 1,000 car rental offers

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 is Kayak Car Rental Scraper?

Kayak Car Rental Scraper returns one dataset row per car rental offer from Kayak for the location and dates you choose. Each row has the rental agency, booking site, vehicle and class, seats and bags, transmission, daily and total price in your chosen currency, payment type, cancellation and mileage policy, pickup counter address and coordinates, and the Kayak booking link. Travel teams, price analysts, travel agencies and AI agents use it to compare rental prices across agencies and markets, with no Kayak account.

### Why travel teams use it for rental prices

- **Every agency in one search.** Hertz, Avis, Enterprise, Sixt, local firms and booking sites, as Kayak lists them.
- **Local currencies.** `currency` selects the matching Kayak regional site, so prices arrive in USD, CAD, GBP, EUR, AUD, NZD, AED, SAR, JPY or SGD.
- **Policy details.** Free cancellation, mileage, fuel policy, payment type and known fees for each offer.
- **Pickup counters.** Address, airport code, distance from the city centre and coordinates.
- **Filters that save money.** Car type, total price range and free-cancellation-only filters run before rows are saved and charged.

### How to use it

**Cheapest cars in Miami for a long weekend:**

```json
{
  "pickupLocation": "Miami, FL",
  "pickupDate": "2026-11-12",
  "returnDate": "2026-11-15",
  "sortBy": "cheapest",
  "maxResults": 25
}
```

**Free-cancellation SUVs at London Heathrow, priced in pounds:**

```json
{
  "pickupLocation": "London Heathrow",
  "pickupDate": "2026-11-20",
  "returnDate": "2026-11-24",
  "currency": "GBP",
  "countryCode": "GB",
  "carTypes": ["suv"],
  "freeCancellationOnly": true,
  "maxResults": 25
}
```

| Input | What it controls |
|---|---|
| `pickupLocation`, `dropoffLocation` | City, airport name or airport code; add a drop-off for one-way rentals |
| `pickupDate`, `returnDate`, `pickupTime`, `returnTime` | Rental window (defaults to 30 days from today for a week, 10:00) |
| `driverAge` | Driver's age (default 30) |
| `sortBy` | `recommended` (default), `cheapest`, `closest` or `best` |
| `carTypes` | `small`, `medium`, `large`, `suv`, `van`, `luxury`, `special`, `convertible`, `pickup` |
| `minTotalPrice`, `maxTotalPrice`, `freeCancellationOnly` | Price and cancellation filters |
| `currency`, `countryCode` | Price currency and search market |
| `startUrls` | Kayak car-search URLs you already have, on any Kayak regional site |
| `maxResults` | Most offers to save (default 50) |

### Output: car rental data you receive

A real row from the London search (Kayak IDs and fee list shortened):

```json
{
  "recordType": "carRentalOffer",
  "position": 1,
  "pickupLocation": "Heathrow, London, England, United Kingdom, (LHR)",
  "pickupDate": "2026-11-20",
  "returnDate": "2026-11-24",
  "driverAge": 30,
  "agencyName": "Alamo",
  "providerName": "VIP Cars",
  "siteName": "vipcars.com",
  "vehicleName": "Ford Transit",
  "carClass": "Passenger van",
  "passengers": 9,
  "bags": 8,
  "transmission": "manual",
  "airConditioning": true,
  "fuelType": "Petrol",
  "dailyPrice": 87,
  "totalPrice": 348,
  "currency": "GBP",
  "localizedTotalPrice": "£348",
  "paymentType": "DEPOSIT",
  "mileagePolicy": "Your hire includes unlimited free miles",
  "fuelPolicy": "Return the car with the same level of fuel as when you picked it up.",
  "freeCancellation": false,
  "pickupLocationName": "Enterprise Rent A Car, London",
  "pickupLocationType": "NON_AIRPORT",
  "pickupCity": "London",
  "pickupDistance": "0.4 mi from city centre",
  "pickupLatitude": 51.49948,
  "pickupLongitude": -0.115284,
  "bookingUrl": "https://www.kayak.co.uk/book/car?code=1PBmVvwFG9...",
  "providerUrl": "https://vipcars.com/"
}
```

| Field | What it contains |
|---|---|
| `agencyName`, `providerName`, `siteName` | Rental company and the site selling the offer |
| `vehicleName`, `carClass`, `carType`, `passengers`, `bags`, `doors`, `transmission`, `fuelType` | The car |
| `dailyPrice`, `totalPrice`, `currency`, `localizedTotalPrice`, `paymentType` | Price for the whole rental and how it is paid |
| `freeCancellation`, `mileagePolicy`, `fuelPolicy`, `knownFees` | Policies and extra fees |
| `pickupLocationName`, `pickupAddress`, `pickupAirportCode`, `pickupDistance`, `pickupLatitude`, `pickupLongitude` | Where to collect the car |
| `bookingUrl`, `providerUrl`, `kayakSearchUrl` | Links to book or see the search |
| `position`, `score`, `badges` | Order in Kayak's results and Kayak ratings when shown |

`OUTPUT` and `RUN_SUMMARY` report the outcome, offers saved and searches completed.

### Example workflow: a weekly rental price tracker

A travel management company tracks rental prices for staff trips to Dallas, Chicago and Denver. Each Monday they collect `cheapest` offers for the next month's dates, then chart the lowest `totalPrice` per `carClass` and per `agencyName`. When prices jump, they book early. They continue with [Hotels.com Scraper](https://apify.com/khadinakbar/hotels-com-scraper) for hotel prices on the same dates.

### Pricing

This Actor uses **Pay per event** plus **Apify platform usage**. You pay a small start event and one event per offer saved, plus the platform usage of the job. The live Pricing tab on this page shows the current price.

- 1 search with `maxResults` 25 = up to 25 offer events + platform usage.
- Offers removed by `carTypes`, price or cancellation filters are not charged.
- `maxResults` is the cost ceiling for the whole job.

### Car rental prices with AI agents (MCP)

Connect this Actor to an AI agent through [Apify MCP](https://mcp.apify.com) and ask in plain language:

> Find the three cheapest automatic cars at Dublin Airport from 20 to 24 November, in euros, with free cancellation.

Agent checklist:

1. Set `pickupLocation`, `pickupDate` and `returnDate` from the request.
2. Set `currency` (and `countryCode`) for the traveller's market.
3. Use `sortBy: "cheapest"` and filters such as `freeCancellationOnly`.
4. Read rows with `get-dataset-items` and `OUTPUT.outcome` for the result status.

### API example

```bash
curl -X POST "https://api.apify.com/v2/acts/khadinakbar~kayak-car-rental-scraper/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"pickupLocation": "SEA", "pickupDate": "2026-12-01", "returnDate": "2026-12-05", "sortBy": "cheapest", "maxResults": 10}'
```

### Related travel tools from the same developer

| Your next step | Use | Why |
|---|---|---|
| When you then price hotels for the same trip | [Hotels.com Scraper](https://apify.com/khadinakbar/hotels-com-scraper) | Hotel prices and ratings by destination |
| When you compare stays on Booking.com | [Booking Scraper PRO](https://apify.com/khadinakbar/booking-scraper-pro) | Properties, prices and review scores |
| When you research things to do at the destination | [TripAdvisor Scraper](https://apify.com/khadinakbar/tripadvisor-scraper) | Hotels, restaurants and reviews |

### Best results

| Starting situation | Helpful action | Expected outcome |
|---|---|---|
| Comparing markets | Set `currency` per market | Prices from each regional Kayak site |
| Airport pickups | Use the airport code, such as `LHR` or `SEA` | Offers at and around the airport |
| A fixed budget | Set `maxTotalPrice` | Only offers within budget |
| A search already set up on Kayak | Paste its URL in `startUrls` | The same results, in that site's currency |

### Builder's note

I found that travel teams compare the same route across countries, and Kayak prices each regional site in its own currency, so `currency` now picks the matching Kayak domain and booking links point to that site. I learned that the cheapest offers are often pay-at-pickup deals with extra fees, so each row keeps `paymentType`, `knownFees` and the policy fields next to the price.

### FAQ

#### Do I need a Kayak account?

No. The Actor reads Kayak's public car search results.

#### Which currencies work?

USD, CAD, GBP, EUR, AUD, NZD, AED, SAR, JPY and SGD, each from its regional Kayak site. INR is accepted too; Kayak lists few rental offers for India.

#### Can I do one-way rentals?

Yes. Add `dropoffLocation`.

#### Why are some prices very low?

Kayak shows some pay-at-pickup offers with fees paid at the counter. Check `paymentType` and `knownFees` for those rows.

#### How far ahead can I search?

Use any future dates Kayak accepts. Without dates, the Actor searches a week starting 30 days from today.

### Responsible use

This Actor collects publicly visible Kayak car rental offers. Use the data for price research and travel planning and follow Kayak's terms and the laws that apply to you. Read Apify's guide on [whether web scraping is legal](https://blog.apify.com/is-web-scraping-legal/) for more context. KAYAK is a trademark of KAYAK Software Corporation. This independent Actor is not affiliated with, associated with, or endorsed by KAYAK. For questions or bugs, open a ticket in the Issues tab.

# Changelog

This Actor's version history is a separate document: https://apify.com/khadinakbar/kayak-car-rental-scraper/changelog.md

# Actor input Schema

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

City, airport, or place to search on Kayak, e.g. 'Los Angeles', 'LAX', 'Miami, FL', or 'London Heathrow'. Leave empty when using startUrls.

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

Optional dropoff city or airport for one-way rentals. Leave empty to return the car to the pickup location.

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

Pickup date in YYYY-MM-DD format. Defaults to 30 days from today when omitted. Must not be in the past.

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

Return date in YYYY-MM-DD format. Defaults to seven days after pickupDate when omitted. Must be after pickupDate.

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

Local pickup time. Kayak prices can change by pickup and return time.

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

Local return time. Defaults to 10:00.

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

Driver age used for Kayak pricing. Defaults to 30. Young-driver pricing can differ by supplier.

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

Kayak result ordering before extraction.

## `carTypes` (type: `array`):

Optional client-side filter. Filtered-out offers are not billed.

## `minTotalPrice` (type: `integer`):

Optional client-side filter on total rental price in the returned currency. Filtered-out offers are not billed.

## `maxTotalPrice` (type: `integer`):

Optional client-side filter on total rental price in the returned currency. Filtered-out offers are not billed.

## `freeCancellationOnly` (type: `boolean`):

Keep only offers Kayak marks with free cancellation. Filtered-out offers are not billed.

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

Preferred ISO currency code sent as a Kayak query hint. The output currency always reflects Kayak's returned offer currency.

## `countryCode` (type: `string`):

Two-letter country code used to bias Kayak location autocomplete. Defaults to US.

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

Optional full Kayak /cars result URLs to scrape directly. Use this for a filtered Kayak search you already built.

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

Maximum bookable provider offers to return across all searches. Each returned offer is one billed event.

## `proxyConfiguration` (type: `object`):

Proxy settings. Residential proxies are recommended for Kayak browser runs.

## Actor input object example

```json
{
  "pickupLocation": "LAX",
  "dropoffLocation": "San Diego, CA",
  "pickupDate": "2026-08-15",
  "returnDate": "2026-08-22",
  "pickupTime": "10:00",
  "returnTime": "10:00",
  "driverAge": 30,
  "sortBy": "recommended",
  "freeCancellationOnly": false,
  "currency": "USD",
  "countryCode": "US",
  "startUrls": [
    "https://www.kayak.com/cars/Los-Angeles,California-c16078/2026-08-15/2026-08-22?sort=rank_a"
  ],
  "maxResults": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

All validated Kayak car rental provider offers returned by this run.

## `runSummary` (type: `string`):

Machine-readable run outcome and counters.

## `output` (type: `string`):

Stable output object with outcome and dataset link.

# 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, CA",
    "driverAge": 30,
    "maxResults": 50,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/kayak-car-rental-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, CA",
    "driverAge": 30,
    "maxResults": 50,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/kayak-car-rental-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, CA",
  "driverAge": 30,
  "maxResults": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call khadinakbar/kayak-car-rental-scraper --silent --output-dataset

```

## MCP server setup

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