# 🚘 cardirect car data scraper US 🇺🇸 (`mrdoe/cardirect-car-data-scraper-us`) Actor

one of the largest used-car marketplaces in the US. Give it one or more listing search pages and it collects every vehicle shown across as many pages as you like, then visits each vehicle's own page to pull price, mileage, VIN, trim, specs, and dealer information.

- **URL**: https://apify.com/mrdoe/cardirect-car-data-scraper-us.md
- **Developed by:** [MrDoe](https://apify.com/mrdoe) (community)
- **Categories:** Automation, E-commerce, Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.70 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

![cardirect car data scraper US hero](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/cardirect-car-data-scraper-us--hero.png)

### What does CarsDirect Used Car Scraper do?

**CarsDirect Used Car Scraper extracts used car listings from [carsdirect.com](https://www.carsdirect.com/used_cars/listings)**, one of the largest used-car marketplaces in the US. Give it one or more listing search pages and it collects every vehicle shown across as many pages as you like, then visits each vehicle's own page to pull price, mileage, VIN, trim, specs, and dealer information. Try it by pasting a CarsDirect search URL into the Input tab and clicking **Start**.

Because it runs on the Apify platform, you get the results as structured data you can pull over the API, schedule to run daily or weekly, pipe straight into Google Sheets/Airtable/Make/Zapier, and monitor for failures - all without maintaining any scraping infrastructure yourself.

### Why use CarsDirect Used Car Scraper?

Used car listing sites change inventory constantly, and pulling that data by hand doesn't scale. This Actor is useful for:

- **Market research** - track how many listings, and at what price, exist for a given make/model/trim across dealers.
- **Pricing intelligence** - build a dataset of asking prices and mileage to spot underpriced or overpriced vehicles.
- **Dealer/inventory monitoring** - keep an eye on a specific dealer's stock or a specific model's availability over time.
- **Lead generation and lakehouse feeds** - feed vehicle listings into your own search tool, CRM, or analytics warehouse.

### How to use CarsDirect Used Car Scraper

![How cardirect car data scraper US works](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/cardirect-car-data-scraper-us--how-it-works.png)

1. Open the Actor's **Input** tab.
2. Paste one or more CarsDirect used-car listing search URLs into **Listing start URLs** (for example, a search filtered by make, model, or location on carsdirect.com).
3. Optionally adjust how many pages to paginate through and how many vehicles to collect - see [Input](#input) below.
4. Click **Start** and wait for the run to finish.
5. Open the **Dataset** tab (or the Output tab) to view, filter, and export the results as JSON, CSV, Excel, or HTML.

### Input

![cardirect car data scraper US input options](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/cardirect-car-data-scraper-us--input.png)

The Actor accepts the fields below - all are configurable from the Input tab's form, no code required. See a full example on the **Input** tab of this Actor, or in `.actor/input_schema.json`.

| Field | What to put there |
| --- | --- |
| **Listing start URLs** | One or more carsdirect.com used-car listing search URLs. Apply whatever filters (make, model, zip code, price range, etc.) you want on carsdirect.com itself, then copy that search URL in here. |
| **Detail URLs to (re-)scrape directly** | Optional. Paste specific vehicle detail-page URLs here to re-scrape just those vehicles - handy for retrying the handful of items that came back as `blocked`/`error` in a previous run's dataset, without redoing the whole listing scrape. |
| **Max pages per listing** | How many listing pages to page through per start URL. Stops automatically once a page has no more vehicles. |
| **Max items per listing** | Cap on how many vehicles to collect per start URL (0 = no cap). |
| **Session batch size** | Advanced. How many pages to visit before the Actor rotates to a fresh browser session. The default works well; lower it if you see more `blocked` items in your results. |
| **Minimum/Maximum delay between page visits** | Advanced. Randomized pacing between page visits, in seconds. |
| **Page timeout** | Advanced. How long to wait for a single page to load before retrying it. |
| **Max retries per page** | Advanced. How many times to retry a page after a network error. |
| **Max/Min concurrency** | Advanced. How many listing URLs are processed in parallel. |
| **Proxy configuration** | Defaults to Apify's residential proxies, which this site needs reliably - datacenter proxies are much more likely to get denied. |

### Output

![cardirect car data scraper US dataset output](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/cardirect-car-data-scraper-us--output.png)

![cardirect car data scraper US data fields](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/cardirect-car-data-scraper-us--fields.png)

Each scraped vehicle is a single item in the dataset, combining a quick preview from its listing tile with the fuller detail-page data. A simplified example:

```json
{
    "id": "ul2454934629",
    "url": "https://www.carsdirect.com/used_cars/vehicle-detail/ul2454934629/ford/bronco-sport?source=UsedCarListings",
    "status": "ok",
    "title": "2025 Ford Bronco Sport",
    "trim": "Big Bend",
    "price": "$26,800",
    "mileage": "32,473 mi",
    "vin": "3FMCR9BN2SRE38002",
    "stockId": "17378P",
    "dealer": "Bob Maxey Ford, Inc. | 510 mi from 90245",
    "specs": {
        "Transmission": "8-SPEED AUTOMATIC",
        "Engine": "1.5L I3 12V PDI DOHC Turbo",
        "Doors": "4"
    }
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel from the **Dataset**/**Output** tab, or fetch it via the Apify API for your own integration.

#### Data table

| Field | Description |
| --- | --- |
| `id` | CarsDirect's internal listing ID for the vehicle. |
| `url` | Link to the vehicle's detail page. |
| `status` | `ok`, `blocked`, or `error` - see [FAQ](#faq-disclaimers-and-support) below. |
| `title` | Year, make, and model. |
| `trim` | Trim level, if listed. |
| `price` | Asking price as shown on the detail page. |
| `mileage` | Odometer reading as shown on the detail page. |
| `vin` | Vehicle Identification Number. |
| `stockId` | Dealer's stock/inventory ID. |
| `dealer` | Selling dealer name and distance. |
| `specs` | Additional vehicle specs (transmission, engine, doors, certified-pre-owned status, etc.) as key/value pairs. |
| `carfaxOwners` | Owner-count summary, if CarsDirect shows one. |
| `imageUrl` | URL of the vehicle's primary photo. |
| `listingPrice`, `listingDealer`, `listingMileage`, `listingColor` | The same fields as seen on the listing tile, kept as a fallback/cross-check alongside the detail-page values. |

### Pricing / Cost estimation

This Actor runs on the [Apify platform's compute-based pricing](https://apify.com/pricing) - you pay for the compute units and proxy usage a run consumes. Every run needs residential proxy traffic and a real browser per page visited, so cost scales with the number of vehicles you collect and the number of listing pages you paginate through. Start with a small **Max items per listing** value to estimate cost before scaling up to a full run. New Apify accounts include free monthly usage credits, which comfortably cover test runs.

### Tips or Advanced options

- Keep **Max items per listing** and **Max pages per listing** as low as you need - the run scales roughly linearly with vehicle count.
- If you see a noticeable share of `blocked` items in a run, lower **Session batch size** so browser sessions rotate more often.
- Use **Detail URLs to (re-)scrape directly** to cheaply retry just the failed handful of vehicles from a prior run instead of re-running the whole listing scrape.
- Raise **Max concurrency** to process multiple listing URLs (e.g. several different search filters) in parallel, at the cost of more simultaneous proxy/compute usage.

### FAQ, disclaimers, and support

**Is it legal to scrape carsdirect.com?** Publicly available data can generally be scraped, but you're responsible for complying with carsdirect.com's Terms of Service and applicable law in your jurisdiction, and for how you use the collected data. This Actor doesn't collect any personal data about private individuals - only public vehicle listings and dealer information.

**Known limitations:** carsdirect.com's page layout and available fields can change at any time, which may require this Actor to be updated. Very large runs (many listing pages/vehicles) will naturally take longer and use more platform credits.

**Found a bug or have a feature request?** Please use this Actor's **Issues** tab on Apify Store - that's the fastest way to reach support. Custom modifications or a bespoke version of this scraper are also available on request.

# Actor input Schema

## `startUrls` (type: `array`):

One or more carsdirect.com used-car listing pages to scrape, e.g. https://www.carsdirect.com/used\_cars/listings?pageNum=1. Each URL is paginated (via its pageNum parameter) up to Max pages per listing, and every vehicle found is then visited on its own detail page.

## `detailUrls` (type: `array`):

Optional. A list of specific vehicle detail-page URLs to scrape directly, skipping the listing/pagination phase entirely. Use this to re-run just the items that came back with status "blocked" or "error" in a previous run's dataset, instead of redoing the whole listing scrape. Leave empty for a normal listing run.

## `maxPagesPerListing` (type: `integer`):

Maximum number of listing pages to paginate through per start URL. Pagination stops earlier automatically once a page comes back with no vehicles (end of results).

## `maxItemsPerListing` (type: `integer`):

Maximum number of vehicles to collect per start URL. 0 means no limit (only Max pages per listing bounds the run).

## `sessionBatchSize` (type: `integer`):

How many page visits (listing pages + detail pages combined) to make in one browser session before proactively closing it and starting a fresh browser with a new fingerprint and a new proxy IP. Session trust decays under volume, so keep this modest.

## `minDelaySecs` (type: `integer`):

Lower bound of the randomized delay taken before every navigation, so pacing doesn't look like a script hammering at a constant interval.

## `maxDelaySecs` (type: `integer`):

Upper bound of the randomized delay taken before every navigation.

## `requestTimeoutSecs` (type: `integer`):

How long to wait for a single page navigation before giving up and retrying.

## `maxRequestRetries` (type: `integer`):

How many times to retry a single page visit after a network error or navigation timeout (not counting the one automatic relaunch-and-retry that happens specifically when a block is detected).

## `maxConcurrency` (type: `integer`):

Maximum number of start URLs processed in parallel, each with its own browser session.

## `minConcurrency` (type: `integer`):

Lower bound on parallel workers, kept for parity with other scrapers in this project. With a small number of start URLs this run may use fewer workers than Max concurrency regardless.

## `proxyConfiguration` (type: `object`):

carsdirect.com sits behind a Cloudflare bot-challenge. Residential proxies are strongly recommended - datacenter IP ranges are far more likely to be denied outright regardless of browser fingerprint.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.carsdirect.com/used_cars/listings?pageNum=1"
    }
  ],
  "detailUrls": [],
  "maxPagesPerListing": 20,
  "maxItemsPerListing": 0,
  "sessionBatchSize": 7,
  "minDelaySecs": 2,
  "maxDelaySecs": 5,
  "requestTimeoutSecs": 60,
  "maxRequestRetries": 2,
  "maxConcurrency": 3,
  "minConcurrency": 1,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://www.carsdirect.com/used_cars/listings?pageNum=1"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("mrdoe/cardirect-car-data-scraper-us").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "startUrls": [{ "url": "https://www.carsdirect.com/used_cars/listings?pageNum=1" }] }

# Run the Actor and wait for it to finish
run = client.actor("mrdoe/cardirect-car-data-scraper-us").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.carsdirect.com/used_cars/listings?pageNum=1"
    }
  ]
}' |
apify call mrdoe/cardirect-car-data-scraper-us --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mrdoe/cardirect-car-data-scraper-us"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/fgcctjsRXemFWBDAy/builds/Pz7iGeF6dtQ7Y7ogg/openapi.json
