# 🚘Used car data scraper 🇺🇸(10 websites) (`jordan-byte/used-car-data-scraper-10-websites`) Actor

Instead of running ten separate scrapers and stitching the results together yourself, this actor queries Hemmings, CarGurus, Bring a Trailer, Craigslist, Carfolio, Car and Driver, AutoTrader, TrueCar, Carvana, and CarsDirect in a single run

- **URL**: https://apify.com/jordan-byte/used-car-data-scraper-10-websites.md
- **Developed by:** [Jordan Byte](https://apify.com/jordan-byte) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 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/platform/actors/running/actors-in-store#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

## 🚗 Used Car Data Scraper US

**Search 10 major US used-car sites at once — one make/model, one run, one dataset of used listings.**

Instead of running ten separate scrapers and stitching the results together yourself, this actor queries Hemmings, CarGurus, Bring a Trailer, Craigslist, Carfolio, Car and Driver, AutoTrader, TrueCar, Carvana, and CarsDirect in a single run and hands back every used listing in one normalized shape — same field names, same structure, regardless of which site it came from. Ask for a used Ford F-150 and every site that has one gives you one.

This actor is used-cars-only by design — no `condition` toggle to configure, every site queried and every result returned is used inventory. Looking for new cars instead? See [New Car Data Scraper US](https://apify.com/jordan-byte/new-car-data-scraper-us-3-website-combined).

### ✨ Why use this instead of ten separate scrapers

- 🔎 **One search, ten sites** — `make`/`model`/price/year filters apply everywhere at once, so you get one clean comparison set instead of ten inconsistent ones.
- ⚡ **Built for speed** — every site is queried at the same time, so the total run time is close to whichever single site is slowest, not the sum of all ten.
- 📄 **Real depth, not just page 1** — a `maxItemsPerSite` of 500 actually goes and gets you up to 500 real listings per site, not just whatever happened to fit on the first screen.
- 🛡️ **Built to survive anti-bot walls** — the sites in this list are notoriously hard to scrape reliably. This actor handles that so you don't have to babysit failed runs.
- 💾 **Skips repeat work** — an identical search run recently is served instantly from cache instead of re-scraping everything.
- 🔔 **Notifies you when it's done** — optional Slack/Discord webhook, no extra credentials needed.
- 🖼️ **Photos included** — listing images are pulled through to the output wherever the site has one.
- 🧩 **Resilient by design** — one site failing or getting temporarily blocked never brings down the other nine; you still get everything the rest could find.

### 🌐 Individual site actors

Each site below also exists as its own standalone actor if you only need one source. This actor doesn't call or depend on them in any way — it's a fully separate implementation — but they're listed here in case a single-site actor is all you need.

| Site | Actor |
|---|---|
| Bring a Trailer | [bringatrailer-car-data-scraper-us](https://apify.com/jordan-byte/bringatrailer-car-data-scraper-us) |
| Hemmings | [hemming-car-data-scraper-us](https://apify.com/jordan-byte/hemming-car-data-scraper-us) |
| Craigslist | [craigslist-only-car-data-scraper-us](https://apify.com/jordan-byte/craigslist-only-car-data-scraper-us) |
| CarGurus | [cargurus-car-data-scraper-us](https://apify.com/jordan-byte/cargurus-car-data-scraper-us) |
| AutoTrader | [autotrader-car-data-scraper-usa](https://apify.com/jordan-byte/autotrader-car-data-scraper-usa) |
| TrueCar | [truecar-car-data-scraper-us](https://apify.com/jordan-byte/truecar-car-data-scraper-us) |
| Carvana | [carvana-car-data-scraper-us](https://apify.com/jordan-byte/carvana-car-data-scraper-us) |
| CarsDirect | [cardirect-car-data-scraper-us](https://apify.com/jordan-byte/cardirect-car-data-scraper-us) |
| Car and Driver | [caranddriver-car-data-scraper-us](https://apify.com/jordan-byte/caranddriver-car-data-scraper-us) |
| Carfolio | [carfolio-car-data-scraper-us](https://apify.com/jordan-byte/carfolio-car-data-scraper-us) |

### 🗺️ Sites covered

| Site | Notes |
|---|---|
| hemming (Hemmings.com) | Used / classic |
| cargurus (CarGurus) | Used listings only from this actor (also has new — see the New Car actor) |
| bringatrailer (Bring a Trailer) | Used (auction) |
| craigslist | Used (private) |
| carfolio | Reference specs, not for sale |
| caranddriver (Car and Driver) | Used listings only from this actor (also has new — see the New Car actor) |
| autotraders (AutoTrader) | Used listings only from this actor (also has new — see the New Car actor) |
| truecar (TrueCar) | Used |
| carvana | Used |
| cardirect (CarsDirect) | Used |

One site failing or getting temporarily blocked never affects the others — every site is independently retried and fully isolated from the rest of the run.

### ⚙️ Input

Only `make` is required — everything else has a sensible default, grouped into sections so the input form stays simple unless you need to go further.

#### 🔍 Search

| Field | Type | Description |
|---|---|---|
| `make` | string | Required. e.g. `"Ford"`. |
| `model` | string | Optional. e.g. `"F-150"`. Leave blank to search all models of the make (where the site supports that). |
| `yearMin` / `yearMax` | integer | Optional year range, where supported. |
| `priceMax` | integer | Optional max price (USD), where supported. |

#### 🌍 Sites & result limits

| Field | Type | Description |
|---|---|---|
| `sites` | array | Which sites to query — effectively a checklist of on/off switches, one per site. Defaults to just the fastest ones (`hemming`, `cargurus`, `bringatrailer`); turn on the rest here for fuller coverage if you don't mind the extra time. |
| `maxItemsPerSite` | integer | Stop each site once this many listings are collected. Default `5`. Set to `0` for "no limit" — each site returns as much real inventory as it has for the query. |

Every site is queried at the same time from the moment the run starts, so results come back roughly as fast as the quickest sites can deliver them, and the total run time doesn't stack up site by site.

#### ⚡ Caching

| Field | Type | Description |
|---|---|---|
| `useCache` | boolean | Default `true`. If an identical search (same make/model/filters/sites/limit) was already run before, instantly return those stored results instead of re-scraping every site again. Cached results never expire on their own — turn this off if a specific run needs to force a fresh scrape. |

The cache persists across runs, keyed to the exact search (make/model/year/price/sites/limit, case-insensitive). Change any of those and it's a cache miss — a fresh scrape — by design.

#### 🔔 Notifications

| Field | Type | Description |
|---|---|---|
| `slackWebhookUrl` | string | Optional. Posts a summary (result count per site, or errors) here when the run finishes. Create one under Slack → Apps → Incoming Webhooks. |
| `discordWebhookUrl` | string | Optional. Same summary, posted to a Discord channel. Create one under a channel's Integrations → Webhooks settings. |

Both are plain webhook POSTs — no extra credentials needed from you beyond the URL itself, and a failed webhook post never fails the run.

#### 🛡️ Proxy

| Field | Type | Description |
|---|---|---|
| `proxyConfiguration` | object | Several of these sites are aggressive about blocking non-residential and non-US traffic. Defaults to a US-targeted residential proxy for the most reliable results. **`cargurus` specifically requires a proxy and fails immediately without one** — it doesn't waste time retrying a request that was never going to succeed. |

### 📦 Output

One row per listing, normalized to the same shape regardless of source site — fields are ordered for how a shopper would actually scan a listing:

```json
{
  "source": "cargurus",
  "url": "https://www.cargurus.com/details/445150934",
  "title": "2021 Ford F-150",
  "image": "https://static.cargurus.com/images/forsale/2026/07/23/07/19/2021_ford_f-150-pic-8007356962285664446-1024x768.jpeg",
  "make": "Ford",
  "model": "F-150",
  "price": 39000,
  "vin": "1FTFW5L82MKD91523",
  "location": "Randolph, OH",
  "sellerName": "Sarchione Ford",
  "sellerPhone": "(330) 594-8114",
  "currency": "USD",
  "trim": "Lariat SuperCrew 4WD",
  "year": 2021,
  "condition": "used",
  "mileage": 41797,
  "exteriorColor": "Iconic Silver Metallic",
  "listedAt": null
}
```

Not every field is available from every site — `null` means that particular site doesn't expose that field (or it wasn't available for that listing), not a scraping error. `image` is populated on every site except `carfolio` (only some listings there have a photo). `sellerPhone` is currently only exposed by `cargurus` and `caranddriver` — the rest either don't publish a phone number on the search page, or (Carvana, Bring a Trailer) aren't phone-based sales in the first place.

### 📝 Notes

- `carfolio` is a spec/reference database, not a for-sale marketplace — its rows never have price/mileage/VIN/seller info, and it won't have every model (e.g. it has no F-150 listings at all despite covering Ford broadly).
- A residential proxy is strongly recommended (and defaulted on) — several of these sites are aggressive about blocking traffic that doesn't look like a real US visitor. `cargurus` requires one outright and fails immediately if none is configured.

### 📬 Custom work / contact

Want a custom actor, a site added to this one, or anything tweaked for your use case? Reach out:

- 📧 Email: <sajanbista1030@gmail.com>
- 💼 LinkedIn: [linkedin.com/in/sajan-bista](https://www.linkedin.com/in/sajan-bista/)

# Actor input Schema

## `make` (type: `string`):

Vehicle make, e.g. "Ford", "Audi", "Toyota".

## `model` (type: `string`):

Vehicle model, e.g. "F-150", "A4", "Camry". Leave blank to search all models of the given make.

## `yearMin` (type: `integer`):

Optional. Only used by sites that support a year-range filter.

## `yearMax` (type: `integer`):

Optional. Only used by sites that support a year-range filter.

## `priceMax` (type: `integer`):

Optional. Only used by sites that support a price filter.

## `sites` (type: `array`):

Which sites to query. Defaults to just the fastest ones (hemming, cargurus, bringatrailer) so a run stays quick - turn on the other, slower sites here if you want fuller coverage and don't mind the extra time.

## `maxItemsPerSite` (type: `integer`):

Stop each site once this many listings have been collected. Set to 0 for "no limit" (each site will page through as much inventory as it actually has for the query - in practice each site's own pagination limit is reached long before the 2,000,000/site safety ceiling).

## `useCache` (type: `boolean`):

If an identical search (same make/model/filters/sites/limit) was already run before, instantly return those stored results instead of re-scraping every site again. Cached results never expire on their own - turn this off if you specifically want a fresh scrape.

## `slackWebhookUrl` (type: `string`):

Optional. If set, a summary of the run (result count per site, or errors) is posted here when the run finishes. Create one under Slack → Apps → Incoming Webhooks.

## `discordWebhookUrl` (type: `string`):

Optional. Same summary as the Slack webhook, posted to a Discord channel instead. Create one under a channel's Integrations → Webhooks settings.

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

Several of these sites block datacenter IPs outright, and caranddriver.com geo-blocks any non-US IP entirely. A US-targeted residential proxy is strongly recommended - cargurus specifically requires one and will fail immediately without it.

## Actor input object example

```json
{
  "make": "Ford",
  "model": "F-150",
  "sites": [
    "hemming",
    "cargurus",
    "bringatrailer"
  ],
  "maxItemsPerSite": 5,
  "useCache": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# 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 = {
    "make": "Ford",
    "model": "F-150"
};

// Run the Actor and wait for it to finish
const run = await client.actor("jordan-byte/used-car-data-scraper-10-websites").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 = {
    "make": "Ford",
    "model": "F-150",
}

# Run the Actor and wait for it to finish
run = client.actor("jordan-byte/used-car-data-scraper-10-websites").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 '{
  "make": "Ford",
  "model": "F-150"
}' |
apify call jordan-byte/used-car-data-scraper-10-websites --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jordan-byte/used-car-data-scraper-10-websites"
        }
    }
}

```

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/uC90bGCe3MYstzaPS/builds/iAxmfHts5QOxdkfVx/openapi.json
