Cars.com Listings Scraper avatar

Cars.com Listings Scraper

Under maintenance

Pricing

Pay per event

Go to Apify Store
Cars.com Listings Scraper

Cars.com Listings Scraper

Under maintenance

Scrape used and new car listings from cars.com by zip code, make, model, and radius. We handle the blocks and retries so you get VIN, price, mileage, full spec sheet, seller info, and photos in one clean, normalized dataset.

Pricing

Pay per event

Rating

0.0

(0)

Developer

DevilScrapes

DevilScrapes

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

20 hours ago

Last modified

Share


What this scrapes 🎯

cars.com's zip-centered search results and each listing's own vehicle detail page, for a make/model/distance/stock-type-filtered search -- one dataset row per vehicle. Point it at a ZIP code and optional make/model/radius filters, or paste a full search URL you built on the site yourself, and get back VIN, price, mileage, year, make/model/trim, engine spec, exterior/interior color, seller info, dealer rating, photos, and description, all normalized into one Pydantic-validated schema.

🔥 What we handle for you

  • 🛡️ We rotate browser fingerprints on every request -- curl-cffi impersonates real Chrome, Firefox, and Safari TLS/HTTP handshakes, so nothing about the traffic looks like a bare Python script.
  • 🌐 We route every request through Apify Proxy, with a fresh session on each run.
  • 🔁 We retry with exponential backoff on rate-limit and block responses -- up to 5 attempts, re-impersonating a fresh browser profile each time, before we give up on a page.
  • 🧱 We isolate faults per listing. One malformed card or one dealer's detail page that won't load logs a warning and gets skipped -- the rest of the run keeps going, and you always get a clear status message, never a silent empty dataset.
  • 🧊 Clean, typed dataset rows -- every row is ResultRow-validated (Pydantic), VIN charset-checked, ISO-8601 timestamps, ready to export as JSON, CSV, or Excel.
  • 💰 Pay-per-result pricing -- a small one-off warm-up charge, then you pay only for rows that land in your dataset.

Use cases 💡

  • Used-car price analytics and comps by make, model, and year.
  • Dealer inventory monitoring -- diff successive runs to catch new arrivals and price cuts.
  • Market research on price, mileage, and spec mix across a metro area.
  • Lead generation from dealer names, locations, and inventory depth.
  • Feeding a VIN-decode or vehicle-history pipeline with a clean, deduplicated VIN list.

How to use it ⚙️

  1. Click Try for free at the top of the page.
  2. Set a ZIP code and, optionally, Makes / Models / Maximum distance / Stock type -- or paste a Search URL override you already built on cars.com.
  3. Click Start. Output streams into the run's dataset.
  4. Export from Storage → Dataset as JSON, CSV, or Excel -- or fetch via the API.

Input 📥

FieldTypeRequiredDefaultNotes
zipCodestringno"90210"US 5-digit ZIP code anchoring the zip-centered search.
maximumDistancestringno"50"Search radius in miles from zipCode, or "all" for nationwide.
stockTypestringno"used"new, used, or all.
makesarrayno[]Make slugs (e.g. "toyota"). Leave empty for all makes. Up to 10 entries.
modelsarrayno[]Model slugs in <makeSlug>-<modelSlug> form (e.g. "toyota-camry"). Up to 10 entries.
maxResultsintegerno50Hard cap on dataset rows (max 1 000). The Actor paginates until this cap or the last page.
fetchDetailsbooleannotrueFetch each listing's vehicle detail page for VIN, stock number, drivetrain, split colors, engine spec, accident/one-owner badges, dealer rating, photos, and description. Turn off for search-card fields only (fewer requests).
searchUrlstringnonullFull cars.com search URL, used verbatim instead of the filter fields above.
proxyConfigurationobjectno{"useApifyProxy": true}Apify Proxy configuration.

Example input

{
"zipCode": "90210",
"maximumDistance": "50",
"stockType": "used",
"makes": ["toyota"],
"models": ["toyota-camry"],
"maxResults": 5,
"fetchDetails": true,
"searchUrl": null,
"proxyConfiguration": {
"useApifyProxy": true
}
}

Output 📤

Every row is one vehicle listing.

FieldTypeNotes
listing_idstringcars.com listing ID.
listing_urlstringAbsolute URL to the vehicle detail page.
vinstring17-character VIN, charset-validated (no I/O/Q); null when absent or malformed.
stock_numberstringDealer stock number. Detail-page only.
titlestringListing headline (year + make + model + trim).
make / model / trimstringVehicle manufacturer, model name, and trim / version line.
yearintegerModel year.
priceintegerAsking price; null for "Call for price" listings.
currencystringConstant "USD".
mileage_miintegerOdometer reading in miles.
fuel_type / transmissionstringFuel type and gearbox.
drivetrainstringFWD / RWD / AWD / 4WD. Detail-page only.
engine_power_hp / engine_displacement_l / cylinder_countnumberEngine spec. Detail-page only.
body_typestringBody style (e.g. Sedan, SUV, Truck).
exterior_color / interior_colorstringSplit exterior and interior colors. Detail-page only.
accident_history / one_ownerstring / booleanFree badge text, best-effort. Detail-page only.
locationstringDealer city/state.
distance_from_zipnumberDistance in miles from your input ZIP code.
seller_typestringprivate or dealer -- overwhelmingly dealer on cars.com.
seller_namestringDealer / seller name.
dealer_ratingnumberDealer rating, 0-5 scale. Detail-page only.
photo_urlsarrayListing photo URLs; empty array when none matched.
descriptionstringFull listing description text. Detail-page only.
posted_datestringISO-8601 posted date when resolvable. Detail-page only.
scraped_atstringISO-8601 wall-clock time of row construction.

Example output

{
"listing_id": "704f8221-1111-2222-3333-000000000001",
"listing_url": "https://www.cars.com/vehicledetail/704f8221-1111-2222-3333-000000000001/",
"vin": "4T1BF1FK5GU123456",
"stock_number": "P12345",
"title": "2023 Toyota Camry SE",
"make": "Toyota",
"model": "Camry",
"trim": "SE",
"year": 2023,
"price": 24998,
"currency": "USD",
"mileage_mi": 18420,
"fuel_type": "Gasoline",
"transmission": "Automatic",
"drivetrain": "FWD",
"engine_power_hp": 203,
"engine_displacement_l": 2.5,
"cylinder_count": 4,
"body_type": "Sedan",
"exterior_color": "Celestial Silver",
"interior_color": "Black",
"accident_history": "No Accidents Reported",
"one_owner": true,
"location": "Beverly Hills, CA",
"distance_from_zip": 4.2,
"seller_type": "dealer",
"seller_name": "Beverly Hills Toyota",
"dealer_rating": 4.6,
"photo_urls": [
"https://platform.cstatic-images.com/xlarge/.../1.jpg"
],
"description": "Certified Pre-Owned, one owner, clean history...",
"posted_date": "2026-08-01T00:00:00Z",
"scraped_at": "2026-08-15T12:00:00.000Z"
}

Pricing 💰

Pay-Per-Event -- you pay only when these events fire:

EventUSDWhat it is
actor-start$0.20One-off warm-up charge per run
result-row$0.0012Per dataset item

Example: 1 000 results at the rates above ≈ $1.40. No subscription, no minimum, no card to start -- Apify gives every new account $5 of free credit.

Limitations 🚧

  • maxResults is hard-capped at 1 000 rows per run -- split larger pulls across multiple runs.
  • accident_history and one_owner reflect only the free badge text cars.com shows on the listing page -- this is not a purchased CARFAX or AutoCheck report, and we never buy or scrape one on your behalf.
  • vin is emitted null whenever the site's value doesn't pass a strict 17-character VIN charset check (no I/O/Q), rather than handing you a malformed VIN.
  • Detail-page-only fields (VIN, stock number, drivetrain, split colors, engine spec, accident/one-owner badges, dealer rating, photos, description, posted date) require fetchDetails: true; turn it off for a faster, cheaper search-card-only run.
  • One search configuration per run -- no multi-search fan-out in a single call.
  • We actively retry and rotate our browser fingerprint on any block or rate-limit response; on a genuinely hostile run the Actor fails loud with a clear status message instead of handing back a quiet empty dataset.

FAQ ❓

What happens if cars.com blocks a request mid-run?

We retry with exponential backoff and rotate to a fresh browser fingerprint automatically -- up to 5 attempts per page. If the very first search page can't be read at all, the run fails loud with a clear error instead of returning an empty dataset with a green status.

Why is vin sometimes null?

We only emit a VIN that passes a strict 17-character charset check (no I, O, or Q -- the standard VIN exclusion set). If the site's value doesn't pass, we return null rather than hand you a value that isn't a real VIN.

Do I need fetchDetails turned on?

Only if you want VIN, stock number, drivetrain, split exterior/interior colors, full engine spec, accident/one-owner badges, dealer rating, photos, or description. Search-card fields (title, price, mileage, year, make/model/trim, location, distance) come back either way, faster and cheaper with fetchDetails: false.

Can I get a full CARFAX or AutoCheck report?

No. accident_history and one_owner are the free badge text cars.com shows publicly on the listing page -- we never purchase or scrape a paywalled vehicle-history report.

What if one listing has a broken or unusual page?

We isolate failures per listing. A malformed card or an unreadable detail page logs a warning and gets skipped; the rest of the run keeps going, and you get a clear status message on how many rows landed.

Is this legal to run?

We only fetch what cars.com serves on its public search and listing pages. We never log in, never touch a dealer contact form, and never scrape any authenticated account feature. Match your own use case against cars.com's terms before using the data commercially.

Your feedback 💬

Spotted a bug, hit a weird edge case, or need a new field? Open an issue on the Actor's Issues tab on Apify Console -- we ship fixes weekly and we read every report.