# CarGurus Scraper \[Only $1💰] | IMV | Deals | Leads (`ahmed_jasarevic/cargurus-scraper`) Actor

Scrape CarGurus vehicle listings with Instant Market Value, deal ratings, VIN, and dealer data. Find underpriced used cars, monitor inventory, and build pricing databases. $0.001 per listing.

- **URL**: https://apify.com/ahmed\_jasarevic/cargurus-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.95 / 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

## CarGurus Scraper

Scrape **CarGurus vehicle listings** with CarGurus IMV, deal ratings, and dealer data - extract price, Instant Market Value, mileage, VIN, days-on-market, and dealer contact info for **used-car pricing intelligence, inventory monitoring, and dealer lead generation**. Only $0.001 per listing.

### What You Can Do With CarGurus Data

- **Spot underpriced inventory** - filter by Great/Good Deal ratings to find cars priced below CarGurus Instant Market Value
- **Used-car price monitoring** - track asking price, IMV, and days-on-market across ZIP codes and models
- **Dealer inventory intelligence** - monitor competitor stock, pricing, and listing velocity
- **Wholesale and flip sourcing** - identify vehicles with the largest price-to-IMV gap for arbitrage
- **Automotive market research** - build structured datasets of US used-car pricing trends by make, model, and region
- **Dealer lead generation** - collect dealer names, cities, states, and listing URLs for B2B outreach

### How This Actor Works

CarGurus uses a React/Remix server-rendered search page that embeds the **full structured result set as JSON** inside the HTML (`window.__remixContext`). This Actor reads that embedded JSON directly with a Cheerio parser - no browser rendering, no brittle DOM scraping, no per-listing detail-page requests.

CarGurus is protected by **DataDome**, which fingerprints the TLS/JA3 and HTTP/2 stack of the HTTP client. To bypass this, the Actor uses **TLS impersonation via libcurl-impersonate** - every request carries a real Chrome TLS fingerprint instead of Node's default stack. Combined with **residential proxy rotation** and a **session pool** that retires sessions on bot challenges, this keeps runs reliable at scale.

You provide either CarGurus search URLs (most precise) or a ZIP code plus optional make/model/radius/condition filters, and the Actor returns matching vehicles as clean JSON records with pagination handled automatically.

### Find Underpriced Used Cars by IMV and Deal Rating

Every listing includes CarGurus' proprietary pricing intelligence:

- **Instant Market Value (IMV)** - CarGurus' estimate of fair market price
- **Deal Rating** - Great Deal / Good Deal / Fair Deal / Overpriced
- **Deal Score** - numerical score underlying the rating
- **Price Differential** - dollar amount above or below IMV

Use these fields to instantly identify vehicles priced below market - the exact signal used by professional car flippers and wholesale dealers.

### Build Used-Car Databases Without Official API Access

CarGurus does not offer a public API for listing data. This Actor extracts the same structured data that powers the CarGurus search UI - VIN, make, model, year, trim, mileage, price, dealer info, and photos - into a clean JSON dataset you can load into spreadsheets, databases, or analytics pipelines.

### Input Parameters

| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
| `startUrls` | `array` | No | - | CarGurus search-result URLs. Paste URLs from cargurus.com after setting filters. If left empty, builds a search from the fields below. |
| `zip` | `string` | No | `90210` | US ZIP code. Used only when no search URLs are provided. |
| `makeModelTrimPaths` | `string` | No | - | CarGurus make/model filter (e.g. `m7/d292` = Toyota Camry). Get it from the `makeModelTrimPaths` parameter in a CarGurus `/search` URL. |
| `distance` | `integer` | No | `50` | Search radius in miles from the ZIP code. |
| `condition` | `string` | No | `used` | Vehicle condition: `used`, `new`, or `certified`. |
| `sortType` | `string` | No | `DEAL_SCORE` | Sort order: `DEAL_SCORE`, `BEST_MATCH`, `PRICE`, `MILEAGE`, `YEAR`, `DISTANCE`, `LISTING_DATE`. |
| `fingerprint` | `string` | No | `chrome124` | Browser TLS fingerprint for DataDome bypass: `chrome99`, `chrome110`, `chrome120`, `chrome124`, `chrome131`. |
| `maxItems` | `integer` | No | `20` | Maximum number of vehicle listings to scrape. |
| `maxPagesPerUrl` | `integer` | No | `0` | Maximum result pages per search URL. `0` = all pages until exhausted. |
| `proxyConfiguration` | `object` | No | Residential | Proxy settings. Residential proxy group is required for reliable results. |

### Output Fields

Each record in the dataset contains:

| Field | Description |
|---|---|
| `year` | Model year |
| `make` | Vehicle manufacturer |
| `model` | Vehicle model |
| `trim` | Trim level |
| `price` | Asking price (USD) |
| `imv` | CarGurus Instant Market Value (USD) |
| `dealRating` | Great Deal / Good Deal / Fair Deal / Overpriced |
| `dealScore` | Numerical deal score |
| `priceDifference` | Dollar amount above/below IMV |
| `mileage` | Odometer reading (miles) |
| `vin` | Vehicle Identification Number |
| `daysOnMarket` | Days since listing was posted |
| `condition` | Used / New / Certified Pre-Owned |
| `bodyType` | Sedan, SUV, Truck, etc. |
| `sellerCity` | Dealer city |
| `sellerRegion` | Dealer state |
| `dealerName` | Dealership name |
| `url` | Listing URL on CarGurus |
| `photos` | Array of photo URLs |
| `searchPage` | Page number in search results |
| `totalSearchResults` | Total matching listings |

### Example Input

```json
{
  "startUrls": [
    {
      "url": "https://www.cargurus.com/search?zip=90210&sortType=DEAL_SCORE&sortDirection=ASC&makeModelTrimPaths=m7/d292&distance=50"
    }
  ],
  "maxItems": 100,
  "condition": "used",
  "fingerprint": "chrome124"
}
```

Alternative - search by ZIP without a URL:

```json
{
  "zip": "90210",
  "makeModelTrimPaths": "m7/d292",
  "distance": 50,
  "condition": "used",
  "maxItems": 100,
  "sortType": "DEAL_SCORE"
}
```

### Example Output

```json
{
  "year": 2021,
  "make": "Toyota",
  "model": "Camry",
  "trim": "SE FWD",
  "price": 22500,
  "imv": 24100,
  "dealRating": "GREAT_PRICE",
  "dealScore": 4.2,
  "priceDifference": -1600,
  "mileage": 31200,
  "vin": "4T1G11AK5MU123456",
  "daysOnMarket": 12,
  "condition": "Used",
  "bodyType": "Sedan",
  "sellerCity": "Los Angeles",
  "sellerRegion": "CA",
  "dealerName": "Toyota of Hollywood",
  "url": "https://www.cargurus.com/Cars/inventorylisting/viewDetailsFilterViewInventoryListing.action?listingId=450352573",
  "photos": [
    "https://static.cargurus.com/images/forsale/2026/06/01/00/00/2021_toyota_camry-pic-999-1024x768.jpeg"
  ],
  "searchPage": 1,
  "totalSearchResults": 342
}
```

### Schedule Daily Runs for Used-Car Price Monitoring

Connect this Actor to **Apify Schedules** to run daily or weekly monitoring. Compare datasets across runs to track:

- Price drops and new listings
- Changes in IMV over time
- Days-on-market trends by model
- Regional pricing differences across ZIP codes

This is especially useful for wholesalers tracking specific models across multiple markets.

### Export to Google Sheets, CRM, or Analytics Pipeline

Pull results via the **Apify API** and pipe into your existing tools:

- **Google Sheets** - export as CSV or use the Apify Google Sheets integration
- **CRM / DMS** - load dealer names, locations, and listing URLs as leads
- **BI dashboards** - feed price, IMV, and deal-rating data into Tableau, Power BI, or Metabase
- **Webhooks** - trigger alerts when new Great Deal listings appear
- **Zapier / Make** - connect to thousands of apps without code

### Related Actors

- [Cars.com Vehicle Listings Scraper](https://apify.com/automation-lab/cars-com-vehicle-listings-scraper) - compare inventory from the other major US car marketplace
- [AutoTrader UK Car Listings Scraper](https://apify.com/automation-lab/autotrader-uk-car-listings-scraper) - scrape UK AutoTrader for cross-market analysis
- [CarGurus Vehicle Listings Scraper (automation-lab)](https://apify.com/automation-lab/cargurus-vehicle-listings-scraper) - alternative CarGurus scraper with tiered pricing and deduplication
- [Used Car Scraper for CarGurus (scrapesage)](https://apify.com/scrapesage/cargurus-scraper) - CarGurus scraper with dealer leads and monitor mode
- [Cargurus.com Scraper (lexis-solutions)](https://apify.com/lexis-solutions/cargurus-com) - multi-country CarGurus scraper (US, CA, UK)

### Frequently Asked Questions

#### Why use this Actor instead of the CarGurus API?

CarGurus offers a limited developer API focused on dealer integrations, not bulk listing data extraction. There is no public API endpoint that returns search-result listings with IMV, deal ratings, and pricing data. This Actor extracts the same structured data that powers the CarGurus search UI - including Instant Market Value and deal ratings - without requiring API keys or dealer partnerships.

#### What are alternatives to scraping CarGurus for used-car data?

Alternatives include KBB (Kelley Blue Book), Edmunds, NADA/J.D. Power, and Cars.com. However, CarGurus is unique in exposing its **Instant Market Value** and **deal rating** system on every listing - signals that KBB and Edmunds do not provide at the individual-listing level. For pricing intelligence that includes a "is this car underpriced?" signal, CarGurus data is the most actionable source.

#### How accurate is the CarGurus Instant Market Value?

CarGurus IMV is computed from recent transaction data and current market conditions. It updates regularly and is widely used by dealers and flippers as a benchmark. This Actor extracts the exact IMV value shown on the CarGurus listing page - no estimation or transformation is applied.

#### Can I scrape CarGurus without a residential proxy?

No. CarGurus uses DataDome anti-bot protection that fingerprints the TLS/HTTP2 stack of the HTTP client. Datacenter IPs are blocked even with correct headers. This Actor requires the Apify RESIDENTIAL proxy group for reliable results - it's included in the default proxy configuration.

#### Can I search by make and model without pasting a URL?

Yes. Leave `startUrls` empty and set `zip`, `makeModelTrimPaths`, `distance`, and `condition`. The `makeModelTrimPaths` value can be obtained by building a filtered search on cargurus.com and copying the parameter from the URL.

#### What deal ratings does CarGurus use?

CarGurus rates every listing as Great Deal, Good Deal, Fair Deal, High Price, or Overpriced based on how the asking price compares to the Instant Market Value and local market conditions. The Actor captures both the rating label and the numerical deal score.

#### Does this Actor work for CarGurus Canada or UK?

This version is optimized for **cargurus.com** (US). For UK listings, see the [lexis-solutions CarGurus scraper](https://apify.com/lexis-solutions/cargurus-com) which supports US, CA, and UK domains.

### SEO Keywords

cargurus scraper, cargurus data, cargurus API alternative, cargurus instant market value, IMV data extraction, used car price monitoring, car deal rating scraper, used car market data, dealer inventory monitoring, car listing scraper, cargurus search scraping, used car pricing intelligence, wholesale car sourcing, car price arbitrage, automotive market research, cargurus VIN data, car inventory database, used car deals finder, dealer lead generation automotive, cargurus vs KBB, car market value API, price differential scraping, days on market tracking, carGurus deal score, used car market analysis

### For AI Agents & LLM Apps

**Purpose:** Extract structured vehicle listing data from CarGurus US search results, including CarGurus Instant Market Value (IMV), deal ratings, pricing, VIN, mileage, and dealer information.

**Minimal working input:**

```json
{
  "startUrls": [{"url": "https://www.cargurus.com/search?zip=90210&sortType=DEAL_SCORE&makeModelTrimPaths=m7/d292"}],
  "maxItems": 20
}
```

**Output fields:** `year`, `make`, `model`, `trim`, `price`, `imv`, `dealRating`, `dealScore`, `priceDifference`, `mileage`, `vin`, `daysOnMarket`, `condition`, `bodyType`, `sellerCity`, `sellerRegion`, `dealerName`, `url`, `photos`, `searchPage`, `totalSearchResults`

**Behaviors an agent should know:**

- `startUrls` takes priority over `zip`/`makeModelTrimPaths` - if both are set, only the URLs are used
- `maxItems` defaults to 20; set higher for bulk extraction
- `maxPagesPerUrl` defaults to 0 (all pages) - this can result in thousands of results; set a limit if cost-sensitive
- `fingerprint` defaults to `chrome124`; rotate to `chrome131` if a run gets blocked with HTTP 406
- Residential proxy is required - the default `proxyConfiguration` handles this automatically
- Each result costs $0.00095 (pay-per-event); budget accordingly for large runs

**Billing:** Pay-per-event - $0.0005 per Actor start + $0.00095 per listing result.

### Legal & Compliance Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by CarGurus, Inc. or any of its subsidiaries. "CarGurus", "Instant Market Value", "IMV", and "Deal Rating" are trademarks of CarGurus, Inc. and are used here only in a descriptive, nominative sense - to identify the publicly accessible website from which this Actor collects data.

This Actor accesses only publicly available search-result pages on cargurus.com. It does not log in, bypass access controls, or solve CAPTCHAs. It uses TLS fingerprint impersonation and residential proxies to access publicly accessible pages that block automated HTTP clients - it does not access any non-public data.

Users are responsible for ensuring their use of scraped data complies with CarGurus' Terms of Service and applicable data-protection laws (including GDPR and CCPA where relevant). This data is intended for market research and pricing intelligence; it should not be used for consumer reporting purposes covered by the Fair Credit Reporting Act (FCRA).

# Actor input Schema

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

One or more CarGurus search-results URLs (use the modern /search URLs, e.g. https://www.cargurus.com/search?zip=...\&makeModelTrimPaths=m7/d292). Build a filtered search on cargurus.com (make, model, ZIP radius, price, etc.) and paste the URL(s) here - this is the most precise way to target listings. If left empty, the actor builds a search from make/model/ZIP below.

## `zip` (type: `string`):

US ZIP code to search around (e.g. 90210). Used only when no search URLs are provided.

## `makeModelTrimPaths` (type: `string`):

Optional CarGurus make/model filter string (e.g. m7/d292 = Toyota Camry). Used only when no search URLs are provided. The easiest way to get a correct value: build a filtered search on cargurus.com and copy the value of the `makeModelTrimPaths` parameter from its /search URL.

## `distance` (type: `integer`):

Search radius in miles from the ZIP code. Used only when no search URLs are provided.

## `condition` (type: `string`):

Vehicle condition to search for. Used only when no search URLs are provided.

## `sortType` (type: `string`):

How to order the results. Used only when no search URLs are provided.

## `fingerprint` (type: `string`):

Browser TLS/HTTP-2 fingerprint used to impersonate when talking to CarGurus (behind DataDome anti-bot). The matching Chrome User-Agent is sent automatically. If a run gets blocked with HTTP 406, try rotating to a different fingerprint.

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

Maximum number of vehicle listings to scrape.

## `maxPagesPerUrl` (type: `integer`):

Maximum number of result pages to scrape per search URL (0 = all pages until the result set is exhausted).

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

Proxy settings. CarGurus uses DataDome anti-bot and fingerprints/blocks datacenter IPs, so a residential proxy group is required for reliable results.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.cargurus.com/search?distance=50&sortType=DEAL_SCORE&sortDirection=ASC&zip=90210&makeModelTrimPaths=m7/d292"
    }
  ],
  "zip": "90210",
  "makeModelTrimPaths": "m7/d292",
  "distance": 50,
  "condition": "used",
  "sortType": "DEAL_SCORE",
  "fingerprint": "chrome124",
  "maxItems": 20,
  "maxPagesPerUrl": 0,
  "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.cargurus.com/search?distance=50&sortType=DEAL_SCORE&sortDirection=ASC&zip=90210&makeModelTrimPaths=m7/d292"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/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": [{ "url": "https://www.cargurus.com/search?distance=50&sortType=DEAL_SCORE&sortDirection=ASC&zip=90210&makeModelTrimPaths=m7/d292" }] }

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/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": [
    {
      "url": "https://www.cargurus.com/search?distance=50&sortType=DEAL_SCORE&sortDirection=ASC&zip=90210&makeModelTrimPaths=m7/d292"
    }
  ]
}' |
apify call ahmed_jasarevic/cargurus-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ahmed_jasarevic/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/TajlmVvrO9Eacup65/builds/bwFfQOLI5zD2Qdr2B/openapi.json
