CarGurus Scraper: US, CA, UK Car Listings — No Login, $10/1k
Pricing
from $0.80 / 1,000 listings
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
Maintained by CommunityActor stats
0
Bookmarked
74
Total users
2
Monthly active users
17 days ago
Last modified
Categories
Security
Limited permissionsShare
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.
| Field | Example | Notes |
|---|---|---|
id, listingId | "459408340" | CarGurus listing id |
listingTitle, title | "2023 Kia Forte" | |
country, currency | "US", "USD" | CA/CAD, UK/GBP |
price, priceString | 15288, "$15,288" | asking price |
totalPrice | 15410 | price plus disclosed dealer fees |
expectedPrice | 16581 | CarGurus Instant Market Value |
priceDifferential | 1293 | market value minus price (positive = below market) |
dealScore, dealRating | 1.128, "GOOD_PRICE" | GREAT_PRICE, GOOD_PRICE, FAIR_PRICE, HIGH_PRICE, OVERPRICED, NA |
year, make, model, trim | 2023, "Kia", "Forte", "GT-Line FWD" | |
bodyType | "Sedan" | |
condition, isNew | "USED", false | |
mileage, mileageString | 72933, "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, combinedMpg | 28, 39, 32.95 | |
safetyRating | "5" | NHTSA overall rating, "Not Rated" when absent |
options | ["Navigation System", "Alloy Wheels", ...] | highlighted features |
daysOnMarket | 31 | |
pictureCount, imageUrl | 18, "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" | |
distance | 17.63 | from the searched ZIP / postal code |
detailUrl, listingUrl | ".../Cars/link/459408340" | |
sourceUrl, searchZip | the search that produced the row | |
scrapedAt | "2026-10-21T16:13:04.286Z" |
With includeDetails: true each row also has:
| Field | Example |
|---|---|
images | all full-size photo URLs (18 on the sample listing) |
priceHistory | [{"price": 12900, "date": "2026-08-14T..."}, {"price": 11900, ...}, ...] |
daysAtDealer | 2 |
accidentCount, ownerCount, hasAccidents, hasVehicleHistoryReport | 2, 5, true, true |
basePrice, dealerFees | 11630, [{"name": "Doc Fee", "amount": 70}] |
savedCount | 9 (users who saved the listing) |
description | dealer'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
priceagainstexpectedPriceanddaysOnMarket, reprice weekly. - Flip and wholesale sourcing: sort by
DEAL_SCORE, keepGREAT_PRICErows with lowownerCountand no accidents, callsellerPhone. - 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 olderviewDetailsFilterViewInventoryListing.action?...form) - make/model pages:
https://www.cargurus.com/Cars/l-Used-Toyota-Camry-d330 - single listings:
https://www.cargurus.com/Cars/link/453245080or 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}
| Field | Values |
|---|---|
country | US (default), CA, UK |
zip, zips | search 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 |
searchRadius | miles (km in Canada), default 50, 50000 = nationwide |
condition | USED (default), NEW, ALL |
minPrice, maxPrice, minYear, maxYear, minMileage, maxMileage | numbers |
bodyTypes | Coupe, Convertible, Hatchback, Minivan, Pickup Truck, Sedan, SUV / Crossover, Van, Wagon |
transmission | ANY, AUTOMATIC, MANUAL |
fuelTypes | Gasoline, Diesel, Electric, Hybrid, Flex Fuel, CNG, Biodiesel, Hydrogen |
driveTrains | AWD, FWD, RWD, 4WD, 4X2 |
colors | Black, White, Gray, Silver, Blue, Red, Green, Brown, Gold, Orange, Yellow, Purple, Teal, Pink |
dealRatings | GREAT_PRICE, GOOD_PRICE, FAIR_PRICE, HIGH_PRICE, OVERPRICED (applied after fetching) |
sellerType | ALL, DEALER, PRIVATE (applied after fetching) |
sortType | BEST_MATCH, DEAL_SCORE, PRICE_ASC, PRICE_DESC, MILEAGE_ASC, MILEAGE_DESC, NEWEST_FIRST, OLDEST_FIRST, YEAR_DESC, YEAR_ASC, DISTANCE |
maxItems | total rows, default 10 |
maxPages | pages per search, 0 = until results run out |
includeDetails | true fetches each listing page (photos, price history, history counts, dealer address) |
makes, maxResults | older 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
maxItemsto what you need. - Rows further away than my radius. CarGurus includes dealers that ship nationwide in every search (
distanceof several hundred miles). Filter ondistancedownstream if you want a strict radius. - New cars. The default search is used cars, like the site. Set
conditiontoNEWorALL. - Private sellers. CarGurus no longer offers a private-seller filter in search, so
sellerType: "PRIVATE"is applied to fetched rows; combine it with a largermaxItems. - Deal ratings. Also applied after fetching; sort by
DEAL_SCOREso 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 onsellerName. - 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_TOKENwith the JSON input above; fetch results from the run's dataset as JSON, CSV, Excel or XML. - Clients:
apify-clientfor 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 ApifyClientclient = 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"])
Legal
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.