# PistonHeads Scraper: Full Spec Car Data (`getascraper/pistonheads-uk-scraper`) Actor

Scrape PistonHeads UK used car listings with the deepest spec sheet on the Store: acceleration, top speed, torque, CO2 and fuel consumption on every car. Export to Google Sheets, Excel, or your own pipeline via the API. Skip scrapers with broken filters. From $0.00066 per listing.

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

## Pricing

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

## 🚗 PistonHeads Scraper: Full Spec Car Data

<table width="100%">
<tr>
<td style="padding:24px 28px;background:#F5F6F3;border:1px solid #E0E3DC;border-top:4px solid #52633D;border-radius:12px">
<span style="font-size:23px;font-weight:800;color:#1C1917;line-height:1.3">Get every PistonHeads listing with the spec sheet no other scraper pulls</span><br>
<span style="font-size:15px;color:#57534E;line-height:1.6">Price, mileage and seller details on every UK used car listing, plus acceleration, top speed, torque, CO2 emissions and official fuel economy that no other PistonHeads scraper extracts.</span>
</td>
</tr>
</table>

<table width="100%">
<tr>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #E0E3DC;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#3D4A2E">🏎️ Full performance spec</span><br>
<span style="font-size:12px;color:#57534E">Acceleration, top speed, torque and cylinders on every listing, not just the basics.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #E0E3DC;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#3D4A2E">🎯 Filters that actually work</span><br>
<span style="font-size:12px;color:#57534E">Price, year, mileage, fuel and body type are checked against real listing data, every time.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #E0E3DC;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#3D4A2E">📊 4 ready-made views</span><br>
<span style="font-size:12px;color:#57534E">Listings, Performance Spec, Ownership & Efficiency, and Seller Directory in the Output tab.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #E0E3DC;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#3D4A2E">💷 CO2 and fuel economy</span><br>
<span style="font-size:12px;color:#57534E">Official CO2 emissions and MPG on every car, for tax and running-cost comparisons.</span>
</td>
</tr>
</table>

Extract [PistonHeads](https://www.pistonheads.com/buy) used car listings across any make. Export to JSON, CSV or Excel, or connect straight into Google Sheets and your own pipeline via the API. Run it on demand or on a schedule. No coding required.

### ✨ Why use this Actor

**Every filter actually filters.** Set a price range, year range, fuel type or body type and the results genuinely match. Each one is checked against the listing's real data, not trusted to a search box that might silently ignore it.

**The full performance spec, not just the basics.** Most car scrapers stop at price, mileage and engine size. This one also pulls 0-62mph acceleration, top speed, torque, cylinder count, drivetrain, CO2 emissions and official fuel consumption. Those are the numbers a trade buyer or performance-car shopper actually needs.

**Built for real workflows.**

- 🚘 **Trade dealers**: pull every competing listing for a model before you price your own stock, in one spreadsheet instead of forty open tabs.
- 📊 **Market researchers**: track UK used car pricing by make, model and year with clean, structured fields ready to pivot.
- 🏁 **Performance car buyers**: cross-shop generations of the same model on real acceleration, torque and running-cost numbers, not just a headline and a photo.

### ⚙️ How it works

<table width="100%">
<tr>
<td style="padding:16px 14px;width:33%;background:#F5F6F3;border:1px solid #E0E3DC;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#52633D;letter-spacing:1px">STEP 1</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Choose your search</span><br>
<span style="font-size:12px;color:#57534E">Pick one or more makes, then narrow with price, year, mileage, fuel type or body type. Every filter is optional.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#F5F6F3;border:1px solid #E0E3DC;border-left:none;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#52633D;letter-spacing:1px">STEP 2</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Run the Actor</span><br>
<span style="font-size:12px;color:#57534E">It browses PistonHeads for you and collects listings matching your criteria, live from the site.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#F5F6F3;border:1px solid #E0E3DC;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#52633D;letter-spacing:1px">STEP 3</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Get your data</span><br>
<span style="font-size:12px;color:#57534E">Download as JSON, CSV or Excel, or connect straight into Google Sheets or your own pipeline via the API.</span>
</td>
</tr>
</table>

### 📥 Input

| Field | Type | Required | Description |
|---|---|---|---|
| `startUrls` | array of URLs | No | PistonHeads listing pages to scrape directly, instead of or alongside the make filter. |
| `makes` | array | No | Car manufacturers to search, e.g. `Porsche`, `BMW`. |
| `models` | array | No | Model names to keep, e.g. `911`, `Cayman`. |
| `keywords` | string | No | Free-text match against the listing title and description. |
| `priceMin` / `priceMax` | integer | No | Asking price range in GBP. |
| `yearMin` / `yearMax` | integer | No | Registration year range. |
| `mileageMin` / `mileageMax` | integer | No | Mileage range. |
| `enginePowerMinBhp` / `enginePowerMaxBhp` | integer | No | Engine power range in BHP. |
| `maxPreviousOwners` | integer | No | Maximum number of previous keepers (requires full details, below). |
| `fuelTypes` | enum | No | Petrol, Diesel, Electric, Hybrid or LPG. |
| `transmissions` | enum | No | Manual or Auto. |
| `bodyTypes` | enum | No | Convertible, Coupe, Estate, SUV, Hatchback, Saloon, MPV or Pick Up. |
| `colours` | array | No | Exterior colours to keep, e.g. `Black`, `Blue`. |
| `sellerType` | enum | No | Trade only, Private only, or any. |
| `postcode` | string | No | UK postcode to search around. |
| `distanceMiles` | integer | No | Search radius from the postcode. |
| `includeSoldCars` | boolean | No | Include listings marked as sold. Off by default. |
| `includeFullDetails` | boolean | No | Fetch each listing's own page for the full spec sheet, description and feature list. Off by default. |
| `maxItems` | integer | No | Stop after collecting this many matching listings. |
| `proxyConfiguration` | object | No | Proxy settings. Datacenter proxy is enough. |

### 📤 Output

Every result is one row in the dataset. A typical item with `includeFullDetails` enabled looks like this:

```json
{
  "listingId": "20971120",
  "listingUrl": "https://www.pistonheads.com/buy/listing/20971120",
  "title": "Porsche 718 BOXSTER GTS",
  "make": "Porsche",
  "model": "Boxster 718 [16-Current]",
  "year": 2024,
  "price": 83718,
  "mileage": 980,
  "fuelType": "Petrol",
  "transmission": "Manual",
  "bodyType": "Convertible",
  "colour": "Grey",
  "engineSizeCc": 3995,
  "enginePowerBhp": 394,
  "acceleration0To62Seconds": 4.5,
  "topSpeedMph": 182,
  "torqueLbFt": 310,
  "co2EmissionsGPerKm": 246,
  "fuelConsumptionMpg": 25.9,
  "doors": 2,
  "seats": 2,
  "driveTrain": "Rear Wheel Drive",
  "numberOfPreviousOwners": 0,
  "sellerName": "Porsche Centre Tewkesbury",
  "sellerType": "Trade",
  "sellerLocation": "Tewkesbury, United Kingdom"
}
```

Download the dataset in JSON, CSV, Excel, HTML or XML from the Apify Console, or pull it through the API.

### 📊 Data table

| Field | Type | Description |
|---|---|---|
| `listingId` / `listingUrl` | string | Unique advert ID and link to the live listing. |
| `title` / `make` / `model` | string | Listing headline, manufacturer and model. |
| `year` / `price` / `mileage` | number | Registration year, asking price (GBP) and odometer reading (miles). |
| `fuelType` / `transmission` / `bodyType` / `colour` | string | Fuel, gearbox, body style and exterior colour. |
| `engineSizeCc` / `enginePowerBhp` | number | Engine displacement and power output. |
| `acceleration0To62Seconds` / `topSpeedMph` / `torqueLbFt` | number | 0-62mph time, top speed and torque. |
| `co2EmissionsGPerKm` / `fuelConsumptionMpg` | number | Official CO2 emissions and fuel economy. |
| `doors` / `seats` / `driveTrain` / `cylinders` / `gears` | number/string | Body configuration and drivetrain layout. |
| `numberOfPreviousOwners` | number | Previous keeper count, where published. |
| `sellerName` / `sellerType` / `sellerLocation` | string | Seller identity, Trade or Private, and location. |
| `images` / `imageCount` | array/number | Photo gallery URLs and count. |
| `description` / `features` | string/array | Full seller write-up and structured feature list (with full details enabled). |

The Output tab also ships four pre-built views: Listings, Performance Spec, Ownership & Efficiency, and Seller Directory, so you can jump straight to the columns you care about.

### 💰 Pricing

This Actor is pay per result: you only pay for the listings you actually collect, and a run that returns nothing costs nothing. There is no subscription and no minimum spend.

### ⭐ Enjoying PistonHeads Scraper?

<table width="100%">
<tr>
<td style="padding:20px 24px 14px;background:#F5F6F3;border:1px solid #E0E3DC;border-left:5px solid #52633D;border-radius:10px 10px 0 0">
<span style="font-size:20px;letter-spacing:4px">⭐ ⭐ ⭐ ⭐ ⭐</span><br>
<span style="font-size:17px;font-weight:800;color:#1C1917">Saved you from opening forty browser tabs to price your stock?</span><br>
<span style="font-size:14px;color:#57534E">A 5-star rating takes 10 seconds and helps other dealers, analysts and buyers find it. Your feedback also tells us what to build next.</span>
</td>
</tr>
<tr>
<td style="padding:0;background:#52633D;border:1px solid #E0E3DC;border-top:none;border-radius:0 0 10px 10px;text-align:center">
<a href="https://apify.com/getascraper/pistonheads-uk-scraper/reviews" style="display:block;padding:13px 16px;color:#FFFFFF;text-decoration:none;font-weight:800;font-size:15px;letter-spacing:0.3px">★&nbsp;&nbsp;Rate this Actor on Apify</a>
</td>
</tr>
</table>

### 🛠️ Tips for better runs

- Leave `includeFullDetails` off for fast, cheap runs when you only need price, mileage and the basics.
- Turn `includeFullDetails` on when you need the performance spec, full description or feature list, or want to filter by previous-owner count.
- Narrow with `makes` and a few filters rather than running with no filters at all; PistonHeads surfaces a rotating set of current listings per make, so a focused search returns more relevant results per run.

### ❓ FAQ

**Is it legal to scrape PistonHeads?**
This Actor only collects data that is already publicly visible on PistonHeads listing pages. You are responsible for how you use the data and for complying with PistonHeads' own terms of service.

**Why do some listings have empty fields?**
Not every seller fills in every field on PistonHeads. This Actor never invents or guesses a value: if PistonHeads doesn't publish it, the field is left out rather than filled with a placeholder.

**Does this cover every listing on PistonHeads?**
It surfaces PistonHeads' current live listings per make, refreshed on every run, rather than an exhaustive fetch of the entire historical catalogue. For most price-comparison and market-research use cases this is exactly what you want: what's on sale right now.

**Can I get notified of new listings automatically?**
Yes. Schedule this Actor to run daily or hourly from the Apify Console and pipe new results into Google Sheets, Slack, or your own database with no code.

Found a bug or need a custom version of this Actor? Open an issue from the Actor's Issues tab and it'll be looked at directly.

### 🔗 Other actors

- [AutoTrader South Africa Cars Scraper](https://apify.com/getascraper/autotrader-za-cars-scraper) ↗ - used car listings from South Africa's largest car marketplace.
- [Blocket Cars Scraper: Bilar till salu](https://apify.com/getascraper/blocket-cars-scraper) ↗ - used car listings from Sweden's Blocket classifieds.
- [Bilbasen Cars Scraper: Brugte biler](https://apify.com/getascraper/bilbasen-cars-scraper) ↗ - used car listings from Denmark's Bilbasen.
- [Carsales.com.au Cars Scraper: Used car listings](https://apify.com/getascraper/carsales-au-cars-scraper) ↗ - used car listings from Australia's largest car marketplace.
- [2dehands Cars Scraper: Tweedehandse auto's](https://apify.com/getascraper/2dehands-cars-scraper) ↗ - used car listings from the Netherlands' 2dehands classifieds.

# Actor input Schema

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

Paste PistonHeads listing URLs (e.g. https://www.pistonheads.com/buy/porsche) to scrape directly instead of, or in addition to, the make/model filters below.

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

Car manufacturers to search for, e.g. "Porsche", "BMW". Leave empty with no Start URLs to scrape PistonHeads' current homepage picks across all makes.

## `models` (type: `array`):

Model names to keep, e.g. "911", "Cayman". Matched against each listing's model and headline.

## `keywords` (type: `string`):

Free-text match against the advert headline and description (case-insensitive).

## `priceMin` (type: `integer`):

Minimum asking price.

## `priceMax` (type: `integer`):

Maximum asking price.

## `yearMin` (type: `integer`):

Earliest registration year.

## `yearMax` (type: `integer`):

Latest registration year.

## `mileageMin` (type: `integer`):

Minimum odometer reading in miles.

## `mileageMax` (type: `integer`):

Maximum odometer reading in miles.

## `enginePowerMinBhp` (type: `integer`):

Minimum engine power.

## `enginePowerMaxBhp` (type: `integer`):

Maximum engine power.

## `maxPreviousOwners` (type: `integer`):

Only available on adverts where PistonHeads publishes an owner count. Requires "Fetch full listing details" below.

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

Keep only listings with one of these fuel types.

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

Keep only listings with one of these transmission types.

## `bodyTypes` (type: `array`):

Keep only listings with one of these body types.

## `colours` (type: `array`):

e.g. "Black", "Blue". Matched case-insensitively against the listing's exterior colour.

## `sellerType` (type: `string`):

Keep only Trade or only Private sellers.

## `postcode` (type: `string`):

UK postcode to search around. Passed to PistonHeads' own location search where supported.

## `distanceMiles` (type: `integer`):

Search radius around the postcode above.

## `includeSoldCars` (type: `boolean`):

By default only live adverts are kept.

## `includeFullDetails` (type: `boolean`):

Fetch each advert's own page for the full technical spec (acceleration, top speed, torque, CO2 emissions, fuel consumption, doors, seats, drivetrain, previous owners, full description, full feature list, all gallery images). Roughly doubles the number of requests. Off by default for faster, cheaper runs using just the search-result fields.

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

Stop after collecting this many matching listings.

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

PistonHeads is a UK site; a UK-based proxy avoids region redirects. Datacenter proxy is sufficient.

## Actor input object example

```json
{
  "startUrls": [],
  "makes": [
    "Porsche"
  ],
  "models": [],
  "keywords": "",
  "fuelTypes": [],
  "transmissions": [],
  "bodyTypes": [],
  "colours": [],
  "sellerType": "",
  "postcode": "",
  "includeSoldCars": false,
  "includeFullDetails": false,
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "startUrls": [],
    "makes": [
        "Porsche"
    ],
    "keywords": "",
    "sellerType": "",
    "postcode": "",
    "includeSoldCars": false,
    "includeFullDetails": false,
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/pistonheads-uk-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 = {
    "startUrls": [],
    "makes": ["Porsche"],
    "keywords": "",
    "sellerType": "",
    "postcode": "",
    "includeSoldCars": False,
    "includeFullDetails": False,
    "maxItems": 100,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/pistonheads-uk-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 '{
  "startUrls": [],
  "makes": [
    "Porsche"
  ],
  "keywords": "",
  "sellerType": "",
  "postcode": "",
  "includeSoldCars": false,
  "includeFullDetails": false,
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call getascraper/pistonheads-uk-scraper --silent --output-dataset

```

## MCP server setup

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