Autotrader US - Cars, Prices, Dealers & VINs
Pricing
from $1.50 / 1,000 listing results
Autotrader US - Cars, Prices, Dealers & VINs
Scrape US car listings from Autotrader by make, model, ZIP, price, year, body style, filters, or listing URLs. Returns VIN, price, KBB deal rating, mileage, colors, MPG, drivetrain, dealer name, phone, location, history flags, photos, and 60+ fields.
Pricing
from $1.50 / 1,000 listing results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
9
Total users
3
Monthly active users
4 days ago
Last modified
Categories
Share
AutoTrader Scraper: US Vehicle Listings, Pricing and Dealer Contacts
AutoTrader Scraper turns AutoTrader.com, the large US vehicle marketplace, into clean structured data. Get VIN, price, mileage, dealer contact details, vehicle history flags, and the site's own deal rating and KBB fair-purchase price for every result. Search by make, model, ZIP code, price, year, body style, fuel type, drivetrain, and color, or paste AutoTrader search and listing links directly, then export to JSON, CSV or Excel, or pull the dataset straight into your app through the API.
Why This Scraper?
- 60+ fields per listing, including VIN, full dealer contact, and the site's own deal rating.
- KBB fair-purchase price range and how each listing compares, when the site provides it.
- Vehicle history flags: no accidents reported, no salvage title, no frame damage, no flood damage, single owner, and free history report availability.
- Two ways to search: build a query from filters, or paste any AutoTrader search or listing URL.
- Forward pagination that walks a whole result set by default, bounded only by the total listings cap you set, so runs stay predictable.
- Optional per-listing detail enrichment for full options, extended specs, and complete vehicle history.
- Optional export of results into Notion, Linear, Airtable, or Apify through MCP connectors.
Use Cases
- Car shoppers and price researchers: compare listings across dealers by price, mileage, and the site's own deal rating.
- Dealership and inventory teams: track competitor pricing and days-on-market within a search area.
- Vehicle history and valuation tools: pull VINs, KBB fair-purchase price ranges, and history flags to feed valuation models.
- Lead generation and CRM pipelines: capture current listings and dealer contact details for a make or model.
- Market analysts and data scientists: build historical pricing datasets across ZIP codes, makes, and body styles.
Data You Get
Sample shape: values are illustrative placeholders, not from a live listing.
| Field | Example |
|---|---|
id | "000000001" |
vin | "1XXXX00000X000000" |
url | "https://www.autotrader.com/cars-for-sale/vehicle/000000001" |
year | 2023 |
make | "Sample Make" |
model | "Sample Model" |
trim | "Sample Trim" |
bodyStyle | "SUV" |
price | 22000 |
dealIndicator | "Great" |
kbbFairPurchasePrice | 22500 |
mileage | 30,000 |
exteriorColor | "White" |
interiorColor | "Black" |
fuelType | "Gasoline" |
transmission | "Automatic" |
driveType | "Front Wheel Drive" |
mpgCity / mpgHighway | 30 / 38 |
sellerName | "Sample Motors" |
sellerPhone | "+10000000000" |
sellerCity / sellerState | "Sample City" / "CA" |
distanceFromSearch | 12 |
images | ["https://images.autotrader.com/000000000.jpg"] |
Every record also carries vehicleHistory (a set of flags: no accidents reported, no salvage title, no frame damage, no flood damage, single owner, free report available), the full dealer object (name, phone, address, and distance, never trimmed down), specifications, warranties, pricingDetail (the raw pricing block price and dealIndicator are read from), description, doors, isReducedPrice, hasSpecialOffer, isNewlyListed, isHot, daysOnSite, stockId, kbbVehicleId, styleId, kbbPriceLow, kbbPriceHigh, kbbPriceDelta, imageCount, and scrapedAt. When "Fetch full detail per listing" is on, or always for a pasted individual listing URL in URL mode, the record also gets enriched: true and a detailFields object holding whatever extra fields the fuller per-vehicle page carries beyond the fields already listed above.
How to Use
- Pick a mode:
search(build a query from filters) orurl(paste AutoTrader search or listing links). - In search mode, set a ZIP code and any filters you need (make, model, price, year, body style, fuel type, drivetrain, color, vehicle history, deal rating, seller type). In URL mode, paste one or more links.
- Turn on "Fetch full detail per listing" if you want full options, extended specs, and complete vehicle history per vehicle. It adds one extra request per listing. A pasted individual listing URL in URL mode always fetches this detail page, regardless of the toggle.
- Set Max listings to control run size and cost, then click Start. Download the dataset as JSON, CSV, or Excel, or read it through the API.
Search by make and model near a ZIP code:
{"mode": "search","zip": "90012","make": ["HONDA"],"model": ["CIVIC"],"searchRadius": 50,"maxListings": 50}
Search with filters:
{"mode": "search","zip": "10001","bodyStyle": ["suv"],"fuelType": ["hybrid"],"driveType": ["awd-4wd"],"minPrice": 20000,"maxPrice": 40000,"minYear": 2021,"sortBy": "price-asc","maxListings": 100}
URL mode: supported URL shapes
URL mode with the urls field left untouched now scrapes the example URLs below (one per shape, capped by Max listings). Replace them with your own links to scrape something else. Every search shape below was run live and returned a full first page of listings. Make and model names in a pasted path are matched against Autotrader's own make and model lists. In URL mode a pasted URL whose make or model does not exist is skipped with a warning that lists the close matches, and the other URLs still run (the run fails only when no URL is left); in search mode such a name stops the run with the close matches. Either way you never get a silently unfiltered search.
| Shape | Example |
|---|---|
| seo | https://www.autotrader.com/cars-for-sale/all-cars/honda/civic/los-angeles-ca |
| canonical-srp | https://www.autotrader.com/cars-for-sale/all-cars?zip=90012&makeCode=HONDA&channel=ATC&allListingType=all-cars |
| paginated | https://www.autotrader.com/cars-for-sale/all-cars?zip=90012&makeCode=HONDA&firstRecord=25&channel=ATC |
| filtered-sorted | https://www.autotrader.com/cars-for-sale/all-cars?zip=90012&makeCode=HONDA&modelCode=CIVIC&startYear=2018&maxPrice=20000&sortBy=derivedpriceASC |
| used-cars | https://www.autotrader.com/cars-for-sale/used-cars/honda/civic/los-angeles-ca |
| new-cars | https://www.autotrader.com/cars-for-sale/new-cars/toyota/camry/los-angeles-ca |
| make-only | https://www.autotrader.com/cars-for-sale/all-cars/honda |
| body-style | https://www.autotrader.com/cars-for-sale/all-cars/suv-crossover/los-angeles-ca |
| price-category | https://www.autotrader.com/cars-for-sale/all-cars/cars-under-25000/honda/civic/los-angeles-ca?startYear=2018&endYear=2022&sortBy=derivedpriceASC |
| price-range | https://www.autotrader.com/cars-for-sale/all-cars/cars-between-10000-and-20000/honda/los-angeles-ca |
| seller-listing-type | https://www.autotrader.com/cars-for-sale/all-cars?zip=90012&sellerType=d&listingType=CERTIFIED&firstRecord=25 |
| legacy-plus | https://www.autotrader.com/cars-for-sale/Honda/Civic/Los+Angeles+CA-90012 |
| mobile-host | https://m.autotrader.com/cars-for-sale/all-cars/honda/accord/los-angeles-ca |
| vehicle-id | https://www.autotrader.com/cars-for-sale/vehicle/790571046 |
| vehicle-zip | https://www.autotrader.com/cars-for-sale/vehicle/793391957?zip=90012 |
| listing-json | https://www.autotrader.com/rest/lsc/listing?allListingType=all-cars&numRecords=25&firstRecord=0&channel=ATC&zip=10001&makeCode=FORD |
Every search shape (including the mobile host, the older Title-Case path and the listing JSON service form) is read through the site's listing service with the same filters, and a firstRecord offset in the URL is honoured as the start position. The address-bar forms the site rewrites filters into are read too: a price category segment (cars-under-25000, cars-over-30000, cars-between-10000-and-20000) becomes the matching maximum and minimum price, and body-style segments such as suv-crossover, sedan, truck, convertible, hatchback and wagon become the body-style filter, so a link copied from the browser after you apply a filter scrapes the same search. A path segment that is not a make, model, city or known filter is ignored with a warning instead of being read as a make. Dealer directory pages are not supported: they are skipped with a warning in the log, never silently; to scrape one dealer's stock, paste a search link that ends in ?dealerId= followed by the dealer id and a zip.
Paste one or more AutoTrader URLs:
{"mode": "url","urls": ["https://www.autotrader.com/cars-for-sale/all-cars/honda/civic/los-angeles-ca","https://www.autotrader.com/cars-for-sale/vehicle/000000001"],"maxListings": 60}
Enrich every listing with the full detail page:
{"mode": "search","zip": "90012","make": ["TOYOTA"],"fetchDetails": true,"maxListings": 25}
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/autotrader-com-scraper").call(run_input={"mode": "search","zip": "90012","make": ["HONDA"],"maxListings": 50,})for listing in client.dataset(run["defaultDatasetId"]).iterate_items():print(listing["year"], listing["make"], listing["model"], listing["price"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/autotrader-com-scraper').call({mode: 'search',zip: '90012',make: ['HONDA'],maxListings: 50,});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets, or webhooks from the Integrations tab.
How maxPages and maxListings interact
maxListings is the only cap most runs need: it stops the whole run once that many listings have been collected, and 0 means unlimited. maxPages defaults to 0 (unlimited) and exists only as a safety bound on how many result pages one search or URL walks; the walk already stops on its own once a page comes back empty or repeats listings already collected, or as soon as maxListings is reached, whichever comes first. Set maxPages to a specific number only when you want an explicit page cap below that natural stop.
Resume a large pull
For a very large walk-all pull, use resumeFromRunId in a follow-up run instead of starting over: paste the ID of a previous run (or its dataset), and this run loads the listings it already saved, skips them, and appends only new listings to a fresh dataset. Leave it empty for a normal run. This is a manual continuation of one pull, not a recurring update mechanism; see the FAQ below for scheduled runs.
Send results into your apps (MCP connectors)
Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.
What gets written to the connector: a condensed, human-readable summary of each record, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify, Settings, Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. If the picker is empty, you have not authorized a connector yet.
- For Notion, also set
notionParentPageUrlto the page where item pages should be created; it is required to enable the Notion export, and ignored by other connectors.
The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | search to build a query from filters, or url to paste AutoTrader search or listing links. |
zip | string | none (prefill: 90012) | US ZIP code the search is centred on. Required in search mode. |
searchRadius | integer | 50 | Search radius in miles (10 to 500). |
make | array | none (prefill: ["HONDA"]) | Vehicle make codes, e.g. HONDA, TOYOTA. Empty for all makes. |
model | array | none | Vehicle model codes, e.g. CIVIC, CAMRY. Empty for all models of the selected make(s). |
minYear | integer | none | Oldest model year to include. |
maxYear | integer | none | Newest model year to include. |
minPrice | integer | none | Lowest listing price to include, in USD. |
maxPrice | integer | none | Highest listing price to include, in USD. |
maxMileage | integer | none | Highest odometer reading to include. |
condition | array | none | New, Used, Manufacturer Certified, or Third-Party Certified. Empty for all. |
bodyStyle | array | none | Sedan, SUV/Crossover, Truck, Coupe, Convertible, Hatchback, Van/Minivan, or Wagon. |
fuelType | array | none | Gasoline, Hybrid, Electric, Diesel, Plug-in Hybrid, or Hydrogen. |
driveType | array | none | AWD/4WD, Front Wheel Drive, or Rear Wheel Drive. |
transmission | array | none | Automatic or Manual. |
exteriorColor | array | none | Simplified exterior color, e.g. BLACK, WHITE, RED, BLUE, GRAY. |
vehicleHistory | array | none | Clean Title, No Accidents, No Frame Damage, Single Owner, or Free Report. |
dealType | array | none | Good Price or Great Price, per the site's own price rating. |
sellerType | string | any | Restrict to dealer or private sellers, or leave as any. |
sortBy | string | relevance | Relevance, price, mileage, year, distance, or newest listed. |
urls | array | one example per supported URL shape (see the URL shapes table) | AutoTrader search or listing URLs. URL mode only; the filter fields above are ignored. |
startUrls | array | none | Alias of urls (strings or {url} objects), used when urls is empty or still the shipped examples; when it holds URLs it selects URL mode. |
fetchDetails | boolean | false | Enrich each listing with the fuller per-vehicle page (full options, extended specs, complete history). Adds one extra request per listing. |
maxListings | integer | 20 | The sole soft cap on the run, applied across the whole run, not per page or per search. 0 means unlimited. |
maxPages | integer | 0 | Safety bound on result pages walked per search or URL. 0 means unlimited: the walk stops on its own once a page comes back empty or repeats listings already collected, or sooner once maxListings is reached. |
maxItems | integer | none | Alias of maxListings, used only when maxListings is not set. |
endPage | integer | none | Alias of maxPages, used only when maxPages is not set. |
resumeFromRunId | string | none | Paste a previous run ID or dataset ID to continue a large pull: listings already saved there are skipped, so this run only appends new ones. |
incrementalMode | boolean | false | Label rows NEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED against the previous run and skip UNCHANGED rows. |
stateKey | string | auto | Optional name for the remembered baseline; empty keys it on your search. |
emitUnchanged | boolean | false | Also save UNCHANGED rows. |
emitExpired | boolean | true | Save EXPIRED rows after a completed scan. |
ignoreFieldsForChanges | array | none | Field names that must not count as a change. |
proxy | object | Apify Proxy, Residential group | Connection settings. Leave the country unset. The default Residential group needs a plan that includes it; choosing Datacenter (or Auto) also works and is tried first. |
sessionCookie | string | none | Optional, advanced. Only needed if a run reports it could not retrieve results. Paste the cookie header from a signed-in session on autotrader.com; the actor then uses it for every request. The cookie is short-lived (about 15 to 30 minutes), so capture a fresh one right before the run. Leave blank for normal use. |
mcpConnectors | array | none | Optionally send results into apps you already use via MCP connectors (Notion, Linear, Airtable, Apify). Leave empty to skip; never changes the dataset output. |
notionParentPageUrl | string | none | Notion connector only: page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListings | integer | 50 | Cap on items written to each connector per run (1 to 1000). Does not affect the dataset. |
Not supported: extendOutputFunction and customMapFunction (running user-supplied JavaScript inside the actor). They are intentionally skipped; post-process the dataset with the API or an integration instead.
Output contract
Every row carries a stable string id (the Autotrader vehicle id, the dedup key), mileage exactly as the site shows it (for example the text 43,500), mileageValue (the same figure as a number, for example 43500, null when there is no mileage) and mileageUnit (mi when a mileage is present), plus the parity attributes brand (same as make), stockNumber (dealer stock id), engine, specifications (object), ownerTitle (dealer name) and ownerPhone (null when the dealer does not show a number). Dealer review score and count (ownerRating, ownerRatingCount) are not published in the listing data the actor reads, so they are always null and are not part of the Specs view. The Output tab has four views: Listings Overview, Dealer & Contact, Price & Value Intelligence, and Specs & Dealer (stock, engine, mileage, dealer contact).
Output Example
Sample shape: values are illustrative placeholders, not from a live listing.
{"id": "000000001","vin": "1XXXX00000X000000","url": "https://www.autotrader.com/cars-for-sale/vehicle/000000001","title": "Used 2023 Sample Make Sample Model","year": 2023,"make": "Sample Make","model": "Sample Model","trim": "Sample Trim","price": 22000,"displayPrice": 22000,"dealIndicator": "Great","kbbFairPurchasePrice": 22500,"kbbPriceLow": 21000,"kbbPriceHigh": 23500,"mileage": "30,000","mileageValue": 30000,"mileageUnit": "mi","exteriorColor": "White","interiorColor": "Black","fuelType": "Gasoline","transmission": "Automatic","driveType": "Front Wheel Drive","mpgCity": 30,"mpgHighway": 38,"sellerName": "Sample Motors","sellerType": "dealer","isPrivateSeller": false,"sellerPhone": "+10000000000","sellerCity": "Sample City","sellerState": "CA","sellerZip": "00000","vehicleHistory": {"noAccidentsReported": true,"noSalvageTitle": true,"noFrameDamage": true,"noFloodDamage": true,"singleOwner": true,"freeHistoryReport": false},"images": ["https://images.autotrader.com/000000000.jpg"],"dealer": {"name": "Sample Motors","phone": { "value": "0000000000" },"location": { "address": { "city": "Sample City", "state": "CA", "zip": "00000" } }}}
Plan Requirement
Residential proxies are not required. In our tests the site served real results over Apify datacenter proxies as well as residential ones, so a plan without the Residential group can still run this actor: pick Datacenter (or Auto) in the proxy setting and the actor tries datacenter connections first, then falls back to residential, and to a backup connection on paid plans. The default setting stays on the Residential group; leave the country unset, since results follow the ZIP code you search, not the visitor's location.
The site sometimes answers with a short "page unavailable" notice instead of results (a plain 200 page, roughly 3.7 KB, with an incident number). It is intermittent and the actor treats it as a temporary refusal: it retries the same page on a fresh connection, which in our tests returned the full page, with a 25 second limit per item. If the proxy connection itself is refused, the log says "The selected connection is unavailable to this run." and, on free plans, "Apify free plans do not include residential proxies." while continuing on a backup connection. If nothing at all could be loaded the run ends as failed (see the FAQ), never as an empty success.
FAQ
How much does it cost?
You pay per event: a small charge when the run starts, a charge for each listing returned in the dataset, and an additional charge per listing (the "detail-enrichment" event, billed as each enriched listing is delivered rather than in one batch at the end) when "Fetch full detail per listing" is switched on, or always for a pasted individual listing URL in URL mode regardless of that setting. The Pricing tab shows the current rates. Use Max listings to cap the cost of any run.
Is it legal to scrape AutoTrader?
This actor collects only publicly available vehicle listing data. You are responsible for how you use it: follow AutoTrader's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Listing facts such as price and mileage are generally not protected, but photos and dealer-supplied content may be subject to third-party rights, and seller contact details should be handled carefully.
Can I run this on a schedule to catch new listings?
Yes. Schedule it from the Schedules tab and switch on incrementalMode. The actor remembers what each run returned for the same search (or for your stateKey) and adds changeType (NEW, UPDATED, UNCHANGED, REAPPEARED, EXPIRED), changedFields, firstSeenAt and lastSeenAt to every row. UNCHANGED listings are skipped, and not charged, unless emitUnchanged is on. EXPIRED rows appear only after a scan that completed (not one cut short by Max listings, Max pages or a resume, and not one where a pasted URL was skipped) and can be turned off with emitExpired. Use ignoreFieldsForChanges to keep noisy fields such as distanceFromSearch from counting as changes. Changing Max listings does not start a new baseline. To continue one very large pull across runs, use resumeFromRunId.
What is the difference between maxListings and maxPages?
maxListings is the cap almost everyone wants: it stops the whole run once that many listings are collected. maxPages only bounds how many result pages a single search or URL walks before giving up, and its default of 0 already lets the walk stop naturally on its own. Leave maxPages at 0 unless you specifically want a lower, explicit page limit.
Why did my run fail instead of returning an empty dataset?
If every attempt to load a search is turned away before any results come back, the run stops with a clear failure message so "no vehicles match this search" is never confused with "nothing could be read." Run it again in a few minutes, and keep Apify Proxy on, with no country pinned (Datacenter or Residential both work). If a search legitimately matches nothing, the run still succeeds and simply returns an empty dataset with a status message saying so.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear, or Airtable.
๐ Want more Autotrader data?
Pair this actor with these related scrapers from the same team:
| ๐ AutoTrader UK Scraper Pull structured vehicle listings from autotrader.co.uk at scale. Search by filters or use... | ๐ EasyAuto123 Scraper Scrape EasyAuto123 vehicle listings into clean structured data. Extract prices, VINs... |
| ๐ Cars.com Scraper Scrape cars.com listings by make, ZIP and radius. 90+ fields per car: price, MSRP... | ๐ mobile.de Scraper Scrape mobile.de vehicle listings with 30+ fields including price, mileage, registration... |
| ๐ AutoScout24 Scraper From $0.8/1K. A lean, production-grade scraper for autoscout24.com. Point it at a search... | ๐ Carsales.com.au Scraper Scrape structured vehicle listings from Carsales.com.au from $1 per 1K results. Built to... |
๐ Browse all abotapi scrapers
๐ฌ Support
- ๐ Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- ๐ ๏ธ Need another site, extra fields or a private build? Email contact@abotapi.com.
- โญ Enjoying it? A quick review on the actor page helps other users find it.