# Copart Search Scraper — Salvage & Used Auction (`confidential_gnat/copart-search-scraper`) Actor

Scrapes vehicle auction lots from any Copart search results page or lot page: damage, odometer, current bid, sale date, yard and photos, with optional VIN decoding to manufacturer and country of origin. Optional cache project skips lots from earlier runs.

- **URL**: https://apify.com/confidential_gnat/copart-search-scraper.md
- **Developed by:** [ActorFlow](https://apify.com/confidential_gnat) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Copart Auction Lot Scraper — Salvage & Used Vehicles with VIN Decoding

**Scrape vehicle auction lots from Copart (copart.com)** — paste any search results page or a single lot page and get each lot's **damage, odometer, current bid, sale date, yard, title and photo**, plus the **manufacturer and country of origin decoded from the VIN**. Results export as **JSON, CSV or Excel** and the actor can be called as an **API**. No login needed: copy a URL from your browser, press Start. Give a **cache project name** and repeat runs skip lots you already have, so scheduled jobs return only new lots.

**Target website:** [copart.com](https://www.copart.com)

### ✨ Features of this Copart auction lot scraper

- **Auction lot extraction** — about 50 fields per lot, including vehicle details, damage, title, odometer, estimated retail value, current bid, sale date and yard location
- **Any search URL** — apply the filters you want on copart.com (make, damage, location, year, keyword…), copy the address bar URL and paste it in
- **Single lot lookup** — paste a lot page URL to get just that vehicle
- **Optional VIN decoding** — switch on **Decode VINs** to decode the visible part of the VIN into manufacturer, make, model year, plant and **country of origin**, even when Copart masks the rest of the number
- **Optional full photo gallery** — every full-size photo URL per lot, on request
- **Cache project** — name a cache project and lots scraped in earlier runs are skipped (and not charged), so each scheduled run returns only new lots
- **Pagination support** — keeps paging through the results until your limit is reached
- **Proxy support** — runs through Apify proxy, with residential proxies as a fallback
- **No browser required** — fast, low-cost runs

### 🚀 How to scrape Copart auction lots in 5 steps

1. [Sign up](https://apify.com/sign-up) for a free Apify account — includes **$5 monthly credit**.
2. Open the actor page and click **Try for free**.
3. Paste one or more Copart search results or lot URLs in **Copart URLs**.
4. Click **Start** and wait for the run to complete.
5. Download results from the **Output** tab in JSON, CSV, or Excel format.

You can also run this actor via the [Apify API](https://docs.apify.com/api/v2) or integrate it directly into your workflows using [Zapier](https://zapier.com/apps/apify), [Make](https://www.make.com/), or [n8n](https://n8n.io/).

### 💰 Pricing

This actor uses **pay-per-result** billing: you pay for each lot saved to the dataset.

- New Apify accounts include **$5 of free monthly credit**.
- The actor uses plain HTTP requests rather than a browser, so it costs significantly less to run than browser-based scrapers.
- VIN decoding is free and adds no extra charge. With a cache project name, lots you already have are skipped and not charged.

### 🔧 Input configuration

![Copart Auction Lot Scraper input](https://i.postimg.cc/hjnmg8qm/image.png)

1. **Copart URLs** — where you enter the Copart search results or lot URLs to scrape.
2. **Max lots per URL** — the `maxItems` limit: how many lots are returned for each URL.
3. **Cache project name** — how to use the cache. In the example the name is `October-4-2025`, so if the scraper runs more than once on the same day, every run after the first skips the lots already scraped under that project name that day. Use a new name (for example, the next day's date) to start fresh, or leave the field empty to scrape everything every time.

| Field | Type | Required | Default | Description |
| ----- | ---- | -------- | ------- | ----------- |
| Copart URLs (`startUrls`) | array | — | All lots search | Search results pages and/or single lot pages from www.copart.com. |
| Max lots per URL (`maxItems`) | integer | — | 5 | Maximum lots returned for each start URL (up to 1,000,000). |
| Decode VINs (`enrichVin`) | boolean | — | false | Off by default. Adds manufacturer, make, model year and country of origin from the visible VIN. |
| Include all photos (`includeImages`) | boolean | — | false | Adds a `lotImages` list with every full-size photo URL. One extra request per lot. |
| Cache project name (`cacheProjectName`) | string | — | — | Optional. Lots already scraped under this name in an earlier run are skipped and not charged. Leave empty to scrape everything. |
| Proxy configuration (`proxyConfiguration`) | object | — | Apify proxy | Copart blocks many hosting and home IPs, so a proxy is on by default. |

**Supported URL types:**

- Search results: `https://www.copart.com/lotSearchResults/?free=true&query=toyota`, or any filtered search URL copied from your browser
- Single lot: `https://www.copart.com/lot/73672065/salvage-2021-kia-forte-gt-wa-spanaway`

### 📦 Copart auction lot scraper output data

The output is a dataset with one record per lot. Fields: `lotNumber`, `url`, `title`, `year`, `make`, `model`, `trim`, `bodyStyle`, `vehicleType`, `color`, `vin`, `odometer`, `odometerStatus`, `engine`, `cylinders`, `fuel`, `transmission`, `drive`, `hasKeys`, `primaryDamage`, `secondaryDamage`, `titleType`, `titleGroup`, `titleState`, `estimatedRetailValue`, `estimatedRepairCost`, `currentBid`, `buyItNowPrice`, `currency`, `saleStatus`, `bidStatus`, `saleDate`, `timeZone`, `yardName`, `yardNumber`, `city`, `state`, `country`, `zipCode`, `latitude`, `longitude`, `highlights`, `features`, `imageUrl`, `lastUpdated` and `sourceUrl`. With **Decode VINs** switched on (it is off by default), `vinDecoded`, `vinWmi`, `vinMake`, `vinManufacturer`, `vinModel`, `vinSeries`, `vinTrim`, `vinModelYear`, `vinBodyClass`, `vinVehicleType`, `vinDoors`, `vinEngineCylinders`, `vinDisplacementL`, `vinEngineHP`, `vinEngineModel`, `vinFuelType`, `vinFuelTypeSecondary`, `vinTransmission`, `vinDriveType`, `vinGvwr`, `vinCountryOfOrigin`, `vinPlantState`, `vinPlantCity`, `vinPlantCompanyName` and `vinErrorCode` are added (`vinErrorCode` 6 means an incomplete VIN, which is normal for Copart's masked VINs); with photos on, `lotImages` is added. The dataset has 1 view, **Overview**, a compact table of photo, vehicle, odometer, damage, current bid, sale date, yard, state, country of origin and lot link.

**Sample output** (with **Decode VINs** switched on; without it the `vin*` fields are absent):

```json
{
    "lotNumber": 73672065,
    "url": "https://www.copart.com/lot/73672065/salvage-2021-kia-forte-gt-wa-spanaway",
    "title": "2021 KIA FORTE GT",
    "year": 2021,
    "make": "KIA",
    "model": "FORTE",
    "trim": "GT",
    "bodyStyle": null,
    "vehicleType": "AUTOMOBILE",
    "color": "GRAY",
    "vin": "3KPF44AC0ME******",
    "odometer": 77968,
    "odometerStatus": "ACTUAL",
    "engine": "1.6L  4",
    "cylinders": "4",
    "fuel": "GAS",
    "transmission": "MANUAL",
    "drive": "Front-wheel Drive",
    "hasKeys": "YES",
    "primaryDamage": "REAR END",
    "secondaryDamage": null,
    "titleType": "BILL OF SALE",
    "titleGroup": "SALVAGE TITLE",
    "titleState": "WA",
    "estimatedRetailValue": 12432,
    "estimatedRepairCost": null,
    "currentBid": 550,
    "buyItNowPrice": null,
    "currency": "USD",
    "saleStatus": "PURE_SALE",
    "bidStatus": "NEVER_BID",
    "saleDate": "2026-03-24T19:00:00.000Z",
    "timeZone": "PDT",
    "yardName": "WA - SPANAWAY",
    "yardNumber": 337,
    "city": "SPANAWAY",
    "state": "WA",
    "country": "USA",
    "zipCode": "98387",
    "latitude": 47.0864,
    "longitude": -122.433,
    "highlights": "RUNS AND DRIVES",
    "features": [
        "Hot Items",
        "No License Required"
    ],
    "imageUrl": "https://cs.copart.com/v1/AUTH_svc.pdoc00001/lpp/0226/426146574f484073bb7768cc26f78005_thb.jpg",
    "lastUpdated": "2026-10-01T15:06:45.000Z",
    "sourceUrl": "https://www.copart.com/lotSearchResults/?free=true&query=",
    "vinDecoded": true,
    "vinWmi": "3KP",
    "vinMake": "KIA",
    "vinManufacturer": "KIA MEXICO S.A. DE C.V.",
    "vinModel": "Forte",
    "vinSeries": null,
    "vinTrim": "GT",
    "vinModelYear": "2021",
    "vinBodyClass": "Sedan/Saloon",
    "vinVehicleType": "PASSENGER CAR",
    "vinDoors": "4",
    "vinEngineCylinders": "4",
    "vinDisplacementL": "1.6",
    "vinEngineHP": "201",
    "vinEngineModel": "T-GDI Gamma",
    "vinFuelType": "Gasoline",
    "vinFuelTypeSecondary": null,
    "vinTransmission": null,
    "vinDriveType": "FWD/Front-Wheel Drive",
    "vinGvwr": "Class 1: 6,000 lb or less (2,722 kg or less)",
    "vinCountryOfOrigin": "MEXICO",
    "vinPlantState": null,
    "vinPlantCity": null,
    "vinPlantCompanyName": "Kia Motors Mexico S.A. De C.V",
    "vinErrorCode": "6"
}
```

### 🐍 How to scrape Copart with Python, JavaScript or the API

Run the actor programmatically with the official Apify clients. Replace `<YOUR_API_TOKEN>` with the token from your [Apify Console](https://console.apify.com/account/integrations).

**Python** (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run = client.actor("<username>/copart-search-scraper").call(run_input={
    "startUrls": [{"url": "https://www.copart.com/lotSearchResults/?free=true&query=toyota"}],
    "maxItems": 50,
    "enrichVin": True,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

**JavaScript** (`npm install apify-client`):

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });

const run = await client.actor('<username>/copart-search-scraper').call({
    startUrls: [{ url: 'https://www.copart.com/lotSearchResults/?free=true&query=toyota' }],
    maxItems: 50,
    enrichVin: true,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

**cURL** — start a run and wait for the dataset:

```bash
curl -X POST "https://api.apify.com/v2/acts/<username>~copart-search-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"startUrls": [{"url": "https://www.copart.com/lotSearchResults/?free=true&query=toyota"}], "maxItems": 50, "enrichVin": true}'
```

### 💡 What you can use Copart auction lot data for

- Daily feeds of fresh salvage inventory by make, damage type and location
- Spotting undervalued lots by comparing current bid, estimated retail value and odometer
- Finding export candidates by manufacturer and country of origin
- Tracking bid levels and inventory volumes by yard and state
- Pulling one vehicle's details and decoded VIN into a spreadsheet before bidding

Auto dealers, salvage buyers, exporters, insurers and market analysts typically use this data.

### ⚠️ Limitations & known issues

- **Public lots only** — lots and fields that need a Copart member login are not available.
- **Masked VINs** — Copart hides the last six VIN characters on most lots. Decoding uses the visible first 11 characters, so trim-level details can be missing, and lots with a fully hidden VIN get `vinDecoded: false`.
- **Search depth** — Copart stops serving results at a certain depth of a very large search, so narrow broad searches with filters.
- **Cache and bids** — with a cache project name, a lot is returned once; later runs skip it, so its bid is not refreshed. Leave the name empty to re-scrape current bids.
- **copart.com only** — other Copart country sites are not supported.

### ❓ Frequently asked questions

#### Can I scrape Copart legally?

The actor only collects data that is already publicly visible on copart.com — no login, paywall or private content is accessed. Scraping publicly available data is generally considered lawful (see *hiQ Labs v. LinkedIn*). You are responsible for complying with Copart's Terms of Service and applicable laws such as GDPR/CCPA if personal data is involved.

#### How does the VIN decoding work on masked VINs?

Copart shows only the first part of most VINs. That visible prefix still identifies the manufacturer, model line, model year and assembly plant, so the actor decodes it with a free public vehicle database and adds the result to each lot.

#### How does the caching work?

Enter a **Cache project name** and the actor remembers every lot it saved under that name. On the next run with the same name those lots are skipped and not charged, so you only get new lots. Leave the name empty to scrape everything every time. Use a different name for each saved search.

#### How many lots can I scrape from one URL?

Up to the **Max lots per URL** limit, which applies to each start URL separately. Very large searches are capped by how deep Copart itself serves results, so add filters to get complete data.

#### Do I need a proxy to scrape copart.com?

Yes. Copart blocks requests from many hosting and home IP addresses, so the actor uses Apify proxy by default. If runs are blocked, switch to residential proxies.

#### How do I scrape Copart with Python?

Use the Apify client as shown in the Python example above, then iterate over the dataset items.

#### Can I run this Copart scraper on a schedule?

Yes. Use Apify Schedules to run it daily on a saved search URL. Add a cache project name to receive only new lots on each run.

#### What output formats are supported?

JSON, CSV, Excel, XML and RSS, either from the **Output** tab or through the Apify API.

### 🔗 Other actors you may find useful

| Actor | Description |
| ----- | ----------- |
| [🚗 Cheapest Cars & Bids Scraper](https://apify.com/confidential_gnat/cheapest-carsandbids-scraper) | Scrapes auction listings, sale prices, vehicle specs and photos from Cars & Bids. |
| [🧴 INCIDecoder Scraper](https://apify.com/confidential_gnat/incidecoder-scraper) | Scrapes skincare product pages with full ingredient lists, ratings and explanations. |
| [🌐 WHOIS Domain Lookup Scraper](https://apify.com/confidential_gnat/whois-com) | Bulk WHOIS lookups with registration dates, registrar, name servers and contacts. |
| [🎟️ Gametime Events Scraper](https://apify.com/confidential_gnat/gametime-events-scraper) | Collects event, venue and ticket offer records from Gametime. |
| [📈 Nasdaq Short Interest Scraper](https://apify.com/confidential_gnat/nasdaq-short-interest-scraper) | Scrapes short interest history for any Nasdaq-listed stock or ETF. |

### 💬 Support & contact

If you encounter any issues or have questions, please [open an issue](https://apify.com/confidential_gnat/copart-search-scraper/issues/open) or reach out via the [Apify Community Forum](https://community.apify.com/).

You can also find more of our actors on the [Actor Flow](https://apify.com/confidential_gnat) page.

# Actor input Schema

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

Copart search results pages (apply your filters on www.copart.com, then copy the address bar URL) and/or single lot pages such as https://www.copart.com/lot/73672065/. You can mix both.

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

Maximum number of lots to return for each start URL.

## `enrichVin` (type: `boolean`):

Off by default. When on, adds manufacturer, make, model, trim, engine, plant and country of origin for each lot by decoding the visible first 11 characters of its VIN (free NHTSA service, no extra charge). Lots whose VIN is fully hidden get vinDecoded: false.

## `includeImages` (type: `boolean`):

Adds a lotImages list with every full-size photo URL per lot. Makes one extra request per lot, so runs are slower. Off by default (every lot always has a thumbnail in imageUrl).

## `cacheProjectName` (type: `string`):

Optional. When set, lots already scraped under this project name in a previous run are skipped (and not charged) instead of being scraped again, and decoded VINs are reused. Use the same name on each scheduled run to get only new lots. Leave empty to scrape everything.

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

Copart blocks requests that come from many hosting and home IP addresses, so an Apify proxy is on by default. If runs are blocked, switch to residential proxies.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.copart.com/lotSearchResults/?free=true&query="
    }
  ],
  "maxItems": 5,
  "enrichVin": false,
  "includeImages": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://www.copart.com/lotSearchResults/?free=true&query="
        }
    ],
    "maxItems": 5,
    "enrichVin": false,
    "includeImages": false,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("confidential_gnat/copart-search-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [{ "url": "https://www.copart.com/lotSearchResults/?free=true&query=" }],
    "maxItems": 5,
    "enrichVin": False,
    "includeImages": False,
    "proxyConfiguration": { "useApifyProxy": True },
}

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

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

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

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.copart.com/lotSearchResults/?free=true&query="
    }
  ],
  "maxItems": 5,
  "enrichVin": false,
  "includeImages": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call confidential_gnat/copart-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,confidential_gnat/copart-search-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/hhohdbgThWolXHkH5/builds/zA27hSmKe3cpyMJBY/openapi.json
