# AutoTrader UK Scraper - UK Car Listings | $0.49/1K (`crawloop/autotrader-uk-scraper`) Actor

Scrape AutoTrader UK car listings: price, year, mileage, specs, dealer, location and photos. Search by make/model, postcode and radius or URL; monitor new ads. $0.49 per 1,000 cars.

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

## Pricing

from $0.49 / 1,000 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?

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 UK Scraper — UK Car Listings, Prices & Dealers

> **Disclaimer:** Unofficial tool — not affiliated with, sponsored by, or endorsed by Auto Trader Limited or its affiliates. Data is read from publicly accessible car search results and car detail pages only. No login. You are responsible for complying with applicable law (including GDPR where personal data appears) and the site’s terms. No warranty on accuracy or availability. Provided for informational and research use.

> **Contact-data controls:** Dealer phone and email are omitted unless `includeContacts` is on. Enable it only when you have a lawful basis. The site often masks those values.

**AutoTrader UK scraper** for UK car listings — an AutoTrader API alternative that turns public search results and advert pages into a JSON or CSV dataset. Search by make, model, postcode, and the usual year, price, mileage, and radius filters, or paste a car-search or car-details URL. Each row has price, price indicator, mileage, year, plate, distance, seller type, and images. Turn on detail mode for fuel, gearbox, body, engine, colour, owners, specification, description, and history. Use it from **Python**, **Node.js**, cURL, or **MCP**.

**Best for:** UK used-car price research, dealer stock checks, and alerts for new adverts and price drops.

| I need… | Actor |
| :--- | :--- |
| UK car listings | **AutoTrader UK Scraper** ◄ you are here |
| Canada car listings | [AutoTrader.ca Scraper](https://apify.com/crawloop/autotrader-ca-scraper) |
| US car listings | [Cars.com Scraper](https://apify.com/crawloop/cars-com-scraper) · [Cars & Bids](https://apify.com/crawloop/cars-and-bids-scraper) |
| Europe car listings | [AutoScout24](https://apify.com/crawloop/autoscout24-scraper) · [Mobile.de](https://apify.com/crawloop/mobile-de-scraper) |
| Used part prices | [Car-Part Scraper](https://apify.com/crawloop/car-part-scraper) |

### When to use this Actor

- **UK listing comps** — Price, price indicator, mileage, year, and plate for a make and model around a postcode.
- **Dealer and private stock** — `sellerType` is TRADE or PRIVATE, with dealer id and profile URL when the card has them.
- **Saved searches** — Paste a car-search URL. Mapped query params become filters.
- **One advert** — Paste a `/car-details/<id>` URL to fetch that advert only.
- **Watch a search** — `monitorMode` emits new adverts and price drops after a baseline run.

### When not to use this Actor

- **Logged-in features** — No account, saved ads, or messaging.
- **Other AutoTrader countries** — This Actor is the UK site. Canada is a separate Actor.
- **Private seller personal data** — Phone and email are dealer fields, off unless you opt in, and often masked on the page.

### Key features

- **Search or URL** — Make, model, and postcode, plus price, year, mileage, and radius. Extra `{filter, selected}` objects go through unchanged.
- **Flat rows** — One advert per dataset item, with GBP price as a number and the original formatted string.
- **Detail pages** — Fuel, transmission, body, engine, doors, seats, colour, owners, specification, description, and history flags.
- **Images** — Search and gallery URLs with a concrete size instead of the `{resize}` placeholder.
- **Monitor** — Named key-value store. The first run seeds a baseline and writes no rows. Later runs keep new adverts and price drops.
- **Plain HTTP** — No browser. No proxy by default. If the site blocks a request, the run switches once to Apify residential GB and continues.

### Input

| Parameter | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `startUrls` | Array | — | `/car-search?...` URLs (params `make`, `model`, `postcode`, `price-from`, `price-to`, `year-from`, `year-to`, `maximum-mileage`, `radius`, `fuel-type`, `transmission`, `body-type`) or `/car-details/<id>` URLs. |
| `make` | String | — | Make, for example Toyota. A start URL value wins when both are set. |
| `model` | String | — | Model, for example Corolla. |
| `postcode` | String | `SW1A 1AA` | Required by the site. Spaces are stripped before the request. |
| `radiusMiles` | Integer | — | Radius in miles. Sent as `distance`. |
| `yearFrom` / `yearTo` | Integer | — | Registration years. Sent as `min_year_manufactured` and `max_year_manufactured`. |
| `priceFrom` / `priceTo` | Integer | — | Cash price band in GBP. Sent as `min_price` and `max_price`. |
| `maxMileage` | Integer | — | Maximum miles. Sent as `max_mileage`. |
| `extraFilters` | Array | — | Extra `{filter, selected}` objects, including `fuel_type`, `transmission`, and `body_type`. |
| `sortBy` | String | `relevance` | `relevance`, `price_asc`, `price_desc`, `year_asc`, or `year_dsc`. Any other value is sent as `relevance`. Promoted listings can appear before the sorted results. |
| `maxItems` | Integer | `100` | Row cap. `0` means no row cap. |
| `maxPages` | Integer | `20` | Page cap. The run also stops at the site page count. |
| `scrapeDetails` | Boolean | `false` | Fetch each car-details page. |
| `includeContacts` | Boolean | `false` | Add dealer phone and email from the detail page. |
| `monitorMode` | Boolean | `false` | After a baseline run, emit only new adverts and price drops. |
| `monitorStoreName` | String | `autotrader-uk-monitor` | Key-value store for that baseline. |
| `resetMonitorState` | Boolean | `false` | Clear the baseline before this run. |
| `proxyConfiguration` | Object | No proxy | Direct connection. Residential GB is used only as an automatic fallback after a block. |

Every search also sends `price_search_type` = `total`. Price, year, mileage, and radius are sent as `min_price`, `max_price`, `min_year_manufactured`, `max_year_manufactured`, `max_mileage`, and `distance`. A car-search URL maps `price-from`, `price-to`, `year-from`, `year-to`, `maximum-mileage`, `radius`, `fuel-type`, `transmission`, and `body-type` to those gateway names (`fuel_type`, `transmission`, `body_type` for the last three). Other gateway filters belong in `extraFilters`.

#### Example input

```json
{
  "make": "Toyota",
  "model": "Corolla",
  "postcode": "SW1A 1AA",
  "radiusMiles": 50,
  "yearFrom": 2018,
  "priceTo": 20000,
  "maxMileage": 60000,
  "extraFilters": [
    {"filter": "fuel_type", "selected": ["Petrol"]}
  ],
  "maxItems": 50,
  "maxPages": 3,
  "scrapeDetails": true,
  "includeContacts": false,
  "sortBy": "relevance",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

Start-URL mode:

```json
{
  "startUrls": [
    {
      "url": "https://www.autotrader.co.uk/car-search?make=Toyota&model=Corolla&postcode=SW1A1AA&year-from=2018&radius=30"
    }
  ],
  "maxItems": 100,
  "scrapeDetails": false
}
```

One advert:

```json
{
  "startUrls": [
    {"url": "https://www.autotrader.co.uk/car-details/202610317492589"}
  ],
  "scrapeDetails": true,
  "includeContacts": false
}
```

### Output

One dataset row per advert. Missing values are null. The run does not drop a row because a key is absent.

| Field | Type | Description |
| :--- | :--- | :--- |
| `advertId` / `url` | String | Advert id and canonical car-details URL. |
| `listingType` | String | Gateway listing `type`, for example `NATURAL_LISTING` or `GPT_LISTING`. |
| `title` / `subTitle` | String | Title and derivative. |
| `make` / `model` / `year` / `registration` | Mixed | Identity. `registration` is the plate text from the badge, such as `21 reg`. |
| `price` / `priceFormatted` / `currency` | Mixed | Numeric GBP, display string, `GBP`. |
| `priceIndicator` | String | PI badge text (`Lower price`, `Good price`, …). |
| `mileageMiles` / `distanceMiles` / `location` | Mixed | Miles, distance from the postcode, town. |
| `condition` / `sellerType` | String | Condition and TRADE or PRIVATE. |
| `dealerName` / `dealerId` / `dealerUrl` / `dealerRating` | Mixed | Dealer identity. Search cards fill the name from the dealer-link slug (`vast-motors-10048848` → `Vast Motors`) and the id from the trailing number. Detail data replaces those when the page has them. Address and postcode need detail mode. |
| `imageUrls` / `imageCount` | Array / Integer | Image URLs and the advert's image count. |
| `attentionGrabber` | String | Search-card headline. |
| `financeMonthly` | Number | Monthly figure when the card has one. |
| `searchPage` / `position` | Integer | Where the card sat in the results. |
| `fuelType` / `transmission` / `bodyType` / `engineSize` | String | Detail page. |
| `doors` / `seats` / `colour` / `owners` | Mixed | Detail page. |
| `specification` / `keyFeatures` | Array | Grouped spec and the headline spec rows. |
| `description` / `history` | String / Object | Seller text and history flags (owners, keys, service history). |
| `dealerAddress` / `dealerPostcode` | String | Detail page. |
| `dealerPhone` / `dealerEmail` | String | Only when `includeContacts` is true. |
| `changeType` / `previousPrice` | Mixed | Monitor mode: `new` or `price_drop`. |
| `scrapedAt` | String | ISO timestamp. |

```json
{
  "advertId": "202610317492589",
  "listingType": "NATURAL_LISTING",
  "url": "https://www.autotrader.co.uk/car-details/202610317492589",
  "title": "Toyota Corolla",
  "subTitle": "1.8 VVT-h Icon Touring Sports CVT Euro 6 (s/s) 5dr",
  "make": "Toyota",
  "model": "Corolla",
  "year": 2021,
  "registration": "21 reg",
  "price": 12495,
  "priceFormatted": "£12,495",
  "currency": "GBP",
  "priceIndicator": "Lower price",
  "mileageMiles": 30700,
  "distanceMiles": 9,
  "location": "The Hyde",
  "condition": "used",
  "sellerType": "TRADE",
  "imageCount": 57,
  "searchPage": 1,
  "position": 1
}
```

A valid search with nothing to save ends as `[OK] 0 listings`. A non-JSON gateway body ends as `[BLOCKED]`. GraphQL `errors` end as `[API]`. Those failures are not reported as an empty success.

### Use cases

| Use case | What you get |
| :--- | :--- |
| **UK price check** | Price, indicator, mileage, year, and plate around a postcode |
| **Dealer stock** | Trade rows with dealer id and profile URL; detail adds address |
| **Private vs trade** | `sellerType` on every search card |
| **New stock and cuts** | Monitor mode for new adverts and price drops |
| **AI / MCP pipelines** | One flat JSON row per advert |

### Integration examples

#### Node.js

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('crawloop/autotrader-uk-scraper').call({
  make: 'Toyota',
  model: 'Corolla',
  postcode: 'SW1A 1AA',
  radiusMiles: 50,
  maxItems: 50,
  scrapeDetails: true,
  proxyConfiguration: { useApifyProxy: false },
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.slice(0, 5));
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient(token)
run = client.actor("crawloop/autotrader-uk-scraper").call(
    run_input={
        "make": "Toyota",
        "model": "Corolla",
        "postcode": "SW1A 1AA",
        "yearFrom": 2018,
        "maxItems": 50,
        "scrapeDetails": True,
        "proxyConfiguration": {"useApifyProxy": False},
    }
)
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items[:5])
```

#### cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/crawloop~autotrader-uk-scraper/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "make": "Toyota",
    "model": "Corolla",
    "postcode": "SW1A 1AA",
    "maxItems": 20,
    "proxyConfiguration": {
      "useApifyProxy": false
    }
  }'
```

### MCP and AI assistants

Use this Actor from AI tools via [Apify MCP](https://docs.apify.com/platform/integrations/mcp). Connect your Apify account, then call `crawloop/autotrader-uk-scraper`.

Example prompts:

- "Run AutoTrader UK Scraper for Toyota Corolla within 50 miles of SW1A 1AA, maxItems 40, and return title, price, mileage, year, and priceIndicator as JSON"
- "Scrape AutoTrader UK car-details for advert 202610317492589 with scrapeDetails on and summarize fuel, gearbox, owners, and history"
- "Chain AutoTrader UK Scraper then [AutoScout24](https://apify.com/crawloop/autoscout24-scraper) to compare a used Corolla band in the UK and in Germany"

### Suite next step

After UK stock, pull the same brief in Canada with [AutoTrader.ca Scraper](https://apify.com/crawloop/autotrader-ca-scraper), then US listings with [Cars.com Scraper](https://apify.com/crawloop/cars-com-scraper). For Europe, run [AutoScout24](https://apify.com/crawloop/autoscout24-scraper) or [Mobile.de](https://apify.com/crawloop/mobile-de-scraper). For used part prices, run [Car-Part Scraper](https://apify.com/crawloop/car-part-scraper).

### FAQ

**Is this an AutoTrader API?**\
There is no public read API for UK listing search. This Actor is an AutoTrader UK API alternative you can call from Python, Node.js, or MCP.

**Why is there a postcode?**\
The search gateway expects one. The default is `SW1A 1AA` (sent without the space).

**Does sort change the order?**\
`sortBy` accepts `relevance` (the default), `price_asc`, `price_desc`, `year_asc`, and `year_dsc`. Anything else is sent as `relevance`. Promoted listings can appear before the sorted results.

**What does monitor mode save?**\
The first run writes a baseline and no dataset rows. Later runs push new adverts and price drops, then stop early once several known adverts appear in a row. `resetMonitorState` clears that baseline.

**Cards or full specs?**\
Leave `scrapeDetails` off for search-card fields. Turn it on for fuel, gearbox, specification, description, history, and dealer address.

**Where are phone and email?**\
Only on detail rows, and only when `includeContacts` is true. Otherwise those fields are absent.

### Related Actors

- [AutoTrader.ca Scraper](https://apify.com/crawloop/autotrader-ca-scraper) — Canada car listings
- [Cars.com Scraper](https://apify.com/crawloop/cars-com-scraper) — US car listings
- [Cars & Bids](https://apify.com/crawloop/cars-and-bids-scraper) — US enthusiast auctions
- [AutoScout24](https://apify.com/crawloop/autoscout24-scraper) — Europe used cars
- [Mobile.de](https://apify.com/crawloop/mobile-de-scraper) — Germany vehicle listings
- [Car-Part Scraper](https://apify.com/crawloop/car-part-scraper) — Used part prices

# Actor input Schema

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

AutoTrader UK car-search URLs (query params make, model, postcode, price-from, price-to, year-from, year-to, maximum-mileage, radius, fuel-type, transmission, body-type are mapped to gateway filters) or car-details URLs (detail only).

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

Vehicle make, for example Toyota. Used when building a search. A start URL's make param wins when both are set.

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

Vehicle model, for example Corolla. Used together with make.

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

UK postcode. The site requires one. Spaces are removed before the request (SW1A 1AA is sent as SW1A1AA).

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

Search radius in miles. Sent to the gateway as distance.

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

Earliest registration year. Sent to the gateway as min_year_manufactured.

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

Latest registration year. Sent to the gateway as max_year_manufactured.

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

Minimum cash price in GBP. Sent to the gateway as min_price.

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

Maximum cash price in GBP. Sent to the gateway as max_price.

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

Maximum mileage in miles. Sent to the gateway as max_mileage.

## `extraFilters` (type: `array`):

Additional {filter, selected} objects (fuel_type, transmission, body_type, and any other gateway filter). Passed to the site as-is.

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

Sort sent to the gateway. Allowed: relevance (default), price_asc, price_desc, year_asc, year_dsc. Any other value is sent as relevance. Promoted listings can appear before the sorted results.

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

Maximum rows to save. 0 means no row cap (still bounded by maxPages and the site page count).

## `maxPages` (type: `integer`):

Maximum search pages to request. The run also stops at the site's page count.

## `scrapeDetails` (type: `boolean`):

Open each car-details page for fuel, gearbox, body, engine, colour, owners, specification, description, history, and dealer address.

## `includeContacts` (type: `boolean`):

Off by default. When on, dealer phone and email from the detail page are added. Enable only with a lawful basis. Values on the site may be masked.

## `monitorMode` (type: `boolean`):

First run stores a baseline and emits no rows. Later runs emit only new adverts and price drops.

## `monitorStoreName` (type: `string`):

Named key-value store for monitor state. Use a distinct name per search you watch.

## `resetMonitorState` (type: `boolean`):

Clear the saved baseline before this run so the next comparison starts fresh.

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

No proxy by default. If a request is blocked (403, 429, a challenge page, or a non-JSON gateway body), the run switches once to Apify Proxy RESIDENTIAL in GB and continues. Your group and country are used exactly as set. Country GB is filled in only when you choose RESIDENTIAL and leave country empty.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.autotrader.co.uk/car-search?make=Toyota&model=Corolla&postcode=SW1A1AA"
    }
  ],
  "postcode": "SW1A 1AA",
  "sortBy": "relevance",
  "maxItems": 100,
  "maxPages": 20,
  "scrapeDetails": false,
  "includeContacts": false,
  "monitorMode": false,
  "monitorStoreName": "autotrader-uk-monitor",
  "resetMonitorState": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Default dataset items (one AutoTrader UK advert per row).

# 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": [
        {
            "url": "https://www.autotrader.co.uk/car-search?make=Toyota&model=Corolla&postcode=SW1A1AA"
        }
    ],
    "postcode": "SW1A 1AA",
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawloop/autotrader-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": [{ "url": "https://www.autotrader.co.uk/car-search?make=Toyota&model=Corolla&postcode=SW1A1AA" }],
    "postcode": "SW1A 1AA",
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("crawloop/autotrader-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": [
    {
      "url": "https://www.autotrader.co.uk/car-search?make=Toyota&model=Corolla&postcode=SW1A1AA"
    }
  ],
  "postcode": "SW1A 1AA",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call crawloop/autotrader-uk-scraper --silent --output-dataset

```

## MCP server setup

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