# CarGurus Scraper — Car Listings, Prices, IMV & Dealer Leads (`haketa/cargurus-scraper`) Actor

Scrape CarGurus used & new car listings: price, Instant Market Value (IMV), deal rating, mileage, make/model/year/trim, VIN, color, price drops, and dealer name & phone for lead-gen. Paste a CarGurus search URL and get every listing across all pages.

- **URL**: https://apify.com/haketa/cargurus-scraper.md
- **Developed by:** [Haketa](https://apify.com/haketa) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.75 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## CarGurus Scraper — Car Listings, Prices, IMV, Deal Ratings & Dealer Leads

> **Extract CarGurus car listings at scale — with price, Instant Market Value (IMV), deal rating, mileage, make/model/year/trim, VIN, color, price drops, and the selling dealer's name & phone.** Paste a CarGurus search URL and get clean, structured JSON/CSV/Excel in seconds. Built for dealers, car shoppers, price analysts and automotive lead-gen.

[![CarGurus Data](https://img.shields.io/badge/CarGurus-Listings%20%2B%20Dealer%20Leads-00a862)]()
[![Includes IMV](https://img.shields.io/badge/Includes-IMV%20%2B%20Deal%20Rating-blue)]()
[![Dealer Leads](https://img.shields.io/badge/Includes-Dealer%20Name%20%26%20Phone-success)]()
[![Fields](https://img.shields.io/badge/Per%20Listing-30%2B%20Fields-purple)]()

***

### What This Actor Does

The **CarGurus Scraper** turns any CarGurus search into a structured dataset. Give it a search URL and it returns each vehicle as a clean row with:

- **Vehicle** — year, make, model, trim, VIN, exterior color, mileage, transmission, drivetrain, engine, CPO/new flags
- **Pricing** — listed price, total price with fees, **Instant Market Value (IMV)**, expected price, and savings-vs-IMV
- **Deal intelligence** — CarGurus deal rating (Great / Good / Fair Price), deal score, days on market, and recent **price drops**
- **Dealer (lead-gen)** — dealer name, **phone number**, location (city/region/postal code), dealer ID
- **Media** — main photo and a direct listing link

Paste a search from any CarGurus region and it paginates through the full result set.

***

### Why Use This

- CarGurus is protected and JavaScript-rendered — a plain fetch returns nothing usable. This Actor uses a browser-grade TLS fingerprint over a residential connection to read the real page data.
- The listing data is deeply **nested** (price, IMV, dealer, mileage and vehicle attributes all live in separate objects) — this Actor flattens it to one tidy row per car.
- It surfaces the values that actually matter for car decisions and lead-gen: **IMV, deal rating, price drops, days on market, and dealer phone** — not just a price and a title.
- Handles pagination, retries and dedup so you get a complete, clean dataset.

***

### Quick Start

#### Run it in the console (no code)

1. On **cargurus.com**, search for a car (make/model, location, filters).
2. Copy the **URL** from your browser's address bar.
3. Open the Actor, paste it into **CarGurus search URLs**, set **Max listings**, and click **Start**.
4. Export as **JSON, CSV, Excel, or HTML**, or push to Google Sheets, a webhook or a database.

> The proxy is preconfigured (US residential) since CarGurus requires it — just paste and run.

#### Run it via API (Python)

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run_input = {
    "startUrls": ["https://www.cargurus.com/Cars/l-Used-Toyota-Camry-c24099"],
    "maxItems": 300,
}

run = client.actor("YOUR_USERNAME/cargurus-scraper").call(run_input=run_input)

for car in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(car["title"], car["price"], car["dealRating"], car["dealerName"], car["dealerPhone"])
```

#### Build a dealer lead list (Python)

```python
run = client.actor("YOUR_USERNAME/cargurus-scraper").call(run_input={
    "startUrls": ["https://www.cargurus.com/Cars/l-Used-Toyota-Camry-c24099"],
    "maxItems": 500,
})

dealers = {}
for c in client.dataset(run["defaultDatasetId"]).iterate_items():
    if c.get("dealerPhone"):
        dealers[c["dealerName"]] = {"phone": c["dealerPhone"], "location": c["dealerLocation"]}
print(len(dealers), "unique dealers")
```

#### Find the best deals (Node.js)

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('YOUR_USERNAME/cargurus-scraper').call({
    startUrls: ['https://www.cargurus.com/Cars/l-Used-Toyota-Camry-c24099'],
    maxItems: 200,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
const greatDeals = items.filter(c => c.dealRating === 'GREAT_PRICE').sort((a,b) => a.price - b.price);
console.log(greatDeals.slice(0, 10));
```

***

### Input Parameters

| Field | Type | Description |
|---|---|---|
| `startUrls` | array | CarGurus search result URLs (e.g. `https://www.cargurus.com/Cars/l-Used-Toyota-Camry-c24099`). Search on cargurus.com and copy the address-bar URL. |
| `maxItems` | integer | Maximum listings to return across all URLs. Default `200`. |
| `proxyConfiguration` | object | Preconfigured to US residential (required by CarGurus). |

**Finding a search URL:** search on cargurus.com, apply any filters (location, price, mileage, year…), and copy the URL. All your filters are preserved.

***

### Output

Each listing is one record. Example:

```json
{
  "listingId": "458597712",
  "title": "2014 Volkswagen Eos",
  "year": "2014", "make": "Volkswagen", "model": "Eos", "trim": "Sport SULEV",
  "vin": "WVWBW8AH7EV000372",
  "price": 9500, "totalPrice": 10495, "imv": 12539,
  "savingsVsImv": 3039, "savingsLabel": "$3,039",
  "dealRating": "GREAT_PRICE", "dealScore": 92,
  "mileage": 51049, "mileageUnit": "MILES",
  "exteriorColor": "Brown (Tan)",
  "transmission": "Automatic", "drivetrain": "FWD",
  "isCpo": false, "isNew": false,
  "daysOnMarket": 13,
  "priceDropOriginal": 9900, "priceDropAmount": 400,
  "dealerName": "Auto Gallery Hollywood",
  "dealerPhone": "+1 754-799-4977",
  "dealerLocation": "Hollywood, FL",
  "imageUrl": "https://static.cargurus.com/....jpeg",
  "listingUrl": "https://www.cargurus.com/Cars/link/458597712",
  "scrapedAt": "2026-09-24T04:10:00.000Z"
}
```

#### Field reference

| Field | Meaning |
|---|---|
| `title`, `year`, `make`, `model`, `trim`, `vin` | Vehicle identity |
| `price`, `totalPrice`, `imv`, `expectedPrice`, `savingsVsImv` | Pricing + Instant Market Value |
| `dealRating`, `dealScore`, `daysOnMarket` | Deal intelligence |
| `priceDropOriginal`, `priceDropAmount` | Recent price drop |
| `mileage`, `exteriorColor`, `transmission`, `drivetrain`, `engine`, `isCpo`, `isNew` | Vehicle attributes |
| `dealerName`, `dealerPhone`, `dealerLocation`, `dealerCity`, `dealerRegion`, `dealerPostalCode`, `dealerId` | Dealer + lead-gen |
| `imageUrl`, `listingUrl` | Media and link |

***

### Use Cases

#### 1. Dealer lead generation

Every listing carries the dealer's name, phone and location. Build targeted dealer lists by make, model or region for automotive B2B outreach, vendor sales, and marketing.

#### 2. Pricing & IMV analysis

Compare listed price to CarGurus IMV and deal rating across a model or market. Find where cars are priced below market and track how deal ratings shift.

#### 3. Deal hunting

Filter to `GREAT_PRICE` / `GOOD_PRICE` deals, sort by savings-vs-IMV, and surface the best-value listings for a model.

#### 4. Inventory & competitor monitoring

Dealers can monitor competing inventory, prices, days-on-market and price drops in their area to price competitively.

#### 5. Market research & analytics

Aggregate listings by make/model/region to analyze pricing, mileage, days-on-market and price-drop trends over time (schedule daily).

#### 6. Price-drop alerts

`priceDropAmount` and `daysOnMarket` let you flag stale inventory and fresh price cuts.

***

### Frequently Asked Questions

**Do I need a CarGurus account?**
No. The Actor reads publicly visible listing data — no login required.

**Why is a proxy required?**
CarGurus is protected by anti-bot; a US residential proxy is preconfigured so it works out of the box.

**How do I get a search URL?**
Search on cargurus.com with any filters and copy the URL. Your filters (location, price, mileage, etc.) are kept.

**Does it include dealer contact details?**
Yes — dealer name, phone and location are included where CarGurus shows them.

**What's IMV?**
CarGurus' Instant Market Value — an estimated fair market price, useful for spotting deals.

**What export formats are supported?**
JSON, CSV, Excel, HTML, or via API — plus Google Sheets, webhooks, Make, and Zapier.

**Can I schedule it?**
Yes — use Apify Schedules for daily inventory and price-drop snapshots.

***

### Legal & Responsible Use

This Actor collects only publicly available listing information for research, pricing and business use. You are responsible for how you use the data. Please:

- Respect CarGurus' Terms of Service and robots directives.
- Comply with applicable data-protection laws when handling dealer contact details.
- Do not use the data for spam, harassment, or any unlawful purpose.
- Use reasonable request volumes and scheduling.

This project is an independent tool and is not affiliated with, endorsed by, or sponsored by CarGurus.

# Actor input Schema

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

CarGurus search result URLs, e.g. https://www.cargurus.com/Cars/l-Used-Toyota-Camry-c24099 . Search on cargurus.com and copy the address bar URL.

## `maxItems` (type: `integer`):

Maximum number of listings to return across all provided URLs.

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

CarGurus is protected by DataDome and requires a US residential proxy. Enabled by default.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.cargurus.com/Cars/l-Used-Toyota-Camry-c24099"
  ],
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `listingId` (type: `string`):

CarGurus listing ID

## `title` (type: `string`):

Year Make Model

## `year` (type: `string`):

Year

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

Make

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

Model

## `trim` (type: `string`):

Trim

## `vin` (type: `string`):

VIN

## `price` (type: `string`):

Price

## `imv` (type: `string`):

Instant Market Value

## `savingsVsImv` (type: `string`):

Price difference vs IMV

## `dealRating` (type: `string`):

GREAT/GOOD/FAIR price

## `mileage` (type: `string`):

Mileage

## `exteriorColor` (type: `string`):

Exterior color

## `isCpo` (type: `string`):

Certified pre-owned

## `daysOnMarket` (type: `string`):

Days on market

## `priceDropAmount` (type: `string`):

Recent price drop amount

## `dealerName` (type: `string`):

Dealer name

## `dealerPhone` (type: `string`):

Dealer phone

## `dealerLocation` (type: `string`):

Dealer location

## `imageUrl` (type: `string`):

Photo URL

## `listingUrl` (type: `string`):

Listing link

## `scrapedAt` (type: `string`):

ISO timestamp

# 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": [
        "https://www.cargurus.com/Cars/l-Used-Toyota-Camry-c24099"
    ],
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/cargurus-scraper").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": ["https://www.cargurus.com/Cars/l-Used-Toyota-Camry-c24099"],
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/cargurus-scraper").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": [
    "https://www.cargurus.com/Cars/l-Used-Toyota-Camry-c24099"
  ],
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call haketa/cargurus-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,haketa/cargurus-scraper"
        }
    }
}
```

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/meaFEBSI83diXsXWN/builds/OacxxMV07xJvhX8gH/openapi.json
