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

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

Pricing

from $2.00 / 1,000 car listings

Go to Apify Store
Used Car Scraper for CarGurus - Listings, VINs & Dealer Leads

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

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.

Pricing

from $2.00 / 1,000 car listings

Rating

0.0

(0)

Developer

Scrape Sage

Scrape Sage

Maintained by Community

Actor stats

0

Bookmarked

14

Total users

3

Monthly active users

5 days ago

Last modified

Security

Limited permissions

Share

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, 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

DataListing row+ listing detailsDealer 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 - 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.

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:

{
"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.

FieldTypeDescription
zipCodesarray5-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.
searchUrlsarrayCarGurus search-results links (see above).
startUrlsarraySearch links or single /details/<id> listing links, which come back as full rows with details.
distanceintegerSearch radius around each ZIP, in miles (default 50).
includeDeliveryListingsbooleanAlso include cars from farther away that dealers offer to ship (off by default; each row's distance shows how far).
sortBystringbest_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).
maxResultsintegerCap on listing rows across the run, shared fairly between searches (default 100).
maxPagesPerSearchintegerResult pages (about 22 listings each) to read per search (default 10).
includeListingDetailsbooleanAdd 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.
includeDealerLeadsbooleanAlso output one deduplicated dealer row per dealership, with its website, rating and map position.
conditionFilterstringany / used / cpo (CarGurus' used-car search has no new cars).
dealRatingFilterarrayKeep only these CarGurus deal ratings.
makeFilterarrayKeep only these makes (Toyota, Mercedes-Benz, Land Rover; Chevy, VW and Mercedes work too).
minYear / maxYear / maxMileage / minPrice / maxPriceintegerNumeric filters (0 = off). Prices are the listed price before dealer fees.
withDealerPhoneOnlybooleanOnly listings that carry a dealer phone.
monitorModebooleanEmit only new and price-changed listings between runs.
proxyConfigurationobjectThe 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:

{
"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: 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

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 - multi-step automation scenarios.
  • Zapier - push new dealer leads straight into your CRM.
  • Slack - get notified when a monitored search finds a price drop.
  • Google Drive / Sheets - auto-export every run to a spreadsheet.
  • Airbyte - pipe results into your data warehouse.
  • 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 - 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 pricing and limited permissions, so it qualifies for Apify's agentic-payment standards:

  • x402: an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the Apify MCP server, with no account and no API key.
  • 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

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 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.

How do I track new inventory and price drops? Turn on monitorMode and create a Schedule; optionally add a webhook or Zapier zap 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. Feature requests are welcome - this Actor is actively maintained.