# Copart UK \[$0.75💰] 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:** 35 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.75 / 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 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

**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`):

Leave empty — the actor already routes all traffic through its own built-in residential proxy at no extra cost to you. Only set this if you want to use your own proxies.

## 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
}
```

# 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"
    ]
};

// 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"] }

# 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"
  ]
}' |
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

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