CarGurus Scraper — US, Canada & UK Listings with Deal Ratings avatar

CarGurus Scraper — US, Canada & UK Listings with Deal Ratings

Pricing

from $5.00 / 1,000 listing scrapeds

Go to Apify Store
CarGurus Scraper — US, Canada & UK Listings with Deal Ratings

CarGurus Scraper — US, Canada & UK Listings with Deal Ratings

Scrape CarGurus car listings by ZIP/postal code or search URL: VIN, price, deal rating, price vs. market, mileage, days on market, specs and dealer name and phone. US, Canada and UK.

Pricing

from $5.00 / 1,000 listing scrapeds

Rating

0.0

(0)

Developer

Khadin Akbar

Khadin Akbar

Maintained by Community

Actor stats

0

Bookmarked

59

Total users

19

Monthly active users

5 days ago

Last modified

Share

What is CarGurus Scraper?

CarGurus Scraper pulls structured car listings from CarGurus in the US, Canada and UK. Start in one of two ways: paste a CarGurus search URL you already filtered in the browser, or give a ZIP/postal code (or several) plus make, model, year, price and mileage filters. It returns one record per listing with VIN, price, total price, deal rating, price difference vs. market, mileage, days on market, specs, photo, dealer name, phone and distance. The output is designed for inventory review, lead generation, pricing analysis, and AI workflows that need a single listing as a clear JSON record. This Actor is usable through Apify MCP and through the Apify API.

This Actor is not affiliated with, endorsed by, or sponsored by CarGurus.

Best fit and connected workflows

This Actor fits workflows where a team needs current CarGurus inventory in a structured form.

Common routing paths include:

  • Marketplace inventory review for a city, postal code, or dealership area
  • Lead lists built from dealer name, phone, and listing URL
  • Price and deal-rating analysis using price, totalPrice, dealRating, dealScore, and priceDifferential
  • Inventory filtering by make, model, year, mileage, and price range
  • AI agent workflows that need a consistent listing schema through Apify MCP

If you already have a CarGurus search results page with filters set in the browser, searchUrls keeps that query structure intact and reuses the page filters directly.

Practical scenario

A used-car buyer is comparing Toyota Camry inventory across New York, Chicago and Los Angeles. One run with postalCodes ["10001", "60601", "90012"], model Camry, minYear 2019 and maxMileage 60000 returns every matching listing with dealRating, priceDifferential and daysOnMarket. Sorting the dataset by priceDifferential shows which cars are priced furthest below market and how long they have been listed, which is where a dealer is most likely to negotiate.

Input fields

FieldTypeDescription
countrystringCarGurus marketplace to search. Use US, CA, or UK.
postalCodestringZIP, Canadian postal/FSA, or UK outcode/postcode used as the search center.
postalCodesarrayMore ZIP/postal codes searched in the same run with the same filters. Listings are de-duplicated; maxResults applies to the whole run.
distanceintegerSearch radius around the postal code.
makestringOptional make filter matched against listing make names.
modelstringOptional model filter matched against listing model names.
minPriceintegerMinimum total price to keep.
maxPriceintegerMaximum total price to keep.
minYearintegerMinimum model year to keep.
maxYearintegerMaximum model year to keep.
maxMileageintegerMaximum mileage to keep.
sortBystringSort order such as deal_score, price_asc, price_desc, mileage_asc, year_desc, or distance.
searchUrlsarrayOne or more CarGurus search or inventory URLs. Reuses the URL filters directly.
maxResultsintegerMaximum number of listings returned per run.
proxyConfigurationobjectProxy settings used to reach CarGurus.

Focused JSON input example

{
"country": "US",
"postalCode": "10001",
"distance": 50,
"make": "Toyota",
"model": "Camry",
"minYear": 2019,
"maxMileage": 60000,
"sortBy": "deal_score",
"maxResults": 100
}

Output fields

Each dataset item is one CarGurus listing.

FieldTypeDescription
listingIdstringCarGurus internal listing ID.
listingUrlstringPermalink to the listing detail page.
titlestringListing title.
makestringVehicle make.
modelstringVehicle model.
trimstring or nullTrim level.
yearinteger or nullModel year.
vinstring or nullVehicle Identification Number.
stockNumberstring or nullDealer stock number.
bodyTypestring or nullBody style.
pricenumber or nullSticker price in local currency.
totalPricenumber or nullPrice including dealer fees.
msrpnumber or nullManufacturer suggested retail price.
priceCurrencystringISO currency code.
dealRatingstring or nullCarGurus deal rating.
dealScorenumber or nullNumeric deal score from 0 to 1.
priceDifferentialnumber or nullDifference versus CarGurus IMV.
mileageinteger or nullOdometer reading.
daysOnMarketinteger or nullDays the listing has been on the market.
exteriorColorstring or nullExterior color.
interiorColorstring or nullInterior color.
transmissionstring or nullTransmission type.
driveTrainstring or nullDrivetrain.
fuelTypestring or nullFuel type.
enginestring or nullEngine display name.
combinedMpgstring or nullCombined fuel economy string.
optionsarrayFeature and option strings.
imageUrlstring or nullPrimary photo URL.
pictureCountinteger or nullNumber of photos.
sellerTypestring or nullSeller type.
dealerNamestring or nullDealer or seller name.
isFranchiseDealerboolean or nullWhether the seller is a franchise dealer.
sellerCitystring or nullSeller city and region.
sellerRegionstring or nullSeller state or region code.
sellerPostalCodestring or nullSeller postal or ZIP code.
phonestring or nullDealer phone number.
distancenumber or nullDistance from the searched postal code.
countrystringMarketplace code.
scrapedAtstringISO 8601 scrape timestamp.

Sample output record

A listing row from a ZIP 10001 search:

{
"listingId": "455954871",
"listingUrl": "https://www.cargurus.com/Cars/link/455954871",
"title": "2023 BMW M4 Competition xDrive Convertible AWD",
"make": "BMW",
"model": "M4",
"trim": "Competition xDrive Convertible AWD",
"year": 2023,
"vin": "WBS33BA01PCM96331",
"stockNumber": "A1312S",
"bodyType": "Convertible",
"price": 69995,
"totalPrice": 69995,
"msrp": null,
"priceCurrency": "USD",
"dealRating": "GREAT_PRICE",
"dealScore": 0.99990386,
"priceDifferential": 2562,
"mileage": 13842,
"daysOnMarket": 52,
"exteriorColor": "Gray (Brooklyn Grey Metallic)",
"interiorColor": "SILVERSTONE/BLACK",
"transmission": "Automatic",
"driveTrain": "All-Wheel Drive",
"fuelType": "Gasoline",
"engine": "503 hp 3L I6",
"combinedMpg": "19 MPG",
"imageUrl": "https://static.cargurus.com/images/forsale/2026/09/05/18/14/2023_bmw_m4-pic-965290619885420473-1024x768.jpeg",
"pictureCount": 0,
"sellerType": "DEALER",
"dealerName": "Teddy Volkswagen",
"isFranchiseDealer": true,
"sellerCity": "Bronx, NY",
"sellerRegion": "NY",
"sellerPostalCode": "10466",
"phone": "(775) 264-9877",
"distance": 12.146781,
"country": "US",
"scrapedAt": "2026-10-04T14:47:59.633Z"
}

How it works

The Actor uses CarGurus search results through the hidden searchResults.action JSON API described in the live contract. It applies the marketplace selection from country, then searches by postal code or by the supplied searchUrls. Structured filters such as price, year, mileage, make, and model are enforced on the returned listings. Results are saved to the default dataset, and the run summary is written to the default key-value store.

Pricing

This Actor uses Pay per event pricing with Apify platform usage included: you pay a small start event and one listing-scraped event per listing saved, with no separate usage charge. The Pricing tab shows the current event prices.

Events in the live contract:

  • Actor start
  • Listing scraped

Example: if a run returns one hundred listings, the billed events include one actor start and one hundred listing scraped events. The run cost scales only with the number of listings returned, and maxResults caps it.

Use with AI agents (MCP)

This Actor is available as an Apify Actor usable through Apify MCP. The tool returns structured CarGurus listing data for agent workflows that need inventory, pricing, and dealer contact fields in a predictable schema.

Actor identity: khadinakbar/cargurus-scraper

Tool description: retrieve CarGurus marketplace listings using a postal search or saved CarGurus results URL, then read the dataset items as JSON.

Find Toyota Camry listings in the US marketplace near 10001, sort by deal score, and return up to 50 records. I need VIN, total price, mileage, dealer phone, and listing URL for each item.

Output interpretation:

  • dealRating, dealScore, and priceDifferential describe CarGurus' own listing evaluation fields
  • listingUrl points to the listing detail page
  • phone, dealerName, and sellerCity identify the seller shown on the listing
  • scrapedAt gives the scrape timestamp for the returned dataset record

Provenance and scope:

  • Data comes from public CarGurus listing results
  • The Actor supports the US, CA, and UK marketplaces
  • searchUrls can preserve filters already set in a CarGurus results page
  • Pagination continues until the requested result count is reached or the search space is exhausted

Cost guidance:

  • Each returned listing is charged as a Listing scraped event
  • A smaller maxResults value reduces event count
  • The live Pricing tab is the source of truth for billing details

Apify API example

import { ApifyClient } from "apify-client";
const client = new ApifyClient({
token: process.env.APIFY_TOKEN,
});
const run = await client.actor("khadinakbar/cargurus-scraper").call({
country: "US",
postalCode: "10001",
distance: 50,
make: "Toyota",
model: "Camry",
maxResults: 10,
proxyConfiguration: {
useApifyProxy: true,
},
});
const dataset = await client.dataset(run.defaultDatasetId).listItems({
clean: true,
format: "json",
});
console.log(dataset.items);

Best results and outcome guidance

Use a single marketplace and a focused location first, then narrow with make, model, minYear, maxYear, minPrice, maxPrice, and maxMileage as needed. deal_score is the default sort order and is a practical starting point when reviewing listings by value. If you already have a CarGurus results page configured in the browser, paste that URL into searchUrls to reuse the same filters and search structure.

Continue the workflow

Design note

I found that the output contract exposes a separate listings dataset link and a summary record in key-value storage, which makes it clear that the run result is split between row-level listing data and run-level metadata.

FAQ

Can I search by country and postal code?

Yes. Set country to US, CA, or UK, then provide a matching postalCode.

Can I use a saved CarGurus search page instead of structured filters?

Yes. Paste one or more results-page URLs into searchUrls to reuse the exact CarGurus filters from the browser.

Which fields are most useful for lead generation?

dealerName, phone, sellerCity, listingUrl, vin, and title are the main contact and record-identity fields.

Which fields are most useful for pricing analysis?

price, totalPrice, msrp, dealRating, dealScore, priceDifferential, mileage, and daysOnMarket support review and comparison workflows.

Is this Actor usable through Apify MCP?

Yes. It is an Apify Actor usable through Apify MCP and returns structured listing data that agent workflows can consume.

Responsible use

Use this Actor for lawful, public-data workflows such as market research, inventory monitoring, and internal analysis. Respect CarGurus terms, applicable law, and third-party rights when collecting, storing, and using listing data.