CarGurus Scraper — US, Canada & UK Listings with Deal Ratings
Pricing
from $2.50 / 1,000 listing scrapeds
CarGurus Scraper — US, Canada & UK Listings with Deal Ratings
Used-car listings from CarGurus (US, Canada, UK): price, mileage, deal rating, market value, VIN and dealer phone. No login. Several makes and models per run. From $2.50 per 1,000 cars; pay only for cars found.
Pricing
from $2.50 / 1,000 listing scrapeds
Rating
0.0
(0)
Developer
Khadin Akbar
Maintained by CommunityActor stats
0
Bookmarked
73
Total users
24
Monthly active users
2 days ago
Last modified
Categories
Features
Share
What is CarGurus Scraper?
CarGurus Scraper gives you used-car listings from CarGurus in the US, Canada and UK: price, mileage, deal rating, CarGurus market value, VIN and dealer details. No login needed, you pay only for the cars it finds, and you can search several makes and models in one run. Cars start at $2.50 per 1,000 on the Gold plan and above ($4.00 per 1,000 on the Free plan).
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. Each car is one record with 48 fields (plus about 30 more with the optional details add-on from 24 November 2026), including VIN, price, total price, CarGurus market value (expectedPrice), deal rating, price difference vs. market, mileage, days on market, specs, fuel economy, safety rating, main photo, dealer name, dealer ID, phone and distance. Use it for car prices research, dealer inventory review, lead generation and AI workflows that need one 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, andpriceDifferential - Inventory filtering by make, model, year, mileage, and price range, applied by CarGurus itself so narrow searches stay fast
- Several makes and models in one run (for example Toyota Camry and Honda Accord)
- 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"], make Toyota, model Camry, minYear 2019 and maxMileage 60000 returns every matching Camry and Camry Hybrid with dealRating, expectedPrice, 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
| Field | Type | Description |
|---|---|---|
country | string | CarGurus marketplace to search. Use US, CA, or UK. |
postalCode | string | ZIP, Canadian postal/FSA, or UK outcode/postcode used as the search center. |
postalCodes | array | More ZIP/postal codes searched in the same run with the same filters. Listings are de-duplicated; maxResults applies to the whole run. |
distance | integer | Search radius around the postal code (miles in the US and UK, km in Canada). Only cars inside it are returned. |
includeDistantListings | boolean | Keep the far-away cars CarGurus mixes in (nationwide delivery or nationwide fallback). Off by default. |
includeDetails | boolean | Optional car details add-on, off by default. Starts on 24 November 2026 at $0.0015 per detailed car (see Car details below). Before that date, switching it on stops the run with a clear message and nothing is charged. |
make | string | Optional brand, e.g. Toyota. In the US and Canada CarGurus filters it directly. |
model | string | Optional model, e.g. Camry (also finds Camry Hybrid). Add the make for the fast path. |
makes | array | More brands searched in the same run. |
models | array | More models searched in the same run, matched within the makes. |
minPrice | integer | Minimum total price (sent to CarGurus and checked on each listing). |
maxPrice | integer | Maximum total price. |
minYear | integer | Oldest model year. |
maxYear | integer | Newest model year. |
maxMileage | integer | Maximum mileage. |
sortBy | string | Sort order: deal_score, price_asc, price_desc (by total price incl. fees), mileage_asc, year_desc, or distance. |
searchUrls | array | One or more CarGurus search or inventory URLs. Reuses the URL filters directly. |
maxResults | integer | Maximum number of listings returned per run. |
proxyConfiguration | object | Proxy 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.
| Field | Type | Description |
|---|---|---|
listingId | string | CarGurus internal listing ID. |
listingUrl | string | Permalink to the listing detail page. |
title | string | Listing title. |
make | string | Vehicle make. |
model | string | Vehicle model. |
trim | string or null | Trim level. |
year | integer or null | Model year. |
vin | string or null | Vehicle Identification Number. |
stockNumber | string or null | Dealer stock number. |
bodyType | string or null | Body style. |
price | number or null | Sticker price in local currency. |
totalPrice | number or null | Price including dealer fees. |
msrp | number or null | Manufacturer suggested retail price. |
expectedPrice | number or null | CarGurus estimated market value (IMV) for this car. |
priceCurrency | string | ISO currency code. |
dealRating | string or null | CarGurus deal rating. |
dealScore | number or null | Numeric deal score from 0 to 1. |
priceDifferential | number or null | Difference versus CarGurus IMV. |
mileage | integer or null | Odometer reading. |
daysOnMarket | integer or null | Days the listing has been on the market. |
exteriorColor | string or null | Exterior color. |
colorGroup | string or null | Normalized color group, e.g. BLACK. |
interiorColor | string or null | Interior color. |
transmission | string or null | Transmission type. |
driveTrain | string or null | Drivetrain. |
fuelType | string or null | Fuel type. |
engine | string or null | Engine display name. |
combinedMpg | string or null | Combined fuel economy string. |
cityMpg | number or null | City fuel economy. |
highwayMpg | number or null | Highway fuel economy. |
doors | integer or null | Number of doors. |
safetyRating | string or null | NCAP overall safety rating shown by CarGurus. |
options | array | Feature and option strings. |
imageUrl | string or null | Main photo URL (one photo per row). |
pictureCount | integer or null | Photo count as reported in CarGurus search results (often 0 even when the listing has photos). |
isFeatured | boolean or null | Whether the dealer paid to feature the listing. |
sellerType | string or null | Seller type. |
sellerId | string or null | CarGurus dealer ID, stable across that dealer's listings. |
dealerName | string or null | Dealer or seller name. |
isFranchiseDealer | boolean or null | Whether the seller is a franchise dealer. |
franchiseMake | string or null | Brand the dealer is franchised for. |
sellerCity | string or null | Seller city and region. |
sellerRegion | string or null | Seller state or region code. |
sellerPostalCode | string or null | Seller postal or ZIP code. |
phone | string or null | Dealer phone number. |
distance | number or null | Distance from the searched postal code. |
detailsAdded | boolean | Only with includeDetails: true when the car's details were found and added. |
detailsStatus | string | Only with includeDetails: added, unavailable, skipped_budget or skipped_after_repeated_failures. |
photos, photoCount | array, integer | Only with includeDetails: all photo URLs and their count. |
priceHistory | array | Only with includeDetails: dated price points, oldest first. |
accidentCount, ownerCount, isFleet | integer, integer, boolean | Only with includeDetails, US only: vehicle history counts. |
daysAtDealer, daysOnCarGurus, savedByShoppers | integer | Only with includeDetails. |
dealerRating, dealerReviewCount, dealerStreet, dealerLatitude, dealerLongitude, dealerWebsite, dealerLogoUrl, dealerHours, dealerSocial | mixed | Only with includeDetails: dealer details. |
description, specs, dealerFees, dealerFeesTotal, returnPolicyDays, safetyRatings | mixed | Only with includeDetails: the seller's description and specifications. |
country | string | Marketplace code. |
scrapedAt | string | ISO 8601 scrape timestamp. |
Sample output record
A real listing row from a ZIP 10001 Toyota Camry search (dealer phone left out here):
{"listingId": "459166145","listingUrl": "https://www.cargurus.com/Cars/link/459166145","title": "2024 Toyota Camry SE FWD","make": "Toyota","model": "Camry","trim": "SE FWD","year": 2024,"vin": "4T1G11AK4RU845162","stockNumber": "B6359","bodyType": "Sedan","price": 25155,"totalPrice": 26150,"msrp": 28995,"expectedPrice": 26876,"priceCurrency": "USD","dealRating": "GREAT_PRICE","dealScore": 0.988964,"priceDifferential": 1721,"mileage": 23034,"daysOnMarket": 53,"exteriorColor": null,"colorGroup": "UNKNOWN","interiorColor": "Black","transmission": "Automatic","driveTrain": "Front-Wheel Drive","fuelType": "Gasoline","engine": "2.5L I4","combinedMpg": "33 MPG","cityMpg": 28,"highwayMpg": 39,"doors": 4,"safetyRating": "Not Rated","options": ["Adaptive Cruise Control","Alloy Wheels","Bluetooth","Backup Camera","Heated Seats"],"imageUrl": "https://static.cargurus.com/images/forsale/2026/10/06/21/10/2024_toyota_camry-pic-2679369764754176616-1024x768.jpeg","pictureCount": 0,"isFeatured": true,"sellerType": "DEALER","sellerId": "889839","dealerName": "Paul Miller Toyota","isFranchiseDealer": true,"franchiseMake": "Toyota","sellerCity": "Pinebrook , NJ","sellerRegion": "NJ","sellerPostalCode": "07058","phone": null,"distance": 19.695755,"country": "US","scrapedAt": "2026-11-09T16:49:18.566Z"}
Car details (optional add-on, starts 24 November 2026)
From 24 November 2026 you can switch on includeDetails to add the full detail page of each car to its record. It costs $0.0015 extra per detailed car on every plan (for example Gold and above: $0.0025 + $0.0015 = $0.0040 per detailed car; Free: $0.0055). You are charged the extra amount only for cars where CarGurus returned the details, and never for cars saved without them. Until that date the option is off, and a run that asks for it stops with a clear message before anything is charged.
What it adds to each car:
- All photos (full size), with
photoCount - Dated price history (
priceHistory), days at the dealer, days on CarGurus, and how many shoppers saved the car - Accident count, owner count and a fleet-use flag (US only; CarGurus does not show these for Canada and the UK)
- Dealer rating and review count, dealer address position, opening hours, website, logo and social links (when the dealer has them)
- The seller's full description, specification sections, dealer fees (such as a documentation fee), return window and safety ratings when shown
Good to know: some cars have no photos or no price changes at CarGurus, so those fields can be empty for them. A car is saved with details only when CarGurus returns its detail page; otherwise it is saved normally with detailsAdded: false and the extra charge is not applied. Details are not available for every car, and the full vehicle history report text is not included.
How it works
The Actor reads CarGurus search results as JSON, page by page, until it has maxResults listings or CarGurus has no more cars. In the US and Canada it looks up your make and model in the CarGurus catalog, so CarGurus returns only matching cars; year, price and mileage are sent with the search too. Every filter is also checked again on each listing, so nothing outside your filters is returned or charged. In the UK, make and model are checked on each listing. If a page is blocked, the Actor retries it and then uses backup routes before giving up. Results go to the default dataset; the run summary (OUTPUT) shows the outcome, how many requests were made, which route served each page, and any warnings.
Pricing
This Actor uses Pay per event pricing with Apify platform usage included: you pay a tiny start event ($0.00005 per run) and one listing-scraped event per car saved, with no separate usage charge. Runs with no matching cars cost only the start event.
Optional from 24 November 2026: Listing details added at $0.0015 per detailed car, the same on every plan, charged only for cars saved with details.
Price per car by your Apify plan:
| Plan | Per car | Per 1,000 cars |
|---|---|---|
| Free | $0.004 | $4.00 |
| Bronze | $0.0035 | $3.50 |
| Silver | $0.003 | $3.00 |
| Gold and above | $0.0025 | $2.50 |
Example: one hundred cars on the Free plan cost 100 x $0.004 + $0.00005 = $0.40005. The run cost scales only with the number of cars returned, and maxResults caps it. The Pricing tab always shows the current prices.
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, andpriceDifferentialdescribe CarGurus' own listing evaluation fieldslistingUrlpoints to the listing detail pagephone,dealerName, andsellerCityidentify the seller shown on the listingscrapedAtgives 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
searchUrlscan preserve filters already set in a CarGurus results page- Pagination continues until the requested result count is reached or CarGurus has no more cars
Cost guidance:
- Each returned listing is charged as a
Listing scrapedevent - A smaller
maxResultsvalue reduces event count - The live Pricing tab is the source of truth for billing details, and the price per car depends on your Apify plan
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
- Then use Mobile.de Scraper — Vehicle Price & Stock Monitor to extend this Actor with a neighboring vehicle-market research source when the brief calls for Mobile data.
- Then use Autotrader UK Scraper to extend this Actor with a neighboring vehicle-market research source when the brief calls for Autotrader data.
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.
What happens when a search has no matching cars?
The run succeeds with an empty dataset and outcome: VALID_EMPTY in the run summary. You are charged only the small start event. A run fails only when no listing could be collected because CarGurus could not be reached (or the run ran out of time before the first listing).
Why are there fewer cars than CarGurus shows for my search?
CarGurus mixes far-away cars into local results (cars offered with nationwide delivery, or a nationwide list when nothing is nearby). The Actor returns and charges only cars inside your radius. Turn on includeDistantListings to keep them too.
Do I get every photo of each car?
No. Each row has the main photo (imageUrl). Open listingUrl for the full gallery.
Can I search only new or only used cars?
Not with a field yet. Paste a CarGurus results URL with that filter set into searchUrls.
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.