Automation · E-commerce
Cars.com Listings Scraper
Scrape used and new car listings from cars.com by ZIP code, make, model, and radius -- VIN, price, mileage, full spec sheet, seller info, and photos, normalized into one clean, VIN-keyed dataset.
Free Apify credit covers a first run. No credit card to try.
What this Actor 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.
Input
Paste this into the Apify Console, or send it as the run input over the API. Proxy settings are on by default; you rarely need to touch them.
| Field | Type | Required | What it does |
|---|---|---|---|
zipCode | string | no | US 5-digit ZIP code anchoring the zip-centered search (e.g. "90210"). |
maximumDistance | string | no | Search radius in miles from ZIP code, or "all" for a nationwide search. |
stockType | string | no | cars.com's stock_type filter. |
makes | array | no | Make slugs to filter by (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"). Leave empty for all models within Makes. Up to 10 entries. |
maxResults | integer | no | Hard cap on dataset rows. The Actor paginates cars.com's search results until this cap or the last page. |
fetchDetails | boolean | no | Fetch each listing's vehicle detail page for stock number, drivetrain, split colors, engine/cylinder detail, accident/one-owner badge, dealer rating, photos, and description. Costs one extra browser render PER ROW --… |
searchUrl | string | no | Full cars.com search URL, used verbatim instead of building one from ZIP code / Maximum distance / Stock type / Makes / Models. Leave empty to use those fields instead. |
{
"zipCode": "90210",
"maximumDistance": "50",
"stockType": "used",
"makes": [
"toyota"
],
"models": [
"toyota-camry"
],
"maxResults": 5,
"fetchDetails": true,
"searchUrl": null,
"proxyConfiguration": {
"useApifyProxy": true
}
} Output
One row per result, schema-validated before it is written. Export JSON, CSV, Excel or XML from the run, or read it over the API.
listing_idlisting_urlvinstock_numbertitlemakemodeltrimyearpricecurrencymileage_mifuel_typetransmissiondrivetrainengine_power_hp
{
"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
| Event | Price | When |
|---|---|---|
| Actor start | $0.20 | Once per run, covers warm-up and proxy session setup. |
| Result row | $0.0012 | Per result written to the dataset. |
You pay only for results that land. Cap any run with maxTotalChargeUsd. See pricing & billing for worked examples.
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?
Why is `vin` sometimes `null`?
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?
fetchDetails: false.Can I get a full CARFAX or AutoCheck report?
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?
Is this legal to run?
Ready to run it?
Open the listing on Apify, paste the input above, and watch rows land. If it ever breaks, it is our problem before it is yours.
Related Actors