ucars APIucars.pro ↗
Search Copart and IAAI salvage auction lots by make, model, year, and odometer. Look up VIN or lot number for final bid price, damage, and photo gallery.
What is the ucars API?
The ucars.pro API gives developers structured access to Copart and IAAI salvage vehicle auction data across the US and Canada through 5 endpoints. Use search_auction_lots to page through live or ended auctions with filters for make, model, year range, and odometer range, or call get_lot_by_vin to retrieve a specific vehicle's full detail record including final bid price, condition damage codes, and a photo gallery.
curl -X GET 'https://api.parse.bot/scraper/73228143-bfbc-403c-8446-10f3c7b9722b/search_auction_lots?make=acura&status=live&auction=copart' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace ucars-pro-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: ucars.pro auction SDK — bounded, re-runnable; every call capped."""
from parse_apis.ucars_pro_api import UcarsPro, Auction, LotStatus, SortOrder, LotNotFound
client = UcarsPro()
# List available makes, pick the first one.
make = client.makes.list(limit=5).first()
if make is not None:
print(f"Make: {make.make} (slug: {make.make_slug})")
# List models for that make.
for model_name in client.makes.list_models(make=make.make, limit=5):
print(f" Model: {model_name}")
# Search live Copart lots for a specific make, sorted soonest-first.
for summary in client.lot_summaries.search(
make="acura", status=LotStatus.LIVE, auction=Auction.COPART,
sort=SortOrder.ASC, limit=3,
):
print(f"{summary.title} lot#{summary.lot_number} {summary.auction_date}")
# Drill down: take one lot summary and navigate to its full detail.
hit = client.lot_summaries.search(make="acura", auction=Auction.COPART, limit=1).first()
if hit is not None:
lot = hit.details()
print(f"{lot.title} — VIN {lot.vin}, price={lot.price}, photos={lot.photo_count}")
# Point lookup by VIN, with typed error handling.
try:
lot = client.lots.get(vin="19UUB2F44LA005123")
print(f"{lot.year} {lot.make} {lot.model}, condition: {lot.condition}, damage: {lot.primary_damage}")
except LotNotFound as e:
print(f"VIN not found: {e.message}")
print("exercised: makes.list / makes.list_models / lot_summaries.search / details / lots.get")
Browse vehicle auction lots, one record per lot, 24 lots per page. status selects live (upcoming/active) auctions or sold (ended sales history). Filters: auction, make, model (requires make), year_from/year_to, odometer_from/odometer_to (miles); every filter is applied by the site. Each lot carries VIN, lot number, auction name, auction date, year/make/model, odometer, primary damage, condition, title type and the primary photo URL; the final bid price and the full photo gallery are only on the lot page, fetch them with get_lot_by_vin using the emitted vin. Pagination: page (default 1); last_page and has_more are read from the site's pager; a page past the last one returns an empty items list. An unknown make returns an empty page. Sort orders by auction date (asc = soonest first, default for live).
| Param | Type | Description |
|---|---|---|
| make | string | Vehicle make as emitted by list_makes.makes[*].make (case-insensitive, spaces allowed, e.g. land rover). Omitted = all makes. |
| page | integer | 1-based page number, 24 lots per page. |
| sort | string | Order by auction date. Omitted = site default (soonest first). |
| model | string | Model name as emitted by list_models.models[*] (case-insensitive). Only applied when make is also given. |
| status | string | live = active/upcoming auctions, sold = ended sales history. |
| auction | string | Restrict to one auction house. Omitted = all auctions. |
| year_to | string | Maximum model year, 4 digits. |
| year_from | string | Minimum model year, 4 digits. |
| odometer_to | string | Maximum odometer reading in miles (non-negative integer). |
| odometer_from | string | Minimum odometer reading in miles (non-negative integer). |
{
"type": "object",
"fields": {
"page": "current page number",
"count": "number of lots on this page",
"items": "array of lot summaries: vin, lot_number, auction (copart|copart-canada|iaai|iaai-canada), auction_date (YYYY-MM-DD), title, year, make, model, specs (fuel / engine / cylinders / drive), odometer (text), odometer_value (integer miles), damage, condition (nullable), title_type, seller (nullable), photo_url, detail_url",
"status": "live or sold, echoing the request",
"has_more": "true when page < last_page",
"last_page": "last page number from the site pager"
},
"sample": {
"data": {
"page": 1,
"count": 24,
"items": [
{
"vin": "SALVP2BG9DH824893",
"make": "Land Rover",
"year": 2013,
"model": "Range Rover Evoque",
"specs": "Gas / 2.0 L / 4 cyl / All wheel drive",
"title": "2013 Land Rover Range Rover Evoque",
"damage": "Normal wear",
"seller": null,
"auction": "copart",
"odometer": "118507 mi",
"condition": "Run and drive",
"photo_url": "https://ucars.pro/lot/images/copart/lpp-0726-0242594e785846fda28131c3e5c794a3_ful",
"detail_url": "https://ucars.pro/vin/SALVP2BG9DH824893",
"lot_number": "63551046",
"title_type": "Other",
"auction_date": "2026-10-12",
"odometer_value": 118507
}
],
"status": "sold",
"has_more": true,
"last_page": 417
},
"status": "success"
}
}About the ucars API
Browsing and Filtering Auction Lots
The search_auction_lots endpoint returns 24 lots per page and accepts filters for auction (copart, copart-canada, iaai, iaai-canada), make, model, year_from/year_to, and odometer_from/odometer_to in miles. The status parameter switches between live (active and upcoming auctions) and sold (ended sales history). Each item in the items array includes vin, lot_number, auction, auction_date (YYYY-MM-DD), title, year, and summary-level fields. Pagination is handled via the page parameter; has_more and last_page tell you how many pages remain.
Lot Detail and Lookup
get_lot_by_vin takes a single VIN and returns the full lot record: year, make, model, fuel, drive, color, keys, loss type, a condition and damage block, vehicle specs, and price with a price_label indicating what the price represents (e.g., "Final bid"). Both price and price_label are null when the source shows no price for the lot. If you have a lot number instead of a VIN, search_by_lot_number accepts the numeric lot_number and returns matching lot summaries in the same shape as search_auction_lots.items without pagination.
Make and Model Discovery
Before filtering searches, use list_makes to retrieve the exact make strings accepted by the search and model-listing endpoints; the response also includes make_slug (URL-form with underscores). Pass one of those make values to list_models along with an optional auction filter to get the raw model strings the site recognizes for that make. These raw strings — lowercase, occasionally including trim variants — are the accepted values for search_auction_lots.model. Both endpoints support an optional auction parameter to restrict results to one auction house.
The ucars API is a managed, monitored endpoint for ucars.pro — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when ucars.pro changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official ucars.pro API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Track final bid prices on sold Copart and IAAI lots by VIN for insurance valuation reference
- Build a salvage car search tool filtered by make, model, year range, and mileage
- Monitor upcoming live auction dates for specific vehicle makes across US and Canada locations
- Fetch photo galleries and damage condition data for a list of VINs before bidding
- Aggregate historical sold prices by model and year to analyze salvage market trends
- Validate a lot number from an external source and retrieve its auction and sale status
- Enumerate all makes and models available at a specific auction house for UI filter population
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does ucars.pro offer an official developer API?+
How does get_lot_by_vin handle lots where no price was recorded?+
price field (integer) and price_label field are returned as null. When a price is present, price_label indicates what it represents — for example, 'Final bid' for a completed sale.Does the search_auction_lots endpoint cover Canadian auction locations?+
auction filter accepts four values: copart, copart-canada, iaai, and iaai-canada. Omitting the filter returns lots across all four. Individual lot records include an auction field identifying which house and country the lot belongs to.Is vehicle history report data (e.g., CarFax or AutoCheck records) available?+
Can I retrieve all lots for a given auction without paginating manually?+
last_page field in the search_auction_lots response tells you the total number of pages, and has_more is true while more pages exist. There is no bulk-download endpoint that returns all lots in one call. You can fork this API on Parse and revise it to add a helper endpoint that iterates pages and aggregates results.