# Copart UK \[Only $1.5💰] Search By Urls and Keywords | Auctions (`memo23/copart-scraper`) Actor

\[Only $1.5💰] Copart UK lots via search URL or filters (make, model, year, odometer, yards, chips). Flat JSON/CSV: vehicle specs, damage, yard & GPS, auction, bids & sale dates, title, masked VIN & reg, odometer, notes, lotImages, thumbnail\_image, sourceUrl, searchResult.

- **URL**: https://apify.com/memo23/copart-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Automation, Lead generation, Integrations
- **Stats:** 2 total users, 1 monthly users, 40.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 results

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

**Unlock Copart UK auction lot data** - Scrape salvage and used vehicle listings from [Copart UK](https://www.copart.co.uk) by driving the same mobile search and lot-detail APIs the member app uses. Ideal for inventory monitoring, pricing research, and building structured datasets from lot search URLs or actor filters—with exports in JSON and CSV.

*Copart UK lots via search URL or filters (make, model, year, odometer, yards, chips). Flat JSON/CSV: vehicle specs, damage, yard & GPS, auction, bids & sale dates, title, masked VIN & reg, odometer, notes, lotImages, thumbnail_image, sourceUrl, searchResult.*

### Overview

The Copart UK Scraper collects **lot detail** records for vehicles (and related inventory) matching your **Copart UK lot search**. It starts from either **full `lotSearchResults` URLs** (including the `searchCriteria` query) or **in-actor filters** (featured chips, extra FETI clauses, or “search all vehicles”). It calls the mobile **`POST /srch/`** search endpoint, then **`POST /lots-api/v1/lot-details`** per lot, and writes **flattened** rows to the dataset (no raw `mobileRequest` payload).

### What does Copart UK Scraper do?

The Copart UK Scraper enables you to:

#### Comprehensive data collection
- **Lot listings**
  - Pull full lot detail fields returned by the mobile lot-details API (vehicle, damage, yard, auction, bids, title, odometer, etc.)
  - Collect **full-size image URLs** in `lotImages` plus a **thumbnail** in `thumbnail_image`
  - Preserve the **search hit** context in `searchResult` (snake_case fields from the search index)
  - Attach **`sourceUrl`** so you know which search produced each lot

#### Advanced behaviour
- **Search criteria mapping**: Translates web `searchCriteria` JSON (FETI, MAKE, MODL, YEAR, ODM, RNCD, LOC, etc.) into the mobile `/srch/` filter format where captured (see codebase `copartMobileMapper.ts`).
- **Pagination**: Follows search pages until limits or no more results.
- **Deduplication**: Uses extended unique keys so identical POST URLs with different bodies are not collapsed incorrectly.

#### Flexible input
- **Start URLs**: Paste one or more Copart UK lot search URLs, e.g.  
  `https://www.copart.co.uk/lotSearchResults?...&searchCriteria=...`
- **Filters only**: Leave `startUrls` empty and use **Search all vehicles**, **Featured filters** (multi-select), and/or **Extra FETI clauses** (raw Solr-style fragments as on the site URL).

This tool is ideal for:
- Salvage and used-vehicle market research
- Tracking lots by make, model, yard, damage, or odometer bands
- Building datasets aligned with Copart UK search UI behaviour

### Features

- **UK-focused**: Host `www.copart.co.uk` / `copart.co.uk`, company/site codes for CPRTUK.
- **Dual input modes**: Full search URLs **or** actor filter fields (URLs win when both are provided).
- **Flattened output**: `lotDetails` fields at the top level; `lotImages` as string URLs only.
- **Concurrency & retries**: Configurable `maxConcurrency`, `minConcurrency`, `maxRequestRetries`.
- **Proxy support**: Apify proxy configuration (residential recommended for member API traffic).
- **Exports**: Dataset JSON/CSV (e.g. `data.json`, `data.csv` when exported from runs).

### How to use

#### Scraping lots
1. **Set up**: Apify account and this actor on the Apify platform (or run locally with Apify SDK / Crawlee).
2. **Configure input** (choose one primary path):
   - Add **Start URLs**: full `https://www.copart.co.uk/lotSearchResults?...` links **including** `searchCriteria` when you copy from the browser, **or**
   - Leave **Start URLs** empty: enable **Search all vehicles** and/or **Featured filters** / **Extra FETI clauses** per the input schema.
3. **Adjust limits**: Set `maxItems`, concurrency, retries, and **proxy** as needed.
4. **Run** the actor.
5. **Collect** dataset items (JSON/CSV). Each item is one lot with flattened detail fields.

### Input configuration

Example input (URLs + limits + proxy):

```json
{
    "startUrls": [
        "https://www.copart.co.uk/lotSearchResults?qId=example&searchCriteria=%7B%22query%22%3A%5B%22*%22%5D%2C%22filter%22%3A%7B%7D%7D"
    ],
    "searchAllVehicles": false,
    "featuredChips": ["buyItNow", "highValueItems"],
    "extraFetiClauses": [],
    "maxItems": 1000,
    "maxConcurrency": 10,
    "minConcurrency": 1,
    "maxRequestRetries": 60,
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": ["RESIDENTIAL"]
    }
}
````

#### Input fields explanation

- **`startUrls`** (Array of strings): Copart UK **lot search** URLs. If this array is **non-empty**, every URL must be a `lotSearchResults` link; the actor **ignores** the filter section below and uses each URL’s `searchCriteria` (after mapping to the mobile API). If **empty**, you must satisfy the filter rules below.
- **`searchAllVehicles`** (Boolean): When `startUrls` is empty, set to `true` to run a very broad UK search (default year facet behaviour in the mapper). If `false`, you need at least one meaningful filter or extra FETI clause.
- **`featuredChips`** (Array of strings, multi-select): “Featured items” style facets. Fully wired fragments in code include e.g. `vehiclesForAuction`, `buyItNow`, `highValueItems`, `hotItems`; other chip IDs may log a warning until mapped in `src/lib/copartFeaturedChips.ts`.
- **`extraFetiClauses`** (Array of strings): Additional Solr-style FETI lines copied from a real `searchCriteria` URL on copart.co.uk—appended after featured chip fragments.
- **`maxItems`** (Integer): Maximum number of **lot detail** records to push to the dataset (subject to Apify account limits / actor logic).
- **`maxConcurrency`** / **`minConcurrency`** (Integer): Crawler concurrency bounds for HTTP requests.
- **`maxRequestRetries`** (Integer): Retries per failed request.
- **`proxy`** (Object): Apify proxy configuration; residential groups are commonly used for Copart member endpoints.

### Output structure

The dataset contains **one object per lot**. Data comes from the mobile **lot-details** response, **flattened** (no nested `lotDetails` wrapper), with `lotImages` as URL strings, plus `sourceUrl`, `searchResult`, and `thumbnail_image`.

#### Sample JSON output (first object from `data.json`, pretty-printed)

```json
{
    "auctionAssignmentNumber": 0,
    "auctionDateType": "F",
    "bodyStyle": "ESTATE",
    "buyTodayBid": 0,
    "color": "GREY",
    "drive": "2 AXLE RIGID BODY",
    "runCondition": "S",
    "fuel": "DIESEL",
    "gridRow": "4L10",
    "keys": "YES",
    "hasOwnerManual": "No",
    "hasTransmission": "Yes",
    "hasEngine": "Yes",
    "highlights": "ENGINE START PROGRAM",
    "lotCountry": "GBR",
    "lotMakeCode": "VOLV",
    "lotModelDesc": "XC60 R DES",
    "lotMakeDesc": "VOLVO",
    "lotYear": 2019,
    "trim": "",
    "category": "S REPAIRABLE STRUCTURAL",
    "lotDescription": "2019 VOLVO XC60 2.0 D4 R DESIGN 5DR GEARTRONIC",
    "navigation": "No",
    "offsiteFlag": false,
    "lotNumber": 47493436,
    "notes": "PHYSICAL V5 AVAILABLE",
    "odometer": 80668,
    "goAppUser": "",
    "primaryDamage": "FRONT END",
    "primaryDamageCode": "DAMAGECODE_FR",
    "secDamage": "SIDE",
    "repairEst": 0,
    "vatTosale": "No",
    "vehicleTypeCode": "VEHTYPE_V",
    "vehicleTypeDesc": "VEHICLES UNDER 7.5 TONNES",
    "siteCode": [
        "CPRTUK"
    ],
    "sellerSource": "",
    "transmission": "8 SPEED AUTO",
    "transmissionType": "8 SPEED AUTO",
    "prop65Warning": false,
    "maskedVIN": "*****************",
    "isLotOwner": false,
    "vehicleRegistrationNumber": "*******",
    "yardName": "BRISTOL",
    "yardNumber": 415,
    "yardZipCode": "BS10 7SF",
    "yardCityName": "AVONMOUTH, BRISTOL",
    "yardTwoLetterState": "GB",
    "buildSheetFlag": false,
    "lotIconCodes": [
        "ADDL-INFO",
        "CERT-S",
        "IV",
        "VHDRP"
    ],
    "hasVehicleReport": true,
    "isInsuranceSeller": true,
    "titleState": "GB",
    "saleTitleType": "S",
    "titleDescription": "S REPAIRABLE STRUCTURAL",
    "titleGroupCode": "TITLEGROUP_C",
    "titleGroupDescription": "Clean",
    "auctionHostName": "BRISTOL",
    "auctionHostId": 415,
    "currencyCode": "GBP",
    "saleDate": "2026-04-22T09:00:00Z",
    "lastUpdated": "04/10/2026, 12:00 am",
    "isSealedBid": false,
    "engine": "1969 cc",
    "estRetailValue": 16902.67,
    "sublotFlag": false,
    "subLotLocation": null,
    "subLotMapsLocation": null,
    "soldFlag": false,
    "timeZone": "BS",
    "isBuyTodayLot": false,
    "latitude": 51.53199,
    "longitude": -2.65965,
    "physicalYardNumber": 415,
    "showJapanSaleDisclaimer": false,
    "currentBid": 0,
    "displayBidAmount": 0,
    "isCopartWholesaleLot": false,
    "showConditionReportV2": false,
    "nonGoApSellerCompanyLot": "",
    "sellerInfo": {},
    "bidState": "PRELIMBID",
    "bidStatus": "NEVERBID",
    "saleStatus": "PURESALE",
    "allowStartingBidAmount": true,
    "isMakeAnOfferLot": false,
    "firstRegistrationDate": "20190610",
    "saleLightColor": "",
    "additionalNotes": [
        {
            "NOTEDATE": "27/03/2026",
            "ESQNBR": 77,
            "NOTE": "NUMBER OF KEYS 2                                                           "
        }
    ],
    "enableUpdatedOffsiteLotPilot": false,
    "autoCheckFlag": false,
    "lotImages": [
        "https://c-static.copart.com/v1/AUTH_svc.pdoc00001/ids-c-prod-lpp/0326/7713961ca0f2421fb821c61db431e534_ful.jpg",
        "https://c-static.copart.com/v1/AUTH_svc.pdoc00001/ids-c-prod-lpp/0326/124caef72e9e4f6f86b1905be87ff4f8_ful.jpg",
        "https://c-static.copart.com/v1/AUTH_svc.pdoc00001/ids-c-prod-lpp/0326/cd9b47738f5d4f37a2b1b0bcb6bdbfe4_ful.jpg",
        "https://c-static.copart.com/v1/AUTH_svc.pdoc00001/ids-c-prod-lpp/0326/99c62b66014c406eab505c340bdf651f_ful.jpg",
        "https://c-static.copart.com/v1/AUTH_svc.pdoc00001/ids-c-prod-lpp/0326/84c7f56f2a044796b0c9a0c9191247cd_ful.jpg",
        "https://c-static.copart.com/v1/AUTH_svc.pdoc00001/ids-c-prod-lpp/0326/d1fc528e27fe45e38408e89866464a9d_ful.jpg",
        "https://c-static.copart.com/v1/AUTH_svc.pdoc00001/ids-c-prod-lpp/0326/76e66da09a1c474f8a6081112a254198_ful.jpg",
        "https://c-static.copart.com/v1/AUTH_svc.pdoc00001/ids-c-prod-lpp/0326/234da12212c4431bb5568170ac780d68_ful.jpg",
        "https://c-static.copart.com/v1/AUTH_svc.pdoc00001/ids-c-prod-lpp/0326/8fb75afa77624dfca6354372f51e47e0_ful.jpg",
        "https://c-static.copart.com/v1/AUTH_svc.pdoc00001/ids-c-prod-lpp/0326/bfcb79d9df5b4182bba5cc7d026eceb8_ful.jpg",
        "https://c-static.copart.com/v1/AUTH_svc.pdoc00001/ids-c-prod-lpp/0426/389ca93b773e4affb80945e61724db8d_ful.jpg",
        "https://c-static.copart.com/v1/AUTH_svc.pdoc00001/ids-c-prod-lpp/0326/443afe2735e64b0db3db5f4e1b3e0b59_ful.jpg"
    ],
    "sourceUrl": "https://www.copart.co.uk/lotSearchResults?qId=cdb3c72e-e25e-4bc6-8b25-bc22009f1e36-1775984478013&intcmp=web_homepage_banner&searchCriteria=%7B%22query%22:%5B%22*%22%5D,%22filter%22:%7B%22MAKE%22:%5B%22lot_make_desc:%5C%22VOLVO%5C%22%22%5D,%22MODL%22:%5B%22manufacturer_model_desc:%5C%22XC60%5C%22%22%5D,%22YEAR%22:%5B%22lot_year:%5B2018%20TO%202024%5D%22%5D,%22ODM%22:%5B%22odometer_reading_received:%5B75001%20TO%20100000%5D%22%5D%7D,%22searchName%22:%22%22,%22watchListOnly%22:false,%22freeFormSearch%22:false%7D",
    "searchResult": {
        "auction_host_name": "BRISTOL",
        "auction_host_id": 415,
        "buy_it_now_price": 0,
        "currency_code": "GBP",
        "sealed_bid_flag": false,
        "auction_date_utc": "2026-04-22T09:00:00Z",
        "auction_date_type": "F",
        "auction_assignment_number": 0,
        "lot_desc": "2019 VOLVO XC60 2.0 D4 R DESIGN 5DR GEARTRONIC",
        "lot_number": 47493436,
        "odometer_reading_received": 80668,
        "lot_thumbnail_image_path": "cs.copart.com/v1/AUTH_svc.pdoc00001/lpp/0326/7713961ca0f2421fb821c61db431e534_thb.jpg",
        "yard_name": "BRISTOL",
        "yard_number": 415,
        "title_desc": "S REPAIRABLE STRUCTURAL",
        "lot_icon_codes": [
            "ADDL-INFO",
            "CERT-S",
            "IV",
            "VHDRP"
        ],
        "purple_wave_url": "",
        "show_updated_offsite_lot_text": false,
        "hide_odometer": false,
        "full_vin": "*****************"
    },
    "thumbnail_image": "https://c-static.copart.com/v1/AUTH_svc.pdoc00001/ids-c-prod-lpp/0326/7713961ca0f2421fb821c61db431e534_thb.jpg"
}
```

*This sample matches the first element of `data.json` (same values; indentation added for readability).*

### Output fields explanation

Fields below match the **first object** in `data.json` (flattened Copart mobile lot detail + actor-added fields). Types reflect typical values; Copart may add or omit fields over time.

#### Auction & sale

- **`auctionAssignmentNumber`** (Number): Lane/assignment identifier for the sale event (0 if not assigned in sample).
- **`auctionDateType`** (String): Auction date classification code from Copart (e.g. `F`).
- **`saleDate`** (String, ISO 8601): Scheduled sale / auction datetime (UTC).
- **`lastUpdated`** (String): Human-readable last update string from the API.
- **`saleStatus`** (String): Sale lifecycle code (e.g. `PURESALE`).
- **`saleLightColor`** (String): Sale light indicator (empty if none).
- **`isSealedBid`** (Boolean): Whether the lot is a sealed-bid sale.
- **`timeZone`** (String): Yard/sale timezone code (e.g. `BS`).
- **`auctionHostName`** (String): Host location name for the auction (often matches yard).
- **`auctionHostId`** (Number): Numeric host / auction location id.

#### Vehicle identity & specs

- **`lotNumber`** (Number): Copart lot number (primary key for the listing).
- **`lotDescription`** (String): Full text description line for the vehicle.
- **`lotYear`** (Number): Model year.
- **`lotMakeDesc`** / **`lotMakeCode`** (String): Make label and internal make code.
- **`lotModelDesc`** (String): Model / trim description string.
- **`trim`** (String): Trim field (may be empty).
- **`bodyStyle`** (String): Body style label (e.g. `ESTATE`).
- **`color`** (String): Exterior colour label.
- **`fuel`** (String): Fuel type label.
- **`drive`** (String): Drivetrain / axle description.
- **`engine`** (String): Engine displacement or description text.
- **`transmission`** / **`transmissionType`** (String): Transmission description (often duplicated).
- **`odometer`** (Number): Odometer reading (miles context for UK listings in typical use).
- **`runCondition`** (String): Run-and-drive style code (e.g. `S`, `N`—Copart-coded).
- **`keys`** (String): Whether keys are present (e.g. `YES` / `NO`).
- **`hasOwnerManual`** / **`hasTransmission`** / **`hasEngine`** (String): Yes/No flags from condition checklist.
- **`highlights`** (String): Highlight line (e.g. programme name).
- **`navigation`** (String): Navigation present flag (e.g. `No`).
- **`vehicleTypeCode`** / **`vehicleTypeDesc`** (String): Vehicle category code and description.
- **`category`** (String): Damage / listing category line (e.g. repairable structural).
- **`firstRegistrationDate`** (String): Registration date, often `YYYYMMDD`.

#### Damage & valuation

- **`primaryDamage`** / **`primaryDamageCode`** (String): Primary damage description and Copart damage code.
- **`secDamage`** (String): Secondary damage description.
- **`repairEst`** (Number): Repair estimate amount (currency implied by `currencyCode`).
- **`estRetailValue`** (Number): Estimated retail value.

#### Title & legal

- **`titleState`** (String): Title jurisdiction (e.g. `GB`).
- **`saleTitleType`** (String): Title type code (e.g. `S`).
- **`titleDescription`** (String): Human-readable title / category line.
- **`titleGroupCode`** / **`titleGroupDescription`** (String): Title group code and label (e.g. Clean group).
- **`notes`** (String): Free-text notes line (e.g. V5 availability).
- **`vatTosale`** (String): VAT treatment flag for sale (e.g. `Yes` / `No`).
- **`prop65Warning`** (Boolean): Prop 65 flag (often false for UK).

#### Yard & location

- **`lotCountry`** (String): Country code for the lot (e.g. `GBR`).
- **`siteCode`** (Array of strings): Site codes (e.g. `CPRTUK`).
- **`yardName`** (String): Yard display name.
- **`yardNumber`** / **`physicalYardNumber`** (Number): Yard identifiers.
- **`yardZipCode`** (String): Yard postal code.
- **`yardCityName`** (String): City / area label for the yard.
- **`yardTwoLetterState`** (String): Region code (e.g. `GB`).
- **`latitude`** / **`longitude`** (Number): Geocoordinates for the yard / lot location.
- **`offsiteFlag`** (Boolean): Offsite lot flag.
- **`sublotFlag`** (Boolean): Sub-lot flag.
- **`subLotLocation`** / **`subLotMapsLocation`** (null|String): Sub-lot location fields when applicable.

#### Seller & flags

- **`sellerSource`** (String): Seller source string (may be empty).
- **`sellerInfo`** (Object): Seller metadata object (often empty `{}`).
- **`isInsuranceSeller`** (Boolean): Insurance-seller indicator.
- **`isLotOwner`** (Boolean): Lot owner flag for the viewing user context.
- **`nonGoApSellerCompanyLot`** (String): Non–GO seller company marker when set.
- **`isCopartWholesaleLot`** (Boolean): Wholesale lot flag.
- **`isBuyTodayLot`** / **`buyTodayBid`** (Boolean|Number): Buy-It-Now style flags and amount.
- **`isMakeAnOfferLot`** (Boolean): Make-an-offer eligibility.
- **`gridRow`** (String): Yard grid / row locator for physical location.

#### VIN & registration

- **`maskedVIN`** (String): Masked VIN for display.
- **`vehicleRegistrationNumber`** (String): Masked or partial registration number.

#### Bidding & display

- **`currentBid`** / **`displayBidAmount`** (Number): Current bid values shown to the user.
- **`bidState`** (String): Bid state machine code (e.g. `PRELIMBID`).
- **`bidStatus`** (String): User bid status (e.g. `NEVERBID`).
- **`allowStartingBidAmount`** (Boolean): Whether starting bid rules apply as shown.
- **`soldFlag`** (Boolean): Whether the lot is marked sold.

#### Icons, reports, misc

- **`lotIconCodes`** (Array of strings): Feature / badge codes (e.g. certificate, inspection).
- **`hasVehicleReport`** (Boolean): Vehicle report available flag.
- **`buildSheetFlag`** (Boolean): Build sheet available flag.
- **`showConditionReportV2`** (Boolean): Condition report UI flag.
- **`showJapanSaleDisclaimer`** (Boolean): Japan sale disclaimer flag.
- **`enableUpdatedOffsiteLotPilot`** (Boolean): Feature pilot flag.
- **`autoCheckFlag`** (Boolean): AutoCheck (or similar) flag.
- **`goAppUser`** (String): GO app user field (often empty in exports).

#### Notes array

- **`additionalNotes`** (Array of objects): Yard/auction notes.
  - **`NOTEDATE`** (String): Note date string.
  - **`ESQNBR`** (Number): Sequence / id number for the note.
  - **`NOTE`** (String): Note body text (often padded).

#### Media & provenance (added by scraper)

- **`lotImages`** (Array of strings): Full-resolution image URLs (`*_ful.jpg` style paths on Copart CDN).
- **`thumbnail_image`** (String): Thumbnail taken from the first image row’s `thumbnailUrl` in the lot-details response (or that row’s `url` if `thumbnailUrl` is missing). Usually a `*_thb.jpg` URL on the Copart CDN when the API returns absolute URLs. `searchResult.lot_thumbnail_image_path` is the separate search-index path and may omit the scheme.
- **`sourceUrl`** (String): The **lot search** URL that produced this lot in the run (includes encoded `searchCriteria` when copied from the browser).

#### `searchResult` object (search index hit, snake\_case)

These fields mirror the **search** payload for this lot before lot-details enrichment. Names stay in snake\_case as in the API.

- **`auction_host_name`** (String): Auction host / sale location name (e.g. yard name).
- **`auction_host_id`** (Number): Numeric id for the auction host location.
- **`buy_it_now_price`** (Number): Buy-it-now price from the search index (0 if none / not applicable).
- **`currency_code`** (String): Currency for monetary fields in the search hit (e.g. `GBP`).
- **`sealed_bid_flag`** (Boolean): Whether the search index marks the lot as sealed bid.
- **`auction_date_utc`** (String, ISO 8601): Scheduled auction datetime from the search index (UTC).
- **`auction_date_type`** (String): Auction date type code (e.g. `F`), same meaning as top-level `auctionDateType`.
- **`auction_assignment_number`** (Number): Assignment / lane number from the search index (often mirrors `auctionAssignmentNumber`).
- **`lot_desc`** (String): Short lot description line as indexed for search (mirrors `lotDescription` in plain language).
- **`lot_number`** (Number): Copart lot number (same logical id as top-level `lotNumber`).
- **`odometer_reading_received`** (Number): Odometer reading on the search document (mirrors top-level `odometer` when unchanged).
- **`lot_thumbnail_image_path`** (String): Thumbnail path or URL fragment from search (may omit scheme; compare with `thumbnail_image`).
- **`yard_name`** (String): Yard name from the search index.
- **`yard_number`** (Number): Yard number from the search index.
- **`title_desc`** (String): Title / damage category description as indexed (mirrors `titleDescription` / category wording).
- **`lot_icon_codes`** (Array of strings): Badge / icon codes on the search hit (same codes as `lotIconCodes`, different naming convention).
- **`purple_wave_url`** (String): Purple Wave (or related) URL when present; empty string if none.
- **`show_updated_offsite_lot_text`** (Boolean): UI flag from search for offsite lot messaging.
- **`hide_odometer`** (Boolean): When true, the product UI would hide odometer; false means odometer is shown.
- **`full_vin`** (String): VIN field from search (typically masked the same way as `maskedVIN` on the detail payload).

***

### Explore more scrapers

If you find this actor useful, see more tools on [memo23's Apify profile](https://apify.com/memo23).

### Support

- For issues or feature requests, use the **Issues** tab for this actor in the [Apify Console](https://console.apify.com/).
- Customization or questions:
  - Website: <https://muhamed-didovic.github.io/>
  - Email: <muhamed.didovic@gmail.com>

### Additional services

- Customization or full dataset delivery: <muhamed.didovic@gmail.com>
- Other scraping needs or actor changes: <muhamed.didovic@gmail.com>
- API-style use of this scraper (commercial arrangements): <muhamed.didovic@gmail.com>

# Actor input Schema

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

<b>Use this OR Option B below—not both.</b> Add one or more full <code>lotSearchResults</code> links from your browser (include <code>searchCriteria=...</code> in the query string when you copy the address bar).<br><br><b>If this list has any URL</b>, <b>Option B is ignored</b> for that run.<br><br><b>If this list is empty</b>, switch to Option B: make, model, year, odometer, and featured chips merge into one search. You still need either <i>Search all vehicles</i> or at least one narrowing option.

## `searchAllVehicles` (type: `boolean`):

<b>Only applies when Option A (URLs) is empty.</b><br><br>When <b>on</b>, runs a very broad UK search (default long year list only—add make/model below if you want to narrow).<br><br>When <b>off</b>, set at least one of: make, model, year, odometer, or a featured chip.<br><br><b>Everything in Option B combines</b> into one <code>searchCriteria</code>, like ticking several filters on copart.co.uk.

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

Manufacturer as Copart lists it (uppercase is typical). Maps to <code>filter.MAKE</code> → <code>lot\_make\_desc:"YOUR\_VALUE"</code>.<br><br><b>Examples:</b> <code>VOLVO</code>, <code>BMW</code>, <code>FORD</code>.<br><br>Clear the field if you don’t want to filter by make. Ignored when <b>Start URLs</b> is non-empty.

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

Model keyword as on Copart (often a short token, not the full description). Maps to <code>filter.MODL</code> → <code>manufacturer\_model\_desc:"YOUR\_VALUE"</code>.<br><br><b>Examples:</b> <code>XC60</code>, <code>3 SERIES</code>, <code>FOCUS</code>.<br><br>Clear if not needed.

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

Minimum model year. Together with <i>Year (maximum)</i> builds <code>filter.YEAR</code> → <code>lot\_year:\[min TO max]</code>.<br><br>If you only set one bound, the other side defaults to a wide range (floor 1940 / ceiling current calendar year + 1).<br><br><b>Example pair:</b> 2018 and 2024 → only vehicles in that year band (plus your other filters).

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

Maximum model year; see <i>Year (minimum)</i>.

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

Minimum odometer reading (miles on UK listings). With <i>Odometer (maximum)</i> builds <code>filter.ODM</code> → <code>odometer\_reading\_received:\[min TO max]</code>.<br><br>Single bound only: open end uses 0 or 9,999,999 as appropriate.<br><br><b>Example pair:</b> 75000 and 100000 = vehicles showing roughly 75k–100k miles.

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

Maximum odometer (miles); see <i>Odometer (minimum)</i>.

## `featuredChips` (type: `array`):

Same idea as Copart’s <i>Featured items</i> on the search page. Selected chips add extra search constraints <b>together with</b> the visible fields above.<br><br><b>Fully wired in code:</b> Vehicles for Auction, Buy it Now, High Value Items, Hot Items. Other labels are accepted in the form but currently log a warning and are skipped until mapped in code.<br><br><b>Example:</b> select <i>Buy it Now</i> with Make <code>VOLVO</code> above to require both.

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

Maximum number of lot detail records to save.

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

Maximum number of API requests that can be processed at the same time.

## `minConcurrency` (type: `integer`):

Minimum number of API requests that will be processed at the same time.

## `maxRequestRetries` (type: `integer`):

Number of times the crawler will retry a failed request before giving up.

## `proxy` (type: `object`):

Specifies proxy servers that will be used by the scraper in order to hide its origin.<br><br>For details, see <a href='https://apify.com/apify/web-scraper#proxy-configuration' target='_blank' rel='noopener'>Proxy configuration</a> in README.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.copart.co.uk/lotSearchResults"
  ],
  "searchAllVehicles": false,
  "make": "VOLVO",
  "model": "XC60",
  "yearMin": 2018,
  "yearMax": 2024,
  "odometerMin": 75000,
  "odometerMax": 100000,
  "featuredChips": [],
  "maxItems": 1000,
  "maxConcurrency": 10,
  "minConcurrency": 1,
  "maxRequestRetries": 60,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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": [
        "https://www.copart.co.uk/lotSearchResults"
    ],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

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

# Run the Actor and wait for it to finish
run = client.actor("memo23/copart-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 '{
  "startUrls": [
    "https://www.copart.co.uk/lotSearchResults"
  ],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call memo23/copart-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Copart UK [Only $1.5💰] Search By Urls and Keywords | Auctions",
        "description": "[Only $1.5💰] Copart UK lots via search URL or filters (make, model, year, odometer, yards, chips). Flat JSON/CSV: vehicle specs, damage, yard & GPS, auction, bids & sale dates, title, masked VIN & reg, odometer, notes, lotImages, thumbnail_image, sourceUrl, searchResult.",
        "version": "0.0",
        "x-build-id": "d6hVcLBwP3arfoSDc"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/memo23~copart-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-memo23-copart-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/memo23~copart-scraper/runs": {
            "post": {
                "operationId": "runs-sync-memo23-copart-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/memo23~copart-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-memo23-copart-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "startUrls": {
                        "title": "Copart lot search URLs",
                        "type": "array",
                        "description": "<b>Use this OR Option B below—not both.</b> Add one or more full <code>lotSearchResults</code> links from your browser (include <code>searchCriteria=...</code> in the query string when you copy the address bar).<br><br><b>If this list has any URL</b>, <b>Option B is ignored</b> for that run.<br><br><b>If this list is empty</b>, switch to Option B: make, model, year, odometer, and featured chips merge into one search. You still need either <i>Search all vehicles</i> or at least one narrowing option.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "searchAllVehicles": {
                        "title": "Search all vehicles (UK, year range only)",
                        "type": "boolean",
                        "description": "<b>Only applies when Option A (URLs) is empty.</b><br><br>When <b>on</b>, runs a very broad UK search (default long year list only—add make/model below if you want to narrow).<br><br>When <b>off</b>, set at least one of: make, model, year, odometer, or a featured chip.<br><br><b>Everything in Option B combines</b> into one <code>searchCriteria</code>, like ticking several filters on copart.co.uk.",
                        "default": false
                    },
                    "make": {
                        "title": "Make",
                        "type": "string",
                        "description": "Manufacturer as Copart lists it (uppercase is typical). Maps to <code>filter.MAKE</code> → <code>lot_make_desc:\"YOUR_VALUE\"</code>.<br><br><b>Examples:</b> <code>VOLVO</code>, <code>BMW</code>, <code>FORD</code>.<br><br>Clear the field if you don’t want to filter by make. Ignored when <b>Start URLs</b> is non-empty.",
                        "default": "VOLVO"
                    },
                    "model": {
                        "title": "Model",
                        "type": "string",
                        "description": "Model keyword as on Copart (often a short token, not the full description). Maps to <code>filter.MODL</code> → <code>manufacturer_model_desc:\"YOUR_VALUE\"</code>.<br><br><b>Examples:</b> <code>XC60</code>, <code>3 SERIES</code>, <code>FOCUS</code>.<br><br>Clear if not needed.",
                        "default": "XC60"
                    },
                    "yearMin": {
                        "title": "Year (minimum)",
                        "minimum": 1900,
                        "maximum": 2100,
                        "type": "integer",
                        "description": "Minimum model year. Together with <i>Year (maximum)</i> builds <code>filter.YEAR</code> → <code>lot_year:[min TO max]</code>.<br><br>If you only set one bound, the other side defaults to a wide range (floor 1940 / ceiling current calendar year + 1).<br><br><b>Example pair:</b> 2018 and 2024 → only vehicles in that year band (plus your other filters).",
                        "default": 2018
                    },
                    "yearMax": {
                        "title": "Year (maximum)",
                        "minimum": 1900,
                        "maximum": 2100,
                        "type": "integer",
                        "description": "Maximum model year; see <i>Year (minimum)</i>.",
                        "default": 2024
                    },
                    "odometerMin": {
                        "title": "Odometer (minimum)",
                        "minimum": 0,
                        "maximum": 9999999,
                        "type": "integer",
                        "description": "Minimum odometer reading (miles on UK listings). With <i>Odometer (maximum)</i> builds <code>filter.ODM</code> → <code>odometer_reading_received:[min TO max]</code>.<br><br>Single bound only: open end uses 0 or 9,999,999 as appropriate.<br><br><b>Example pair:</b> 75000 and 100000 = vehicles showing roughly 75k–100k miles.",
                        "default": 75000
                    },
                    "odometerMax": {
                        "title": "Odometer (maximum)",
                        "minimum": 0,
                        "maximum": 9999999,
                        "type": "integer",
                        "description": "Maximum odometer (miles); see <i>Odometer (minimum)</i>.",
                        "default": 100000
                    },
                    "featuredChips": {
                        "title": "Featured filters (multi-select)",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Same idea as Copart’s <i>Featured items</i> on the search page. Selected chips add extra search constraints <b>together with</b> the visible fields above.<br><br><b>Fully wired in code:</b> Vehicles for Auction, Buy it Now, High Value Items, Hot Items. Other labels are accepted in the form but currently log a warning and are skipped until mapped in code.<br><br><b>Example:</b> select <i>Buy it Now</i> with Make <code>VOLVO</code> above to require both.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "vehiclesForAuction",
                                "featuredCars",
                                "buyItNow",
                                "highValueItems",
                                "newListings",
                                "usedVehiclesDamaged",
                                "pureSaleItems",
                                "runsAndDrives",
                                "doesNotRun",
                                "hotItems",
                                "usedVehicles",
                                "fleetLease",
                                "repossessions",
                                "partSales"
                            ],
                            "enumTitles": [
                                "Vehicles for Auction",
                                "Featured Cars",
                                "Buy it Now",
                                "High Value Items",
                                "New Listings",
                                "Used Vehicles - Damaged",
                                "Pure Sale Items",
                                "Runs and Drives",
                                "Does Not Run",
                                "Hot Items",
                                "Used Vehicles",
                                "Fleet / Lease",
                                "Repossessions",
                                "Part Sales"
                            ]
                        },
                        "default": []
                    },
                    "maxItems": {
                        "title": "Maximum number of lots",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of lot detail records to save.",
                        "default": 1000
                    },
                    "maxConcurrency": {
                        "title": "Max Concurrency",
                        "type": "integer",
                        "description": "Maximum number of API requests that can be processed at the same time.",
                        "default": 10
                    },
                    "minConcurrency": {
                        "title": "Min Concurrency",
                        "type": "integer",
                        "description": "Minimum number of API requests that will be processed at the same time.",
                        "default": 1
                    },
                    "maxRequestRetries": {
                        "title": "Max Request Retries",
                        "type": "integer",
                        "description": "Number of times the crawler will retry a failed request before giving up.",
                        "default": 60
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Specifies proxy servers that will be used by the scraper in order to hide its origin.<br><br>For details, see <a href='https://apify.com/apify/web-scraper#proxy-configuration' target='_blank' rel='noopener'>Proxy configuration</a> in README.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
