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

Scrape car rental offers from Kayak: provider, agency, vehicle type, day/total price, mileage and fuel policy, cancellation terms, and booking links for any Kayak car search URL.

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

## Pricing

from $0.89 / 1,000 rental car offers

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/platform/actors/running/actors-in-store#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

Scrape car rental offers from [Kayak](https://www.kayak.com/cars): provider, agency, vehicle type, day and total price, mileage and fuel policy, cancellation terms, and direct booking links — from any Kayak car search URL.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Paste any Kayak car search URL — expired dates and stale query parameters are healed automatically — and get every supplier's price for every vehicle, ready for rate comparison or monitoring.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
Apify Actor: parsebird/kayak-car-rental-scraper. Scrapes car rental offers from Kayak.com. Call via ApifyClient: client.actor("parsebird/kayak-car-rental-scraper").call(run_input={"startUrl": "https://www.kayak.com/cars/Los-Angeles,CA/2026-09-10/2026-09-17?sort=rank_a", "results_wanted": 20}). Expired dates and stale query params in startUrl are healed automatically. Returns per offer: source_type, search_id, result_id, provider_name, provider_code, agency_code, agency_name, car_type, car_type_groups, day_price, total_price, price, currency_code, known_fees, payment_type, mileage_policy_type, mileage_total_limit, fuel_policy, free_cancellation_policy, pickup_location, pickup_date, return_date, pickup_location_details, booking_url, site_url, source_url. Full API spec: https://apify.com/parsebird/kayak-car-rental-scraper/api. Get your token: https://console.apify.com/settings/integrations.
```

### What does Kayak Car Rental Scraper do?

This actor turns a [Kayak](https://www.kayak.com/cars) car rental search into structured, comparison-ready data. Kayak aggregates offers from dozens of suppliers (Hertz, Avis, Enterprise, Booking.com, Priceline, and more) for the same vehicle — this actor captures every one of them, not just the cheapest headline price.

- 🔗 **URL-in, data-out** — paste any `kayak.com/cars/...` search URL; no separate query builder needed
- 🩹 **Auto-healing** — expired pickup/return dates are rolled forward (trip length preserved) and stale query parameters are stripped automatically
- 💲 **Every offer, every provider** — one row per supplier/price combination for each vehicle, so you can compare Hertz-via-Kayak against Hertz-via-Priceline side by side
- 📋 **Full policy detail** — mileage limits, fuel policy, cancellation terms, and known fees for each offer
- 🔗 **Direct booking links** — `booking_url` goes straight to Kayak's booking flow for that specific offer

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `startUrl` | string | **Yes** | — | Full Kayak car rental results URL. Expired dates and noisy query params are auto-healed |
| `results_wanted` | integer | No | `20` | Maximum number of car rental offers to save |
| `proxyConfiguration` | object | No | `{ "useApifyProxy": false }` | Optional proxy settings for improved reliability |

> Kayak's car search doesn't require a proxy for normal use, so it's off by default — turn it on only if you're running high volume and want extra reliability.

### How to scrape Kayak car rental data

1. Open the [Kayak Car Rental Scraper](https://apify.com/parsebird/kayak-car-rental-scraper) page and click **Try for free**.
2. Search for a location and dates on [kayak.com/cars](https://www.kayak.com/cars), then copy the resulting URL into **Start URL**.
3. Set **Results Wanted** to control how many offers to save.
4. Click **Start** and wait for the run to finish — Kayak's search streams in results progressively, so the actor waits for the result set to settle.
5. Download results as JSON, CSV, or Excel from the Dataset tab, or pull them via the [Apify API](https://docs.apify.com/api/v2).

### Output example

```json
{
  "source_type": "result_provider",
  "search_id": "exampleSearchId",
  "result_id": "573a35fe3f4cea35e98380f42a5a9d32",
  "provider_name": "WiseCars",
  "provider_code": "IWISECARSOPAQUE",
  "agency_code": "IHERTZPV",
  "agency_name": "Hertz",
  "car_type": "Jeep Wrangler Unlimited (Open air all terrain)",
  "car_type_groups": ["SUV"],
  "day_price": { "price": 13, "currency": "USD", "localizedPrice": "$13" },
  "total_price": { "price": 184, "currency": "USD", "localizedPrice": "$184" },
  "currency_code": "USD",
  "payment_type": "PREPAY",
  "mileage_policy_type": "limited",
  "mileage_total_limit": "1,553 total mi included",
  "pickup_location": "Los Angeles CA",
  "pickup_date": "2026-07-15",
  "return_date": "2026-07-22",
  "booking_url": "https://www.kayak.com/book/car/example",
  "source_url": "https://www.kayak.com/cars/Los-Angeles,CA/2026-07-15/2026-07-22?sort=rank_a"
}
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("parsebird/kayak-car-rental-scraper").call(run_input={
    "startUrl": "https://www.kayak.com/cars/Los-Angeles,CA/2026-09-10/2026-09-17?sort=rank_a",
    "results_wanted": 50,
})

for offer in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(offer["car_type"], "-", offer["agency_name"], "-", offer["total_price"]["localizedPrice"])
```

#### JavaScript

```javascript
import { ApifyClient } from "apify-client";

const client = new ApifyClient({ token: "<YOUR_API_TOKEN>" });
const run = await client.actor("parsebird/kayak-car-rental-scraper").call({
    startUrl: "https://www.kayak.com/cars/Los-Angeles,CA/2026-09-10/2026-09-17?sort=rank_a",
    results_wanted: 50,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Use cases

- **Rate comparison tools** — Aggregate every supplier's price for the same vehicle to build a meta-search or comparison feature.
- **Price monitoring** — Track `day_price`/`total_price` for a route over time to spot the best time to book.
- **Fleet/market research** — Analyze which agencies and vehicle classes dominate a given pickup location.
- **Policy auditing** — Compare mileage limits, fuel policies, and cancellation terms across suppliers for the same trip.

### How it works

1. **URL healing** — `startUrl` is parsed for its location, pickup date, and return date. Expired pickup dates are rolled forward (keeping the same trip length), and the location is re-resolved through Kayak's own location lookup, since raw city names can silently resolve to the wrong place. Noisy query parameters are dropped, keeping only `sort`.
2. **Search** — The actor loads the healed search URL and captures Kayak's own results feed as it streams in car rental offers from dozens of suppliers.
3. **Wait for settle** — Kayak returns results progressively; the actor waits until the search reports complete or enough offers have arrived to satisfy `results_wanted`.
4. **Flatten** — Each vehicle listing's supplier offers are flattened into individual rows, with agency and provider codes resolved to display names.
5. **Output** — Results are pushed to the Apify dataset, downloadable as JSON, CSV, or Excel, or accessible via the [Apify API](https://docs.apify.com/api/v2) and [integrations](https://apify.com/integrations) (Zapier, Make, Google Sheets, and more).

### How much does it cost to scrape Kayak car rentals?

Kayak Car Rental Scraper uses Apify's [pay-per-event](https://docs.apify.com/platform/actors/publishing/monetize#pay-per-event-pricing) model — you pay only for offers actually delivered.

| Event | Free plan | Bronze | Silver | Gold |
|-------|-----------|--------|--------|------|
| `car-offer-scraped` (per 1,000) | $0.99 | $0.89 | $0.89 | $0.89 |

Every car rental offer pushed to the dataset counts as one event. A 200-offer run on the Free plan costs about $0.20. Apify's [free trial](https://apify.com/pricing) covers your first runs at no cost.

### Is it legal to scrape Kayak?

Yes. Kayak Car Rental Scraper only collects car rental offer data that Kayak already displays publicly to any visitor. The actor does not bypass logins, place bookings, or collect personal user data. See Apify's [blog post on the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/) for a general overview. You are responsible for using the collected data in compliance with applicable laws and Kayak's [Terms of Service](https://www.kayak.com/terms).

### Related Actors

- [GetYourGuide Tours & Activities Scraper](https://apify.com/parsebird/getyourguide-scraper) — tours and activities pricing data, same travel-booking category
- [AutoTrader.co.uk Scraper](https://apify.com/parsebird/autotrader-scraper) — vehicle listings and pricing data

### FAQ

**Why does my Start URL end up with different dates or a different-looking location code?** That's the auto-healing feature. Expired dates are rolled forward (same trip length), and human-readable locations (like "Los-Angeles,CA") are re-resolved through Kayak's own location lookup and replaced with the matching airport code — this avoids a real Kayak quirk where some city/state URL slugs silently resolve to the wrong city.

**Does this need a proxy?** No — Kayak's car search doesn't block normal traffic, so proxy is off by default. You can enable it for high-volume runs if you want extra reliability.

**Why are there multiple rows for the same car?** Kayak shows the same vehicle listing priced by several different suppliers (e.g., Hertz direct vs. Hertz via a reseller). Each supplier/price combination is returned as its own row so you don't lose any pricing options.

**Can I filter by vehicle class or price in the input?** Not directly — build your filters into the Kayak search itself (on kayak.com/cars) and paste the resulting URL into `startUrl`.

**Why did I get fewer offers than `results_wanted`?** A single search URL exposes one Kayak results page — typically enough vehicle listings, each with several supplier offers, to comfortably reach 100+ rows, but it has a ceiling. If your run logs a warning that fewer offers were available than requested, that's the page's natural limit; run additional searches with different filters (dates, sort order) for more coverage.

Found a bug or have a feature request? Open an issue on the Actor's Issues tab — feedback shapes what gets built next.

# Actor input Schema

## `startUrl` (type: `string`):

Full Kayak car rental results URL (kayak.com/cars/<location>/<pickup-date>/<return-date>). Expired dates and noisy query params are auto-healed.

## `results_wanted` (type: `integer`):

Maximum number of car rental offers to save. A single search URL exposes one results page from Kayak (typically enough for 100-150+ offers once every supplier per vehicle is counted) — for more, run additional searches with different filters.

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

Kayak does not require a proxy for normal use — leave off unless you're running a very high volume and want extra reliability.

## Actor input object example

```json
{
  "startUrl": "https://www.kayak.com/cars/Los-Angeles,CA/2026-09-10/2026-09-17?sort=rank_a",
  "results_wanted": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

No description

# 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 = {
    "startUrl": "https://www.kayak.com/cars/Los-Angeles,CA/2026-09-10/2026-09-17?sort=rank_a",
    "results_wanted": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/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 = {
    "startUrl": "https://www.kayak.com/cars/Los-Angeles,CA/2026-09-10/2026-09-17?sort=rank_a",
    "results_wanted": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/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 '{
  "startUrl": "https://www.kayak.com/cars/Los-Angeles,CA/2026-09-10/2026-09-17?sort=rank_a",
  "results_wanted": 20
}' |
apify call parsebird/kayak-car-rental-scraper --silent --output-dataset

```

## MCP server setup

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