# Hertz Scraper — Direct Car Rental Prices in Europe (`studio-amba/hertz-scraper`) Actor

Scrape brand-direct car rental prices and availability straight from Hertz.com. Extract car category, model, daily and total price, currency, transmission, fuel type, and pickup/drop-off details across European Hertz locations. No login or cookies required.

- **URL**: https://apify.com/studio-amba/hertz-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** Travel
- **Features:** Limited permissions
- **Stats:** 1 total users, 0 monthly users, 96.4% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 result scrapeds

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?

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

## Hertz Scraper

Scrape brand-direct car rental prices and availability straight from Hertz.com, the largest US-headquartered car rental brand with dense coverage across Europe. Extract car category, model, daily and total price, currency, transmission, fuel type, and pickup/drop-off details. No login or cookies required.

### Why use this actor?

Most car rental price data comes from aggregators like Booking.com/RentalCars, Kayak, or Expedia — useful for comparison shopping, but the price shown there is the aggregator's markup on top of the supplier's own rate, not what Hertz actually charges at the counter. This actor goes straight to the source: Hertz's own booking engine. Use it to track brand-direct pricing separately from aggregator pricing, spot when Hertz undercuts (or overcuts) its own listings on comparison sites, or build a rental-cost monitor that isn't distorted by a middleman's commission.

If you need cross-supplier comparison (Hertz vs Avis vs Europcar vs Sixt in one call), pair this with [`rentalcars-scraper`](https://apify.com/studio-amba/rentalcars-scraper) — see Related Scrapers below.

### How to scrape Hertz data

1. Enter a pickup location (city or airport), for example `Paris Charles de Gaulle Airport`
2. Optionally set a drop-off location, pickup/drop-off dates, and driver age
3. Start the actor

Under the hood, the actor resolves your location through Hertz's own location-search endpoint (the same one that powers the autocomplete box on hertz.com), then loads Hertz's booking results page for that location and date range through a real browser session and reads the vehicle/pricing data straight off the network — no manual form-filling, no screen-scraping brittle HTML.

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `pickupLocation` | String | No | City or airport. Default: `Paris Charles de Gaulle Airport` |
| `dropoffLocation` | String | No | City or airport to return the car. Defaults to the pickup location. |
| `pickupDate` | String | No | `YYYY-MM-DD`. Defaults to 30 days from now. Past dates are replaced by that default. |
| `dropoffDate` | String | No | `YYYY-MM-DD`. Defaults to a 7-day rental. |
| `driverAge` | Integer | No | Driver age at pickup (default: 30). Hertz prices by bracket (19-20, 21-24, 25-27, 28+) — mapped automatically. |
| `maxResults` | Integer | No | Maximum number of offers to return (default: 20, max: 100) |
| `proxyConfiguration` | Object | No | Proxy settings. A `RESIDENTIAL` group is the default and is required — see Anti-bot notes below. |

### Output

Each result contains:

| Field | Type | Example |
|-------|------|---------|
| `rentalCompany` | String | `"Hertz"` |
| `carName` | String | `"BMW X5"` |
| `carCategory` | String | `"Luxury"` |
| `sippCode` | String | `"LFAR"` |
| `transmission` | String | `"Auto"` |
| `fuelType` | String | `"Petrol"` |
| `fuelPolicy` | String or null | Not exposed by this endpoint — always `null`, never guessed |
| `seats` | Number | `5` |
| `doors` | Number | `5` |
| `bags` | Number | `6` |
| `totalPrice` | Number | `462.03` |
| `dailyPrice` | Number | `66` |
| `currency` | String | `"GBP"` |
| `pickupLocation` | String | `"Paris, FR - CDG-Roissy Charles de Gaulle Airport - Terminals 2D & 1 (CDG)"` |
| `dropoffLocation` | String | Same shape as `pickupLocation` |
| `pickupDate` | String | `"2026-09-28"` |
| `dropoffDate` | String | `"2026-10-05"` |
| `url` | String | Hertz booking results page URL for this search |
| `scrapedAt` | String | `"2026-08-29T09:42:16.859Z"` |

#### Example output

```json
{
  "rentalCompany": "Hertz",
  "carName": "BMW X5",
  "carCategory": "Luxury",
  "sippCode": "LFAR",
  "transmission": "Auto",
  "fuelType": "Petrol",
  "fuelPolicy": null,
  "seats": 5,
  "doors": 5,
  "bags": 6,
  "totalPrice": 462.03,
  "dailyPrice": 66,
  "currency": "GBP",
  "pickupLocation": "Paris, FR - CDG-Roissy Charles de Gaulle Airport - Terminals 2D & 1 (CDG)",
  "dropoffLocation": "Paris, FR - CDG-Roissy Charles de Gaulle Airport - Terminals 2D & 1 (CDG)",
  "pickupDate": "2026-09-28",
  "dropoffDate": "2026-10-05",
  "url": "https://www.hertz.co.uk/gb/en/book/vehicles?age=28&pid=CDGT50&did=CDGT50&pdate=2026-09-28T13%3A00%3A00&ddate=2026-10-05T13%3A00%3A00&pCountryCode=FR&travelType=LEISURE",
  "scrapedAt": "2026-08-29T09:42:16.859Z"
}
```

#### Currency note

Hertz shows the cheapest available rate plan per vehicle, and different rate plans can be priced in different currencies (a prepaid online rate in the storefront's home currency vs. a pay-at-counter rate in the destination's local currency). The actor always reports the currency alongside the price it picked, matching the "best price" figure Hertz's own site shows — it does not convert everything to a single currency.

### Cost estimate

Priced at Apify's STANDARD tier: $0.005 per run start + $0.002 per result. A typical search returning 15-20 vehicle offers costs roughly $0.03-0.05 per run, well under $1 for dozens of searches. One search loads one booking page and its pricing response, so residential proxy traffic stays at a few megabytes per run. The final usage cost only settles once the run reports SUCCEEDED — reading the dataset mid-run will undercount it.

### Anti-bot notes

Hertz.com and its supporting domains (booking pages, location search, pricing API) sit behind genuine Imperva Incapsula bot management plus reCAPTCHA Enterprise on the legacy reservation flow. This actor does not touch that legacy flow — it uses Hertz's own location-search JSON endpoint (plain HTTP, unaffected) and a modern booking results page that a real browser session loads cleanly.

Since 15 September 2026 Incapsula blocks datacenter IP ranges on the booking page. The page still loads, but the pricing request behind it never fires, so the run returns nothing. The default proxy is therefore a `RESIDENTIAL` group in Great Britain, which matches the storefront the actor reads and returns full results in under a minute. Leave it on residential. If you override `proxyConfiguration` with a datacenter or no-proxy setting, expect empty runs.

### Limitations

- Fuel policy (e.g. "Full to Full") is not exposed by the pricing endpoint this actor reads — the field is always `null` rather than guessed.
- Pricing reflects Hertz's own "best available rate" logic, which can mix prepaid and pay-later rate plans (and their respective currencies) — see the currency note above.
- Driver age is priced in brackets (19-20 / 21-24 / 25-27 / 28+), not by exact age, matching how Hertz itself prices rentals.
- Very long or overly specific location queries (e.g. a full official location name) can return zero matches from Hertz's own location search — the actor automatically retries with shorter word-prefixes of your query, but a well-known city or airport name works best.

### Related Scrapers

- [RentalCars Scraper](https://apify.com/studio-amba/rentalcars-scraper) — compare Hertz against Avis, Europcar, Sixt and dozens more suppliers via the Booking.com-owned aggregator
- [Autoscout24 Scraper](https://apify.com/studio-amba) — used car listings across Europe
- [AtHome Scraper](https://apify.com/studio-amba) — Luxembourg real estate listings
- [Staatsblad Scraper](https://apify.com/studio-amba) — Belgian official company gazette

# Actor input Schema

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

City or airport to pick up the car. The actor resolves this via Hertz's own location search and uses the best match. Example: "Paris Charles de Gaulle Airport", "Berlin", "Madrid Barajas Airport".

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

City or airport to return the car. Leave empty to return to the same location as pickup.

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

Pickup date in YYYY-MM-DD format. Leave empty to default to about 30 days from now. Dates in the past are automatically replaced by that default.

## `dropoffDate` (type: `string`):

Drop-off date in YYYY-MM-DD format. Leave empty to default to a 7-day rental.

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

Driver age at pickup. Hertz prices by age bracket (19-20, 21-24, 25-27, 28+) — this is mapped to the matching bracket. Minimum rentable age is 19.

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

Maximum number of car rental offers to return.

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

Proxy settings. Hertz sits behind Imperva Incapsula bot management. As of 2026-09-15 Incapsula hard-blocks Apify's automatic (datacenter) pool — the booking page loads but its api.hertz.io/vehicle-rates fetch never fires, so the run returns nothing. Verified live 2026-09-17: three consecutive datacenter runs failed (9ikoCtXsQTsWdcWt5, hJ5mkjqOCBv29uKIU, I3dGlKmqeycEspHUf) while RESIDENTIAL returned 15 full vehicle rows in under a minute from GB (25nFS5OdGzIcs2vyO) and FR (DjHBVtO4Ub0Qmsmpu). Keep RESIDENTIAL. A run fetches one booking page plus its rates JSON, so residential traffic per run is a few megabytes.

## Actor input object example

```json
{
  "pickupLocation": "Paris Charles de Gaulle Airport",
  "driverAge": 30,
  "maxResults": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "GB"
  }
}
```

# Actor output Schema

## `results` (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 = {
    "pickupLocation": "Paris Charles de Gaulle Airport",
    "maxResults": 5,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "GB"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/hertz-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": "Paris Charles de Gaulle Airport",
    "maxResults": 5,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "GB",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/hertz-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": "Paris Charles de Gaulle Airport",
  "maxResults": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "GB"
  }
}' |
apify call studio-amba/hertz-scraper --silent --output-dataset

```

## MCP server setup

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