Read live salvage auction lots across the US and Canada
The Copart API returns salvage and insurance auto-auction data as clean JSON.
4 active endpoints. Every call is 1 credit.
- POST/copart/v1/search
- POST/copart/v1/lot_detail
- POST/copart/v1/lot_images
- POST/copart/v1/yards
What Copart endpoints does ReefAPI ship?
4 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
Copart API
3 of 4 endpoints, ready to run
Live lots with the VIN, both damage codes, the title brand, the odometer and its brand, the current bid and estimated retail value, the sale status and date, and the yard with its city, state and coordinates — everything a rebuilder or a parts buyer prices a lot on.
{ "ok": true, "meta": { "api": "copart", "endpoint": "search", "mode": "live", "latency_ms": 1438.8, "record_count": 20, "cache_hit": false, "completeness_pct": 0.2 }, "data": { "lots": [ { "lot_number": "41583236", "vin": "WBAFU9C55BC******", "year": 2011, "make": "BMW", "model": "550I", "trim": "XDRIVE", "title": "2011 BMW 550I XDRIVE ", "body_style": "SEDAN 4D", "color": "BLACK", "engine": null, "cylinders": null, "fuel_type": null, "transmission": "AUTOMATIC", "drive": null, "primary_damage": "SIDE", "secondary_damage": "REAR END", "title_type": null, "title_group": null, "title_state": null, "keys_available": "YES", "highlights": null, "loss_type": "IL - SOUTHERN ILLINOIS", "odometer": 120385, "odometer_brand": null, "estimated_retail_value": null, "current_bid": 0, "high_bid": 0, "buy_it_now_price": 0, "repair_cost": 0, "sale_status": "PURE_SALE", "currency": "USD", "sale_date": null, "sale_date_epoch_ms": null, "sale_time": "12:00:00", "yard_name": "IL - SOUTHERN ILLINOIS", "yard_number": 189, "location_city": "CAHOKIA HEIGHTS", "location_state": "IL", "location_country": "USA", "zip": "62205 1001", "latitude": 38.57757, "longitude": -90.09685, "thumbnail": "https://cs.copart.com/v1/AUTH_svc.pdoc00001/lpp/0326/176c42c3fd824715ae9400ad0b706d2b_thb.jpg", "vehicle_type": "AUTOMOBILE", "url": "https://www.copart.com/lot/41583236/2011-bmw-550i-xdrive-il-southern-illinois" }, { "lot_number": "41598746", "vin": "WBA8E9C55GK******", "year": 2016, "make": "BMW", "model": "328I", "trim": null, "title": "2016 BMW 328I ", "body_style": "SEDAN 4DR", "color": "BLACK", "engine": "2.0L 4", "cylinders": "4", "fuel_type": "GAS", "transmission": "AUTOMATIC", "drive": "REAR WHEEL DRIVE", "primary_damage": "FRONT END", "secondary_damage": null, "title_type": "SALVAGE CERTIFICATE", "title_group": "SALVAGE TITLE", "title_state": "SC", "keys_available": "NO", "highlights": [ "Hot Items" ], "loss_type": "CA - VAN NUYS", "odometer": 134234, "odometer_brand": "ACTUAL", "estimated_retail_value": 9600, "current_bid": 800, "high_bid": 800, "buy_it_now_price": 0, "repair_cost": 0, "sale_status": "PURE_SALE", "currency": "USD", "sale_date": "2026-08-28T19:00:00+00:00", "sale_date_epoch_ms": 1787943600000, "sale_time": "12:00:00", "yard_name": "CA - VAN NUYS", "yard_number": 43, "location_city": "VAN NUYS", "location_state": "CA", "location_country": "USA", "zip": "91405 1509", "latitude": 34.2085, "longitude": -118.4355, "thumbnail": "https://cs.copart.com/v1/AUTH_svc.pdoc00001/lpp/0326/53013f31522341ada9301b9c96658a41_thb.jpg", "vehicle_type": "SEDAN", "url": "https://www.copart.com/lot/41598746/salvage-2016-bmw-328i-ca-van-nuys" }, { "lot_number": "41628456", "vin": "WBXJG9C09L5******", "year": 2020, "make": "BMW", "model": "X1", "trim": "XDRIVE28I", "title": "2020 BMW X1 XDRIVE28I ", "body_style": "SPORT UTILITY VEHICLE", "color": "WHITE", "engine": "2.0L 4", "cylinders": "4", "fuel_type": "GAS", "transmission": "AUTOMATIC", "drive": "ALL WHEEL DRIVE", "primary_damage": "SIDE", "secondary_damage": null, "title_type": null, "title_group": null, "title_state": null, "keys_available": "YES", "highlights": null, "loss_type": "FL - WEST PALM BEACH", "odometer": 55069, "odometer_brand": null, "estimated_retail_value": 18075, "current_bid": 0, "high_bid": 0, "buy_it_now_price": 0, "repair_cost": 13717.57, "sale_status": "PURE_SALE", "currency": "USD", "sale_date": null, "sale_date_epoch_ms": null, "sale_time": "10:00:00", "yard_name": "FL - WEST PALM BEACH", "yard_number": 70, "location_city": "WEST PALM BEACH", "location_state": "FL", "location_country": "USA", "zip": "33411 3823", "latitude": 26.69202, "longitude": -80.17167, "thumbnail": "https://cs.copart.com/v1/AUTH_svc.pdoc00001/lpp/0426/e17060a193524ad7a4741f4f46f7bef8_thb.jpg", "vehicle_type": "AUTOMOBILE", "url": "https://www.copart.com/lot/41628456/2020-bmw-x1-xdrive28i-fl-west-palm-beach" } ] } }
How the Copart API works
Copart is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 184 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
Find the rebuildable lots in one state before the sale closes
Salvage buying is a location problem before it is a vehicle problem — freight from the wrong yard eats the margin. So the walk starts from the network, not from a make.
{"query": "TX"}Every yard whose location matches, each with how many lots are sitting in it right now. The yard number is what the search filter wants.
{"make": "BMW", "title_type": "salvage", "size": 50}Fifty lots a page with VIN, both damage codes, odometer, current bid, estimated retail value and the sale date. Page numbers are real offsets: consecutive pages share nothing.
{"lot_number": "<lot from a search row>"}The photograph set on its own, so a damage assessment does not have to re-fetch the whole record to look at pictures.
A priced, damage-classified, geolocated shortlist you can drive to, with a VIN on every row — starting from a state code and nothing else.
curl -X POST https://api.reefapi.com/copart/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"make":"HONDA","size":20}'{
"ok": true,
"data": { … },
"meta": {
"api": "copart",
"endpoint": "search",
"mode": "live",
"latency_ms": …,
"record_count": …
},
"error": null
}The auction vocabulary: title, odometer, keys and sale status
Copart's own words are what people search for, and several of these fields look like enums but are not. The counts below come from one live 100-lot sample plus targeted filter runs, so you can see how often each value actually turns up rather than only that it exists.
| Field | Values measured | What it means |
|---|---|---|
| title_group | CLEAN TITLE, SALVAGE TITLE, NON-REPAIRABLE | Copart's normalized bucket. This is the field to group and compare on. |
| title_type | Free text in dozens of spellings: SALVAGE CERTIFICATE, CERT OF TITLE-SALVAGE, SALVAGE VEHICLE TITLE, PERMIT SALVAGE, CERTIFICATE OF DESTRUCTION, NONREPAIRABLE TITLE, BILL OF SALE - PARTS ONLY, JUNKING CERT OF A VEHICLE, MV907A-PARTS ONLY, IRRECUPERABLE | The issuing state or province's own document name, including French for Quebec lots. Never treat it as an enum. |
| title_type filter | clean, salvage, non_repairable | The only three tokens the search accepts. Each maps to one title_group: clean returned 20 of 20 CLEAN TITLE, non_repairable returned 30 of 30 NON-REPAIRABLE. |
| odometer_brand | ACTUAL (25), NOT ACTUAL (8), EXEMPT (1), absent (66), out of 100 lots | The federal odometer disclosure attached to the reading in odometer, which is miles as a float. |
| keys_available | YES (87), NO (9), EXEMPT (3), null (1) | Whether the yard holds keys for the lot. |
| sale_status | PURE_SALE (75), ON_APPROVAL (15), MINIMUM_BID (9), NOT_ON_SALE (1) | How the lot sells. Lots carrying a real buy-it-now price came back MINIMUM_BID. |
| vin | 11 visible characters then six asterisks: 3HGGK5G84FM****** | Copart masks the last six digits for logged-out visitors. There is no unmasked VIN in this API. |
| currency | USD (93), CAD (7) | Canadian yards quote CAD. Do not total bids across a mixed result set without checking this field. |
| vehicle_type | In responses: SEDAN, SUV, PICKUP, COUPE, MOTORCYCLE, ATV, JET SKI, TRAILERS, INDUSTRIAL EQUIPMENT. As a filter: automobile, motorcycle, atv, boat, bus, construction, trailer, heavy_truck, rv | Two different vocabularies. The returned value is a body style; the filter token is a category. |
An unrecognized filter value is ignored rather than rejected. A search with damage set to a nonsense string returned ok true and 36,977 unfiltered Honda lots, with no error and no warning. Validate the tokens you send against the lists above, because a typo silently widens your result set instead of failing.
Two countries, four hundred yards, and how much of the VIN you actually get
Measured against the live gateway on several makes and title filters. The first row decides whether this engine fits your product at all.
Every row we measured carried a VIN, and every one of them ended in six asterisks. That is what Copart itself publishes to a visitor who is not signed in, and we do not sign in. The first eleven characters are still the manufacturer, the model year, the plant and the descriptor section — enough to decode and enough to disambiguate a model, but NOT enough to run a title-history check. No engine on this site will give you the last six.
The yard directory returns four hundred locations with a live lot count on each, together covering hundreds of thousands of lots. Location prefixes span the US states and the Canadian provinces — Alberta, Ontario, Quebec, Nova Scotia and New Brunswick all answer — and lot rows carry an explicit country of USA or CAN alongside city, state, postcode, latitude and longitude.
On thirty salvage lots: a current bid on eleven, an estimated retail value on twenty-three, a sale date on twenty, a buy-it-now price on one. The rest read zero or null. A zero bid means nobody has bid yet, not a free car — and a lot with no sale date has not been scheduled rather than cancelled. Read sale_status beside them: it separates a pure sale from a minimum-bid lot, an on-approval lot and one not on sale at all.
Filtered to salvage, thirty of thirty rows carried a title_type, and the vocabulary is the auction's own rather than a normalised guess — salvage certificate, certificate of title salvage, permit to sell, rebuildable, and the French-language Quebec wording on Canadian lots. title_group, the normalised bucket, and title_state came back on all thirty too. On an UNFILTERED sweep the picture inverts: eight of fifty lots carried a title brand at all. So filter on it if you need it, and never treat a null as clean.
Pages 1, 50 and 400 of the same query shared zero lot numbers with one another, twenty rows each, against a reported total of about ten thousand for that make. The page parameter is a real offset, not a re-roll of the first page.
Run back to back, one search returned the identical twenty lot numbers both times. There is no ranking jitter to defend against, so a diff between two pulls is a real change in the auction rather than noise.
An invented lot number answers NOT_FOUND with retryable false, naming the lot in the message. That is the signal to close the row rather than retry it: a lot that has run and sold leaves the live catalogue, and this is how you learn that it did.
lot_images returns the full photograph set for one lot on its own — thirteen images on the lot we measured. Search rows carry a single thumbnail, so a damage assessment that needs the whole set does not have to re-pull the record to get it.
What people build with Copart
The jobs this data is most often used for.
endpoints
credit per call
Auto-remarketing tools call search to find salvage vehicles by make, model and title type.
Parts-sourcing products use lot_detail and lot_images to assess a damaged vehicle before bidding.
Salvage-market analysts use yards and search to track auction supply by location.
What Copart data costs
The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.
Full pricing →- 1,000 free credits on signup, no card
- One key, all 184 APIs, one credit pool
- Failed and blocked calls are never charged
- Credits roll over and never expire
Call it in two lines
Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.
curl -X POST https://api.reefapi.com/copart/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"make":"HONDA","size":20}'import requests
r = requests.post(
"https://api.reefapi.com/copart/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"make": "HONDA",
"size": 20
},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up Copart.
Get a free key →Why is sale_date null on most lots?▾
Because Copart only stamps a date once a lot is assigned to an auction, and freshly listed lots are not. Measured: 92 of 100 lots on a default search, and 100 of 100 sorted by sale date, came back with sale_date and sale_date_epoch_ms both null, while sale_time still carried the yard's usual start (12:00:00 on 68 lots, 10:00:00 on 21). When a date is present it is ISO-8601 with a UTC offset, like 2026-08-27T16:00:00+00:00, with the epoch milliseconds beside it.
Why is title_type null on lots I just searched, and can I still filter by it?▾
Same reason: the title document is not recorded yet on a newly listed lot, and 82 of 100 default-sorted lots returned both title_type and title_group null. Copart's own index knows more than the card shows, so the filter still works on those lots. A title_type=clean search returned 20 of 20 with title_group CLEAN TITLE, and non_repairable returned 30 of 30 NON-REPAIRABLE. Filter server-side with the parameter instead of post-filtering the field.
What does odometer_brand NOT ACTUAL mean?▾
It is the odometer disclosure that rides with the reading, not a quality score. ACTUAL means the mileage is certified as the true reading. NOT ACTUAL means it is not, which covers a broken or replaced cluster as well as an unverifiable one. EXEMPT means the vehicle falls outside the disclosure rule by age or weight. This matters when you read the number: a measured motorcycle lot showed odometer 0.0 with odometer_brand NOT ACTUAL, which is an uncertified reading rather than a zero-mile bike.
current_bid, high_bid or buy_it_now_price, which one is the price?▾
current_bid is the live number, and high_bid matched it on every lot inspected (275.0 and 275.0, then 325.0 and 325.0). buy_it_now_price is 0.0 rather than null when there is no buy-it-now, and it was 0.0 on all 100 lots of a general search. A condition=buy_it_now search returned real ones between 1700 and 12300, all with sale_status MINIMUM_BID. Test buy_it_now_price > 0, not for null.
How do I restrict a search to one Copart location?▾
Call yards first. It returns all 400 locations with their live lot counts and the exact strings the filters accept. Measured: TX - DALLAS 6,071 lots, TX - DALLAS SOUTH 4,628, AK - ANCHORAGE 450, AB - CALGARY 621. Then pass either yard_number or location. yard_number 357 resolved to TX - HOUSTON EAST with 3,157 lots. The list includes Canadian yards, which is where the CAD lots come from.
What does lot_images give me, and can I tell which photo is the VIN plate?▾
It gives every photo in order, with three sizes derived from the same key and ending _ful, _hrs and _thb, so you pick the resolution without a second call. Lot 36532223 returned 13 photos. The type field is present but came back UNKNOWN on all 13, so it will not identify the VIN plate or the odometer shot for you. sequence is the only ordering you get.
What is loss_type actually carrying?▾
The sale it belongs to, not an insurance loss code. Measured values are auction and yard names: 'MO - ST. LOUIS', 'TX - HOUSTON EAST', 'CRASHEDTOYS POWERSPORT AUCTION', 'HEAVY TRUCK SPECIALTY SALE', 'ATLANTIC CANADA AUCTION'. It is often identical to yard_name. For what happened to the vehicle, read primary_damage and secondary_damage, which use Copart's own words (FRONT END, SIDE, WATER/FLOOD, TOP/ROOF). A damage=water_flood search returned WATER/FLOOD on 40 of 40 lots.
How reliable are estimated_retail_value and repair_cost?▾
They are Copart's own estimates in the lot's currency, not appraisals, and one of them is frequently missing. In the 100-lot sample estimated_retail_value was null on 23 lots while repair_cost was populated on all 100. A measured 2015 Honda Fit lot carried estimated_retail_value 15025.0 against repair_cost 11782.76. Use them for ranking, not for valuation.
What is the Copart API?▾
Copart API is a ReefAPI endpoint group for copart It returns live JSON through POST requests under /copart/v1.
Is the Copart API free to try?▾
Yes. ReefAPI starts with 1,000 free credits, no card required. Copart calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Copart login or account?▾
No login to Copart is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Copart data?▾
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Copart API use?▾
Copart actions currently cost 1 credit per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.
Can I call Copart from an AI assistant or MCP client?▾
Yes. Connect ReefAPI once through MCP and your assistant can call copart actions with the same key, credit pool and JSON envelope used by normal REST requests.
35 E-commerce & Marketplaces APIs on the same key
One key, one credit pool, one response envelope. If you are pulling Copart, you are one call away from the rest of the category — no second contract, no second integration.
Need something this API does not do?
Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.
Try it on your own data before you pay anything
The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 183 APIs, and the same envelope everywhere.
Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-08-28.