Cars.com Listings Scraper
Under maintenancePricing
Pay per event
Cars.com Listings Scraper
Under maintenanceScrape 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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
20 hours ago
Last modified
Categories
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-cffiimpersonates 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 ⚙️
- Click Try for free at the top of the page.
- Set a ZIP code and, optionally, Makes / Models / Maximum distance / Stock type -- or paste a Search URL override you already built on cars.com.
- Click Start. Output streams into the run's dataset.
- Export from Storage → Dataset as JSON, CSV, or Excel -- or fetch via the API.
Input 📥
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
zipCode | string | no | "90210" | US 5-digit ZIP code anchoring the zip-centered search. |
maximumDistance | string | no | "50" | Search radius in miles from zipCode, or "all" for nationwide. |
stockType | string | no | "used" | new, used, or all. |
makes | array | no | [] | Make slugs (e.g. "toyota"). Leave empty for all makes. Up to 10 entries. |
models | array | no | [] | Model slugs in <makeSlug>-<modelSlug> form (e.g. "toyota-camry"). Up to 10 entries. |
maxResults | integer | no | 50 | Hard cap on dataset rows (max 1 000). The Actor paginates until this cap or the last page. |
fetchDetails | boolean | no | true | Fetch 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). |
searchUrl | string | no | null | Full cars.com search URL, used verbatim instead of the filter fields above. |
proxyConfiguration | object | no | {"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.
| Field | Type | Notes |
|---|---|---|
listing_id | string | cars.com listing ID. |
listing_url | string | Absolute URL to the vehicle detail page. |
vin | string | 17-character VIN, charset-validated (no I/O/Q); null when absent or malformed. |
stock_number | string | Dealer stock number. Detail-page only. |
title | string | Listing headline (year + make + model + trim). |
make / model / trim | string | Vehicle manufacturer, model name, and trim / version line. |
year | integer | Model year. |
price | integer | Asking price; null for "Call for price" listings. |
currency | string | Constant "USD". |
mileage_mi | integer | Odometer reading in miles. |
fuel_type / transmission | string | Fuel type and gearbox. |
drivetrain | string | FWD / RWD / AWD / 4WD. Detail-page only. |
engine_power_hp / engine_displacement_l / cylinder_count | number | Engine spec. Detail-page only. |
body_type | string | Body style (e.g. Sedan, SUV, Truck). |
exterior_color / interior_color | string | Split exterior and interior colors. Detail-page only. |
accident_history / one_owner | string / boolean | Free badge text, best-effort. Detail-page only. |
location | string | Dealer city/state. |
distance_from_zip | number | Distance in miles from your input ZIP code. |
seller_type | string | private or dealer -- overwhelmingly dealer on cars.com. |
seller_name | string | Dealer / seller name. |
dealer_rating | number | Dealer rating, 0-5 scale. Detail-page only. |
photo_urls | array | Listing photo URLs; empty array when none matched. |
description | string | Full listing description text. Detail-page only. |
posted_date | string | ISO-8601 posted date when resolvable. Detail-page only. |
scraped_at | string | ISO-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:
| Event | USD | What it is |
|---|---|---|
actor-start | $0.20 | One-off warm-up charge per run |
result-row | $0.0012 | Per 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 🚧
maxResultsis hard-capped at 1 000 rows per run -- split larger pulls across multiple runs.accident_historyandone_ownerreflect 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.vinis emittednullwhenever the site's value doesn't pass a strict 17-character VIN charset check (noI/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.