CarGurus Scraper: US, CA, UK Car Listings — No Login, $10/1k avatar

CarGurus Scraper: US, CA, UK Car Listings — No Login, $10/1k

Pricing

from $0.80 / 1,000 listings

Go to Apify Store
CarGurus Scraper: US, CA, UK Car Listings — No Login, $10/1k

CarGurus Scraper: US, CA, UK Car Listings — No Login, $10/1k

Scrape CarGurus car listings from cargurus.com, .ca and .co.uk: price, deal rating, VIN, mileage, specs, dealer phone, photos, price history. Paste search URLs or filter by ZIP, make/model, price, year, mileage, body type, fuel. No login or cookies. MCP-ready for AI agents. $10 per 1,000 records.

Pricing

from $0.80 / 1,000 listings

Rating

0.0

(0)

Developer

Fortuitous Pirate

Fortuitous Pirate

Maintained by Community

Actor stats

0

Bookmarked

74

Total users

2

Monthly active users

17 days ago

Last modified

Security

Limited permissions

Share

CarGurus Scraper: US, Canada and UK Car Listings with Prices, VINs, Deal Ratings and Dealer Contacts

Pull car listings from cargurus.com (US), cargurus.ca (Canada) and cargurus.co.uk (UK) as clean JSON, CSV or Excel. Paste a CarGurus search URL, or pick a country, ZIP / postal code and make/model filters, and get one row per listing with asking price, CarGurus market value and deal rating, VIN, mileage, specs, dealer name and phone, and (optionally) every photo, the price history, accident and owner counts and the dealer address.

No login, no cookies, no browser: the actor reads CarGurus' own JSON search and listing endpoints, so a 1,000-row pull finishes in a few minutes.

What you get

One dataset row per listing. Search rows carry 52 fields; includeDetails adds 21 more.

FieldExampleNotes
id, listingId"459408340"CarGurus listing id
listingTitle, title"2023 Kia Forte"
country, currency"US", "USD"CA/CAD, UK/GBP
price, priceString15288, "$15,288"asking price
totalPrice15410price plus disclosed dealer fees
expectedPrice16581CarGurus Instant Market Value
priceDifferential1293market value minus price (positive = below market)
dealScore, dealRating1.128, "GOOD_PRICE"GREAT_PRICE, GOOD_PRICE, FAIR_PRICE, HIGH_PRICE, OVERPRICED, NA
year, make, model, trim2023, "Kia", "Forte", "GT-Line FWD"
bodyType"Sedan"
condition, isNew"USED", false
mileage, mileageString72933, "72,933"miles (US), km (CA, UK)
vin, stockNumber"3KPF54AD0PE665017", "0720327A"
exteriorColor, interiorColor"Gray", "Black"
transmission, driveTrain, fuelType, engine, doors"Continuously Variable Transmission", "Front-Wheel Drive", "Gasoline", "147 hp 2L I4", "4 doors"
cityMpg, highwayMpg, combinedMpg28, 39, 32.95
safetyRating"5"NHTSA overall rating, "Not Rated" when absent
options["Navigation System", "Alloy Wheels", ...]highlighted features
daysOnMarket31
pictureCount, imageUrl18, "https://static.cargurus.com/images/..."main photo
sellerType, sellerName, isFranchiseDealer"DEALER", "South Bay Toyota", true
sellerCity, sellerRegion, sellerPostalCode, sellerPhone"Gardena, CA", "CA", "90248", "(424) 688-6133"
distance17.63from the searched ZIP / postal code
detailUrl, listingUrl".../Cars/link/459408340"
sourceUrl, searchZipthe search that produced the row
scrapedAt"2026-10-21T16:13:04.286Z"

With includeDetails: true each row also has:

FieldExample
imagesall full-size photo URLs (18 on the sample listing)
priceHistory[{"price": 12900, "date": "2026-08-14T..."}, {"price": 11900, ...}, ...]
daysAtDealer2
accidentCount, ownerCount, hasAccidents, hasVehicleHistoryReport2, 5, true, true
basePrice, dealerFees11630, [{"name": "Doc Fee", "amount": 70}]
savedCount9 (users who saved the listing)
descriptiondealer's listing text
dealerAddress, dealerStreet, dealerLat, dealerLng"7909 Van Nuys Blvd, Ste A, Panorama City, CA 91402", 34.2146, -118.449
dealerWebsite, dealerInventoryUrl, supportsSms
listingStatus"OPEN"

Fields CarGurus does not provide for a listing are null.

Use cases

  • Dealer pricing intelligence: pull every competitor listing of the models you stock within 50 miles, compare price against expectedPrice and daysOnMarket, reprice weekly.
  • Flip and wholesale sourcing: sort by DEAL_SCORE, keep GREAT_PRICE rows with low ownerCount and no accidents, call sellerPhone.
  • Dealer lead lists: one search per ZIP gives dealer names, phones, addresses and websites with their live inventory.
  • Market research and valuation models: price, mileage, year, trim and region for whole markets; schedule it daily and track priceHistory.
  • VIN pipelines: collect VINs for history reports, recall checks or inventory matching.
  • Cross-border comparisons: the same filters run on US, Canadian and UK sites in one run.

Input

Option A: paste CarGurus URLs

Open CarGurus, set your filters, copy the address bar and paste it into CarGurus URLs. Supported:

  • search pages: https://www.cargurus.com/search?zip=10001&distance=50&entityId=d1751&minPrice=10000 (also .ca, .co.uk, and the older viewDetailsFilterViewInventoryListing.action?... form)
  • make/model pages: https://www.cargurus.com/Cars/l-Used-Toyota-Camry-d330
  • single listings: https://www.cargurus.com/Cars/link/453245080 or any URL with #listing=453245080
{
"startUrls": [
{ "url": "https://www.cargurus.com/search?zip=10001&distance=25&sortType=DEAL_SCORE&entityId=d1751" },
{ "url": "https://www.cargurus.ca/search?zip=M4B+1B4&distance=50&entityId=d1751" },
{ "url": "https://www.cargurus.co.uk/search?distance=75&zip=SW1A+1AA&minPrice=5000&maxPrice=10000" }
],
"maxItems": 500
}

The country is detected from the domain. Filters in the URL are used as-is.

Option B: filters

{
"country": "US",
"zip": "60601",
"searchRadius": 50,
"searchQueries": ["Toyota Camry", "Honda Civic"],
"minYear": 2019,
"maxMileage": 60000,
"bodyTypes": ["Sedan"],
"transmission": "AUTOMATIC",
"sortType": "DEAL_SCORE",
"maxItems": 200
}
FieldValues
countryUS (default), CA, UK
zip, zipssearch centers; defaults to 90210 / M5V 2T6 / SW1A 1AA when empty
searchQueries"Toyota Camry", "BMW", "Ford F-150"; one search per entry, names resolved against CarGurus' make/model list
searchRadiusmiles (km in Canada), default 50, 50000 = nationwide
conditionUSED (default), NEW, ALL
minPrice, maxPrice, minYear, maxYear, minMileage, maxMileagenumbers
bodyTypesCoupe, Convertible, Hatchback, Minivan, Pickup Truck, Sedan, SUV / Crossover, Van, Wagon
transmissionANY, AUTOMATIC, MANUAL
fuelTypesGasoline, Diesel, Electric, Hybrid, Flex Fuel, CNG, Biodiesel, Hydrogen
driveTrainsAWD, FWD, RWD, 4WD, 4X2
colorsBlack, White, Gray, Silver, Blue, Red, Green, Brown, Gold, Orange, Yellow, Purple, Teal, Pink
dealRatingsGREAT_PRICE, GOOD_PRICE, FAIR_PRICE, HIGH_PRICE, OVERPRICED (applied after fetching)
sellerTypeALL, DEALER, PRIVATE (applied after fetching)
sortTypeBEST_MATCH, DEAL_SCORE, PRICE_ASC, PRICE_DESC, MILEAGE_ASC, MILEAGE_DESC, NEWEST_FIRST, OLDEST_FIRST, YEAR_DESC, YEAR_ASC, DISTANCE
maxItemstotal rows, default 10
maxPagespages per search, 0 = until results run out
includeDetailstrue fetches each listing page (photos, price history, history counts, dealer address)
makes, maxResultsolder names, still accepted

Several ZIPs and several make/model entries multiply: zips: ["10001", "60601", "90012"] with searchQueries: ["Toyota Camry"] runs three searches and de-duplicates listings across them.

Option C: bulk list from a CSV or Google Sheet

{ "listUrl": "https://docs.google.com/spreadsheets/d/1AbC.../edit#gid=0", "maxItems": 2000, "includeDetails": true }

The first column of the sheet (shared as "anyone with the link") is read row by row. URLs become URL searches, ZIP / postal codes become locations and anything else is treated as a make/model query, so one sheet can mix all three.

Single listings with full details

{ "startUrls": [{ "url": "https://www.cargurus.com/Cars/link/453245080" }] }

Listing URLs always return the detail record (photos, price history, dealer address).

Output example

Search row from a {} run (ZIP 90210, 21 October 2026):

{
"id": "459408340",
"listingTitle": "2023 Kia Forte",
"country": "US",
"currency": "USD",
"price": 15288,
"priceString": "$15,288",
"totalPrice": 15410,
"expectedPrice": 16581,
"priceDifferential": 1293,
"dealScore": 1.1283423,
"dealRating": "GOOD_PRICE",
"year": 2023,
"make": "Kia",
"model": "Forte",
"trim": "GT-Line FWD",
"bodyType": "Sedan",
"condition": "USED",
"isNew": false,
"mileage": 72933,
"mileageString": "72,933",
"vin": "3KPF54AD0PE665017",
"stockNumber": "0720327A",
"exteriorColor": "Gray",
"interiorColor": "Black",
"transmission": "Continuously Variable Transmission",
"driveTrain": "Front-Wheel Drive",
"fuelType": "Gasoline",
"engine": "147 hp 2L I4",
"doors": "4 doors",
"cityMpg": 28,
"highwayMpg": 39,
"combinedMpg": 32.95,
"safetyRating": "Not Rated",
"options": ["Navigation System", "Alloy Wheels", "Bluetooth", "Backup Camera", "Blind Spot Monitoring"],
"daysOnMarket": 31,
"pictureCount": 0,
"imageUrl": null,
"sellerType": "DEALER",
"sellerName": "South Bay Toyota",
"isFranchiseDealer": true,
"sellerCity": "Gardena, CA",
"sellerRegion": "CA",
"sellerPostalCode": "90248",
"sellerPhone": "(424) 688-6133",
"distance": 17.626648,
"detailUrl": "https://www.cargurus.com/Cars/inventorylisting/viewDetailsFilterViewInventoryListing.action?entitySelectingHelper.selectedEntity=459408340",
"listingUrl": "https://www.cargurus.com/Cars/link/459408340",
"sourceUrl": "https://www.cargurus.com/search?distance=50&sortType=BEST_MATCH&sortDir=ASC&zip=90210",
"searchZip": "90210",
"scrapedAt": "2026-10-21T16:13:04.286Z"
}

Detail fields for listing 453245080 (2017 Toyota Corolla SE, same day):

{
"priceHistory": [
{ "price": 12900, "date": "2026-08-14T16:52:18.000Z" },
{ "price": 11900, "date": "2026-09-16T23:38:55.000Z" },
{ "price": 12450, "date": "2026-10-20T16:27:13.000Z" }
],
"daysAtDealer": 2,
"accidentCount": 2,
"ownerCount": 5,
"hasAccidents": true,
"basePrice": 11630,
"dealerFees": [{ "name": "Doc Fee", "amount": 70 }],
"savedCount": 9,
"images": ["https://static.cargurus.com/images/forsale/2026/10/19/17/49/2017_toyota_corolla-pic-5833484960174474478-1024x768.jpeg", "..."],
"dealerAddress": "7909 Van Nuys Blvd, Ste A, Panorama City, CA 91402",
"dealerLat": 34.2146,
"dealerLng": -118.449,
"dealerWebsite": "https://www.wheelyfinecars.com/?utm_source=cargurus.com&utm_medium=referral&utm_campaign=cargurus_listings"
}

The run's key-value store gets an OUTPUT record summarising every search (pages fetched, listings found, rows saved, any error), so partial results are never silent.

Pricing

Pay per result: $0.0008 per listing, i.e. $0.80 per 1,000 rows, plus a $0.001 start fee per run (this price takes effect on 5 November 2026; until then the previous $0.01 per listing and $0.005 start fee apply, as shown on the Pricing tab). Listing details (includeDetails) are included in the row price. You pay only for rows written to the dataset; a search that returns nothing costs the start fee only.

A 10,000-listing market scan costs $8.

Limits and FAQ

  • How many listings can one search return? CarGurus serves about 22 listings per page and keeps paging while results exist. Wide searches (a popular model, nationwide) run into thousands of rows; set maxItems to what you need.
  • Rows further away than my radius. CarGurus includes dealers that ship nationwide in every search (distance of several hundred miles). Filter on distance downstream if you want a strict radius.
  • New cars. The default search is used cars, like the site. Set condition to NEW or ALL.
  • Private sellers. CarGurus no longer offers a private-seller filter in search, so sellerType: "PRIVATE" is applied to fetched rows; combine it with a larger maxItems.
  • Deal ratings. Also applied after fetching; sort by DEAL_SCORE so the best deals come first.
  • Dealer ratings and review counts are not part of CarGurus' listing data and are not included.
  • Dealer inventory pages (/Cars/m-Dealer-Name-sp123) are not supported; search by ZIP instead and filter on sellerName.
  • Listing details blocked? CarGurus rate-limits listing pages per IP. The actor retries blocked detail requests through a residential proxy automatically and keeps the search row when a detail page is unavailable (the row is still saved, without the detail fields).
  • Make/model not found. Names are matched against CarGurus' own make/model list per country; a model that does not exist there falls back to the whole make, and a make that does not exist is skipped and reported in OUTPUT.

Integrations

  • API: POST https://api.apify.com/v2/acts/fortuitous_pirate~cargurus-scraper/runs?token=YOUR_TOKEN with the JSON input above; fetch results from the run's dataset as JSON, CSV, Excel or XML.
  • Clients: apify-client for Python and JavaScript; client.actor("fortuitous_pirate/cargurus-scraper").call(run_input={...}).
  • Schedules and webhooks: schedule a daily run per market and attach a webhook to push new rows into your warehouse or CRM.
  • Make, Zapier, n8n: use the Apify module to start the actor and read the dataset.
  • AI agents / MCP: the actor has typed input and output schemas and works through the Apify MCP server ("find Toyota Camrys under 60,000 miles near 60601 sorted by best deal").
from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("fortuitous_pirate/cargurus-scraper").call(run_input={
"zip": "10001", "searchQueries": ["Toyota RAV4"], "maxMileage": 50000, "sortType": "DEAL_SCORE", "maxItems": 100,
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
print(row["listingTitle"], row["price"], row["dealRating"], row["sellerPhone"])

The actor reads publicly available listing data only. Use it in line with CarGurus' terms and the privacy laws that apply to you; you are responsible for how the data is used. Not affiliated with CarGurus.