# Copart & IAAI Scraper: Lots, VIN, Landed Cost (`tiger19935/copart-iaai-scraper`) Actor

Copart and IAAI scraper for salvage auction lots in one schema: photos, damage, odometer, bids, sale dates, NHTSA VIN decode and a landed-cost estimate for Ukraine, Poland, Lithuania, Germany. Bid alerts. Pay per lot from $0.002.

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

## Pricing

from $1.40 / 1,000 auction lots

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/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 Salvage Auction Scraper

Copart & IAAI Salvage Auction Scraper gives importers and brokers one clean dataset from both US salvage auctions, with NHTSA VIN decoding and a landed-cost estimate for Ukraine, Poland, Lithuania and Germany. Search by make, model or VIN, set a target bid and get alert rows when a lot drops to it. Run it on a schedule, export to CSV, JSON or Excel, or call it from your own tools through the Apify API and MCP. Pay per lot from $2 per 1,000.

### What does Copart & IAAI Salvage Auction Scraper do?

The Actor reads public lot data and returns one record per lot in the same schema for both auctions:

- **Lot data**: lot number, link, year, make, model, damage (primary and secondary), odometer, title type, keys, fuel, engine, transmission, drive, color, yard location, sale date, current bid, buy-now price, estimated retail value, photos.
- **VIN decode**: every full 17-character VIN is decoded with the free official NHTSA vPIC API (model year, body class, engine displacement, cylinders, fuel, plant country). Masked VINs (with asterisks) are left as they are and never guessed.
- **Landed-cost estimate**: hammer price plus auction fees, US inland freight, sea freight, customs duty, excise, VAT and port/broker costs for Ukraine (UA), Poland (PL), Lithuania (LT) or Germany (DE). Every table is an input you can edit, and every number is named as an estimate.
- **Bid alerts**: set one target bid for the whole run, or a watchlist of lots with their own targets. When the current bid is at or below the target the Actor adds an extra `alert` row, once per lot across scheduled runs.
- **Search sharding**: Copart search pages return at most 100 lots. When a search has more matches, the Actor splits it by model year to reach more of them.

It does not log in, does not place bids and does not use any account. Copart is read through its public JSON endpoints. IAAI is a best-effort source: if IAAI changes its pages or blocks the request, you get a clear warning in the run summary and the Copart results still arrive.

### Why use Copart & IAAI Salvage Auction Scraper?

1. **Both auctions in one schema, plus VIN and logistics.** Existing Copart scrapers on the Store return Copart lots only, or IAAI lot details only, and none of them adds a landed-cost estimate. Here Copart, IAAI, VIN decode and the cost to your border share one output.
2. **Cheap.** Lots start at $0.002 ($2 per 1,000) and a lot with VIN decode and landed cost is $0.005 ($5 per 1,000). Popular Copart scrapers on the Store charge several times more per thousand lots.
3. **Built for importers.** Rates for UA, PL, LT and DE are editable tables, so you can match your own broker agreement, and a target-bid alert tells you when a lot is worth a look without watching the site all day.

### How much does it cost to scrape Copart?

You pay per result (pay per event). There is no monthly rental. Prices per single event, by Apify plan:

| Event | What is billed | FREE | BRONZE | SILVER | GOLD |
|---|---|---|---|---|---|
| `lot` | One lot without landed cost | $0.002 | $0.0018 | $0.0016 | $0.0014 |
| `lot-landed` | One lot with VIN decode and landed-cost estimate | $0.005 | $0.0045 | $0.004 | $0.0035 |
| `alert` | One alert row (bid at or below your target) | $0.01 | $0.009 | $0.008 | $0.007 |

Examples at the FREE price: 1,000 lots without landed cost = $2. 1,000 lots with VIN and landed cost = $5. If 20 of those lots trigger an alert, add $0.20.

A lot is billed as `lot-landed` only when a landed-cost estimate was actually computed. If a lot has no bid and you set no assumed bid, it is billed as `lot`. Duplicates, errors and empty results are never billed.

Apify plans without a paid subscription are capped at 25 results per run, after which the Actor stops with a normal exit and the message "Free tier limit reached (25 results). Upgrade to a paid Apify plan for unlimited results." To limit spend on paid plans, set "Max results" or use the Apify "Maximum cost per run" setting (`maxTotalChargeUsd`). The Actor stops cleanly when that limit is reached. If a datacenter proxy is blocked and the residential fallback is used, residential proxy traffic is billed by Apify separately.

### Input

| Field | Type | Meaning |
|---|---|---|
| `sources` | array | `copart`, `iaai` (default both) |
| `searchQueries` | array | Free-text searches: `toyota camry`, `bmw`, a full VIN |
| `lotNumbers` | array | Copart lot numbers to fetch in full detail |
| `lotUrls` | array | Copart or IAAI lot page URLs |
| `yearFrom`, `yearTo` | integer | Model year range |
| `maxOdometer` | integer | Skip lots above this many miles (lots with unknown odometer are kept) |
| `maxItems` | integer | Max billed results per run (default 10; 25 on free plans) |
| `shardByYear` | boolean | Split big Copart searches by model year (default true) |
| `decodeVin` | boolean | NHTSA VIN decode (default true) |
| `includeLandedCost` | boolean | Landed-cost estimate, billed as `lot-landed` (default true) |
| `destinationCountry` | string | `UA`, `PL`, `LT`, `DE` |
| `landedCost` | object | Overrides for the estimate tables, see below |
| `targetBidUsd` | integer | Alert when current bid is at or below this value |
| `watchlist` | array | Lots with own targets: `{"lotNumber": "56789012", "targetBidUsd": 2500}` |
| `alertOncePerLot` | boolean | Remember alerted lots between runs (default true) |
| `proxyConfiguration` | object | Apify Proxy settings, datacenter first |
| `useResidentialFallback` | boolean | Retry via residential proxy if blocked (default true) |

Searches, lot numbers, lot URLs and the watchlist can be combined in one run.

#### Landed-cost tables (all values are estimates)

The `landedCost` object is merged over the built-in defaults. Keys you leave out keep their default. Arrays (`auctionFeeTable`, `exciseRules`) replace the default when given.

| Key | Meaning |
|---|---|
| `usdPerEur` | Exchange rate used for EUR-based excise (default 1.08) |
| `assumedBidUsd` | Bid to use when a lot has no current bid (default none: landed cost is skipped) |
| `auctionFeeTable` | List of `{upToUsd, feeUsd}` buyer-fee brackets |
| `pctAbove` | Fee as a share of the bid above the last bracket |
| `fixedAuctionFeesUsd` | Gate, virtual bid and environmental fees |
| `inlandFreightUsd` | US yard to port |
| `seaFreightUsd` | Per destination: `{"UA": 2200, "PL": 1700, "LT": 1600, "DE": 1500}` |
| `portAndBrokerUsd` | Per destination port, clearance and broker costs |
| `rates` | Per destination: `dutyRate`, `vatRate`, `exciseRules` |

The default values are rough placeholders for planning, not quotes. Excise rules in the defaults follow the common Ukrainian per-1,000-cc model with an age factor and the Polish percentage-by-engine-size model, but laws change and special cases (EVs, hybrids, registration taxes, exemptions) are not modelled. Replace the numbers with the ones from your broker or customs agent before making a bidding decision. If a lot's engine size is unknown, excise is left out and the record says so in `landedCost.assumptions`.

#### Example 1: quick search

```json
{
  "sources": ["copart", "iaai"],
  "searchQueries": ["toyota camry"],
  "maxItems": 10,
  "destinationCountry": "UA"
}
```

#### Example 2: import candidates for Poland with custom freight

```json
{
  "sources": ["copart"],
  "searchQueries": ["bmw x5", "audi q5"],
  "yearFrom": 2018,
  "maxOdometer": 90000,
  "maxItems": 200,
  "destinationCountry": "PL",
  "landedCost": { "seaFreightUsd": { "PL": 1450 }, "portAndBrokerUsd": { "PL": 380 } }
}
```

#### Example 3: bid alerts on a schedule

```json
{
  "sources": ["copart"],
  "searchQueries": ["honda civic"],
  "targetBidUsd": 2500,
  "watchlist": [{ "lotNumber": "56789012", "targetBidUsd": 1800 }],
  "includeLandedCost": false,
  "maxItems": 50
}
```

Run this with an Apify schedule (for example every 3 hours) and send the dataset to Telegram, Slack or email through a webhook or an integration.

### Output example

Illustrative record (values are an example of the shape, not a real lot). Fields that the source does not provide are `null`.

```json
{
  "recordType": "lot",
  "source": "copart",
  "lotNumber": "56789012",
  "url": "https://www.copart.com/lot/56789012",
  "vin": "4T1B11HK5KU123456",
  "vinMasked": false,
  "year": 2019,
  "make": "TOYOTA",
  "model": "CAMRY SE",
  "damagePrimary": "FRONT END",
  "damageSecondary": "MINOR DENT/SCRATCHES",
  "odometer": 41000,
  "odometerUnit": "mi",
  "titleType": "SALVAGE",
  "fuel": "GAS",
  "location": "CA - SACRAMENTO",
  "auctionDate": "2026-11-03T17:00:00.000Z",
  "currentBidUsd": 3200,
  "estimatedRetailValueUsd": 18000,
  "images": ["https://cs.copart.com/..."],
  "vinDecoded": { "make": "TOYOTA", "model": "Camry", "bodyClass": "Sedan/Saloon", "displacementCc": 2487, "engineCylinders": 4, "plantCountry": "UNITED STATES (USA)" },
  "landedCostEstimateUsd": 10120.55,
  "landedCost": {
    "destination": "UA", "isEstimate": true, "bidUsdUsed": 3200,
    "auctionFeesEstimateUsd": 630, "inlandFreightEstimateUsd": 450, "seaFreightEstimateUsd": 2200,
    "customsValueEstimateUsd": 6480, "dutyEstimateUsd": 648, "exciseEstimateUsd": 805.79,
    "vatEstimateUsd": 1586.76, "portAndBrokerEstimateUsd": 600,
    "assumptions": ["All rates and freight values are editable ESTIMATES, not a customs or broker quote."]
  },
  "targetBidUsd": 3500,
  "alertTriggered": true,
  "scrapedAt": "2026-10-19T12:00:00.000Z"
}
```

An alert row (`recordType: "alert"`) carries the lot number, link, vehicle, current bid, target bid and a short message. The run also writes an `OUTPUT` record with counts, charged events, an estimated charge total and any warnings per source.

### How to use Copart & IAAI Salvage Auction Scraper (tutorial)

1. Open the Actor on Apify and click **Try for free**.
2. Under **Search queries** enter what you want, for example `toyota camry` or a full VIN. Choose the sources and a destination country.
3. Set **Max results** (start with 10) and, if you want alerts, a **target bid**.
4. Click **Start**. A small run finishes in about a minute. Open the **Output** tab to see the table view with current bid, sale date and landed-cost estimate.
5. Export as CSV, Excel or JSON, or save the input as a Task and schedule it. Check the `OUTPUT` record for warnings, for example if one source was blocked.

### Run via API

Replace `YOUR_APIFY_TOKEN` with your token. The Actor id is `tiger19935~copart-iaai-scraper`.

```bash
curl -X POST "https://api.apify.com/v2/acts/tiger19935~copart-iaai-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"sources":["copart"],"searchQueries":["toyota camry"],"maxItems":10,"destinationCountry":"UA"}'
```

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('tiger19935/copart-iaai-scraper').call({
  sources: ['copart'],
  searchQueries: ['bmw x5'],
  yearFrom: 2018,
  maxItems: 50,
  destinationCountry: 'PL',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, items[0]?.landedCostEstimateUsd);
```

The input uses plain arrays and simple fields, so AI agents can call the Actor through the Apify MCP server (`https://mcp.apify.com`) with the same JSON.

### Integrations

- **n8n and Make**: use the Apify nodes or the HTTP module, run the Actor and read the dataset.
- **Zapier**: trigger on a finished run and add each lot to your CRM or a message.
- **Google Sheets**: send the dataset to a sheet to keep a lot tracker with landed cost.
- **Webhooks**: Apify webhooks call your URL when a run finishes, handy for Telegram or Slack alert bots.
- **MCP**: connect the Actor to Claude or other agents through the Apify MCP server.

### Legal / ethical use

The Actor reads only information that is publicly visible without logging in. It does not bid, buy, log in or bypass account restrictions. Auction sites have terms of use, and some restrict automated access. You are responsible for using the data in line with those terms and with the law that applies to you, including consumer and data protection rules (for example GDPR if you combine lot data with personal data). Do not republish photos or listings in ways the source forbids. Landed-cost output is an estimate and not tax, customs or legal advice.

### FAQ and support

**Does it need a Copart account?**
No. It reads public lot data only. Bids and Buy It Now actions are not performed.

**How is landed cost calculated?**
Hammer price plus auction fees, US inland freight, sea freight, customs duty, excise and VAT for the destination country, plus port and broker costs. All rates are editable inputs, so you can match your own broker agreement. The defaults are estimates.

**How many lots per search?**
Copart search pages are capped at 100 results, so the Actor shards by model year when a search has more matches. Narrow searches (make and model plus year range) give the most complete results.

**Why did a source return a warning and no lots?**
Auction sites change their pages and sometimes block automated requests. The Actor never crashes on this: the failing source is reported under `warnings` in the `OUTPUT` record and the other source continues. Try enabling the residential fallback, narrower queries or fewer results, or open an issue.

**Why is the VIN masked or missing?**
Auctions often hide the full VIN until you are a registered buyer. Masked VINs are returned as they are and are not decoded or guessed.

**Is IAAI as complete as Copart?**
IAAI is supported on a best-effort basis through its public pages. Lot URLs in `lotUrls` are the most reliable way to read IAAI lots.

**Can I get the data in Excel or CSV?**
Yes. Export any dataset from the Output tab as CSV, Excel, JSON or XML.

**Something is wrong or a field is missing. What now?**
Open an issue in the Issues tab with the run link. Replies come within 12 hours.

### More tools by the same author

- [Prozorro & TED Tenders Scraper](https://apify.com/tiger19935/prozorro-ted-tenders-scraper) - public tenders from Ukraine and the EU
- [Billing & Payment Stack Detector](https://apify.com/tiger19935/billing-stack-detector) - which payment gateway a website uses
- [Website Technology Detector](https://apify.com/tiger19935/website-technology-detector) - tech stack of any site
- [Decision-Maker Contacts](https://apify.com/tiger19935/decision-maker-contacts) - people and roles at a company

### Related searches

Copart scraper, IAAI scraper, Copart API, salvage auction data, Copart lots to CSV, Copart VIN decoder, car import Ukraine, Copart price tracker, insurance auto auction, Copart bid alert, IAAI lots, salvage car import calculator.

# Changelog

This Actor's version history is a separate document: https://apify.com/tiger19935/copart-iaai-scraper/changelog.md

# Actor input Schema

## `sources` (type: `array`):

Which auctions to read. Copart is the main source; IAAI is best-effort and a failing source only produces a warning in the run summary.

## `searchQueries` (type: `array`):

Free-text searches, one per line: a make and model (toyota camry), a make (bmw), a full 17-character VIN or any keyword you would type into the auction search box.

## `lotNumbers` (type: `array`):

Optional. Specific Copart lot numbers to fetch in full detail (for example 56789012).

## `lotUrls` (type: `array`):

Optional. Copart (copart.com/lot/...) or IAAI (iaai.com/VehicleDetail/...) lot page URLs.

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

Only lots with this model year or newer. Leave empty for no limit.

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

Only lots with this model year or older. Leave empty for no limit.

## `maxOdometer` (type: `integer`):

Skip lots with a known odometer above this value, in miles. Leave empty for no limit.

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

Maximum number of billed results (lots plus alerts) for the whole run. Free Apify plans are capped at 25.

## `shardByYear` (type: `boolean`):

Copart search pages return at most 100 lots. When a search has more matches than that, split it into one search per model year to collect more of them.

## `decodeVin` (type: `boolean`):

Decode every full 17-character VIN with the free NHTSA vPIC API (engine, fuel, body, plant). Masked VINs are skipped.

## `includeLandedCost` (type: `boolean`):

Add an estimate of the total cost delivered to the destination country (freight, customs duty, excise, VAT). Billed as lot-landed instead of lot.

## `destinationCountry` (type: `string`):

Country used for the landed-cost estimate.

## `landedCost` (type: `object`):

Optional JSON that overrides the built-in ESTIMATE tables: usdPerEur, assumedBidUsd, auctionFeeTable, inlandFreightUsd, seaFreightUsd, portAndBrokerUsd, rates (per country: dutyRate, vatRate, exciseRules). See the README for the full shape. Defaults are rough estimates, replace them with your broker's numbers.

## `targetBidUsd` (type: `integer`):

Create an alert row for every lot whose current bid is greater than 0 and at or below this value. Leave empty to disable.

## `watchlist` (type: `array`):

Optional list of lots with their own target bid. Example item: {"lotNumber": "56789012", "targetBidUsd": 2500} or {"url": "https://www.copart.com/lot/56789012", "targetBidUsd": 2500}.

## `alertOncePerLot` (type: `boolean`):

Remember alerted lots between scheduled runs (named key-value store copart-iaai-alerts) so the same lot is not billed as an alert twice.

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

Apify Proxy settings. Datacenter proxy is tried first.

## `useResidentialFallback` (type: `boolean`):

If datacenter IPs are blocked by an auction site, retry through Apify residential proxy (needs residential proxy access on your plan; adds proxy cost to your Apify bill).

## Actor input object example

```json
{
  "sources": [
    "copart",
    "iaai"
  ],
  "searchQueries": [
    "toyota camry"
  ],
  "maxItems": 10,
  "shardByYear": true,
  "decodeVin": true,
  "includeLandedCost": true,
  "destinationCountry": "UA",
  "landedCost": {},
  "alertOncePerLot": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "useResidentialFallback": true
}
```

# Actor output Schema

## `lots` (type: `string`):

No description

## `dataset` (type: `string`):

No description

## `summary` (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 = {
    "sources": [
        "copart",
        "iaai"
    ],
    "searchQueries": [
        "toyota camry"
    ],
    "maxItems": 10,
    "decodeVin": true,
    "includeLandedCost": true,
    "destinationCountry": "UA",
    "landedCost": {},
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("tiger19935/copart-iaai-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 = {
    "sources": [
        "copart",
        "iaai",
    ],
    "searchQueries": ["toyota camry"],
    "maxItems": 10,
    "decodeVin": True,
    "includeLandedCost": True,
    "destinationCountry": "UA",
    "landedCost": {},
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("tiger19935/copart-iaai-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 '{
  "sources": [
    "copart",
    "iaai"
  ],
  "searchQueries": [
    "toyota camry"
  ],
  "maxItems": 10,
  "decodeVin": true,
  "includeLandedCost": true,
  "destinationCountry": "UA",
  "landedCost": {},
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call tiger19935/copart-iaai-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tiger19935/copart-iaai-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/ITtyqRhtQFuBRvu9b/builds/a22RWjbsGcKNyob1G/openapi.json
