Copart Scraper - Salvage Lots, Damage, Title & Bids avatar

Copart Scraper - Salvage Lots, Damage, Title & Bids

Pricing

$0.60 / 1,000 per lot returneds

Go to Apify Store
Copart Scraper - Salvage Lots, Damage, Title & Bids

Copart Scraper - Salvage Lots, Damage, Title & Bids

From $0.60 per 1,000 rows, no start fee. Every Copart lot: year, make, model, trim, masked VIN, primary and secondary damage, title group and state, odometer, run-and-drive, keys, current bid, buy-it-now, est. retail value, repair cost, sale date, consigning insurer and yard. 417,320 counted.

Pricing

$0.60 / 1,000 per lot returneds

Rating

0.0

(0)

Developer

Scrapers Delight

Scrapers Delight

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Share

๐Ÿš— Copart Scraper โ€” Salvage Lots, Damage, Title & Bids

Every vehicle lot listed on Copart, with the salvage disclosure a buyer actually needs. Year, make, model, trim, the masked VIN, primary and secondary damage, title group and title state, odometer with its brand, run-and-drive certification, keys, the current bid, buy-it-now price, Copart's own estimated retail value and estimated cost of repair, the sale date, and the yard the car is physically sitting in โ€” name, number, city, state, ZIP and coordinates.

$0.60 per 1,000 rows. No start fee. You are charged for rows delivered, and for nothing else.

๐Ÿท๏ธ Which carrier is liquidating the car โ€” and the cheapest way to get it

On 18.2% of lots Copart names the consigning company, and this Actor returns it in sellerName. Measured over 1,600 rows: GEICO (152), USAA (68), Bristol West (18), CSAA (15), Farmers (14), AIG, National Powersport Auctions.

That turns a salvage-price feed into something that also answers who is writing these off: track one carrier's total-loss volume by damage type, model and yard; spot which insurer is dumping a model line this month; size a carrier's salvage flow into a region before you bid.

Two of the 26 other Copart Actors also return it โ€” scrapers_lat/copart-scraper at $0.008/row and bovi/copart-lot-scraper at $0.0233/row, checked in their own latest builds' READMEs. This Actor returns the same field at $0.0006/row: 13ร— and 39ร— cheaper.

The honest half: the other 81.8% are consigned anonymously and sellerDisclosed is false. It is a company name on a vehicle record โ€” there is no person, email, phone or address behind it here or on any public Copart surface. Filter on sellerName being present when you need the carrier; treat the 18.2% as the real coverage, not a rounding error.


๐Ÿ“Š What this Actor does

Copart publishes 417,320 lots in its public index (counted on 2026-09-18 from Copart's own totalElements, not estimated). This Actor reads them through Copart's own search API โ€” the same endpoint copart.com's front end calls โ€” and returns one clean, typed row per lot.

  • ๐Ÿš™ Vehicle identity โ€” year, make, model, model group, trim, engine, cylinders, fuel, transmission, drive, colour, Copart's vehicle type
  • ๐Ÿ”‘ Salvage disclosure โ€” primary damage, secondary damage, Copart's damage code, title group, title description, title state, title doc type, odometer + odometer brand, run-and-drive and engine-start certification, keys
  • ๐Ÿท๏ธ The consigning carrier โ€” sellerName on the 18.2% of lots Copart discloses (GEICO, USAA, Bristol West, CSAA, Farmers, AIG). Only 2 of the 26 other Copart Actors return it, at 13ร— and 39ร— this price.
  • ๐Ÿ’ฐ The money โ€” current bid, whether any bid exists, buy-it-now price, Copart's estimated retail value, estimated value, estimated cost of repair, currency, sale type
  • ๐Ÿ“… The sale โ€” sale date, sale time, time zone, auction name, lot status
  • ๐Ÿ“ The yard โ€” yard name, yard number, city, state, country, ZIP, latitude, longitude
  • ๐Ÿงพ Provenance on every row โ€” which partition, which query and which page produced it
  • ๐Ÿ†“ Copart's whole filter vocabulary, written to the key-value store free of charge on every run

Who buys this

Auto dismantlers and recyclers sourcing donor vehicles by make/model/year/yard ยท salvage rebuilders screening lots on damage code, title group and the bid-to-retail ratio ยท used-car exporters building shipping lists by yard and state ยท VIN-history and valuation vendors ยท Copart brokers reselling access to non-licensed buyers.


โš–๏ธ What this is NOT โ€” read this before you buy

This is a salvage-lot DATA product. It is not a contact or lead product, and it is not sold as one. On 18.2% of lots (291 of 1,600 measured) Copart names the consigning company โ€” GEICO, USAA, Bristol West, CSAA, Farmers, AIG โ€” and that name ships in sellerName. Those are the insurers writing the vehicle off: corporate entities attached to a vehicle record. The other 81.8% are consigned anonymously. Either way there is no person, no email, no phone number and no address anywhere on this surface, and the location on every lot is Copart's own yard rather than a third party's premises. Nothing here is a lead list.

Why the data is public at all. Salvage and junk vehicle designations are a disclosure regime. State salvage-title statutes, and federal NMVTIS (49 U.S.C. ยง30502, implemented at 28 CFR Part 25), require salvage/junk status to be reported and disclosed to buyers โ€” which is why Copart publishes title type, damage and odometer against every lot in the first place. That is a disclosure obligation about vehicles, not a contact register about people, and this Actor stays on the vehicle side of that line.


๐ŸŽฏ Honest limits (measured, not hedged)

LimitThe measurement
VIN is maskedCopart returns the first 11 of 17 characters to anonymous callers โ€” KNDJT2A64C7******. Measured: 1,560 of 1,560 standard 17-character VINs masked, always the last 6, always exactly 11 visible. Every row carries vinMasked and vinVisibleChars, so it can never be mistaken for a full VIN. No surface reachable without a Copart membership returns the full VIN, and this Actor does not claim otherwise.
Not every lot has a VIN at all40 of 1,600 rows (2.5%) carry a shorter manufacturer serial instead โ€” forklifts and industrial equipment mostly, plus a few boats, jet skis and trailers. Those come back unmasked, and vinMasked: false says so rather than dressing them up as masked VINs.
Seller is named on a minority of lotssellerName is present on 18.2% of rows and is the consigning insurer, never a person. See the section above.
No sold pricesCopart does not publish realized/hammer prices to anonymous callers. Every lot in the public index is an open lot (lotStatus: "O" on 1,600 of 1,600). currentBid is the live high bid at the moment of the request; there is no sold-price field and none is implied.
Only 34.3% of lots have a sale date143,154 of 417,320 lots have an auction date in the future. The rest are listed but not yet scheduled. The default scope is the scheduled ones โ€” see the FAQ, because this one has a sharp edge.
No body styleCopart lets you filter on body style but does not return it in the search record. It is cut rather than shipped as a column of nulls โ€” use rawFilters with body_style:"4DR SEDAN" to filter on it.
No grid/row positionCopart's "Grid/Row" yard-position column came back as the empty string on 1,600 of 1,600 records. Cut, not shipped.
One thumbnail, not a galleryFull photo galleries need a per-lot request this Actor does not make. thumbnailUrl is the one image the search record carries (99.9% filled).
Copart is Imperva-walledcopart.com intermittently serves an HTTP 200 carrying an Incapsula challenge page to unproxied IPs โ€” a block that does not announce itself as an error. This Actor sniffs for it, retries on a fresh proxy session, and never records it as "end of data". Apify's datacenter pool was measured clean; see the proxy FAQ.

๐Ÿ“ˆ Measured field fill

From a real run, counted against the raw bytes Copart returned, over 1,600 records spanning 18 different scopes (whole index, single yard, single year, single state, by vehicle type, by title group, buy-it-now only, free-text search, and a four-filter buyer query):

FieldFillFieldFill
lotNumber, lotUrl, vin, year, make, model100%titleGroup, titleGroupCode, titleDescription, titleDocType94.4%
primaryDamage, damageTypeCode100%saleDate (default scope)93.8%
currentBid, hasBids, estimatedRetailValue100%fuel89.9%
saleType, saleTime, saleTimeZone, auctionName100%drive86.6%
yardName, yardNumber, city, state, zip, latitude, longitude100%engine, cylinders86.1%
keysStatus, color, thumbnailUrl99.9%estimatedValue83.2%
titleState99.8%odometer81.3%
modelGroup99.4%trim75.9%
runAndDrive, engineStartProgram, lotFeatureCodes98.3%repairCost60.5%
transmission97.1%bidToRetailRatio (needs a bid)46.3%
hasKeys, odometerBrand, conditionCode95%+secondaryDamage43.2%

Every one of those gaps is Copart's, not the parser's: the offline suite asserts field-by-field that our fill equals the fill in the raw bytes, and the build fails if it does not.


๐Ÿงญ How the fields were named

Copart's search JSON names its columns with two- to four-letter keys โ€” hb, la, lotPlugAcv, orr, dd, tgd, syn. Guessing at those is how a scraper ships a confidently wrong column: la and lotPlugAcv are both money in the same order of magnitude, and picking the wrong one puts "estimated retail value" on a field that means something else, at 100% fill, with no error anywhere.

So none of it was guessed. The mapping was read out of Copart's own front end โ€” the messages_CPRTUS_en bundle it loads on every page, which carries the column dictionaries Copart uses for its own search grid and CSV export:

Copart's label idCopart's own textOur field
app.label.csv.lotAcvEst. Retail valueestimatedRetailValue
app.label.csv.lotPlugAcvEstimated valueestimatedValue
lotsearch.header.label.highBidCurrent bidcurrentBid
lotsearch.header.label.repairCostEst. Cost of repairrepairCost
lotsearch.header.label.buyItNowPriceBuy it now pricebuyItNowPrice
lotsearch.header.label.odometerReadingReceivedMileageodometer
lotsearch.header.label.saleTitleTypeDoc TypetitleDocType

currentBid was then cross-checked a second way: it equals dynamicLotDetails.currentBid on 1,600 of 1,600 rows, and the offline suite re-asserts that every build.


โš™๏ธ Input

FieldTypeDefaultNotes
searchTermstringโ€”Free text, exactly as Copart's own search box works. ANDs with every filter below.
maxItemsinteger50Hard spend cap โ€” rows are charged only as delivered. 0 = everything in scope.
onlyUpcomingSalesbooleantrueRestrict to lots with a future auction date. Read the FAQ before turning this off.
statesarrayโ€”Two-letter yard states, e.g. ["TX","CA"]. Filters Copart's location_state.
yardNames / yardNumbersarrayโ€”e.g. "TX - DALLAS" / 371. The full list for your scope lands in COPART_FACETS.
makes / models / yearsarrayโ€”OR'd within each.
yearFrom / yearTointegerโ€”Model-year range.
odometerMin / odometerMaxintegerโ€”Odometer range.
titleGroupsarrayโ€”clean, salvage, non-repairable.
vehicleTypesarrayโ€”17 Copart categories from automobile to agriculture-farm-equipment.
damageTypesarrayโ€”All 25 Copart primary-damage codes.
lotFeaturesarrayโ€”16 Copart quick picks (run-and-drive, buy-it-now, electric, classic, recovered-theftโ€ฆ). AND'd, so two features narrow.
saleDateFrom / saleDateTostringโ€”YYYY-MM-DD.
sortByenumsale-date-soonestAlso latest-first, Copart's own order, lot number, odometer.
partitionByenumautoauto / yard / year / make / none.
rawFiltersarrayโ€”Raw clauses against Copart's index for anything the above misses.
pageSizeinteger100Copart's own ceiling โ€” it rejects 200 with an error.
concurrencyinteger4
proxyConfigurationobjectApify proxySee the proxy FAQ.

Example input

{
"titleGroups": ["salvage"],
"lotFeatures": ["run-and-drive"],
"makes": ["TOYOTA"],
"yearFrom": 2018,
"odometerMax": 80000,
"states": ["TX", "CA"],
"maxItems": 500
}

๐Ÿ“ค Output

One row per lot. A real row from a real run, untouched:

{
"lotNumber": "41584556",
"lotUrl": "https://www.copart.com/lot/41584556/salvage-2025-cadillac-escalade-esv-sport-vt-rutland",
"vin": "1GYS9PRL5SR******",
"vinMasked": true,
"vinVisibleChars": 11,
"year": 2025,
"make": "CAD",
"model": "ESCALADE E",
"modelGroup": "ESCALADE",
"trim": "SPORT",
"title": "2025 CADILLAC ESCALADE ESV SPORT",
"vehicleType": "SUV",
"odometer": null,
"odometerBrand": null,
"primaryDamage": "FRONT END",
"secondaryDamage": null,
"damageTypeCode": "FR",
"conditionCode": "CERT-E",
"conditionDescription": "ENHANCED VEHICLES",
"runAndDrive": false,
"hasKeys": true,
"keysStatus": "YES",
"titleGroup": "SALVAGE TITLE",
"titleState": "VT",
"currentBid": 21800,
"hasBids": true,
"buyItNowPrice": null,
"estimatedRetailValue": 60000,
"estimatedValue": 96700,
"repairCost": 41000,
"bidToRetailRatio": 0.3633,
"currency": "USD",
"saleType": "Pure Sale",
"saleDate": "2026-09-29T17:00:00.000Z",
"auctionName": "VT - RUTLAND",
"yardName": "VT - RUTLAND",
"yardNumber": 88,
"city": "RUTLAND",
"state": "VT",
"zip": "05701",
"latitude": 43.5872,
"longitude": -72.9784,
"sellerDisclosed": false,
"sourcePartition": "yard:Vt - Rutland",
"sourceQuery": "UPCOMING=auction_date_utc:[NOW TO *] AND LOC=yard_name:\"VT - RUTLAND\"",
"sourcePage": 0
}

Plus two key-value store records, neither of them billed:

  • RUN_SUMMARY โ€” the filters actually sent, how many lots Copart said matched, what each partition declared versus delivered, rows delivered (= rows charged), duplicates and empty records skipped, per-field fill measured on your own run, every failed page split into WAF blocks versus transport errors, and the honest-limits list.
  • COPART_FACETS โ€” Copart's entire filter vocabulary for your scope: every yard, make, model, year, body style, engine, damage type, title group and sale date in it, each with its live count. This is the input to your next, narrower run.

๐Ÿ† What this does that the alternatives do not

There are 26 other Copart Actors on the store (counted from the full store sitemap, all 12 shards). This one is the cheapest of them, and it differs in five ways that are checkable rather than claimed:

  1. sellerName โ€” the consigning carrier, on 18.2% of lots. Checked against all 26 other READMEs pulled from their own latest builds: 2 return it (scrapers_lat $0.008/row, bovi $0.0233/row), one returns Copart's raw seller flags without resolving a name (memo23), and the other 23 do not return it at all. We return it at $0.0006/row.
  2. Coverage you can verify. Every run reports Copart's own count for the scope against what was delivered, partition by partition, and fails loudly if a sweep comes back short. A short parse is otherwise indistinguishable from a small scope.
  3. Provenance on every row. sourcePartition, sourceQuery and sourcePage mean a plausible-but-wrong result set is obvious at a glance instead of being taken on trust.
  4. Fields named from Copart's own dictionary, not from inference โ€” and re-asserted against the bytes on every build.
  5. No start fee, against a lane where 22 of 26 rivals charge one.

๐Ÿ’ต Pricing

EventRate
Per lot returned (lot-scraped)$0.0006 per row โ€” $0.60 per 1,000
Actor startnone โ€” there is no start fee
Everything else (RUN_SUMMARY, COPART_FACETS, retries, skipped duplicates, unreadable records)free

Rows are charged as they are delivered, per item. If you set a budget cap, you keep exactly the rows you paid for โ€” you will never be handed rows you were not billed for, or billed for rows you were not handed. A duplicate skipped across partitions, a record with no lot number, and a retried request all cost you nothing.

The default maxItems of 50 means an empty input costs $0.03.


โ“ FAQ

Why does onlyUpcomingSales default to true, and what happens if I turn it off?

Because of a sharp edge worth knowing about. Copart's public index holds 417,320 lots, but only 143,154 (34.3%) have an auction date in the future โ€” the rest are listed but not yet scheduled. Copart's index sorts the undated lots first on any ascending date sort, so a "soonest first" run over the whole index returns 100 lots nobody can bid on and looks completely healthy doing it. Leaving this on gives you the lots that are actually for sale. Turn it off when you want total inventory, including cars that have arrived at a yard but have no sale scheduled yet.

Is the VIN complete?

No. Copart returns 11 of the 17 characters to anonymous callers: KNDJT2A64C7******. Every row says so explicitly via vinMasked and vinVisibleChars. The visible 11 still carry the WMI, vehicle descriptor and check digit โ€” enough to decode make, model, body, engine, restraint system and model year, and enough to match against a VIN you already hold โ€” but they are not enough to uniquely identify the vehicle on their own. Any Copart Actor showing you a full 17-character VIN in its sample output is not showing you what the anonymous API returns.

Can I get sold prices or auction results?

Not from this Actor, and not from Copart's public surface. Copart does not publish realized prices to anonymous callers โ€” every lot in the public index is an open lot. currentBid is the live high bid when the request was made. For pre-sale price context the row carries Copart's own estimatedRetailValue, estimatedValue and repairCost, plus a derived bidToRetailRatio.

Who is the seller?

On 18.2% of lots Copart names the consigning company in sellerName โ€” the insurers writing these vehicles off. Measured over 1,600 rows: GEICO (152), USAA (68), Bristol West (18), CSAA (15), Farmers (14), AIG, National Powersport Auctions. On the other 81.8% Copart consigns anonymously and sellerDisclosed is false. Two of the 26 other Copart Actors return this field too, at $0.008 and $0.0233 per row. It is a company name on a vehicle record โ€” there is no person, email, phone or address behind it, on this surface or any other public one. This is vehicle data, not contact data.

Why is estimatedRetailValue sometimes null when Copart shows a number?

It is null when Copart has no value for it. Watch for this if you are parsing Copart yourself: Copart writes -1, not 0 and not null, as its not-published sentinel on that field โ€” on 269 of 1,600 measured rows. A zero check does not catch it, so it sails through as a retail value of minus one dollar and poisons anything derived from it. Here it becomes null, and the offline suite fails the build if a negative ever reaches a money column.

yardNumber and the auction don't always match โ€” why?

Because they are different things, and this trips up naive Copart parsers. yardNumber is the physical yard the car sits in; auctionHostNumber is the sale it has been assigned to, and Copart runs virtual sales (MEDIUM DUTY CLEAN TITLE SALE, RENTAL VEHICLE SALE) out of physical yards. Filtering yard 371 returns 200 cars all physically at 371, 8 of which belong to sale 832 or 838. yardNumber here always agrees with yardName; the sale keeps its own field.

Which proxy should I use?

The default (Apify's automatic/datacenter pool) was measured clean across several hundred requests on 2026-09-18 and is the fastest (~1.7 s/request). If you see blocks, switch to residential: {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US"} โ€” measured working at ~4.0 s/request. Your own proxies work too. Running unproxied is not recommended: copart.com sits behind Imperva and intermittently serves an HTTP 200 carrying a challenge page to bare IPs (it did exactly that to the machine this was built on, then stopped about ninety minutes later).

What happens when Copart blocks a request?

It is retried on a fresh proxy session โ€” retrying a flagged IP through the same IP is a slower way to get the same answer. A block is never recorded as "no more results": the Actor tells apart a transport failure, a WAF challenge served under HTTP 200, a malformed query and a genuinely empty result set, because those need opposite fixes. Failed pages are itemised in RUN_SUMMARY.

How do you handle Copart's pagination limits?

Copart caps page size at 100 (it rejects 200 outright) but deep paging works: pages at start=120,000 and beyond were measured returning real, distinct rows with zero overlap against page 0. The catch is that the index is live โ€” rows shift between requests, so a single long walk silently loses whatever slides backwards past the cursor. Large scopes are therefore split along a facet Copart itself publishes (yard, then year, then make), each partition small enough to close in seconds and each checked against Copart's own count for it. It is also cheaper: Copart repeats a ~425 KB facet dictionary on every page, and a narrower filter shrinks it by 36โ€“56%.

Does partitioning miss anything?

It would, if it were done naively โ€” Copart's yard facet panel caps at 400 values and names fewer lots than the scope contains. So every partitioned run computes the shortfall and sweeps it with an explicit remainder query that excludes the named values, and reports the arithmetic in RUN_SUMMARY.

Can I filter on something that isn't in the input list?

Yes โ€” rawFilters takes raw clauses against Copart's own index, AND'd with everything else, e.g. body_style:"4DR SEDAN" or lot_features_code:LOTFEATURE_X. The complete vocabulary for your scope, with live counts, is written to COPART_FACETS on every run.

How many requests does a row cost?

One request per 100 rows, and no per-lot request at all โ€” all the fields arrive in the search response. That is why this runs at 512 MB with no browser.

Will this get me Copart bidding access?

No. This reads public listing data. Buying at Copart requires a Copart membership and, for many lots, a dealer or dismantler licence in the relevant state. lotFeatures: ["no-license-required"] filters to lots Copart marks as open to the public.

What does robots.txt say?

www.copart.com/robots.txt disallows a set of member-account paths. The two lines that bear on this Actor, verbatim:

Disallow: /public/data/
Allow: /lotSearchResults$

The endpoint this Actor uses, /public/lots/search-results, matches no Disallow line. The /public/data/ lot-detail endpoint does match one โ€” so it is not used, which also costs nothing, because it adds only 12 low-value flags over the search record. The gated member areas (/myBids/, /dashboard/, /downloadSalesData) are never touched, and the offline suite fails the build if any source file acquires a request to a disallowed path.

This Actor reads publicly published listing data โ€” no login, no account, no circumvention of an access control, and no personal data. What you do with it is your call: check your own jurisdiction and Copart's Terms of Use before commercial redistribution. Salvage-title disclosure is a federal and state requirement (NMVTIS, 49 U.S.C. ยง30502 / 28 CFR Part 25), which is why these vehicle facts are published in the first place.


๐Ÿ”ง How it works

POST /public/lots/search-results page 1 of the scope -> totalElements + the facet index
โ””โ”€ plan the walk split large scopes along a facet Copart publishes
โ””โ”€ POST .../search-results pages 2..N, <= 100 rows each, 4 in flight, deduped by lot number
โ””โ”€ push + charge atomically, per item, only for rows actually delivered
โ””โ”€ floor-assert delivered vs Copart's own count; a short sweep FAILS the run

No browser, no per-lot hop, no headless Chrome โ€” one JSON endpoint, 512 MB, and the discipline to tell a block from an empty page.