# CarGurus Scraper: US, Canada & UK Car Listings, VIN & Prices (`fayoussef/cargurus-listings-scraper`) Actor

Scrape CarGurus car listings from cargurus.com, .ca and .co.uk by search URL or ZIP code: price, deal rating, mileage, VIN, specs, dealer name and phone, and every photo. Export to JSON, CSV or Excel.

- **URL**: https://apify.com/fayoussef/cargurus-listings-scraper.md
- **Developed by:** [Youssef Farhan](https://apify.com/fayoussef) (community)
- **Categories:** Developer tools, Automation, E-commerce
- **Features:** Limited permissions
- **Stats:** 109 total users, 28 monthly users, 99.4% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $0.80 / 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: US, Canada & UK Car Listings, VIN & Prices

**Scrape CarGurus listings at scale** from **cargurus.com (USA)**, **cargurus.ca (Canada)** and **cargurus.co.uk (UK)**, with no login, no browser and no code. Paste a CarGurus search URL **or just pick a country and a location**, and get **clean, structured JSON** for every car: price, deal rating, mileage, VIN, full specs, dealer details and **all listing photos**.

> Fast, reliable CarGurus data extraction for car dealers, marketplaces, price-monitoring tools, lead generation and market research.

### What does CarGurus Scraper do?

CarGurus Scraper turns any CarGurus search into a dataset with one row per car. It pages through the whole result set, opens every listing through CarGurus' own listing data, and returns 40+ fields per vehicle: price, CarGurus deal rating and deal score, expected market price, mileage, VIN, stock number, trim, engine, drivetrain, colours, dealer name, phone, website and rating, plus every full-resolution photo.

It works on all three CarGurus marketplaces from one Actor. The country is detected from the URL you paste, or picked in the form when you search without a URL.

### Why use this CarGurus Scraper?

- **3 countries, one Actor:** United States, Canada and the United Kingdom, auto-detected.
- **Two ways to search:** paste a CarGurus URL, **or** build a search with simple fields (no URL needed).
- **Every image, full resolution:** not just the thumbnail (often 25 to 80 photos per car).
- **Deal rating included:** CarGurus' own deal rating, deal score and expected price on every listing.
- **Fast:** listing details are fetched in parallel.
- **All pages or set a limit:** `maxPages = 0` scrapes the entire result set.
- **Anti-blocking built in:** browser-grade TLS fingerprinting plus geo-targeted residential proxies, with no proxy setup.
- **Migration-safe:** resumes exactly where it left off, with no duplicate or lost data.
- **Clean, validated schema:** one tidy record per listing, ready for Excel, Google Sheets, CSV, JSON or the API.
- **AI-agent and MCP ready:** typed input and output schemas that LLM agents can call directly.

### How to scrape CarGurus in 3 steps

1. **Pick your cars.** Paste one or more CarGurus search URLs, or leave the URL field empty and fill in **Search by filters** (country, ZIP or postal code, radius, sort order).
2. **Set the depth.** Leave **Max pages** at `0` for every page, or cap it for a quick sample.
3. **Click Start.** Results stream into the dataset as the Actor runs. Export them as JSON, CSV or Excel, or read them through the API.

#### Option A: paste a CarGurus URL

1. Go to CarGurus (`.com`, `.ca` or `.co.uk`) and apply your filters: location or ZIP, make, model, price, mileage and so on.
2. Copy the URL from your browser's address bar.
3. Paste it into **Search by URL > CarGurus search URLs** and click **Start**.

Old-style CarGurus links (`/Cars/inventorylisting/...#filters=...`) are converted to the current search format automatically.

#### Option B: no URL needed

Leave the URL field empty and fill in **Search by filters**:

- **Country** (US, Canada or UK)
- **ZIP or postal code** (for example `10001`, `M4B 1B4`, `SW1A 1AA`)
- **Search radius**, **Sort by**, **Sort direction**, and an optional **make and model filter**

The Actor builds the correct CarGurus search for you.

#### Example input (Option A)

```json
{
  "startUrls": [
    { "url": "https://www.cargurus.com/search?distance=10&sortType=BEST_MATCH&zip=10001" },
    { "url": "https://www.cargurus.ca/search?zip=M4B+1B4&entityId=d1751" },
    { "url": "https://www.cargurus.co.uk/search?distance=75&sortType=DEAL_SCORE&zip=75+001" }
  ],
  "maxPages": 0
}
```

#### Example input (Option B)

```json
{
  "searchCountry": "US",
  "zip": "10001",
  "distance": 50,
  "sortType": "BEST_MATCH",
  "sortDirection": "ASC",
  "maxPages": 0
}
```

### Input parameters

**Search by URL**

| Field | Type | Description |
|------|------|-------------|
| `startUrls` | array | One or more CarGurus search or result URLs (US, CA or UK). Leave empty to use the filter fields below. |

**Search by filters (used only when no URL is provided)**

| Field | Type | Description |
|------|------|-------------|
| `searchCountry` | enum | `US`, `CA` or `UK`: picks the marketplace. |
| `zip` | string | ZIP or postal code to search around (required for this mode). |
| `distance` | integer | Search radius. Default `50`. |
| `sortType` | enum | `BEST_MATCH`, `DEAL_SCORE`, `PRICE`, `MILEAGE`, `YEAR`, `DISTANCE`, `LISTING_DATE`. |
| `sortDirection` | enum | `ASC` or `DESC`. |
| `makeModelTrimPaths` | string | *(Advanced, optional)* CarGurus make and model path, for example `m4` or `m124,m124/d1751`. |

**Scraper settings**

| Field | Type | Description |
|------|------|-------------|
| `maxPages` | integer | Max result pages per URL. **`0` (default) scrapes every page until the results run out.** |

> Proxies are handled automatically (geo-targeted residential), so there is no proxy configuration to set up.

### Output: one record per listing

Each listing comes from CarGurus' per-listing detail data, so you get full specs, dealer info and **every** photo:

```json
{
  "country": "US",
  "listingId": 441325338,
  "title": "2023 Hyundai Tucson SEL FWD",
  "year": 2023,
  "make": "Hyundai",
  "model": "Tucson",
  "trim": "SEL FWD",
  "price": 21495,
  "priceString": "$21,495",
  "msrp": 28500,
  "expectedPrice": 22100,
  "dealScore": 8.7,
  "dealRating": "GREAT_PRICE",
  "mileage": 31250,
  "mileageString": "31,250 mi",
  "condition": "USED",
  "isNew": false,
  "vin": "5NMJBCAE8PH000000",
  "stockNumber": "H12345",
  "transmission": "Automatic",
  "drivetrain": "Front-Wheel Drive",
  "engine": "2.5L I4",
  "fuelType": "Gasoline",
  "exteriorColor": "White",
  "interiorColor": "Black",
  "doors": "4 doors",
  "postalCode": "11209",
  "distance": 8,
  "savedCount": 12,
  "dealerName": "Hyundai City of Bay Ridge",
  "dealerType": "FRANCHISE",
  "dealerPhone": "(718) 000-0000",
  "dealerLocation": "Brooklyn, NY, 11209",
  "dealerWebsite": "https://...",
  "dealerRating": 4.6,
  "dealerReviewCount": 1284,
  "imageCount": 49,
  "mainImage": "https://static.cargurus.com/.../1024x768.jpeg",
  "images": ["https://...", "https://..."],
  "listingUrl": "https://www.cargurus.com/Cars/inventorylisting/...",
  "sourceUrl": "https://www.cargurus.com/search?...",
  "scrapedAt": "2026-06-08T17:40:00+00:00"
}
```

The dataset ships with a typed **output schema** and a clean **table view** (price, mileage, deal rating, dealer, photo, listing link). Export to **JSON, CSV, Excel, HTML or through the Apify API and MCP**.

### Use cases

- **Car dealers and resellers:** monitor competitor pricing and inventory across markets.
- **Price intelligence:** track deal ratings, price drops and days on market.
- **Lead generation:** build dealer contact lists with phone, website and ratings.
- **Marketplaces and aggregators:** bulk-import vehicle inventory with full media.
- **Market research and analytics:** model pricing trends by make, model and region.
- **Cross-border comparison:** compare the same model's price in the US, Canada and the UK.

### How much does it cost to scrape CarGurus?

You pay per car listing saved to the dataset, with no monthly fee. The current rate is shown on this Actor's Store page. Proxies are included, so there is no separate proxy bill.

The **Free plan is limited to 20 results per run**, so you can check the output first. For every page and unlimited listings, upgrade to a [paid Apify plan](https://apify.com/pricing?fpr=youssef).

### Use with AI agents (MCP)

This Actor exposes a clean, typed input and output schema, so AI assistants and **MCP (Model Context Protocol)** clients can call it directly, for example: *"Get all used Tucsons near ZIP 10001 sorted by best deal, with photos."* Structured fields like `price`, `dealRating`, `vin` and `images` make the data immediately usable by LLM agents.

### FAQ

**Which CarGurus sites are supported?**
US (`cargurus.com`), Canada (`cargurus.ca`) and UK (`cargurus.co.uk`), detected automatically from your input.

**Do I need a URL?**
No. Use **Option B** (country plus ZIP or postal code) and the Actor builds the search for you.

**Do I need to set up proxies?**
No. Geo-targeted residential proxies are built in.

**How do I get every car, not just page 1?**
Leave `maxPages` at `0`.

**Can I get all photos?**
Yes. The `images` array contains every full-resolution photo for each listing.

**Does it return the VIN?**
Yes, in the `vin` field, whenever the seller publishes it on CarGurus. It is empty when the listing has no VIN.

**Can I get CarGurus deal ratings?**
Yes. Every record carries `dealRating` (for example `GREAT_PRICE`), `dealScore` and `expectedPrice`, so you can sort or filter by how good the deal is.

**Is there a CarGurus API?**
CarGurus does not offer a public listings API. This Actor works as one: call it through the Apify API and get JSON back, or schedule it and read the latest dataset.

**Will I get blocked?**
The Actor uses browser-grade TLS impersonation plus country-matched residential proxies to stay reliable.

**What if the run is interrupted?**
It is migration-safe: state is saved and the run resumes without losing or duplicating data.

**Can I schedule it?**
Yes. Use Apify schedules for daily or weekly runs, and webhooks or integrations to send the results to Google Sheets, Slack or your database.

### Is it legal to scrape CarGurus?

This Actor collects publicly available listing data only, with no login. Use it in compliance with CarGurus' terms of service and applicable laws (including GDPR and CCPA where relevant). You are responsible for how you use the extracted data, including dealer contact details.

### Related scrapers

- [AutoTrader.ca Scraper](https://apify.com/fayoussef/autotrader-canada): Canadian car listings with price, VIN, mileage and dealer phone.
- [Canada Car Scraper](https://apify.com/fayoussef/canada-car-scraper): AutoTrader.ca, Kijiji and CarGurus.ca in one dataset, one row per car.
- [AutoScout24 Scraper](https://apify.com/fayoussef/autoscout24): European car listings from 9 AutoScout24 sites.
- [Canada VIN Decoder](https://apify.com/fayoussef/canada-vin-report): recalls and market value for any VIN.
- [Car Dealer Website Inventory Scraper](https://apify.com/fayoussef/dealer-inventory-scraper): stock straight from a dealer's own website.

### Contact and custom solutions

Found a bug or need a field? Open a ticket in the **Issues** tab. 💼 Need a custom version or another site? [Contact me through my Apify profile](https://apify.com/fayoussef)

*Keywords: CarGurus scraper, CarGurus API, car listings scraper, used car data, vehicle data extraction, CarGurus UK, CarGurus Canada, car price monitoring, dealer inventory scraper, VIN scraper, auto data, car marketplace data.*

# Actor input Schema

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

One or more CarGurus search/result URLs from www.cargurus.com (US), www.cargurus.ca (Canada) or www.cargurus.co.uk (UK). Open CarGurus, apply your filters (location, make, model, price), then paste the resulting URL here.

## `searchCountry` (type: `string`):

Pick the CarGurus marketplace to search.

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

Location to search around. US ZIP (e.g. 10001), Canadian postal code (e.g. M4B 1B4) or UK postcode (e.g. SW1A 1AA).

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

Radius around the ZIP/postal code to include listings from.

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

How to order results.

## `sortDirection` (type: `string`):

Ascending (e.g. lowest price first) or descending.

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

Optional. CarGurus make/model path to filter by, e.g. 'm4' (a make) or 'm124,m124/d1751'. Find it in a CarGurus URL after applying a make/model filter. Leave empty for all makes/models.

## `maxPages` (type: `integer`):

Maximum number of result pages to scrape per URL. Set to 0 (or leave empty) to scrape ALL pages until there are no more listings.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.cargurus.com/search?distance=10&sortDirection=ASC&sortType=BEST_MATCH&zip=10001&makeModelTrimPaths=m4&page=1&pageAlignment=eyJmaXJzdFBhZ2UiOjE4LCJwYWdlTiI6MjF9"
    },
    {
      "url": "https://www.cargurus.ca/search?zip=M4B+1B4&entityId=d1751&sourceContext=carGurusHomePageModel&makeModelTrimPaths=m124%2Cm124%2Fd1751"
    },
    {
      "url": "https://www.cargurus.co.uk/search?srpVariation=DEFAULT_SEARCH&distance=10&sortDirection=ASC&sortType=DEAL_SCORE&zip=75+001&makeModelTrimPaths=m271%2Cm271%2Fd3033&nonShippableBaseline=560"
    }
  ],
  "searchCountry": "US",
  "zip": "10001",
  "distance": 50,
  "sortType": "BEST_MATCH",
  "sortDirection": "ASC",
  "maxPages": 0
}
```

# Actor output Schema

## `listings` (type: `string`):

All scraped vehicle listings as dataset items.

# 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=10&sortDirection=ASC&sortType=BEST_MATCH&zip=10001&makeModelTrimPaths=m4&page=1&pageAlignment=eyJmaXJzdFBhZ2UiOjE4LCJwYWdlTiI6MjF9"
        },
        {
            "url": "https://www.cargurus.ca/search?zip=M4B+1B4&entityId=d1751&sourceContext=carGurusHomePageModel&makeModelTrimPaths=m124%2Cm124%2Fd1751"
        },
        {
            "url": "https://www.cargurus.co.uk/search?srpVariation=DEFAULT_SEARCH&distance=10&sortDirection=ASC&sortType=DEAL_SCORE&zip=75+001&makeModelTrimPaths=m271%2Cm271%2Fd3033&nonShippableBaseline=560"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("fayoussef/cargurus-listings-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=10&sortDirection=ASC&sortType=BEST_MATCH&zip=10001&makeModelTrimPaths=m4&page=1&pageAlignment=eyJmaXJzdFBhZ2UiOjE4LCJwYWdlTiI6MjF9" },
        { "url": "https://www.cargurus.ca/search?zip=M4B+1B4&entityId=d1751&sourceContext=carGurusHomePageModel&makeModelTrimPaths=m124%2Cm124%2Fd1751" },
        { "url": "https://www.cargurus.co.uk/search?srpVariation=DEFAULT_SEARCH&distance=10&sortDirection=ASC&sortType=DEAL_SCORE&zip=75+001&makeModelTrimPaths=m271%2Cm271%2Fd3033&nonShippableBaseline=560" },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("fayoussef/cargurus-listings-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=10&sortDirection=ASC&sortType=BEST_MATCH&zip=10001&makeModelTrimPaths=m4&page=1&pageAlignment=eyJmaXJzdFBhZ2UiOjE4LCJwYWdlTiI6MjF9"
    },
    {
      "url": "https://www.cargurus.ca/search?zip=M4B+1B4&entityId=d1751&sourceContext=carGurusHomePageModel&makeModelTrimPaths=m124%2Cm124%2Fd1751"
    },
    {
      "url": "https://www.cargurus.co.uk/search?srpVariation=DEFAULT_SEARCH&distance=10&sortDirection=ASC&sortType=DEAL_SCORE&zip=75+001&makeModelTrimPaths=m271%2Cm271%2Fd3033&nonShippableBaseline=560"
    }
  ]
}' |
apify call fayoussef/cargurus-listings-scraper --silent --output-dataset

```

## MCP server setup

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