IAAI Scraper - Salvage Car Auction Lots & Damage Data API
Pricing
from $10.67 / 1,000 lots
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
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 it | What they scrape IAAI for |
|---|---|
| Rebuilders and body shops | Repairable lots by damage type, within driving distance of a branch |
| Dismantlers | Parts donors by make, model and year, with the start code |
| Exporters | Run-and-drive lots by branch and auction date |
| Used-car dealers | Clear-title lots that are not salvage |
| Market analysts | Damage 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 it —
Not Actual,Not Required/Exempt,Exceeds Mechanical Limitsand 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 kept | IAAI 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 cross | IAAI'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 timestamps | auctionDate 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 handling | IAAI masks the VIN for anonymous visitors. isVinMasked marks every affected row instead of passing a partial VIN off as complete. |
| 100 lots per request | A 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 search | IAAI 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 hatch | IAAI'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 state | A 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 auction | detail.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 one | The 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 back | Each 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.
| Feature | ParseForge | easyapi | lulzasaur | crawlerbros | shahidirfan |
|---|---|---|---|---|---|
Odometer brand (Not Actual, Exempt) kept as its own field | Yes | Not stated | Not stated | Not stated | Not stated |
| Masked VIN flagged rather than passed off as complete | Yes, isVinMasked | Not stated | Not stated | Not stated | Not stated |
| Auction date as ISO 8601 from IAAI's metadata | Yes | Not stated | "sale date" | "sale date" | Not stated |
| Core vehicle fields (VIN, damage, odometer, make/model) | Yes | Yes | Yes | Yes | Yes |
| High-resolution photo sets | First photo only | Yes, HD sets | Yes | Yes | Not stated |
| Search-based (100 lots per request) | Yes | Detail-based | Not stated | Yes | Not stated |
| Documented fields per lot | 134 | Not stated | Not stated | Not stated | Not stated |
| Named filters | 30 | Not stated | Not stated | Not stated | Not stated |
| Title's issuing state | Yes, detail.titleState | Not stated | Not stated | Not stated | Not stated |
| Live pre-bid activity | Yes, detail.preBidActivity | Not stated | Not stated | Not stated | Not stated |
| Engine-running video | Yes, media.engineVideoUrl | Not stated | Not stated | Not stated | Not stated |
| Masked VIN decoded against NHTSA | Yes, vinDecode | Not stated | Not stated | Not stated | Not 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 collected | Approximate 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 event | What it adds | Price |
|---|---|---|
| Vehicle detail | Up to 60 more fields from the lot's detail page | $15.00 / 1,000 |
| Media | Full image set at native resolution, 360 spin, engine video | $5.00 / 1,000 |
| VIN decode | Up 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 group | Rows one run delivers | What stops it |
|---|---|---|
| Datacenter (default) | around 1,500 | the rate limit above, once a retry stops recovering it |
| Residential | 5.8 rows per second, so about 20,000 at the default 3,600-second timeout | the 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
- Create a free Apify account with $5 in credit.
- Open the IAAI Scraper in the Apify Console.
- Pick a
make, astateor aprimaryDamage, setmaxItems, and click Start. - 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
| Question | Answer |
|---|---|
| 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. |
Related actors
- Copart Public Search Scraper: the same job for Copart's public salvage listings.
- AutoTrader Car Listings Scraper: retail used-car listings, for comparing salvage against retail.
- Bring a Trailer Auctions Scraper: enthusiast car auctions with bids and time left.
- IronPlanet Scraper: heavy equipment auction listings.
- Machinery Trader Scraper: equipment listings with price and hours.
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.
