# Copart UK Scraper — Salvage Vehicle Auction Lots (`solidcode/copart-co-uk-scraper`) Actor

\[💰 $0.7 / 1K] Extract salvage and used-vehicle auction lots from Copart UK across all 19 UK sale yards. Get year, make, model, damage, write-off category, mileage in miles, GBP bids, buy-it-now prices, estimated retail value, sale dates and V5 logbook status. Export to JSON, CSV or Excel.

- **URL**: https://apify.com/solidcode/copart-co-uk-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (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.70 / 1,000 lots

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/platform/actors/running/actors-in-store#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

## Copart UK Scraper — Salvage Vehicle Auction Lots

Pull every live salvage and used-vehicle lot from Copart UK into one clean table — 52 fields per
lot covering the vehicle, the damage, the write-off category, the money and the sale itself. Built
for salvage traders, vehicle dismantlers and pricing analysts who need the whole UK auction
catalogue as a spreadsheet each morning, instead of paging through a search grid twenty lots at a
time.

### Why This Scraper?

- **52 fields on every lot, not a search-grid summary** — year, make, model, trim, body style, colour, fuel, engine size, primary and secondary damage, run condition, and the UK write-off category (Cat B breaker, Cat S repairable structural, Cat N repairable non-structural).
- **Zero blanks on the fields that matter across 554 sampled lots** — year, make, model, damage, write-off category, sale yard, postcode, sale date and a photo were present on every one, across five sale yards × three vehicle categories, every cell.
- **V5 logbook status and first-registration date** — the two fields that decide whether a UK salvage vehicle can go back on the road. Neither appears in search results; both arrive when you switch on full details.
- **All 19 UK sale yards** — Sandy, Sandtoft, Sandwich, Westbury, Chester, Rochford, Wisbech, Peterlee, York, Whitburn, Bristol, Colchester, Wolverhampton, Newbury, Belfast, Gloucester, East Kilbride, Corby and St Helens, each measured live returning lots, each row carrying its yard number, town and postcode — plus the sale yard's own coordinates when full details are on.
- **Seven filters, each checked against Copart UK's own result counts** — free-text make/model, sale yard, 12 vehicle categories, year from, year to, minimum mileage and maximum mileage. Combine them, or paste a `lotSearchResults` link from the address bar and the filters are read straight out of it.
- **No misleading zeros: 12 value checks run against live data before every release** — a lot nobody has bid on returns an empty current bid rather than £0, an un-estimated repair cost stays empty, and an odometer the yard never recorded stays empty instead of reading zero miles.
- **Readable values, not internal codes** — `RUNS AND DRIVES`, `Motorcycle/ATV`, `Physical V5 Available`, `Minimum Bid`. The 12 vehicle categories come from Copart UK's own label table, so a category they add tomorrow shows up as missing rather than as a raw code.
- **GBP prices and odometer readings in miles** — both confirmed against Copart UK's own British labelling, so a price is never mistaken for dollars and a mileage is never kilometres.

### Use Cases

#### Salvage Buying & Sourcing

- Watch every lot at your two nearest yards and build a shortlist before the sale opens
- Filter to Cat N and Cat S repairables under 80,000 miles and skip the breakers entirely
- Catch buy-it-now lots — the price is on the row whenever Copart UK shows the label
- Rank by keys present, engine present and `RUNS AND DRIVES` for the lowest-risk rebuilds

#### Dismantling & Parts

- Build a weekly feed of Cat B breakers by make and model to plan parts intake
- Match arriving lots to the parts you are short of, by year, engine size and trim
- Read the extra damage areas (available with full details) to judge which panels survive

#### Pricing & Valuation

- Compare estimated retail value against the live bid across thousands of lots at once
- Model repair-cost-to-value ratios by damage type, write-off category and vehicle age
- Re-run the same search daily and watch how bids move as the sale date approaches

#### Market Research

- Measure how salvage supply splits across 19 yards, 12 vehicle categories and every fuel type
- Chart the write-off category mix over time — Cat B against Cat S against Cat N
- Compare regional stock: what Belfast lists this week versus what Wolverhampton lists

#### Data & Integration

- Send rows straight into Google Sheets, a database or your own pricing model
- Join to your own records on `lotNumber`, which is unique and stable on every row
- Schedule a daily run and fire a webhook when fresh lots land in the dataset

### Getting Started

#### Simplest run

```json
{
  "maxItems": 100
}
```

#### One yard, recent vans only

```json
{
  "saleYard": "WHITBURN",
  "vehicleCategory": "VEHTYPE_B",
  "yearFrom": 2018,
  "maxItems": 500
}
```

#### A make and model, under 100,000 miles, with full details

```json
{
  "searchTerm": "Ford Transit",
  "odometerMax": 100000,
  "enrichDetails": true,
  "maxItems": 250
}
```

#### Paste a search URL from the site

Run your search on Copart UK, copy the address bar, and the filters travel with it.

```json
{
  "searchUrls": [
    "https://www.copart.co.uk/lotSearchResults?query=FORD"
  ],
  "maxItems": 500
}
```

#### The whole UK catalogue, fully enriched

```json
{
  "maxItems": 0,
  "enrichDetails": true
}
```

### Input Reference

#### What to Scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchUrls` | array | — | Copart UK search result URLs. Run your search on the site, then paste the address bar URL here. A URL that carries its own search or filters replaces the filter fields below for that search. |
| `maxItems` | integer | `100` | Maximum lots per search URL. Set to `0` to collect everything the search returns. |

#### Search Filters

Used on their own when **Search URLs** is empty. Leave every field blank to collect the whole UK
catalogue.

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchTerm` | string | — | Make and/or model, for example `Ford` or `Ford Transit`. Matched against the make and model of each lot. |
| `saleYard` | string | — | One of the 19 UK yards, chosen from a drop-down. Blank means every yard. |
| `vehicleCategory` | string | — | One of 12 categories: cars and light vehicles, commercials under 7.5 tonnes, motorcycle/ATV, HGV, caravan, RV, plant, agricultural, boat, jet ski, snowmobile, other goods. |
| `yearFrom` | integer | — | Oldest model year to include. |
| `yearTo` | integer | — | Newest model year to include. |
| `odometerMin` | integer | — | Lowest odometer reading to include, in miles. |
| `odometerMax` | integer | — | Highest odometer reading to include, in miles. |

#### Options

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `enrichDetails` | boolean | `false` | Adds the 12 extra fields listed below, including V5 status and first-registration date. Costs one extra request per lot and bills at the higher rate. |
| `concurrency` | integer | `8` | How many requests to run at once. Lower it if you see failures. |
| `proxyConfiguration` | object | Apify Proxy | Network settings for the run. |

### Output

Every lot is one dataset row. Switching on `enrichDetails` adds 12 further fields to that same row
— there is no second record type to join.

The example below is a real captured lot, exactly as the actor emits it with full details enabled.

```json
{
  "lotNumber": 57471226,
  "url": "https://www.copart.co.uk/lot/57471226",
  "title": "2003 VAUXHALL CORSA 1.0I 12V LIFE 3DR",
  "year": 2003,
  "make": "VAUXHALL",
  "model": "CORSA",
  "modelDetail": "CORSA 1.0I 12V LIFE 3DR",
  "trim": "1.0i 12V Life 3dr",
  "vehicleType": "Vehicles Under 7.5 Tonnes",
  "bodyStyle": "HATCHBACK",
  "colour": "SILVER",
  "fuelType": "PETROL",
  "transmission": "5 SPEED MANUAL",
  "driveTrain": "2 AXLE RIGID BODY",
  "engineCc": "998 cc",
  "odometerMiles": 56024,
  "damage": "FRONT END",
  "secondaryDamage": "MECHANICAL",
  "runCondition": "ENGINE START PROGRAM",
  "titleType": "CAT B - BREAKER",
  "titleGroup": "BREAKER",
  "currency": "GBP",
  "currentBid": 100,
  "estimatedRetailValue": 1349.67,
  "yardMinimumBid": 50,
  "saleType": "Pure Sale",
  "saleYard": "WHITBURN",
  "yardNumber": 412,
  "city": "WHITBURN",
  "postcode": "EH47 7RJ",
  "country": "GBR",
  "thumbnailUrl": "https://cs.copart.com/v1/AUTH_svc.pdoc00001/lpp/0626/5e54f9bc5e56498ebbfc5174f6d0548b_thb.jpg",
  "saleDate": "2026-07-30T11:30:00+00:00",
  "saleTimeLocal": "12:30:00",
  "lastUpdated": "2026-07-27T14:22:10+00:00",
  "lotFeatures": ["Hot Items"],
  "hasKeys": true,
  "v5Status": "Physical V5 Available",
  "additionalDamage": ["SIDE", "UNDERCARRIAGE"],
  "yardLatitude": 55.86532,
  "yardLongitude": -3.65137,
  "isOffsiteLot": false,
  "hasEngine": true,
  "lotSold": false,
  "timeZone": "Europe/London",
  "firstRegisteredDate": "2003-11-27T00:00:00"
}
```

Fields with no value on a given lot are left out of that row rather than filled with a zero or an
empty string.

#### Core Fields

| Field | Type | Description |
|-------|------|-------------|
| `lotNumber` | number | Copart lot number — unique and stable, the key to join on |
| `url` | string | Direct link to the lot page |
| `title` | string | Full lot title, as shown on the site |
| `year` | number | Model year |
| `make` | string | Make |
| `model` | string | Model group |
| `modelDetail` | string | Full model description |
| `trim` | string | Trim |
| `vehicleType` | string | One of 12 categories, as a label |
| `bodyStyle` | string | Body style |
| `colour` | string | Colour |
| `fuelType` | string | Fuel type |
| `transmission` | string | Transmission, where the vehicle has one |
| `driveTrain` | string | Drive train |
| `engineCc` | string | Engine size, e.g. `998 cc` |
| `odometerMiles` | number | Odometer reading in miles; empty when the yard recorded none |
| `odometerBrand` | string | Odometer brand, e.g. `ACTUAL`, when stated |
| `damage` | string | Primary damage |
| `secondaryDamage` | string | Secondary damage |
| `runCondition` | string | Run condition, e.g. `RUNS AND DRIVES` |
| `titleType` | string | UK write-off category, e.g. `CAT B - BREAKER` |
| `titleGroup` | string | Category group, e.g. `BREAKER`, `C - SALVAGE` |

#### Price & Value

| Field | Type | Description |
|-------|------|-------------|
| `currency` | string | Currency of every money field — `GBP` on UK yards |
| `currentBid` | number | Highest bid so far; empty until somebody bids |
| `buyNowPrice` | number | Buy-it-now price, present only when the site shows the label |
| `estimatedRetailValue` | number | Estimated retail value of the vehicle undamaged |
| `estimatedRepairCost` | number | Estimated cost of repair, when the yard commissioned one |
| `yardMinimumBid` | number | The yard's published bid threshold, on the yards that publish one |
| `saleType` | string | `Pure Sale`, `Minimum Bid` or `On Approval` |

#### Location & Media

| Field | Type | Description |
|-------|------|-------------|
| `saleYard` | string | Copart UK sale yard holding the lot |
| `yardNumber` | number | Yard number |
| `city` | string | Town or city of the yard |
| `postcode` | string | Yard postcode |
| `country` | string | Country code |
| `thumbnailUrl` | string | Thumbnail photo of the lot |

#### Sale & Timestamps

| Field | Type | Description |
|-------|------|-------------|
| `saleDate` | string | Sale date and time in UTC |
| `saleTimeLocal` | string | The same sale time on the yard's own clock |
| `lastUpdated` | string | When Copart last updated the record |
| `lotFeatures` | array | Promotional labels, e.g. `Hot Items`, `Featured Cars` |
| `hasKeys` | boolean | Whether the lot comes with keys |

#### With `enrichDetails` Enabled

| Field | Type | Description |
|-------|------|-------------|
| `v5Status` | string | V5 logbook status — `Physical V5 Available`, `Partial V5 Available` or `V5 Reference only` |
| `firstRegisteredDate` | string | First UK registration date |
| `additionalDamage` | array | Further damage areas beyond primary and secondary |
| `yardLatitude` | number | Latitude of the **sale yard** (not of the vehicle) |
| `yardLongitude` | number | Longitude of the **sale yard** (not of the vehicle) |
| `isOffsiteLot` | boolean | True when the vehicle sits away from its sale yard |
| `offsiteLocationName` | string | Name of the offsite location, e.g. `Copart Hixon` |
| `offsiteLocationCity` | string | Town of the offsite location |
| `offsiteLocationPostcode` | string | Postcode of the offsite location |
| `hasEngine` | boolean | Whether an engine is present |
| `lotSold` | boolean | Whether the lot has sold |
| `timeZone` | string | Time zone the local sale time is expressed in |

### Tips for Best Results

- **Leave every filter blank and set `maxItems` to `0`** to take the whole live UK catalogue — roughly 17,000 lots at any moment. Narrow with a yard or a year band when you only need a slice.
- **Results are ordered by sale date, so page one is whatever sells next.** Live stock moves while a run is going: the catalogue shifted by tens of lots inside a single measurement window. Filter to a yard, a year band or a make for a set that reconciles run to run, and match on `lotNumber` rather than on row position.
- **`odometerMin` quietly excludes unrecorded mileage.** Where a yard never recorded a reading the field comes back empty, and any minimum-mileage filter drops those lots. Motorcycles are the common case — bikes often arrive with no mileage and no transmission string at all — so leave the minimum blank on two-wheeler searches.
- **`yardMinimumBid` is a yard policy, not a per-lot figure.** Sixteen of the 19 UK yards publish a threshold on every lot they list; Gloucester, East Kilbride and St Helens publish none, so that column is empty for all three. An empty value means "this yard sets no threshold", never "£0".
- **Turn `enrichDetails` on when you need V5 status, the first-registration date or the yard coordinates**, and off for fast price-tracking sweeps — it costs one extra request per lot and bills at the higher rate. Rows whose detail lookup comes back empty are still delivered, at the search-only rate.
- **The coordinates are the sale yard's, not the vehicle's** — every lot at one yard shares the same pair. When `isOffsiteLot` is true the vehicle is physically at the named offsite location, which can be tens of miles from those coordinates, so use the offsite fields for collection planning.
- **VIN and registration plate are masked by Copart UK** — the site publishes only asterisks, so they are deliberately not in the output. Identify vehicles on `lotNumber`, and use `title`, `year`, `make`, `modelDetail`, `trim` and `firstRegisteredDate` to match against your own records.

### Pricing

**From $0.70 per 1,000 results** (search only) or **from $1.75 per 1,000 results** (with full details).

| Results | Search Only | With Full Details |
|---------|-------------|-------------------|
| 100 | $0.07 | $0.175 |
| 1,000 | $0.70 | $1.75 |
| 10,000 | $7.00 | $17.50 |
| 100,000 | $70.00 | $175.00 |

Those are the rates on Gold and above. Higher-volume plans pay less per result:

| Your Apify plan | Search Only | With Full Details |
|-----------------|-------------|-------------------|
| No discount | $0.84 | $2.09 |
| Bronze | $0.79 | $1.99 |
| Silver | $0.74 | $1.84 |
| **Gold and above** | **$0.70** | **$1.75** |

Per 1,000 results.

A "result" is any lot row in the output dataset. When you run several searches at once, a lot matching more than one of them is de-duplicated before it reaches the dataset, so you are never charged twice for the same lot. The full-details rate applies only to rows that actually came back enriched — if a lot's detail record is unavailable, the row is still delivered and charged at the search-only rate. Platform fees (compute, storage) are additional and depend on your Apify plan.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

**This is an unofficial scraper. It is not affiliated with, endorsed by, or connected to Copart.co.uk or its operators in any way.** All trademarks belong to their respective owners.

This actor is intended for legitimate market research, valuation and inventory analysis. You are responsible for complying with applicable laws and with Copart.co.uk's Terms of Service.

Vehicle identification numbers and registration plates are published in masked form by the source
and are therefore not collected. Lot data still describes real vehicles being sold by real
businesses — use it for research and trading decisions, not for spam, harassment or any unlawful
purpose, and follow applicable privacy rules when storing or processing it.

# Actor input Schema

## `searchUrls` (type: `array`):

Copart.co.uk search result URLs. Run your search on Copart.co.uk, then paste the address bar URL here (for example https://www.copart.co.uk/lotSearchResults?query=FORD). A URL that carries its own search or filters replaces the filter fields below for that search; the filter fields are used on their own when this is left empty.

## `searchTerm` (type: `string`):

Make and/or model to look for, for example "Ford" or "Ford Transit". Matched against the make and model on each lot.

## `saleYard` (type: `string`):

Collect lots from one Copart UK yard only. Leave empty for all yards.

## `vehicleCategory` (type: `string`):

Collect one type of lot only. Leave empty for every type.

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

Oldest model year to include.

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

Newest model year to include.

## `odometerMin` (type: `integer`):

Lowest odometer reading to include, in miles. Lots whose mileage was never recorded read as 0, so leave this empty to keep them.

## `odometerMax` (type: `integer`):

Highest odometer reading to include, in miles.

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

Maximum lots per search URL (0 = collect everything each search returns).

## `enrichDetails` (type: `boolean`):

Add 12 extra fields per lot. Adds one request per lot and is billed at the higher rate.

## `concurrency` (type: `integer`):

How many requests to run in parallel. Lower this if you see failures.

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

Proxy settings for the run.

## Actor input object example

```json
{
  "searchUrls": [
    "https://www.copart.co.uk/lotSearchResults"
  ],
  "maxItems": 100,
  "enrichDetails": false,
  "concurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `core` (type: `string`):

Core Fields for each lot.

## `financial` (type: `string`):

Price & Value for each lot.

## `location` (type: `string`):

Location for each lot.

## `media` (type: `string`):

Media for each lot.

## `meta` (type: `string`):

Details & Timestamps for each lot.

# 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 = {
    "searchUrls": [
        "https://www.copart.co.uk/lotSearchResults"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/copart-co-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 = { "searchUrls": ["https://www.copart.co.uk/lotSearchResults"] }

# Run the Actor and wait for it to finish
run = client.actor("solidcode/copart-co-uk-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchUrls": [
    "https://www.copart.co.uk/lotSearchResults"
  ]
}' |
apify call solidcode/copart-co-uk-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=solidcode/copart-co-uk-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/6caPAIre9b3wo1wsi/builds/RvD1qHpT6rlraWknF/openapi.json
