Cars.com Listings Scraper icon

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

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.

FieldTypeRequiredWhat 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

EventPriceWhen
Actor start$0.20Once per run, covers warm-up and proxy session setup.
Result row$0.0012Per result written to the dataset.

You pay only for results that land. Cap any run with maxTotalChargeUsd. See pricing & billing for worked examples.

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.

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

Teams that run this also run