Auto.dev

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/listings

Parameters

PropTypeDefault
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.

PropTypeDefault
page?
number
1
limit?
number
100
https://api.auto.dev/listings?page=2&limit=50

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.

PropTypeDefault
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.

PlanMax ?limit=
Starter20
Growth100
Scale500

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).

PropTypeDefault
sort?
string
updatedAt.desc

Supported sort fields

FieldDescription
createdAtWhen the listing was first added
updatedAtWhen the listing was last updated (default)
priceRetail price
milesVehicle mileage (mileage is an accepted alias)
yearModel 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.asc
https://api.auto.dev/listings?sort=year.desc&vehicle.make=Toyota

Field 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.

PropTypeDefault
select?
string
-
https://api.auto.dev/listings?select=vehicle.vin,vehicle.year,vehicle.make,retailListing.price&limit=1

Important: 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.

PropTypeDefault
zip?
string
-
distance?
number
50
https://api.auto.dev/listings?zip=33132&distance=50

Search 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=mustang

Filter syntax

All filter parameters share the same operator vocabulary:

  • Comma for multiple valuesvehicle.make=Ford,Chevrolet (logical OR).
  • Dash for numeric rangesretailListing.price=10000-30000 or vehicle.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=CA

Example 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=total is 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.

Plan Availability

  • Starter: ✅ Available
  • Growth: ✅ Available
  • Scale: ✅ Available

See pricing for plan details and signup.

Was this API reference helpful?