# Autohero Scraper: Used Cars, Prices & VIN in 9 EU Countries (`oswaldocarabano/autohero-scraper`) Actor

Scrape Autohero used-car listings in Germany, France, Spain, Italy, Belgium, Poland, Austria, Netherlands and Sweden: price, monthly payment, price drops, mileage, engine, CO2, owners, damages and branch. Optional details add VIN, equipment, damage photos, service history and warranties. No login.

- **URL**: https://apify.com/oswaldocarabano/autohero-scraper.md
- **Developed by:** [Oswaldo Carabano](https://apify.com/oswaldocarabano) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.25 / 1,000 car listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Autohero Scraper: used car prices, VIN and damages in 9 EU countries

**Scrape used-car listings from Autohero, AUTO1 Group's online car retailer,** in
**Germany, France, Spain, Italy, Belgium, Poland, Austria, the Netherlands and
Sweden**: about **21,500 cars** on 1 Oct 2026, all in one schema.

Every row carries the **price in the market's own currency**, the **monthly
payment**, **price-drop history**, mileage, first registration, fuel,
transmission, power, CO2, consumption, Euro class, previous owners, accidents,
number of documented damages, service book status and the **Autohero branch**
holding the car. Turn on details and you also get the **VIN**, the **full
equipment list**, **every documented damage with its photo**, the **service
history**, dimensions, tyres, **EV battery and charging data**, all gallery
photos and the **warranty offers with prices**.

**No login. No cookies. No browser.** $1.25 per 1,000 cars.

***

### What you can use this Autohero API for

| If you are… | You want |
|---|---|
| A **dealer or remarketing team** pricing used stock | price, previous price and price drop, mileage and year for every car in a market |
| Comparing **used car prices in Europe by country** or building a **used car price index** | the same schema in 9 countries, with the currency on every row (EUR, PLN, SEK) |
| Doing **car finance or leasing analytics** | the monthly payment, number of instalments, down payment and financed price |
| **Valuing a specific car** | VIN, equipment list, damages with photos and service history from the detail page |
| Tracking the **used EV market** | battery capacity, electric range, consumption and charging times |
| Mapping **Autohero's footprint** | the branches mode: every branch and pickup centre with phone, hours and stock count |

***

### What actually arrives in a row

A car row has **130 columns**. A median of **65 carry a value** without details
and **101 with details**. Every percentage below was measured on this actor's
own runs on the Apify platform on **1 Oct 2026**: **1,642 cars from all 9
countries** (search columns) and **759 cars with details** (detail columns). We
do not promise a column whose fill rate we did not measure.

#### Always there: 100% (n = 1,642)

`car_id` · `url` · `country` · `title` · `make` · `model` · `variant` · `price` ·
`currency` · `monthly_payment` · `monthly_payment_months` ·
`monthly_payment_down_payment` · `mileage` · `first_registration_date` ·
`built_year` · `transmission` · `power_kw` · `power_hp` · `co2_g_km` ·
`vat_type` · `accidents` · `damages_count` · `has_full_service_book` ·
`seller_name` · `branch_id` · `branch_name` · `branch_street` · `branch_city` ·
`branch_zipcode` · `stock_number` · `first_published_at` · `published_at`

#### Usually there, or there when it applies (n = 1,642)

| Column | Fill rate |
|---|---:|
| `fuel_type`, `drivetrain` | 99.8% |
| `last_service_date` | 99.3% |
| `main_image_url` | 99.3% |
| `engine_cc` *(empty for electric cars)* | 97.2% |
| `emission_standard` | 97.0% |
| `previous_owners` | 94.9% |
| `variant_extra` | 94.8% |
| `fuel_consumption_combined` | 91.8% |
| `acceleration_0_100_s` | 89.5% |
| `highlights` | 35.8% |
| `dealer_sales_price` | 21.7% |
| `previous_price`, `price_drop` *(cars reduced since listing)* | 6.0% |

**Country-specific columns live in their country**, so a blended figure would
mislead. Measured per market:

| Column | Where it is filled |
|---|---|
| `financed_price` | Spain and Poland: 100%; elsewhere empty |
| `monthly_payment_down_payment_pct` | Sweden: 100% |
| `emission_sticker` | Germany 96%, France and Spain 100% |
| `is_novice_driver_car` | Italy: 100% |

#### With details on (n = 759 cars with details)

100%: `vin` · `body_type` · `color` · `doors` · `upholstery` · `handover_keys` ·
`tire_season` · `vehicle_id` · `image_urls` (median **42 photos**) ·
`warranties` (level, months and price) · `listing_created_at`.

| Column | Fill rate |
|---|---:|
| `seats` | 99.9% |
| `equipment` *(grouped by category; median **51 items**)* | 99.7% |
| `length_mm`, `width_mm`, `height_mm` | 97.2% |
| `damages` *(each with its photo; median 20 per car)* | 96.8% |
| `service_history` *(median 3 records)* | 96.7% |
| `trunk_volume_l` | 93.8% |
| `inspection_valid_until` | 91.6% |
| `country_of_origin` *(all but France and Sweden)* | 89.6% |
| `was_in_commercial_use` | 89.2% |
| `summary` *(DE, AT, FR, IT, ES: 100%)* | 78.7% |
| `original_engine` | 63.1% |
| `was_in_accident` | 48.2% |
| `license_plate` *(IT, ES, SE: 100%; NL: 52%)* | 45.7% |
| `secondary_wheels_price` | 23.5% |
| `history_report_urls` *(FR 90%, ES 100%, BE 97%)* | 11.9% |
| `battery_capacity_kwh`, `electric_range_km` *(EVs and plug-ins: 97% and 87% of them)* | 11% |

Detail texts (body type, colour, equipment, damages) are in the country's own
language: the same words the buyer sees on the site. Codes are always mapped to
English labels (`fuel_type`, `transmission`, `emission_standard`) with the raw
code next to them.

***

### Input

| Field | Default | What it does |
|---|---|---|
| `outputType` | `cars` | `cars`, or `branches` for one row per Autohero branch |
| `countries` | `["DE"]` | any of DE, AT, FR, IT, ES, PL, SE, NL, BE |
| `maxItems` | `100` | hard cap, shared fairly between countries |
| `sortBy` | `newest` | newest, most popular, price, mileage, make |
| `makes`, `model` | — | e.g. `["Volkswagen"]`, `"Golf VII"`; `vw`, `audi` or `GOLF VII` work too |
| `minPrice`, `maxPrice` | — | in each country's currency |
| `maxMileage`, `minYear`, `maxYear`, `minPowerKw` | — | numeric filters |
| `fuelTypes`, `transmissions` | — | petrol/diesel/electric/hybrid; manual/automatic/… |
| `includeDetails` | `false` | adds the 53 detail columns, billed separately |

Every filter was verified against the live site to actually narrow the results
before it was offered here.

Example: German and French automatic diesels under €20,000, with details:

```json
{
  "countries": ["DE", "FR"],
  "fuelTypes": ["diesel"],
  "transmissions": ["automatic"],
  "maxPrice": 20000,
  "maxItems": 300,
  "includeDetails": true
}
```

***

### Pricing

Pay per event: you pay only for rows delivered.

| Event | Price |
|---|---:|
| Car listing | **$0.00125** ($1.25 per 1,000) |
| Car detail page (only when `includeDetails` is on and the details arrive) | **$0.0007** |
| Branch record | $0.0022 |
| Actor start | $0.00001 (platform minimum) |

- **Error rows are never charged**, and a car is never charged twice within a run.
- **If you set a maximum charge for the run, the actor stops cleanly** before the
  rows that would exceed it and says so in the status message. It never delivers
  a row it did not charge, and never charges a row it did not deliver.

### Speed

Measured on the Apify platform at 512 MB on 1 Oct 2026: **1,000 cars in 23
seconds** without details; **500 cars with full details in 57 seconds**; every
branch in all 9 countries (207 branches, scanning about 21,500 cars) in about
2 minutes. Peak memory stayed under 100 MB.

***

### Output example (shortened)

```json
{
  "record_type": "car",
  "url": "https://www.autohero.com/fr/renault-captur/id/cd7669eb-2a0b-4aa9-bbd3-9702e689cc56/",
  "country": "FR",
  "title": "Renault Captur 1.5 dCi Energy Intens Eco2",
  "price": 10690,
  "currency": "EUR",
  "monthly_payment": 184,
  "monthly_payment_months": 72,
  "mileage": 114998,
  "first_registration_date": "2016-06-17",
  "fuel_type": "Diesel",
  "transmission": "Manual",
  "power_hp": 90,
  "co2_g_km": 95,
  "emission_standard": "EURO 6",
  "previous_owners": 1,
  "damages_count": 19,
  "branch_city": "Montataire",
  "details_included": true,
  "body_type": "SUV",
  "equipment_count": 71,
  "tire_season": "summer",
  "tax_rating": 4,
  "warranties": [{ "level": "PREMIUM", "months": 12, "price": 289, "currency": "EUR" }]
}
```

***

### FAQ

**Does Autohero have a public API?** No public, documented one. This actor reads
the same public catalogue the autohero.com website shows to every visitor, with
no login, and returns it as clean rows you can export to JSON, CSV or Excel, or
pull through the Apify API.

**Which countries are covered?** All 9 Autohero markets: Germany, Austria,
France, Italy, Spain, Poland, Sweden, the Netherlands and Belgium. Belgium has
two language versions of the site over one stock; you get each car once.

**Why are some prices in PLN or SEK?** Autohero prices cars in Poland in złoty
and in Sweden in kronor. Every row states its `currency`; the actor never
converts, so the numbers match the site.

**How do I get only one model?** Set `makes` and `model` exactly as Autohero
writes them, for example `Volkswagen` and `Golf VII`, `BMW` and `3er`, or
`Volkswagen` and `ID.3`. Make spelling is normalised (`vw`, `mercedes`), and the
model is not case-sensitive. A partial name such as `Golf` matches nothing, and
the run tells you so instead of failing.

**What do details add, and what do they cost?** One more event per car
($0.0007): VIN, the full equipment list, every documented damage with its photo,
service history, dimensions, tyres, EV battery data, all photos and the warranty
offers. You are only charged for details that actually arrived.

**What happens with a typo or a filter that matches nothing?** The run finishes
successfully with one error row explaining what to change, and nothing is charged
for it.

**Do I need a proxy?** No. The actor works without one. If the site ever starts
refusing requests, it switches route on its own and never waits more than a few
minutes in total.

**Are there private sellers?** No. Autohero sells its own inspected stock: every
car measured was company stock, so there are no private-seller contact details.
The `includePrivateSellerContact` switch (off by default) keeps it that way if
the site ever changes.

**Can I schedule it to track prices over time?** Yes. `car_id` is stable across
runs, so a daily schedule gives you price-drop and stock history per car.

***

### Good to know

- **Branch phone numbers** are company lines and are delivered in branches mode.
- Autohero's data is theirs. Use what you extract responsibly and in line with the
  law that applies to you.

**Questions or data removal requests:** privacy@actorstack.dev

# Actor input Schema

## `outputType` (type: `string`):

Cars (one row per car, the default) or Autohero branches (one row per branch or pickup centre, with address, branch phone, opening hours and how many of your filtered cars it holds). One row type per run, so every column in the dataset means one thing.

## `countries` (type: `array`):

Autohero markets to search. Stock measured on 1 Oct 2026: Germany 8,837 · France 3,850 · Spain 2,530 · Italy 2,392 · Belgium 1,459 · Poland 937 · Austria 770 · Sweden 397 · Netherlands 393. Prices come in each market's own currency (EUR, PLN or SEK), stated on every row.

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

Hard cap for this run, shared fairly between the countries you pick. The cap is reserved before each request, so you are never charged for more rows than this.

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

Only sort orders verified against the live site. Autohero rejects the others.

## `makes` (type: `array`):

Only these makes, e.g. Volkswagen, BMW, Audi. Autohero's make filter is case-sensitive, so common spellings are normalised for you (vw → Volkswagen, mercedes → Mercedes-Benz). Leave empty for every make.

## `model` (type: `string`):

Model name as Autohero writes it, e.g. "Golf VII", "Tiguan", "3er", "ID.3" (not case-sensitive). A partial name such as "Golf" matches nothing. Best combined with one make. Letters, digits, spaces and . - + & ' ( ) ! only.

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

In the currency of each country (EUR, or PLN in Poland and SEK in Sweden).

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

In the currency of each country (EUR, or PLN in Poland and SEK in Sweden). Verified against the live site to narrow the results.

## `maxMileage` (type: `integer`):

Only cars with at most this many kilometres.

## `minYear` (type: `integer`):

Only cars first registered in this year or later.

## `maxYear` (type: `integer`):

Only cars first registered in this year or earlier.

## `minPowerKw` (type: `integer`):

Only cars with at least this power. 1 kW = 1.36 hp.

## `fuelTypes` (type: `array`):

Leave empty for every fuel type.

## `transmissions` (type: `array`):

Leave empty for every transmission.

## `includeDetails` (type: `boolean`):

Adds 53 detail columns per car: VIN, body type, colour, doors and seats, the full equipment list (median 51 items), every documented damage with its photo, service history, dimensions, tyre season, battery and charging data for EVs, every gallery photo (median 42) and the warranty offers with prices. Billed as a separate event per car, only when the details actually arrive.

## `includePrivateSellerContact` (type: `boolean`):

Autohero sells its own stock, so every car measured was sold by the company and this switch changes nothing today. It exists so that, if private sellers ever appear, their contact details stay out of your data unless you turn it on.

## `maxConcurrency` (type: `integer`):

How many requests run at once. 3 is fast and polite; measured, the site served 25 requests per second without throttling, but a global pause kicks in if it ever asks us to slow down.

## `maxCacheAgeDays` (type: `integer`):

0 always fetches fresh details (the default). Rows served from a cache say so in from\_cache and data\_age\_hours.

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

Not needed: the actor works without a proxy. If the site ever starts refusing requests, it switches to an alternative route on its own. A proxy you set here is used for those retries; if it does not work, the run continues without it.

## Actor input object example

```json
{
  "outputType": "cars",
  "countries": [
    "DE",
    "FR"
  ],
  "maxItems": 50,
  "sortBy": "newest",
  "includeDetails": false,
  "includePrivateSellerContact": false,
  "maxConcurrency": 3,
  "maxCacheAgeDays": 0,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One row per car: price, currency, monthly payment, mileage, registration, engine, emissions, owners, damages and branch. With details on: VIN, equipment, damages with photos, service history and warranties.

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

The most useful columns in a compact table.

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

Counts of cars, details, branches and error rows, requests made and whether the run stopped early.

## `errors` (type: `string`):

Every error row of the run, never charged. Always written, empty when nothing went wrong.

# 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 = {
    "countries": [
        "DE",
        "FR"
    ],
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("oswaldocarabano/autohero-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 = {
    "countries": [
        "DE",
        "FR",
    ],
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("oswaldocarabano/autohero-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 '{
  "countries": [
    "DE",
    "FR"
  ],
  "maxItems": 50
}' |
apify call oswaldocarabano/autohero-scraper --silent --output-dataset

```

## MCP server setup

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