# AutoTrader Scraper — UK Used Cars, Prices & Dealers (`tortuga/autotrader-scraper`) Actor

Scrape AutoTrader UK car listings by search URL or make/model + filters: price, price rating, mileage, year, specs, ULEZ, owners, dealer & rating, distance, photos; optional features & history check.

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

## Pricing

from $0.60 / 1,000 car listing scrapeds

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

## AutoTrader Scraper — UK Used Cars, Prices & Dealers

Scrape car listings from AutoTrader UK (autotrader.co.uk), the UK's largest car marketplace with around 470,000 cars for sale. Paste any AutoTrader search URL, or type a make and model and pick filters (postcode and radius, price, year, mileage, fuel, gearbox, body type, colour, seller type, new or used, keywords). Every listing comes with the full spec straight from the search: price, AutoTrader's price indicator (great / good / fair / high / lower price), year and plate, mileage, fuel, gearbox, body, colour, doors, seats, engine size, power, drivetrain, Euro emission class, CO2, ULEZ compliance, road tax, number of owners, MOT expiry, history-check status, dealer name and rating or private seller, town and distance, the seller's description and every photo.

Turn on advert page details to add the full feature list, added extras, technical data (0-62 mph, torque, dimensions, boot space), running costs (insurance group, mpg), the full vehicle history check, the market price range and dealer coordinates. No login, no cookies, no browser: the actor reads the same structured data AutoTrader's own pages use, so prices, mileages and dates are exact numbers. You pay only for the listings you get.

### What data does AutoTrader Scraper extract?

| Field | Description |
|---|---|
| `id`, `url` | AutoTrader advert id and advert URL (`https://www.autotrader.co.uk/car-details/<id>`) |
| `title`, `make`, `model`, `variant`, `trim`, `subtitle` | e.g. `BMW`, `3 Series`, "2.0 330e 12kWh M Sport Auto Euro 6 (s/s) 4dr", `M Sport` |
| `attentionGrabber` | The seller's one-line headline ("FSH, 2 keys, new MOT") |
| `condition` | `used` or `new` |
| `price`, `currency` | Asking price in pounds (number) and `GBP` |
| `priceRating`, `priceRatingLabel` | AutoTrader's price indicator: `great`, `good`, `fair`, `high`, `low` ("Lower price"); null when AutoTrader shows none |
| `vatStatus`, `noAdminFees` | VAT status (e.g. `INC_VAT`) and the "no admin fees" flag |
| `year`, `firstRegistration`, `registrationDate`, `plate` | Year, first registration `YYYY-MM`, the full date, and the plate identifier ("18", "69") |
| `mileageMiles`, `mileageKm` | Mileage in miles, and converted to km |
| `fuel`, `gearbox`, `bodyType`, `colour`, `doors`, `seats` | e.g. `Petrol Plug-in Hybrid`, `Automatic`, `Saloon`, `White`, 4, 5 |
| `engineSizeLitres`, `engineSizeCc`, `powerBhp`, `powerHp`, `powerKw`, `driveTrain`, `topSpeedMph` | Engine and performance (`powerHp` = metric hp/PS from the title when shown) |
| `emissionClass`, `co2GramsPerKm`, `ulezCompliant`, `annualTaxGbp` | Euro class, CO2 g/km, London ULEZ compliance (true/false), standard road tax per year |
| `previousOwners`, `keys`, `motExpiry`, `serviceHistory`, `historyCheckStatus` | Owners, number of keys (when given), MOT expiry date, service history, AutoTrader history check `PASSED` / `FAILED` |
| `manufacturerApproved`, `preRegistered`, `stockType` | Manufacturer-approved used car, pre-registered, physical or virtual stock |
| `sellerType`, `sellerId` | `dealer` or `private`, and the AutoTrader retailer id |
| `dealerName`, `dealerRating`, `dealerRatingCount`, `dealerPostcode`, `dealerAddress` | Dealer name, review score (out of 5), number of reviews, business postcode and street |
| `city`, `county`, `countryCode`, `distanceMiles` | Where the car is, and the distance from your postcode in miles (when a postcode is set) |
| `description` | The seller's description as plain text |
| `imageUrl`, `images`, `imageCount` | First photo and all photo URLs (1024x768 JPEG) |
| `searchUrl`, `scrapedAt`, `detailsFetched` | The search the listing came from, when it was scraped, and whether details were added |

Turn on **Include advert page details** to also open each advert page and add:

| Field | Description |
|---|---|
| `features`, `featuresByCategory` | Every standard feature ("BMW Navigation System", "Rear Parking Sensors", ...), also grouped by category |
| `addedExtras` | Optional extras the car was built with ("Seat Heating for Driver and Front Passenger", paint, leather) |
| `technicalData` | Performance and dimensions, e.g. `{"Performance": {"0-62mph": "7.2 seconds", "Engine torque": "207NM"}, "Size and dimensions": {"Boot space (seats up)": "480L"}}` |
| `runningCosts` | CO2, insurance group, tax per year, urban / extra-urban / average mpg |
| `historyCheck` | Type (`BASIC` / `FULL`), status, summary, last checked, and each check (stolen, scrapped, written off, mileage issues, outstanding finance, plate changes, ...) |
| `priceRatingDescription`, `goodPriceRange`, `mileageComparison` | "£385 below market average", the price range AutoTrader calls a good price, mileage vs. average |
| `motStatus`, `stockLabel`, `homeDelivery`, `expertRating`, `expertReviewUrl`, `videoUrls` | MOT text, "Available to reserve", home delivery, AutoTrader's expert review score and link, walk-around videos |
| `dealerUrl`, `latitude`, `longitude` | Dealer profile page and dealer coordinates (dealers only) |
| `images`, `imageCount` | The full photo gallery |

### How to scrape AutoTrader UK

1. Either open autotrader.co.uk, set your filters, and copy the results URL into **Start URLs**, or fill in **Make** and **Model** (as written on AutoTrader: `BMW` + `3 Series`, `Volkswagen` + `Golf`, `Land Rover` + `Range Rover Sport`) and the filters you need.
2. Add a **Postcode** (and **Radius**) to search around a place and get the distance of every car.
3. Set **Max items** to cap the run and the cost, and turn on **Include advert page details** if you need features, technical data and the full history check.
4. Click **Start** and export the dataset as JSON, CSV or Excel, or read it through the API.

### Input example

Make, model and filters:

```json
{
  "make": "BMW",
  "model": "3 Series",
  "postcode": "SW1A 1AA",
  "radiusMiles": 50,
  "priceFrom": 10000,
  "priceTo": 25000,
  "yearFrom": 2019,
  "mileageTo": 60000,
  "fuelTypes": ["Petrol", "Hybrid"],
  "gearbox": ["Automatic"],
  "sellerType": "dealer",
  "sort": "most_recent",
  "maxItems": 500
}
```

Or search and advert URLs straight from the browser:

```json
{
  "startUrls": [
    { "url": "https://www.autotrader.co.uk/car-search?postcode=M1%201AE&radius=30&make=Ford&model=Fiesta&price-to=8000&year-from=2016&transmission=Manual&sort=price-asc" },
    { "url": "https://www.autotrader.co.uk/car-details/202608305569752" }
  ],
  "maxItems": 1000,
  "includeDetails": true
}
```

### Output example

```json
{
  "id": "202610106854808",
  "url": "https://www.autotrader.co.uk/car-details/202610106854808",
  "title": "BMW 3 Series 2.0 330e 12kWh M Sport Saloon 4dr Petrol Plug-in Hybrid Auto Euro 6 (s/s) (292 ps)",
  "make": "BMW",
  "model": "3 Series",
  "variant": "2.0 330e 12kWh M Sport Auto Euro 6 (s/s) 4dr",
  "trim": "M Sport",
  "attentionGrabber": "PAN,DRIVING ASSIS,LASER,360CAM",
  "condition": "used",
  "price": 21995,
  "currency": "GBP",
  "priceRating": "good",
  "priceRatingLabel": "Good price",
  "year": 2021,
  "firstRegistration": "2021-03",
  "registrationDate": "2021-03-05",
  "plate": "21",
  "mileageMiles": 49000,
  "mileageKm": 78858,
  "fuel": "Petrol Plug-in Hybrid",
  "gearbox": "Automatic",
  "bodyType": "Saloon",
  "colour": "White",
  "doors": 4,
  "seats": 5,
  "engineSizeLitres": 2.0,
  "engineSizeCc": 1998,
  "powerBhp": 288,
  "powerHp": 292,
  "powerKw": 215,
  "driveTrain": "Rear Wheel Drive",
  "emissionClass": "Euro 6",
  "co2GramsPerKm": 36,
  "ulezCompliant": false,
  "annualTaxGbp": 200,
  "topSpeedMph": 143,
  "previousOwners": 5,
  "motExpiry": "2026-11-20",
  "historyCheckStatus": "PASSED",
  "sellerType": "dealer",
  "sellerId": "10046739",
  "dealerName": "GB VEHICLES LTD",
  "dealerRating": 5.0,
  "dealerRatingCount": 3,
  "dealerPostcode": "NW7 3HS",
  "city": "Mill Hill",
  "county": "Middlesex",
  "countryCode": "GB",
  "distanceMiles": 11,
  "imageUrl": "https://m.atcdn.co.uk/a/media/w1024h768/1c90e10935244b67ac98b3520ba8c7b8.jpg",
  "imageCount": 1,
  "searchUrl": "https://www.autotrader.co.uk/car-search?make=BMW&model=3%20Series&postcode=SW1A%201AA&radius=50&sort=most-recent",
  "scrapedAt": "2026-10-10T06:43:21+00:00",
  "detailsFetched": false
}
```

### How many results can I get from one AutoTrader search?

AutoTrader serves at most 400 listings for any single search. When a search has more and your **Max items** asks for more, the actor walks it in price windows automatically (cheapest first, each window under 400 listings), so searches with thousands of listings (every BMW 3 Series in the UK is about 7,000) work in one run, with duplicates removed. Tested: all 2,591 VW Golfs within 50 miles of Manchester in one run, 2,591 unique listings. Turn off **Split large searches** to stop at the first 400 in AutoTrader's order instead. Listings without a price (POA) can be missed when a search is walked by price.

### Which filters work in AutoTrader search URLs?

Make, model, postcode, radius, price from/to, year from/to, minimum/maximum mileage, fuel type (including "Hybrid"), transmission, body type, colour, drivetrain, engine size, engine power, seller type, keywords, "exclude write-offs" and the sort order. Other filters in a pasted URL (insurance group, CO2 band, annual tax band, acceleration, ...) are listed in the run's SUMMARY as ignored rather than silently changing the results. AutoTrader.com (US), AutoTrader.ca and other AutoTrader sites are different companies and are not supported.

### Does it need an AutoTrader account? Does it collect phone numbers?

No account, cookies or API key are needed: everything comes from public search results and advert pages. Phone numbers (behind "Show number" or protected for private sellers), e-mail addresses and the registration number (which AutoTrader masks) are never collected. Private sellers are exported with their town only; dealers come with their public business name, address, postcode, rating and profile page.

### Monitor changes on a schedule

Turn on **Only new or changed items** to watch a search: each run remembers what earlier runs returned and outputs only listings that are new or whose price changed, so a daily schedule gives you fresh stock and price drops. Unchanged listings are dropped before any advert page is opened and are not charged. **Max items** then sets how many listings are checked per run, so keep **Sort: Most recent first** and a window such as 200. Save the input as a task and add a Schedule in Apify (for example daily); give each watch its own **Monitoring key** if several schedules use the same search. Every output item has `changeType` (`new` or `changed`), and changed items have `previousValues` with the old price, e.g. `{"price": 12995}`.

### Pricing

$0.60 per 1,000 listings ($0.0006 per listing) with the full search data, and $0.60 per 1,000 more ($0.0006 per listing) for listings scraped with **Include advert page details**. No start fee, no subscription. Platform usage is billed by Apify on top and is small: about $0.005-0.006 per 1,000 listings from search results and about $0.015 per 1,000 with details on (measured on 512 MB, datacenter proxy).

### Proxy note

The default Apify Proxy (datacenter) is enough for AutoTrader UK. About 1-3% of requests meet a Cloudflare check; they are retried on a new IP automatically. No residential or Unblocker traffic is used, so there is no proxy cost per page.

### Integrations and API

Run it from Python or Node with the Apify client, schedule it to track prices or new stock, or send the dataset to Google Sheets, Zapier, Make or n8n. Field names follow our mobile.de and AutoScout24 scrapers (`price`, `priceRating`, `mileageKm`, `firstRegistration`, `fuel`, `gearbox`, `bodyType`, `colour`, `sellerType`, `dealerName`, `images`, ...), so UK and European listings combine in one table. See the **API** tab for ready-made snippets.

### Is it legal to scrape AutoTrader?

This Actor collects only data that AutoTrader shows publicly to every visitor: vehicle details, prices, photos, the town of the car, and dealers' public business details. It does not log in and does not collect phone numbers, e-mail addresses, registration numbers or private sellers' names or addresses. You are responsible for how you use the data and for complying with AutoTrader's terms and applicable law (including UK GDPR).

### Support

Missing a field, or a search URL that does not work? Open an issue in the **Issues** tab; it is usually answered within a day.

# Actor input Schema

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

AutoTrader UK search pages with filters set in the browser, e.g. https://www.autotrader.co.uk/car-search?postcode=SW1A1AA\&radius=50\&make=BMW\&model=3%20Series\&price-to=20000, or single adverts (https://www.autotrader.co.uk/car-details/<id>). Leave empty to use the Make / Model search below. Only autotrader.co.uk is supported.

## `make` (type: `string`):

Brand as shown on AutoTrader, e.g. BMW, Ford, Volkswagen, Mercedes-Benz, Land Rover, Tesla. The filters below apply to this search only, not to Start URLs. Leave empty for all makes.

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

Model as shown on AutoTrader, e.g. 3 Series, Golf, Fiesta, Qashqai, Range Rover Sport, Model 3. Needs a Make.

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

UK postcode to search around (e.g. SW1A 1AA, M1 1AE). Adds the distance in miles to every listing. Without a radius the whole UK is searched.

## `radiusMiles` (type: `integer`):

Only cars within this many miles of the postcode (AutoTrader offers 1-200). Needs a Postcode. Leave empty for national.

## `priceFrom` (type: `integer`):

Minimum asking price in pounds.

## `priceTo` (type: `integer`):

Maximum asking price in pounds.

## `yearFrom` (type: `integer`):

Earliest year of manufacture, e.g. 2018.

## `yearTo` (type: `integer`):

Latest year of manufacture.

## `mileageFrom` (type: `integer`):

Minimum mileage in miles.

## `mileageTo` (type: `integer`):

Maximum mileage in miles.

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

Only these fuel types. 'Hybrid' covers all petrol/diesel hybrids and plug-ins. Leave empty for all.

## `gearbox` (type: `array`):

Only these transmissions. Leave empty for all.

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

Only these body types. Leave empty for all.

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

Only these body colours. Leave empty for all.

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

Only dealers (trade) or only private sellers.

## `condition` (type: `string`):

Only used or only new cars.

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

Free-text keywords AutoTrader matches against the advert, e.g. 'heated seats' or 'full service history'.

## `excludeWriteOffs` (type: `boolean`):

Leave out cars recorded as insurance write-offs (Cat S / Cat N).

## `sort` (type: `string`):

Order of the Make / Model search. 'Most recent' is best for monitoring new listings. 'Relevance' and 'Distance' need a Postcode (otherwise most recent is used).

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

Stop after this many listings in total (across all searches). Keeps cost predictable. With 'Only new or changed items' on, this is the number of listings checked per run.

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

Also open every advert page for the full feature list (by category), added extras, technical data (0-62, torque, dimensions, boot space), running costs (insurance group, mpg, tax), the full history-check list, MOT status, market price range, dealer coordinates and profile URL, all photos and videos. Charged as an extra 'detail' event per listing; one extra request per listing.

## `splitLargeSearches` (type: `boolean`):

AutoTrader serves at most 400 listings per search. When a search has more and Max items asks for more, it is walked in price windows automatically so you can get all of them (results then come cheapest first).

## `onlyNewOrChanged` (type: `boolean`):

Remember what earlier runs of this search returned and output only new items or items whose price/status changed. Use with a Schedule; unchanged items are not charged.

## `monitoringKey` (type: `string`):

Name for this watch, so several schedules on the same search stay separate; defaults to a key derived from the search input

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

Apify Proxy (datacenter) works for AutoTrader UK and is the default; occasional Cloudflare challenges are retried on a new IP automatically. No residential or Unblocker traffic is needed.

## Actor input object example

```json
{
  "startUrls": [],
  "make": "BMW",
  "model": "3 Series",
  "excludeWriteOffs": false,
  "sort": "most_recent",
  "maxItems": 100,
  "includeDetails": false,
  "splitLargeSearches": true,
  "onlyNewOrChanged": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "startUrls": [],
    "make": "BMW",
    "model": "3 Series",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("tortuga/autotrader-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": [],
    "make": "BMW",
    "model": "3 Series",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("tortuga/autotrader-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": [],
  "make": "BMW",
  "model": "3 Series",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call tortuga/autotrader-scraper --silent --output-dataset

```

## MCP server setup

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