IAAI Scraper - Salvage Car Auction Lots & Damage Data API avatar

IAAI Scraper - Salvage Car Auction Lots & Damage Data API

Pricing

from $10.67 / 1,000 lots

Go to Apify Store
IAAI Scraper - Salvage Car Auction Lots & Damage Data API

IAAI Scraper - Salvage Car Auction Lots & Damage Data API

Scrape public IAAI.com salvage auction listings. Damage, odometer with its brand, title type, start code, branch, auction date and ACV for every lot. No API key.

Pricing

from $10.67 / 1,000 lots

Rating

0.0

(0)

Developer

ParseForge

ParseForge

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

ParseForge

IAAI Scraper - Salvage Car Auction Lots & Damage Data API

Scrape public auction listings from IAAI.com — Insurance Auto Auctions — across every branch and vehicle type. Each lot comes with its damage, odometer and the brand on that odometer, title type, start code, branch, lane, ACV and auction date. One request returns 100 complete lots. No login or API key. Export to CSV, JSON, Excel, or XML.

IAAI has no public API. This Actor talks to the same search endpoint the website's own front end calls, so filtering, sorting and paging behave exactly like the site.

Who uses itWhat they scrape IAAI for
Rebuilders and body shopsRepairable lots by damage type, within driving distance of a branch
DismantlersParts donors by make, model and year, with the start code
ExportersRun-and-drive lots by branch and auction date
Used-car dealersClear-title lots that are not salvage
Market analystsDamage mix, odometer distribution and ACV by region

What it does

This Actor collects IAAI auction lots by make, model, damage, branch and 26 other filters, and returns each one as a flat row. Every lot carries:

  • 🚗 Identity: stock number, lot ID, VIN, year, make, model and series.
  • 📏 Odometer: the reading as a number, its unit, and IAAI's brand on itNot Actual, Not Required/Exempt, Exceeds Mechanical Limits and others — which changes what the vehicle is worth.
  • 💥 Condition: primary and secondary damage, start code, airbag state, and whether a key is included.
  • 📄 Title: the sale document IAAI will issue — Clear, Salvage, Non-Repairable, Bill Of Sale.
  • 🔧 Specification: engine, fuel, cylinders, transmission, drivetrain, body style, colour, country of origin.
  • 📍 Location and sale: branch and its state, region, lane, item number, ACV, and the auction date as a real ISO 8601 timestamp.
  • 🚩 Flags: timed auction, Buy Now, pre-bid open, open to the public, stored offsite.

Three optional enrichments go past what the search listing publishes, each one request per vehicle and each billed on its own:

  • 🔍 Vehicle details — up to 60 more fields: IAAI's vehicle grade, the state that issued the title, catalytic converter, battery and radiator presence, the repair estimate, bid increment, live pre-bid activity, branch coordinates and the aisle, stall and slot the car is parked in.
  • 📸 Media — every photo at native resolution (measured at 2576×1932), the 360° spin, the undercarriage flag, and the video of the engine running.
  • 🔑 VIN decode — IAAI masks the last six VIN characters, but the eleven it publishes decode against NHTSA's vPIC: trim, engine model, horsepower, GVWR class, assembly plant and manufacturer.

Results export to CSV, JSON, Excel, or XML, or stream from the API.

What you can do with IAAI data

🔧 Source repairable stock.

Filter by primaryDamage and titleType: Repairable, then sort by odometer and acv to find the lots worth bidding on. startCode tells you whether it still drives.

📦 Find parts donors.

Filter by make, model and year range, then read engine, transmission and driveLineType to confirm the donor matches before you bid.

🌍 Plan export runs.

Group by branch and auctionDate to batch lots at one location on one day. isOffsite warns you when the vehicle is not actually there.

📊 Analyse the salvage market.

Compare damage mix, odometer distribution and ACV across region and branchState over time.

Why choose this scraper

What you get
The odometer brand keptIAAI writes 210,800 mi (Not Required/Exempt). A parser that only accepts 210,800 mi throws the whole field away — the mileage and the warning that it cannot be trusted. Both come back, in odometer and odometerBrand, whatever qualifier IAAI used.
Fields that cannot crossIAAI's rows are unlabelled and their cells shift position from row to row. Six values live in two vocabularies at once — Other, Water, Theft, None, Hybrid, Unknown — so reading by position files a flood-damaged car's Water under fuel type. Every value is classified by which block of the listing it came from.
Real auction timestampsauctionDate is ISO 8601 with an offset, read from IAAI's own auction metadata — not parsed from Wed Aug 19, 8:30am CDT. The original text stays in auctionDateText.
Honest VIN handlingIAAI masks the VIN for anonymous visitors. isVinMasked marks every affected row instead of passing a partial VIN off as complete.
100 lots per requestA search request, not a detail request. No per-vehicle fee hiding behind the per-row price.
A rate limit is never mistaken for an empty searchIAAI answers both with HTTP 200 and zero rows. The Actor retries once before reporting nothing found, so a throttled run does not come back as "no matches".
Thirty named filters plus escape hatchIAAI's own panel exposes 58 facet groups. Thirty of them are named inputs here — body style, engine size, interior colour, region, featured auction lane, Buy Now band and the rest — and anything left goes through extraFacets as a {group, value} pair.
The title's issuing stateA lot parked in Houston can carry a Georgia title, and the rebranding rules follow the title, not the branch. detail.titleState reports it. The search listing never does.
Pre-bid activity before the auctiondetail.preBidActivity returns IAAI's own count — 2 people currently pre-bidding — alongside the bid increment and minimum bid.
A decoded VIN out of a masked oneThe masked VIN keeps eleven characters, which is everything NHTSA's decoder needs. vinDecode turns them into trim, engine model, horsepower, GVWR class and assembly plant.
You pay for what came backEach enrichment is billed only when its data arrives. A detail fetch that fails ships the row without that block and bills nothing for it.

How it compares

Several IAAI scrapers exist and most return the same core vehicle fields. The differences are in what happens to the awkward data: the odometer qualifier, the ambiguous damage labels, and the masked VIN.

The competitor columns below reflect what each Actor's own public listing states, not a test run of it.

FeatureParseForgeeasyapilulzasaurcrawlerbrosshahidirfan
Odometer brand (Not Actual, Exempt) kept as its own fieldYesNot statedNot statedNot statedNot stated
Masked VIN flagged rather than passed off as completeYes, isVinMaskedNot statedNot statedNot statedNot stated
Auction date as ISO 8601 from IAAI's metadataYesNot stated"sale date""sale date"Not stated
Core vehicle fields (VIN, damage, odometer, make/model)YesYesYesYesYes
High-resolution photo setsFirst photo onlyYes, HD setsYesYesNot stated
Search-based (100 lots per request)YesDetail-basedNot statedYesNot stated
Documented fields per lot134Not statedNot statedNot statedNot stated
Named filters30Not statedNot statedNot statedNot stated
Title's issuing stateYes, detail.titleStateNot statedNot statedNot statedNot stated
Live pre-bid activityYes, detail.preBidActivityNot statedNot statedNot statedNot stated
Engine-running videoYes, media.engineVideoUrlNot statedNot statedNot statedNot stated
Masked VIN decoded against NHTSAYes, vinDecodeNot statedNot statedNot statedNot stated
Price per result$0.00338$0.00299$0.01$0.005$0.001

If you need HD image sets per vehicle, easyapi/iaai-vehicle-detail-scraper is built for that and this one is not.

What a lot looks like

Every lot returns as one flat JSON row. Here is a real record:

{
"itemId": "46415206~US",
"stockNumber": "45916118",
"vin": "1GCNCNEH5GZ******",
"isVinMasked": true,
"year": 2016,
"make": "CHEVROLET",
"model": "SILVERADO 1500",
"series": "WORK TRUCK",
"title": "2016 CHEVROLET SILVERADO 1500 WORK TRUCK",
"url": "https://www.iaai.com/VehicleDetail/46415206~US",
"odometer": 124007,
"odometerUnit": "mi",
"primaryDamage": "Transmission Damage",
"secondaryDamage": "Other",
"titleType": "Clear",
"startCode": "Run & Drive",
"airbagState": "Intact",
"hasKey": true,
"vehicleType": "Automobiles",
"engine": "4.3L V-6 DI, VVT, 285HP",
"fuelType": "Gasoline",
"cylinders": "6 Cyl",
"transmission": "Automatic",
"driveLineType": "4X2 Drive",
"bodyStyle": "Regular Cab",
"exteriorColor": "White",
"countryOfOrigin": "United States",
"branch": "Orlando",
"branchState": "Florida",
"region": "East",
"market": "IAA United States",
"lane": "A - #126",
"itemNumber": "S - 49",
"acv": 0,
"acvCurrency": "USD",
"isPublicSale": false,
"isOffsite": false,
"auctionDate": "2026-08-19T08:30:00+00:00",
"auctionDateText": "Wed Aug 19, 8:30am CDT",
"inventoryStatus": "RS",
"currency": "USD",
"isTimedAuction": false,
"hasBuyNow": false,
"acceptsPreBid": true,
"searchUrl": "https://www.iaai.com/Search",
"scrapedAt": "2026-08-19T10:00:00.000Z"
}

odometerBrand appears only when IAAI qualifies the reading. secondaryDamage appears only when a second damage is recorded. An acv of 0 means not disclosed, not free.

Note what did not happen to this row: its secondary damage is Other, which is also a valid IAAI fuel type — and its fuelType still reads Gasoline. Six labels sit in two vocabularies at once (Other, Water, Theft, None, Hybrid, Unknown), and IAAI prints them in unlabelled cells whose position shifts between rows, so a naive parser files a flooded car's Water under fuel.

About the VIN

IAAI masks the last characters of the VIN for anyone who is not signed in, and this Actor reads only public pages. You get what IAAI shows a visitor — 1GCNCNEH5GZ****** — and isVinMasked is true on every affected row so nothing looks like a complete VIN when it is not. The first eleven characters still identify world manufacturer, model line, body, engine and model year, which is enough to match against a parts catalogue. The full VIN is behind an IAAI account and is not public data.

Configure the run

Drive the Actor with a keyword, thirty named filters, a year range, or raw facets. The Input tab lists every parameter. The three enrichment toggles are off by default, so a plain run stays fast and cheap.

Every Tesla currently at auction:

{ "make": "TESLA", "vehicleType": "Automobiles", "maxItems": 500 }

Repairable front-end damage in Florida, newer than 2018:

{ "state": "Florida", "primaryDamage": "Front End", "titleType": "Repairable", "yearFrom": 2018, "maxItems": 1000 }

Run-and-drive pickups selling this week:

{ "vehicleType": "Pick-up Trucks", "startCode": "Run & Drive", "auctionWindow": "ThisWeek", "maxItems": 300 }

Free-text search, plus a filter IAAI exposes that this input does not name:

{ "keyword": "flood", "airbagState": "Intact Airbags", "maxItems": 200 }

Everything IAAI knows about every Tesla in Florida, enrichment on:

{ "make": "TESLA", "state": "Florida", "includeDetails": true, "includeMedia": true, "decodeVin": true, "maxItems": 100 }

That run makes three extra requests per vehicle and is spaced out on purpose, so it takes minutes rather than seconds. Leave the toggles off for a fast listing sweep.

Filters take IAAI's own values. make and model are capitalised the way IAAI writes them (CHEVROLET, SILVERADO 1500). The dropdown filters offer exactly the values IAAI's own filter panel offers. Anything not covered goes through extraFacets as a {group, value} pair.

Pricing

Pay-per-event: $0.00338 per lot, dropping to $0.003 at higher volume, plus a $0.054 run-start fee (down to $0.048) and $0.009 per search request — one request returns up to 100 lots. You pay only for rows written to your dataset, and platform usage is on us rather than added to your bill.

Lots collectedApproximate cost
100$0.40
1,000$3.52
10,000$34.75

That covers the listing. The three enrichments are opt-in and priced on their own, because each is an extra request per vehicle:

Enrichment eventWhat it addsPrice
Vehicle detailUp to 60 more fields from the lot's detail page$15.00 / 1,000
MediaFull image set at native resolution, 360 spin, engine video$5.00 / 1,000
VIN decodeUp to 18 NHTSA fields recovered from the masked VIN$3.00 / 1,000

Enrichment is charged only when the data comes back. A request that fails ships the row without that block and bills nothing for it. A 1,000-lot run with all three switched on costs about $26.52.

New Apify accounts start with $5 in free credit, which is roughly 1,400 listing-only lots.

Free users

Free-plan runs return up to 100 rows as a preview. Upgrade your Apify plan to collect up to 50,000 rows per run — see below for what one run delivers in practice, which is a question of time rather than of plan.

How many rows one search really returns

Measured on 19 August 2026. Around the 400-row mark, IAAI stops serving a paginating search: it does not return an error — the next page comes back well formed and empty, exactly like the end of the results. Two searches of very different sizes, Ford (43,101 matches) and Tesla (3,860), both stopped at the same 400.

That empty page is a rate limit, not the end of the data, and treating it as the end is how a run quietly delivers 400 rows to someone who asked for 1,000. So the Actor does not treat it as the end. It retries the page once with a fresh session, which in testing recovered the full 100 rows and let the search carry on well past 400.

Two things follow, both worth knowing:

  • A large run may log one of these warnings and keep going. That is the recovery working, not a failure.
  • If the retry also comes back empty, the run stops and says so — as a warning naming the row count it reached and the one you asked for, never as a quiet success. Should that happen, a residential proxy pages through where datacenter will not:
{ "make": "FORD", "maxItems": 5000, "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] } }

What one run actually delivers

Both limits below are measured, not estimated, and they matter more than the 50,000 ceiling in the input schema.

Proxy groupRows one run deliversWhat stops it
Datacenter (default)around 1,500the rate limit above, once a retry stops recovering it
Residential5.8 rows per second, so about 20,000 at the default 3,600-second timeoutthe run timeout

The 4,000-row residential run behind those numbers finished complete, with memory flat at 533 MB of the 1,024 MB the Actor uses — so memory is not the constraint at any size you are likely to ask for. Time is.

To collect more than about 20,000 rows, raise the timeout in the run options — 50,000 rows needs roughly 8,600 seconds — or split the job across several runs with narrower filters. Splitting is usually better: it also keeps each search well inside the rate limit.

Run it

  1. Create a free Apify account with $5 in credit.
  2. Open the IAAI Scraper in the Apify Console.
  3. Pick a make, a state or a primaryDamage, set maxItems, and click Start.
  4. Export the results as CSV, Excel, JSON, or XML from the Dataset tab.

Run it programmatically through the Apify API or the ApifyClient for JavaScript and Python.

Use with AI agents (MCP)

Give an AI agent live access to IAAI through the Model Context Protocol. Add the Actor to Claude, Cursor, or any MCP client:

claude mcp add --transport http apify "https://mcp.apify.com?tools=parseforge/iaai-scraper"

Then prompt it in plain language:

  • "Find run-and-drive Toyotas with front-end damage in Texas selling this week."
  • "List every clear-title vehicle under 100,000 miles at the Orlando branch."
  • "Compare the damage mix between the East and West regions."

Copy this into ChatGPT, Claude, or Cursor to start:

Use the Apify Actor "parseforge/iaai-scraper" to collect public IAAI.com salvage auction lots. Input: { "make": "<MAKE IN CAPS>", "model": "<MODEL IN CAPS>", "yearFrom": <year>, "yearTo": <year>, "state": "<US state or Canadian province>", "primaryDamage": "<IAAI damage label>", "startCode": "<Run & Drive|Starts|Stationary|Can't Test>", "titleType": "<Clear|Salvage|Repairable|Non-Repairable|Bill Of Sale|PartsOnly|None>", "auctionWindow": "<AuctionToday|AuctionTomorrow|ThisWeek|NextWeek>", "includeDetails": <true for vehicle grade, issuing title state, parts presence and pre-bid activity>, "includeMedia": <true for the full-resolution image set, 360 spin and engine video>, "decodeVin": <true to decode the masked VIN against NHTSA>, "maxItems": <n> }. It returns stockNumber, vin, isVinMasked, year, make, model, odometer, odometerBrand, primaryDamage, secondaryDamage, titleType, startCode, airbagState, hasKey, engine, fuelType, transmission, driveLineType, branch, branchState, region, lane, acv and auctionDate per lot. VINs are partially masked because IAAI hides them from anonymous visitors. Call it with the ApifyClient and my APIFY_TOKEN.

Troubleshooting

Why am I getting no results?

The filter combination has no matches. Drop the narrowest filter first — usually model or branch — and confirm make alone returns lots. Filter values must match IAAI's spelling exactly.

Why is the VIN incomplete?

IAAI masks it for anonymous visitors. See the VIN section above. isVinMasked marks every affected row.

Why fewer lots than I asked for?

maxItems is a ceiling, not a target. The search ran out — the run log prints how many lots IAAI reported for your filters.

Why did the run fail saying IAAI returned no vehicles twice?

IAAI answers a rate limit with HTTP 200 and a results page that is well formed but empty — indistinguishable from a search that genuinely matches nothing. Rather than guess, the Actor waits and asks once more: if the second try returns rows, the first was a rate limit and the run continues; if it returns nothing again, your filters really match nothing. Drop the narrowest filter, or enable Apify Proxy.

Why is acv zero?

IAAI publishes an actual cash value only for some lots. Zero means not disclosed, not free.

Why is the run slow?

Each request returns 100 lots and the Actor spaces requests out on purpose, because IAAI drops the connection when they arrive too fast. A 10,000-lot run is 100 requests.

A field stopped filling.

IAAI changed its markup or added a value not in its published filter vocabulary. Email us with your run ID so we can update the parser.

FAQ

QuestionAnswer
Do I need an IAAI account or API key?No. This reads public search results, so there is nothing to register or authorize.
Do I get the full VIN?No. IAAI masks the last characters for anonymous visitors, and this Actor reads only public data. isVinMasked marks every row.
Does it return the final sale price?No. Sale prices are behind an IAAI login. This returns the published ACV where IAAI discloses one.
Does it return photos?The first auction photo per lot, in imageUrl. For full HD image sets per vehicle, use a dedicated detail scraper.
How many lots per run?Free plan: 100. Paid: up to 50,000 by schema, but in practice bounded by time — about 1,500 on the default datacenter proxy, or ~20,000 on a residential one at the default 3,600-second timeout. Raise the timeout for more.
Can I filter by anything on IAAI's panel?Yes. Thirty named filters cover the common ones; anything else goes through extraFacets as a {group, value} pair.
Is the auction date reliable?It comes from IAAI's own auction metadata as an ISO 8601 timestamp with an offset, not parsed from the displayed text. auctionDateText keeps the original string.
What is odometerBrand?IAAI's qualifier on the reading, passed through as published — Not Actual, Not Required/Exempt and Exceeds Mechanical Limits are the common ones, and the field is not restricted to a fixed list. Empty means the reading is taken as actual.
Does it cover Canada?Yes, where IAAI lists it. market tells you which IAAI market a lot belongs to.
Do I need a proxy?Apify Proxy is on by default. IAAI drops connections from an IP that requests too fast, so running without one will stall on longer jobs. Past 400 rows in one search you need the residential group; see "How many rows one search really returns".
Is this an official IAAI product?No. It is unofficial and reads only public IAAI data.

Browse the full ParseForge collection for more scrapers.

🆘 Need help? Email parseforge@protonmail.com with your run ID, your input, and what you expected.

⚠️ Disclaimer. This Actor is unofficial and is not affiliated with, endorsed by, or sponsored by IAA, Inc. or RB Global. It collects only publicly available IAAI data. You are responsible for using the data in compliance with IAAI's terms and applicable laws. Do not use it to identify, profile, or target individuals.