Vehicle Listings API
Access millions of active vehicle listings with real-time pricing and availability
Get comprehensive vehicle listings from U.S. physical & online dealers in seconds. Our Vehicle Listings API provides detailed vehicle information, dealership data, specifications, and market pricing.
Endpoint
GET https://api.auto.dev/listings
GET https://api.auto.dev/listings/{vin}Returns vehicle listings. Without a VIN, returns an array of listings (typically 100 per page). With a VIN, returns a single specific listing.
View in Browser
https://api.auto.dev/listingsParameters
| Prop | Type | Default |
|---|---|---|
vin? | string | - |
includeUnpriced? | boolean | false |
Pagination
Pagination is supported for large result sets.
Use the page parameter to navigate through the results. For example, page=2 will return the second page of results.
Limit the number of results per page using the limit parameter. For example, limit=10 will return 10 results per page.
| Prop | Type | Default |
|---|---|---|
page? | number | 1 |
limit? | number | 100 |
https://api.auto.dev/listings?page=2&limit=50Cursor pagination (recommended for deep browsing)
For page 50 and beyond, the API auto-issues a cursor in links.next:
{
"data": [...],
"links": {
"self": "/listings?page=50&limit=20",
"next": "/listings?cursor=eyJrIjoxNzMyMDg...&limit=20",
"prev": "/listings?page=49&limit=20",
"first": "/listings",
"last": "/listings?page=...&limit=20"
}
}Follow links.next — it stays fast at any depth, while ?page=N past 100 gets slower.
Once a request includes ?cursor=, the response returns self, next, prev, and first (no last). Follow first to jump back to the start.
Cursor tokens are opaque — don't parse or modify them, and don't reuse them across sort changes. A cursor issued under one sort returns 400 under another; drop ?cursor= and re-paginate.
| Prop | Type | Default |
|---|---|---|
cursor? | string | - |
Per-plan ?limit= caps
?limit= is capped per plan. Requests above your plan's cap silently clamp to the cap — no 400 is returned, pages just come back smaller.
| Plan | Max ?limit= |
|---|---|
| Starter | 20 |
| Growth | 100 |
| Scale | 500 |
Sorting
Sort results using the sort parameter. Pass a field name followed by an optional direction (asc or desc). Default direction is asc. Default sort when no ?sort= is provided is updatedAt.desc (most recently updated first).
| Prop | Type | Default |
|---|---|---|
sort? | string | updatedAt.desc |
Supported sort fields
| Field | Description |
|---|---|
createdAt | When the listing was first added |
updatedAt | When the listing was last updated (default) |
price | Retail price |
miles | Vehicle mileage (mileage is an accepted alias) |
year | Model year |
distance is not supported as a sort. random is not supported on /listings (each page would reshuffle, making pagination meaningless). Multi-column sort is not supported — pass a single field only.
Examples
https://api.auto.dev/listings?sort=price.aschttps://api.auto.dev/listings?sort=year.desc&vehicle.make=ToyotaField Selection
Project the response down to only the fields you need with ?select=. Pass a comma-separated list of field paths. Any field not listed is omitted from each result, which yields smaller payloads and lower latency.
| Prop | Type | Default |
|---|---|---|
select? | string | - |
https://api.auto.dev/listings?select=vehicle.vin,vehicle.year,vehicle.make,retailListing.price&limit=1Important: when ?select= is used, data[] rows come back with flat dot-keyed properties rather than the nested objects of the default response. Compare (showing vehicle.vin in both for symmetry):
// Default response — nested
{
"vehicle": {
"vin": "YV4L12UC0S2574760",
"year": 2025,
"make": "Volvo",
...
},
"retailListing": { "price": 30975, ... }
}
// With ?select=vehicle.vin,vehicle.year,vehicle.make,retailListing.price
{
"vehicle.vin": "YV4L12UC0S2574760",
"vehicle.year": 2025,
"vehicle.make": "Volvo",
"retailListing.price": 30975
}The default response also surfaces a top-level vin that mirrors vehicle.vin for convenience, but it is not a valid ?select= path — use vehicle.vin instead. Other top-level fields with no nested equivalent (createdAt, updatedAt, location) are selectable by their bare name.
Clients that traverse the response by key path need to handle both shapes when toggling ?select= on and off.
Location Filtering
Filter listings by geographic location using the zip and distance parameters.
| Prop | Type | Default |
|---|---|---|
zip? | string | - |
distance? | number | 50 |
https://api.auto.dev/listings?zip=33132&distance=50Search Listings
Simply make a GET request to listings with your desired search parameters. You can filter by make, model, year, price, mileage, and more. Use commas to specify multiple values.
https://api.auto.dev/listings?vehicle.make=ford&vehicle.model=mustangFilter syntax
All filter parameters share the same operator vocabulary:
- Comma for multiple values —
vehicle.make=Ford,Chevrolet(logical OR). - Dash for numeric ranges —
retailListing.price=10000-30000orvehicle.year=2018-2024. Ranges are inclusive on both ends.
These combine: vehicle.year=2018-2024&vehicle.make=Ford,Chevrolet&retailListing.cpo=true is valid and behaves as expected.
For example, to find Toyota Camrys under $30k in California:
https://api.auto.dev/listings?vehicle.make=Toyota&vehicle.model=Camry&retailListing.price=1-30000&retailListing.state=CAExample Request
curl -X GET "https://api.auto.dev/listings/10ARJYBS7RC154562" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"Response Structure
Response Envelope
Both endpoints return a wrapper object:
{
"data": ...,
"links": { "self": "...", "next": "...", "prev": "...", "first": "...", "last": "..." },
"total": 12345
}data— the payload. Array of listing objects for/listings, a single listing object for/listings/{vin}.links— pagination URLs on array responses. See the accordion below for shape and behavior in cursor mode.total— present only when?includes=totalis passed. Count of matching rows ignoring pagination.
Single Listing Object Structure
Each listing object inside data contains:
Example Responses
Error Responses
Invalid Parameter
{
"status": 400,
"error": "Invalid parameter provided: make. This parameter does not exist in this endpoint.",
"code": "INVALID_PARAMETER",
"path": "/listings",
"requestId": "966e8386bb38f095"
}Invalid VIN
{
"status": 400,
"error": "Invalid VIN format: \"123INVALID\" - VIN must be exactly 17 characters",
"code": "INVALID_VIN_FORMAT",
"path": "/listings/123INVALID",
"requestId": "a1b2c3d4e5f6g7h8"
}VIN Not Found
{
"status": 404,
"error": "Resource \"1FTFW3LDXRFB40317\" not found",
"code": "RESOURCE_NOT_FOUND",
"path": "/listings/1FTFW3LDXRFB40317",
"requestId": "966716ac29ed8147"
}Interactive API Reference
Ready to test these endpoints? Use our interactive API playground to make live requests and see real responses.
Search Vehicle Listings
Search and filter through millions of vehicle listings with advanced criteria
Get Vehicle Listing by VIN
Retrieve detailed listing information for a specific vehicle by VIN
Plan Availability
- Starter: ✅ Available
- Growth: ✅ Available
- Scale: ✅ Available
See pricing for plan details and signup.
Was this API reference helpful?