# Copart & IAAI Sold Prices History Scraper (Final Bids) (`donzely/copart-iaai-sold-prices`) Actor

Get real final bids of past Copart and IAAI auctions: sold price, sale date, VIN, lot, damage, odometer, title, location and photos. Search by make, model and year, add VIN sale history, ACV and repair estimates. Bidfax-style data via API.

- **URL**: https://apify.com/donzely/copart-iaai-sold-prices.md
- **Developed by:** [Grzegorz Pryjma](https://apify.com/donzely) (community)
- **Categories:** Automation, E-commerce
- **Security:** Limited permissions
- **Stats:** 1 total users, 1 monthly users, 60.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 sold lots

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/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 & IAAI Sold Prices History Scraper (Final Bids)

**Find out what cars actually sold for at Copart and IAAI.** This Actor pulls final bids from past US salvage and insurance auctions. Each record includes the sold price, sale date, VIN, lot number, damage, odometer, title type, location and photos. Search by **make, model and year**, filter by date, price, damage or title, and export to JSON, CSV or Excel. You can also feed the data into your own pricing model through the API.

Data comes from the public [FinalBid](https://finalbid.vin) auction archive, which records completed Copart and IAAI auctions. No login, no browser and no CAPTCHA are needed, so runs are fast and cheap.

### Why use it

- **Bid smarter.** See the real hammer price for the same model, year and damage type before you place a bid.
- **Price imported cars.** Importers in Poland, Germany, Lithuania, Ukraine, Georgia and the Middle East can check what a car really cost at auction. A seller's "I paid $X" claim becomes something you can verify.
- **Build valuation models.** Get clean, typed rows with USD prices, ISO dates, miles and km, ready for pandas, BigQuery or a spreadsheet.
- **Track the market.** Schedule a daily run to monitor median final bids for the models you trade.
- **Run a dealer or broker site.** Show customers "similar cars sold for..." comparisons.

### What you get

| Field | Example |
|---|---|
| `year`, `make`, `model`, `trim` | 2019 · BMW · X5 · xDrive40i |
| `finalBidUsd` | 19500 |
| `saleStatus` | `sold` / `sold_buy_now` (optionally `minimum_bid_not_met`, `on_approval`) |
| `saleDate` | 2026-11-02 |
| `auction`, `lotNumber`, `vin` | copart · 74864766 · 5UXCR6C56KLL61889 |
| `primaryDamage` | Minor dents & scratches |
| `odometerMi`, `odometerKm` | 129474 · 208368 |
| `titleType` | Clean title / Salvage title / Rebuilt title |
| `location`, `state` | Hartford Springfield, CT · CT |
| `hasKeys` | true |
| `originalImageUrl` | Original Copart/IAAI photo URL |
| `url` | Source page |

#### Full lot details (optional)

Turn on **Include full lot details** to add more fields:

- all photos, both original auction URLs and archive URLs
- **actual cash value (ACV)** and **estimated repair cost**
- **VIN sale history**: every earlier auction of the same car, with date, lot, final bid and status. This shows relists and "on approval" bids.
- engine (displacement, cylinders, hp), fuel, transmission, drive, colors
- secondary damage, loss type, run & drive condition, airbags, keys, seller

#### Market summary (free)

For every make, model and year you search, the Actor saves a market snapshot to the key-value store under `MARKET_SUMMARY`. The snapshot covers:

- total auctions in the archive
- the median final bid, all time and for the last 12 months
- the middle 50% price band
- the top 10% threshold and the highest sale
- the number of sales in the last 12 months

This summary is not charged.

### How to use

1. Enter one vehicle per line in **Vehicles to look up**:
   - `Ford F-150 2018-2020` (one archive per year)
   - `BMW X5 2019`
   - `Tesla Model 3` (all years, newest sales first)
   - `Mercedes C class 2018`. Model names are matched loosely, so "3 series", "3-series" and "3series" all work.
2. Optionally add filters: **Sold after** (`30 days` or `2026-09-01`), min and max price, max mileage, damage words, title words, and Copart or IAAI only.
3. Set **Max sold lots** and run.

You can also paste FinalBid archive or lot URLs into **FinalBid URLs**, in any language version.

#### Example input

```json
{
  "searches": ["Toyota RAV4 2019-2021", "Honda Civic 2020"],
  "soldAfter": "60 days",
  "titleContains": ["Clean"],
  "maxItems": 500,
  "includeDetails": false
}
```

#### Example output

```json
{
  "year": 2018, "make": "Mercedes-Benz", "model": "C", "trim": "300",
  "finalBidUsd": 3650, "saleStatus": "sold", "saleDate": "2026-10-28",
  "auction": "iaai", "lotNumber": "46198398", "vin": "55SWF4JB4JU273332",
  "primaryDamage": "Front end", "odometerMi": 70185, "titleType": "Salvage title",
  "location": "Rancho Cordova, CA, USA", "actualCashValueUsd": 17448, "estRepairCostUsd": 14752,
  "saleHistory": [{ "date": "2026-10-21", "auction": "iaai", "finalBid": 2850, "status": "sold" }],
  "url": "https://finalbid.vin/en/mercedes-benz/c/2018/iaai-46198398-55SWF4JB4JU273332"
}
```

### Pricing

Pay per result. There is no monthly fee and no start fee.

| Event | Price |
|---|---|
| Sold lot saved to the dataset | **$2.50 per 1,000 lots** |
| Full lot details (only when enabled) | **+$1.50 per 1,000 lots** |

Platform usage is included. For example, 1,000 recent BMW X5 sales cost $2.50. With photos, ACV, repair estimate and VIN history, they cost $4.00. You can cap spending with the run's **maximum total charge**.

### Limits and notes

- The archive shows the **1,200 most recent auctions per make/model/year** (50 pages × 24). Split wide searches by year to get more.
- Lookup is by make, model and year, or by direct lot URL. Free-text VIN search is not offered because the source site does not allow automated access to its search endpoint.
- Prices are final bids as recorded by the archive, without auction fees, taxes or shipping.
- Location text on list pages can be shortened by the source. Turn on full details to get the complete location, and check `locationTruncated`.

### FAQ

**Is this the same data as bidfax?** It is the same kind of data: final bids of completed Copart and IAAI auctions with photos. This Actor works without a browser, so it is fast and low cost.

**Can I get Canadian IAAI lots?** Yes, when they appear in the archive. Their prices keep their original currency in `finalBid` and `currency`, and `finalBidUsd` is set only for USD prices.

**How fresh is the data?** The archive adds auctions daily, and the newest lots are usually from the previous day.

**Does it bid or log in?** No. It only reads public archive pages.

Found a bug or need a field? Open an issue on the Actor's page.

# Actor input Schema

## `searches` (type: `array`):

One vehicle per line: make, optional model and optional year or year range, or a 17-character VIN to find that car's auction sales. Examples: "Ford F-150 2018-2020", "BMW X5 2019", "Tesla Model 3", "Toyota". Each year is a separate archive with up to 1,200 most recent auctions.

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

Direct finalbid.vin archive pages (make / model / year / damage / location) or individual lot pages. Any language version works.

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

Stop after this many lots are saved (you pay only for saved lots).

## `maxPagesPerSearch` (type: `integer`):

Each archive page has 24 lots, newest first. The archive exposes up to 50 pages (1,200 lots) per make/model/year.

## `includeDetails` (type: `boolean`):

Opens every lot page to add all photos, engine, fuel, transmission, drive, colors, secondary damage, run & drive condition, ACV, estimated repair cost and the full sale history of the VIN (all previous auctions). Charged as an extra event per lot.

## `auctions` (type: `array`):

Which auction houses to include.

## `onlySold` (type: `boolean`):

Skip lots that did not sell (minimum bid not met, on approval).

## `soldAfter` (type: `string`):

Only lots sold on or after this date. Absolute (2026-09-01) or relative (30 days, 8 weeks, 3 months).

## `minFinalBidUsd` (type: `integer`):

Only lots that sold for at least this amount.

## `maxFinalBidUsd` (type: `integer`):

Only lots that sold for at most this amount.

## `maxOdometerMi` (type: `integer`):

Skip lots with higher mileage.

## `damageContains` (type: `array`):

Keep only lots whose primary damage contains one of these words, e.g. "Front end", "Hail", "Minor dents".

## `titleContains` (type: `array`):

Keep only lots whose title/sale document contains one of these words, e.g. "Clean", "Salvage", "Rebuilt".

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

Apify Proxy is used by default for reliability.

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

Parallel requests. Keep it low to be polite to the source.

## Actor input object example

```json
{
  "searches": [
    "Ford F-150 2018-2020",
    "Tesla Model 3 2021"
  ],
  "maxItems": 100,
  "maxPagesPerSearch": 10,
  "includeDetails": false,
  "auctions": [
    "copart",
    "iaai"
  ],
  "onlySold": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxConcurrency": 5
}
```

# Actor output Schema

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

No description

## `results` (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 = {
    "searches": [
        "BMW X5 2019-2020",
        "Toyota Camry 2021"
    ],
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("donzely/copart-iaai-sold-prices").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 = {
    "searches": [
        "BMW X5 2019-2020",
        "Toyota Camry 2021",
    ],
    "maxItems": 100,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("donzely/copart-iaai-sold-prices").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 '{
  "searches": [
    "BMW X5 2019-2020",
    "Toyota Camry 2021"
  ],
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call donzely/copart-iaai-sold-prices --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,donzely/copart-iaai-sold-prices"
        }
    }
}
```

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/DPa5KGB0SfsIW9M1s/builds/f6C4bT1YInfKL2Dr8/openapi.json
