# Used Car Scraper for CarGurus - Listings, VINs & Dealer Leads (`scrapesage/cargurus-scraper`) Actor

Scrape used-car listings & dealer leads from CarGurus by ZIP or search URL: VIN, price, Instant Market Value & deal rating, mileage, specs, photos, plus dealer name, phone & address. Independent tool - not affiliated with or endorsed by CarGurus, Inc.; all trademarks belong to their owners.

- **URL**: https://apify.com/scrapesage/cargurus-scraper.md
- **Developed by:** [Scrape Sage](https://apify.com/scrapesage) (community)
- **Categories:** E-commerce, Lead generation, Agents
- **Features:** Limited permissions
- **Stats:** 14 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 car listings

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?

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

## Used Car Scraper for CarGurus - Listings, VINs & Dealer Leads

> **Disclaimer:** This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by CarGurus, Inc. or any of its subsidiaries. All trademarks mentioned are the property of their respective owners. "CarGurus" is referenced only to describe the publicly available website this Actor collects data from.

Scrape **[CarGurus](https://www.cargurus.com)**, one of the largest US used-car marketplaces, into clean, structured data. Search by **ZIP code and radius** (with make, price, year, mileage, condition and deal-rating filters that CarGurus applies itself) or paste any **CarGurus search link**, and get every listing with **year, make, model, trim, VIN, asking price, the CarGurus Instant Market Value and deal rating, mileage, drivetrain, engine, fuel economy, EV range, colours, photos and days on market**, plus the selling **dealer's name, phone and full address** as a ready-to-use B2B lead. Turn on **listing details** for the seller's description, the full options list, vehicle and price history, NHTSA crash ratings and the dealer's own website and rating, and **dealer leads** for one clean row per dealership. Built-in **monitor mode** returns only new listings and price changes between runs.

No API key, no login, no browser: the actor reads CarGurus' own page data, and every row carries a **0-100 lead score**.

### What each row carries

| Data | Listing row | + listing details | Dealer lead row |
|---|---|---|---|
| Year, make, model, trim, body type, VIN, condition (used / certified) | ✅ | ✅ | |
| Asking price, price with dealer fees, **CarGurus Instant Market Value**, **deal rating** and deal score | ✅ | ✅ | |
| Mileage, days on market, drivetrain, engine, transmission, doors, colours, photos | ✅ | ✅ | |
| Fuel economy (MPG, or MPGe for electric cars when CarGurus shows it), **EV range and battery size** | ✅ | ✅ | |
| Distance from your ZIP and the listing's placement (standard or paid) | ✅ | ✅ | |
| Dealer name, phone, full street address, franchise flag | ✅ | ✅ | ✅ |
| Seller's description, full **options** list, all photos | | ✅ | |
| **Vehicle history**: owners, accidents, salvage / lemon / frame damage / fleet use | | ✅ | |
| **Price history**, days on CarGurus, how many shoppers saved it | | ✅ | |
| **NHTSA crash ratings**, safety features, legroom and cargo space | | ✅ | |
| Original MSRP of the trim and the dealer's documented fees | | ✅ | |
| Dealer's **own website**, rating and review count, map position | | ✅ | ✅ |
| Lead score (0-100) | ✅ | ✅ | ✅ |

### Who buys CarGurus data?

- **Car dealers & dealer groups** - track competitor pricing, deal ratings and days on lot for the exact year, make and model you stock.
- **Automotive marketplaces, pricing & valuation tools** - feed live asking prices, market values and mileage into your model.
- **Dealer-facing SaaS, ad-tech, CRM & DMS vendors** - build prospect lists of dealers by market, with phone, address, website and rating.
- **Lenders, F\&I, insurers & warranty providers** - size markets and reach dealers.
- **Wholesalers, flippers & exporters** - surface under-priced cars and recent price drops fast using the CarGurus deal rating.
- **Researchers & analysts** - used-car price trends, inventory and depreciation by make, model and region.

### How to use

1. [Sign up for Apify](https://console.apify.com/sign-up) - the free plan is enough to try this actor.
2. Open the **Used Car Scraper for CarGurus**, enter **ZIP codes** (with a search radius and any filters) or paste **CarGurus search links**, and click **Start**.
3. Watch results stream into the dataset table.
4. **Export** as JSON, CSV, Excel, XML, or RSS - or pull results programmatically via the [Apify API](https://docs.apify.com/api/v2).

### Input

Search by location with **ZIP codes**. CarGurus applies the radius, makes, condition, deal ratings, years, mileage and prices itself, and the actor checks every row again, so what you get matches what you asked for:

```json
{
    "zipCodes": ["90001", "78704"],
    "distance": 50,
    "makeFilter": ["Toyota", "Honda"],
    "dealRatingFilter": ["GREAT_PRICE", "GOOD_PRICE"],
    "maxMileage": 80000,
    "maxPrice": 30000,
    "sortBy": "lowest_price",
    "maxResults": 100,
    "includeListingDetails": false,
    "includeDealerLeads": true
}
```

Or paste a link copied from CarGurus. A results link with a ZIP (cargurus.com/search?zip=...) runs exactly as it is, filters and sort included. A make or model page such as cargurus.com/Cars/l-Used-Honda-Civic-d586 has no place of its own (CarGurus shows it near whoever opens it), so add `&zip=12345` to the link or put a ZIP in `zipCodes`; city pages (ending in `_L` and a number) keep their city.

| Field | Type | Description |
|---|---|---|
| `zipCodes` | array | 5-digit US ZIP codes to search around. A ZIP CarGurus does not know is named on the run card and nothing is billed for it. |
| `searchUrls` | array | CarGurus search-results links (see above). |
| `startUrls` | array | Search links **or** single `/details/<id>` listing links, which come back as full rows with details. |
| `distance` | integer | Search radius around each ZIP, in miles (default 50). |
| `includeDeliveryListings` | boolean | Also include cars from farther away that dealers offer to ship (off by default; each row's `distance` shows how far). |
| `sortBy` | string | `best_match`, `newest_listed`, `lowest_price`, `highest_price`, `lowest_mileage`, `best_deal`, `closest_first`, `newest_car_year`. With any order other than best match, CarGurus' paid slots are left out so the rows keep your order. CarGurus orders prices by the price with dealer fees (`priceWithFees`). |
| `maxResults` | integer | Cap on listing rows across the run, shared fairly between searches (default 100). |
| `maxPagesPerSearch` | integer | Result pages (about 22 listings each) to read per search (default 10). |
| `includeListingDetails` | boolean | Add the listing's detail record: description, options, vehicle and price history, all photos, safety and NHTSA ratings, MSRP, fees and the dealer's website and rating. |
| `includeDealerLeads` | boolean | Also output one deduplicated dealer row per dealership, with its website, rating and map position. |
| `conditionFilter` | string | `any` / `used` / `cpo` (CarGurus' used-car search has no new cars). |
| `dealRatingFilter` | array | Keep only these CarGurus deal ratings. |
| `makeFilter` | array | Keep only these makes (Toyota, Mercedes-Benz, Land Rover; Chevy, VW and Mercedes work too). |
| `minYear` / `maxYear` / `maxMileage` / `minPrice` / `maxPrice` | integer | Numeric filters (0 = off). Prices are the listed price before dealer fees. |
| `withDealerPhoneOnly` | boolean | Only listings that carry a dealer phone. |
| `monitorMode` | boolean | Emit only new and price-changed listings between runs. |
| `proxyConfiguration` | object | The default Apify proxy is fine: the run switches to US residential IPs by itself if CarGurus refuses datacenter. |

### Output

Each listing is one row tagged `type: "listing"` (dealer rows are tagged `type: "dealer"`). A real row from a Toyota and Tesla search around ZIP 94102:

```json
{
  "type": "listing",
  "listingId": "458597568",
  "vin": "7MUBAAAG5NV003638",
  "url": "https://www.cargurus.com/details/458597568",
  "title": "2022 Toyota Corolla Cross",
  "make": "Toyota",
  "model": "Corolla Cross",
  "year": 2022,
  "trim": "LE FWD",
  "bodyType": "SUV / Crossover",
  "condition": "Used",
  "isCertified": false,
  "price": 22876,
  "priceWithFees": 22998,
  "marketValue": 23318,
  "priceVsMarket": 442,
  "dealRating": "GOOD_PRICE",
  "dealRatingLabel": "Good Price",
  "mileage": 40942,
  "daysOnMarket": 41,
  "exteriorColor": "Wind Chill Pearl",
  "drivetrain": "Front-Wheel Drive",
  "engine": "169 hp 2L I4",
  "fuelType": "Gasoline",
  "mpgCity": 31,
  "mpgHighway": 33,
  "features": ["Sunroof/Moonroof", "Adaptive Cruise Control", "Backup Camera", "Blind Spot Monitoring"],
  "photoCount": 23,
  "distance": 45.3,
  "placement": "priority",
  "dealerName": "Mercedes-Benz of San Jose",
  "dealerPhone": "(831) 777-4699",
  "dealerAddress": "3000 E Capitol Expy, San Jose, CA, 95148",
  "isFranchiseDealer": true,
  "leadScore": 79
}
```

With `includeListingDetails` on, the same row also carries, for example, `"ownerCount": 1`, `"accidentCount": 0`, `"trimMsrp": 24795`, `"dealerFeesTotal": 122`, `"dealerWebsite": "https://www.mbsanjose.com"`, `"dealerRating": 3.4`, `"dealerReviewCount": 8`, the `options` list, the `priceHistory` (`[{"price": 23338, "date": "2026-09-13"}, ...]`), `description`, `allPhotos`, `safetyFeatures` and the `ncap...Rating` fields.

**Field notes**

- `priceVsMarket` is how far the price is **below** CarGurus' market value, in dollars (negative means above market).
- `leadScore` (0-100) on a listing weighs the dealer's contact details, the deal rating and how complete the listing is. On a dealer row it weighs the phone, the dealer's own website, the street address, map position and text messaging, plus the CarGurus rating and how many reviews it rests on, so established dealers you can reach rank first.
- `dealerRating` is the dealer's CarGurus rating out of 5, to one decimal as CarGurus shows it, and only when the dealer has reviews (`dealerReviewCount`). `distance` is in miles, to one decimal.
- `placement` is `standard` for an ordinary result and `priority`, `featured` or `highlight` for a paid placement CarGurus put on the page (best-match runs only; every one matches your search). With another order those paid slots are left out, so the rows follow the order you chose. New-car adverts CarGurus mixes into used-car results are left out and never billed.
- Electric cars: CarGurus shows MPGe in the MPG fields for some models and nothing for most; an empty figure stays empty, never 0. `evRangeMiles`, `evBatteryKwh` and `evChargeTime240V` carry the battery figures.
- Some fields exist only where CarGurus has them: `msrp` when the dealer lists one, a deal rating when CarGurus can price the car, NHTSA ratings for rated models, price history once a price has changed, and vehicle history when a report exists.

### Monitor mode

Turn on **`monitorMode`** to remember every listing (and its price) across runs. The next run emits **only**:

- **new listings** (`monitorStatus: "new"`), and
- **price changes** (`monitorStatus: "price_drop"` / `"price_increase"`).

The first run delivers up to `maxResults` and also records the rest of each search (up to `maxPagesPerSearch` pages) without billing it, so later runs report only cars that are really new. State is stored in a named key-value store (`monitorStoreName`, default `cargurus-scraper-monitor`); use a different name per tracked search to keep histories separate. Pair it with [Apify Schedules](https://docs.apify.com/platform/schedules): the schedule decides *when* the run fires, monitor mode decides *what's new*.

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

This Actor uses Apify's **pay-per-event** pricing: you are charged only for the results it delivers, with no monthly rental and no start fee. The events it can charge are:

- **Car listing** - one used-car listing with its car record, CarGurus market value and deal rating, photos and the dealer's name, phone and address, plus a 0-100 lead score.
- **Listing details enrichment** - an add-on charged once per listing only when its detail record arrives: description, options, vehicle and price history, all photos, safety features and NHTSA ratings, measurements, MSRP, fees and the dealer's website and rating.
- **Dealer lead** - one deduplicated dealership: name, phone, full street address, city, state and ZIP, logo, its own website, CarGurus rating and review count, map position and a 0-100 lead score.

The current price of each event is shown on the **Pricing** tab of this page. Set a maximum total charge on the run if you want a hard cap on spend: the run then delivers only whole rows the cap pays for. Use the input limits to control how much the Actor fetches.

### Automate & schedule

- **[Apify API](https://docs.apify.com/api/v2)** - start runs, fetch datasets, and manage schedules over REST.
- **[apify-client for JavaScript](https://docs.apify.com/api/client/js/)** and **[apify-client for Python](https://docs.apify.com/api/client/python/)** - official SDKs.
- **[Schedules](https://docs.apify.com/platform/schedules)** - run it hourly, daily or weekly to track new inventory and price drops in a market.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks)** - trigger downstream actions (CRM import, Slack alert, repricing job) the moment a run finishes.

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

const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });

const run = await client.actor('scrapesage/cargurus-scraper').call({
    zipCodes: ['90001'],
    distance: 50,
    makeFilter: ['Toyota'],
    includeDealerLeads: true,
    maxResults: 100,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Integrate with any app

Connect the dataset to 5,000+ apps - no code required:

- **[Make](https://docs.apify.com/platform/integrations/make)** - multi-step automation scenarios.
- **[Zapier](https://docs.apify.com/platform/integrations/zapier)** - push new dealer leads straight into your CRM.
- **[Slack](https://docs.apify.com/platform/integrations/slack)** - get notified when a monitored search finds a price drop.
- **[Google Drive / Sheets](https://docs.apify.com/platform/integrations/drive)** - auto-export every run to a spreadsheet.
- **[Airbyte](https://docs.apify.com/platform/integrations/airbyte)** - pipe results into your data warehouse.
- **[GitHub](https://docs.apify.com/platform/integrations/github)** - trigger runs from commits or releases.

### Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. You can call this actor from Claude, ChatGPT, or any agent framework through the **[Apify MCP server](https://docs.apify.com/platform/integrations/mcp)** - ask your assistant to "find Toyota RAV4s near 90001 under $30k with a great deal rating and list the dealers" and let it run this scraper for you.

### Agent-ready: autonomous payments (x402 & Skyfire)

This actor is **agent-ready**: AI agents can discover it, run it, and **pay for it autonomously**, with no Apify account and no human in the loop. It uses [pay-per-event](https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event) pricing and [limited permissions](https://docs.apify.com/platform/actors/development/permissions), so it qualifies for Apify's agentic-payment standards:

- **[x402](https://docs.apify.com/platform/integrations/x402)**: an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp), with no account and no API key.
- **[Skyfire](https://docs.apify.com/platform/integrations/skyfire)**: agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

### More scrapers from scrapesage

- **[Cars.com Scraper](https://apify.com/scrapesage/cars-com-scraper)** - US new & used car listings, prices and dealer leads.
- **[AutoScout24 Scraper](https://apify.com/scrapesage/autoscout24-scraper)** - European used-car listings and dealers.
- **[AutoTrader Canada Scraper](https://apify.com/scrapesage/autotrader-ca-scraper)** - Canadian car listings and prices.
- **[SgCarMart Used Car Scraper](https://apify.com/scrapesage/sgcarmart-used-car-scraper)** - Singapore used-car listings.
- **[US Auto Dealer Scraper](https://apify.com/scrapesage/us-auto-dealer-scraper)** - licensed auto-dealer registry leads.
- **[Vehicle Manufacturer Leads](https://apify.com/scrapesage/vehicle-manufacturer-leads)** - manufacturer & importer firmographics.
- **[Google Maps Scraper](https://apify.com/scrapesage/google-maps-scraper)** - local business leads with phone, website and rating, plus optional emails.
- **[Website Contact Scraper](https://apify.com/scrapesage/website-contact-scraper)** - emails, phones and socials from any website.

### Tips

- **Make, price and deal filters**: set them in the input (CarGurus applies them to each ZIP search), or build the search on cargurus.com and paste the link with its ZIP.
- **Best deals**: set `dealRatingFilter` to `["GREAT_PRICE", "GOOD_PRICE"]` and `sortBy` to `best_deal`.
- **Cleanest dealer lists**: turn on `includeDealerLeads` + `withDealerPhoneOnly` for a deduplicated dealer prospect list with website and rating.
- **Recurring monitoring**: combine [Schedules](https://docs.apify.com/platform/schedules) with `monitorMode` and `sortBy: "newest_listed"` to track newly listed cars and price drops.

### FAQ

**Do I need a CarGurus API key or login?** No. This actor reads CarGurus' own public page data: no key, no login, no browser.

**Can I search by make and model?** Yes. Set `makeFilter` with your ZIP codes, or paste a CarGurus link for a model (add `&zip=` to a model page link).

**Will I get cars from outside my radius?** Not by default. CarGurus can add cars that dealers ship from far away; turn on `includeDeliveryListings` if you want them.

**Which proxy should I use?** The default. It uses Apify datacenter IPs and switches to US residential IPs by itself if CarGurus refuses them.

**Does it get dealer phone numbers and addresses?** Yes: every listing carries the selling dealer's name, phone, full street address and city, state and ZIP. Turn on `includeDealerLeads` for a deduplicated dealer list with each dealer's own website and rating.

**Can I export to Google Sheets, CSV, or Excel?** Yes: one click in the dataset view, or automatically on every run via the [Google Drive integration](https://docs.apify.com/platform/integrations/drive).

**How do I track new inventory and price drops?** Turn on `monitorMode` and create a [Schedule](https://docs.apify.com/platform/schedules); optionally add a [webhook](https://docs.apify.com/platform/integrations/webhooks) or [Zapier zap](https://docs.apify.com/platform/integrations/zapier) to push changes into your CRM as they appear.

***

### Disclaimer

**This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by CarGurus, Inc. or any of its subsidiaries. All trademarks mentioned are the property of their respective owners.**

"CarGurus", "Instant Market Value", "IMV" and any related marks 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 is not an official CarGurus product, is not authorised or certified by CarGurus, Inc., and does not distribute CarGurus software. It collects only publicly available information; you are responsible for ensuring your use of that data complies with applicable laws, regulations and the terms of the source website.

### Need help?

Open an issue on the Actor's **Issues** tab, or visit the [Apify help center](https://help.apify.com/). Feature requests are welcome - this Actor is actively maintained.

# Actor input Schema

## `zipCodes` (type: `array`):

5-digit US ZIP codes to search around. Each ZIP is its own search of used cars within the search radius; the run checks that CarGurus applied the ZIP, and a ZIP CarGurus does not know is named on the run card and nothing is billed for it. One per row (e.g. 90001, 78704).

## `searchUrls` (type: `array`):

Paste CarGurus search-results links (build a search on cargurus.com with your filters and copy the address). Links to cargurus.com/search with a ZIP run exactly as they are. A make or model page (cargurus.com/Cars/l-Used-Honda-Civic-d586) has no place of its own, so add \&zip=12345 to it or put a ZIP in zipCodes; city pages (...\_L34369) keep their city. One per row.

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

CarGurus links to scrape directly: search-results links (as in CarGurus search URLs) or single listings (https://www.cargurus.com/details/<id>), which come back as full listing rows with details. Auto-detected. One per row.

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

Radius around each ZIP code to search, in miles. Cars farther away that a dealer offers to ship are left out unless you turn on includeDeliveryListings.

## `sortBy` (type: `string`):

Order of the results, applied by CarGurus. With Best match, CarGurus mixes a few paid listings into each page (each row's placement field names them); with any other order those paid slots are left out, so the rows keep the order you chose.

## `maxResults` (type: `integer`):

Cap on car-listing records across the whole run, shared fairly between your searches. Searches page automatically until this cap or the page limit is reached. (Dealer-lead records do not count against this cap.)

## `maxPagesPerSearch` (type: `integer`):

How many result pages (about 22 listings each) to read per ZIP or search URL before moving on.

## `includeListingDetails` (type: `boolean`):

Read each listing's detail record for the richest row: the seller's description, the full options list, vehicle history (accidents, owners, title, fleet use), price history, all photos, safety features and NHTSA crash ratings, legroom and cargo space, the trim's original MSRP and dealer fees, plus the dealer's own website, rating and map position. One extra request per listing, billed only when the details arrive.

## `includeDealerLeads` (type: `boolean`):

Output one deduplicated dealer record (type `dealer`) per dealership seen: name, phone, full street address, city/state/ZIP and logo, plus the dealer's own website, rating and map position when listing details are on.

## `conditionFilter` (type: `string`):

Keep only listings of a given condition (applied by CarGurus and checked on every row). CarGurus' used-car search has no new cars, so "New" finds nothing.

## `dealRatingFilter` (type: `array`):

Keep only listings with one of these CarGurus deal ratings (applied by CarGurus). Leave empty for all.

## `makeFilter` (type: `array`):

Keep only these makes, as CarGurus names them (case-insensitive: Toyota, Ford, Mercedes-Benz, Land Rover; Chevy, VW and Mercedes work too). CarGurus applies them to each ZIP search; a make CarGurus does not have is named on the run card. Leave empty for all.

## `minYear` (type: `integer`):

Keep only listings from this model year or newer. 0 = no filter.

## `maxYear` (type: `integer`):

Keep only listings from this model year or older. 0 = no filter.

## `maxMileage` (type: `integer`):

Keep only listings at or below this mileage. 0 = no filter.

## `minPrice` (type: `integer`):

Keep only listings whose listed price (before dealer fees) is at or above this. 0 = no filter.

## `maxPrice` (type: `integer`):

Keep only listings whose listed price (before dealer fees) is at or below this. 0 = no filter.

## `withDealerPhoneOnly` (type: `boolean`):

Output only listings that have a dealer phone number (best for lead generation).

## `excludePrivateSellers` (type: `boolean`):

Output only dealer listings, skipping private (for-sale-by-owner) sellers.

## `deduplicateListings` (type: `boolean`):

Skip a listing already delivered by another search in the same run (overlapping ZIP areas). Within one search a listing is never repeated.

## `includeDeliveryListings` (type: `boolean`):

CarGurus can add cars from dealers outside your radius that offer delivery. Off: only cars within the search radius. On: CarGurus' own mix, which can include cars hundreds of miles away (each row's distance field shows it).

## `monitorMode` (type: `boolean`):

Remember listings (and their last price) from previous runs and emit ONLY new listings and price-changed ones (each tagged monitorStatus = new / price_drop / price_increase). The first run also records the rest of each search (up to Max pages per search) without billing it, so later runs report only cars that are really new. Pairs with Apify Schedules.

## `monitorStoreName` (type: `string`):

Named key-value store that holds the 'already seen' listing ids + prices for monitoring mode. Use a different name per tracked target/search to keep their histories separate.

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

Maximum parallel detail requests (up to 4 are used at a time). Lower it if you see transient blocks.

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

Proxy settings. The default (Apify proxy, automatic) uses datacenter IPs and switches the run to US residential IPs by itself if CarGurus refuses datacenter. Custom settings are used as given.

## `urlsFromFile` (type: `string`):

Paste a list of CarGurus URLs (one per line), OR one link to a .txt/.csv file, Google Sheet or Google Drive file containing them. Lets you import many search or listing URLs at once instead of typing each. Google Sheet/Drive share links are handled automatically.

## Actor input object example

```json
{
  "zipCodes": [
    "90001"
  ],
  "distance": 50,
  "sortBy": "best_match",
  "maxResults": 100,
  "maxPagesPerSearch": 10,
  "includeListingDetails": false,
  "includeDealerLeads": false,
  "conditionFilter": "any",
  "dealRatingFilter": [],
  "minYear": 0,
  "maxYear": 0,
  "maxMileage": 0,
  "minPrice": 0,
  "maxPrice": 0,
  "withDealerPhoneOnly": false,
  "excludePrivateSellers": false,
  "deduplicateListings": true,
  "includeDeliveryListings": false,
  "monitorMode": false,
  "monitorStoreName": "cargurus-scraper-monitor",
  "maxConcurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "urlsFromFile": ""
}
```

# Actor output Schema

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

All scraped records in the default dataset. Listing rows carry full vehicle data, the CarGurus Instant Market Value deal rating, dealer contact info and a lead score; dealer rows carry deduplicated dealership leads.

# 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 = {
    "zipCodes": [
        "90001"
    ],
    "urlsFromFile": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/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 = {
    "zipCodes": ["90001"],
    "urlsFromFile": "",
}

# Run the Actor and wait for it to finish
run = client.actor("scrapesage/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 '{
  "zipCodes": [
    "90001"
  ],
  "urlsFromFile": ""
}' |
apify call scrapesage/cargurus-scraper --silent --output-dataset

```

## MCP server setup

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