CarsForSale APIcarsforsale.com ↗
Search car listings by zip code, browse makes/models/trims, and fetch listing details including price history and market analytics from CarsForSale.com.
What is the CarsForSale API?
The CarsForSale.com API gives developers access to 5 endpoints covering vehicle inventory search, make/model/trim browsing, and individual listing detail retrieval. The search_listings endpoint returns up to ~24 recently added vehicle listings near a given US zip code, each with price, mileage, dealer info, and image URLs. Listing detail responses include market analytics such as national average price, days on market, and depreciation data.
curl -X GET 'https://api.parse.bot/scraper/2afee011-a6ca-481e-8fa9-cb59db7733be/search_listings?make=Toyota&zip_code=84010' \ -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 carsforsale-com-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: CarsForSale SDK — search listings, browse makes/models/trims, get analytics."""
from parse_apis.carsforsale.com_api import CarsForSale, ListingNotFound
cfs = CarsForSale()
# List available makes and popular categories
for name in cfs.makes.list(limit=10):
print(name)
# Search for Toyota listings near a zip code
for listing in cfs.listings.search(make="Toyota", zip_code="84010", limit=3):
print(listing.make, listing.model, listing.model_year, listing.price, listing.mileage)
# Drill into one listing's market analytics
listing = cfs.listings.search(zip_code="84010", limit=1).first()
if listing:
profile = listing.details()
print(profile.national_average_price, profile.days_on_market, profile.popularity_description)
for dp in profile.depreciation_prices[:3]:
print(dp.date, dp.price)
# Browse models for a specific make (constructible)
for model in cfs.make("Honda").models(limit=5):
print(model.slug, model.display_name)
# Get trims for a make/model via sub-resource
for trim in cfs.make("Toyota").trims.list(model="Camry", limit=10):
print(trim)
# Handle a missing listing gracefully
try:
bad_listing = cfs.listings.search(zip_code="00000", limit=1).first()
if bad_listing:
bad_listing.details()
except ListingNotFound as exc:
print(f"listing not found: {exc.listing_id}")
print("exercised: makes.list / listings.search / listing.details / make.models / make.trims.list")
Search for newly listed vehicle listings near a zip code. Returns recently added vehicles, optionally filtered by make. Results are not paginated and typically return up to ~24 listings. Each listing includes price, mileage, dealer info, and image URLs.
| Param | Type | Description |
|---|---|---|
| make | string | Filter results by vehicle make (e.g. Toyota, Honda, Ford). Case-insensitive partial match. |
| zip_code | string | US zip code to search near. Omitting returns listings from a default/national scope. |
{
"type": "object",
"fields": {
"count": "integer total number of listings returned",
"listings": "array of listing objects with globalInventoryId, make, model, modelYear, trim, price, mileage, dealer info, and image URLs"
},
"sample": {
"data": {
"count": 24,
"listings": [
{
"make": "Chevrolet",
"trim": "AWD LT 4dr SUV w/2LT",
"model": "Traverse",
"price": 7000,
"dealer": {
"zip": "84097",
"city": "Orem",
"state": "UT",
"address": "1800 S State St",
"displayName": "CR Cars",
"phoneNumber": "+1 (555) 012-3456"
},
"mileage": "124,628",
"forSaleBy": "CR Cars",
"modelYear": 2015,
"globalInventoryId": 126359288
}
]
},
"status": "success"
}
}About the CarsForSale API
Search and Browse Inventory
search_listings accepts an optional zip_code and make parameter, returning an array of listing objects that each contain globalInventoryId, make, model, modelYear, trim, price, mileage, dealer information, and image URLs. Results reflect recently added vehicles and are capped at roughly 24 listings per call — there is no pagination. The get_makes endpoint requires no inputs and returns a flat array of make names and popular search categories sourced from the site homepage.
Make, Model, and Trim Hierarchy
get_models_by_make takes a make string and returns an array of model objects, each with a Value (slug used in subsequent requests) and a Text field that includes the display name and current listing count. Pass the Value from that response as the model parameter to get_trims_by_make_model, which returns the available trim strings for that make/model combination. This three-level hierarchy lets you build filtered search UIs or enumerate available inventory by vehicle configuration.
Listing Detail and Market Data
get_listing_details accepts a listing_id (the globalInventoryId from search results) and returns a profile object with market analytics: NationalAveragePrice, Price, DaysOnMarket, PopularityDescription, and DepreciationPrices. A core_info object is populated only when the listing is present in the newly-listed feed; otherwise it returns an empty object. This makes the endpoint most reliable when the listing_id was obtained directly from search_listings results.
Coverage Notes
All zip code filtering applies to US locations. Make and model strings are case-insensitive for search but must match the Value slug from get_models_by_make when passed to get_trims_by_make_model. The API does not expose seller contact forms, saved search functionality, or VIN decoder data.
The CarsForSale API is a managed, monitored endpoint for carsforsale.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when carsforsale.com 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 carsforsale.com 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?+
- Build a local used-car alert tool that polls
search_listingsby zip code and notifies users of new listings matching a target make. - Populate a vehicle configurator dropdown by chaining
get_makes,get_models_by_make, andget_trims_by_make_modelto render a full make/model/trim selector. - Compare a specific listing's
Priceagainst theNationalAveragePricefield fromget_listing_detailsto surface deal quality scores. - Track
DaysOnMarketacross multiple listings to identify slow-moving inventory for price negotiation research. - Aggregate listing counts from
get_models_by_maketo visualize which models have the most available inventory in a region. - Feed
DepreciationPricesdata from listing detail responses into a vehicle value forecasting model. - Audit dealer inventory breadth by searching
search_listingsacross multiple makes and grouping results by dealer info fields.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does CarsForSale.com offer an official developer API?+
What does `get_listing_details` return, and when is `core_info` populated?+
profile object with market analytics fields including NationalAveragePrice, Price, DaysOnMarket, PopularityDescription, and DepreciationPrices. The core_info object — which contains basic listing info like make, model, price, and dealer — is only populated when the listing_id corresponds to a listing present in the newly-listed feed. If you pass a listing ID sourced from search_listings, core_info will generally be available.Can I paginate through all listings in a region or filter by price range?+
search_listings returns up to roughly 24 listings per call and does not support pagination or price-range filtering. The only available filters are make and zip_code. You can fork this API on Parse and revise it to add pagination or additional filter parameters if the underlying data supports it.Does the API return vehicle history reports, VIN details, or seller contact information?+
Does the API cover listings outside the United States?+
zip_code parameter is US-specific, and CarsForSale.com primarily serves the US market. Omitting zip_code returns listings from a default national scope, but there is no support for Canadian postal codes or international locations. You can fork this API on Parse and revise it to adjust geographic scope if needed.