# AutoTrader.com \[$1.2💰] USA · VIN, EV Battery, Dealers (`memo23/autotrader-com-scraper`) Actor

AutoTrader.com (USA) scraper: listings by URL or filters, one row per car with VIN, price, mileage, EV battery health, photos and full dealer data (address, phones, hours, rating, website). Reads past the 400-result cap for complete nationwide sweeps. Optional vehicle pages. JSON/CSV.

- **URL**: https://apify.com/memo23/autotrader-com-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** E-commerce, Lead generation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 vehicle listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## AutoTrader.com Scraper (USA) — every listing, VIN, EV battery health and the full dealer block

Turn any AutoTrader.com search into a clean dataset: one row per car with VIN, price, mileage, photos, EV range and battery-health score, and the complete dealer record (address with coordinates, every phone number, opening hours, rating, website). Paste a search URL or pick filters, and the actor collects the whole result set, including searches far bigger than the 400 cars the site itself will page through.

Nationwide sweeps, dealer-only or private-seller cuts, weekly market snapshots, single-vehicle lookups. JSON, CSV, Excel, or straight into your own pipeline through the Apify API.

![How the AutoTrader.com Scraper works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-autotrader-com.png)

***

### Why Use This Scraper?

- **Beats the 400-result window.** AutoTrader.com shows at most 400 cars per search. The actor splits any bigger search by make, price, year and model until every car is reachable, then reconciles the count against the site's own "Matches" total.
- **The dealer comes with the car.** Name, street address, city, state, ZIP, latitude/longitude, typed phone numbers (office, call-tracking), opening hours, rating and review count, website, contract level. No second scrape needed.
- **EV data the search page hides.** Battery-health rating and description, rating source, min/max range, EV range when new, charging time, plus VIN, KBB vehicle id and days on site.
- **Two ways in.** Paste any AutoTrader.com search or vehicle URL, or use plain filters (make, model, ZIP, radius, price, year, mileage, condition, fuel, seller type, sort).
- **Optional full galleries, two ways.** A light toggle pulls every photo (often 30 to 70) from the site's listing API at about a tenth of the cost of a page; a full toggle opens the vehicle page for the gallery plus the description, feature list, warranties and stock number.
- **Completeness you can enforce.** Whole-market runs can be told to fail unless the collected count is within a tolerance of the site total, so a scheduled sweep never silently ships a partial file.
- **Runs on its own residential proxies.** Traffic goes through US residential IPs at no extra cost; you pay per result.

***

### Overview

This actor is for anyone who needs structured AutoTrader.com data: market analysts tracking used-EV prices, dealers benchmarking inventory, lead-generation teams building dealer lists, researchers, and developers feeding car data into apps and AI agents.

The primary entity is the **vehicle listing**. Every dataset row is one car, with the site's own listing object passed through unchanged, a set of flat convenience columns in front of it (`priceUsd`, `mileageMiles`, `makeName`, `batteryHealthRating`, `dealerPhone`, ...), and the seller attached as a nested `dealer` object. Search pages carry 1 to 4 photos per car; the optional vehicle-page fetch replaces that with the full gallery and adds description, features and warranties.

Default runs read search pages only, so a nationwide sweep of tens of thousands of cars costs a couple of thousand requests. Gallery or vehicle-page enrichment adds one request per car.

***

### Supported Inputs

#### URL types

| Type | Example | What you get |
|---|---|---|
| Search results page (any filters, any location) | `https://www.autotrader.com/cars-for-sale/used-cars/electric?searchRadius=0&zip=10001&sellerType=d` | Every car in the result set, split automatically when it exceeds 400 |
| Search built on the site with make/model/price/year/etc. | `https://www.autotrader.com/cars-for-sale/all-cars/tesla/model-3?zip=90210&searchRadius=100&minPrice=20000&maxPrice=40000` | Same, respecting every filter in the URL |
| Vehicle page | `https://www.autotrader.com/cars-for-sale/vehicle/790084839` | That one car, always with the full gallery and details |

`searchRadius=0` with any ZIP means the whole USA. Page numbers (`firstRecord`, `numRecords`) and tracking parameters in a pasted URL are ignored; the actor pages through the complete result set itself.

#### Copy-pasteable startUrls

```json
{
  "startUrls": [
    { "url": "https://www.autotrader.com/cars-for-sale/used-cars/electric?searchRadius=0&zip=10001&sellerType=d" },
    { "url": "https://www.autotrader.com/cars-for-sale/vehicle/790084839" }
  ],
  "maxItems": 50000
}
```

#### Filter mode

Leave `startUrls` empty and fill the filters instead. The actor builds the search URL for you: `searchMake` (name or code), `searchModel` (site model code), `zip`, `searchRadius` (miles, 0 = nationwide), `priceMin`/`priceMax`, `yearMin`/`yearMax`, `maxMileage`, `condition`, `fuelType`, `sellerType`, `sort`. When any Start URL is present, URL mode wins and filters are ignored.

#### Unsupported inputs

- Dealer inventory pages (`/car-dealers/...`) and dealer profile pages. Dealer data is attached to every car instead.
- Saved searches, alerts, "My Autotrader" and anything behind a login.
- Vehicle history reports (Carfax/AutoCheck), KBB Instant Cash Offers, financing calculators.
- Other AutoTrader sites. Use the dedicated actors for [AutoTrader.co.uk](https://apify.com/memo23/autotrader-cheerio), [AutoTrader.ca](https://apify.com/memo23/autotrader-ca-scraper) and [AutoTrader.com.au](https://apify.com/memo23/autotrader-australia-cheerio).

***

### Use Cases

| Who | What they do with it |
|---|---|
| Market analysts and pricing teams | Weekly nationwide snapshots of used-EV prices, mileage and battery health by make, model and year |
| Dealers and dealer groups | Benchmark inventory and pricing against every competitor in a radius, track days on site |
| Lead generation and sales | Dealer lists with typed phone numbers, addresses, hours, ratings and websites, straight from the listings they run |
| Investors and researchers | Supply counts, price trends and EV adoption data per state, brand or segment |
| Developers and AI agents | Structured car data for apps, chatbots and agents through the Apify API or MCP server |
| Agencies and data vendors | Repeatable exports for clients, scheduled on Apify, delivered as CSV, JSON or webhook |

***

### How It Works

1. **Input.** Paste search or vehicle URLs, or set the filters. Choose whether to fetch vehicle pages and how many cars you need.
2. **Probe the search.** The actor reads the search page, notes the site's "Matches" total and the effective filters, and checks that the site's count endpoint agrees with them.
3. **Split past the 400 cap.** Any search bigger than the site's window is divided by make, then price band, then model year, then model, until every segment fits. Each segment is measured through the count endpoint for a few bytes; overlapping bands are deduplicated by listing id.
4. **Read every page.** Each segment is paged in 100-record windows, including the partial last page the site otherwise hides. Cars that the site pads in from outside the filters are dropped.
5. **Build the rows.** Each car is joined with its dealer record and pushed as one row. With `includeDetails` the vehicle page is fetched first for the full gallery, description, features and warranties. At the end the collected count is compared with the site total and, if you asked for it, the run fails when it falls short.

***

### Input Configuration

#### Input fields

| Field | Type | Default | Description |
|---|---|---|---|
| `startUrls` | array | prefilled example | AutoTrader.com search or vehicle URLs. When present, filters below are ignored. |
| `searchMake` | string | – | Make name or site code, e.g. `Tesla`, `Ford`, `Mercedes-Benz`. |
| `searchModel` | string | – | Model code as in the site URL after `modelCodeList=`, e.g. `GMCHUMMER`. Only with a make. |
| `zip` | string | `10001` when needed | ZIP code to centre the search on. |
| `searchRadius` | integer | `0` | Miles around the ZIP. `0` = whole USA. |
| `priceMin` / `priceMax` | integer | – | Asking price bounds in USD. |
| `yearMin` / `yearMax` | integer | – | Model year bounds. |
| `maxMileage` | integer | – | Highest odometer reading in miles. |
| `condition` | select | `all` | `all`, `new`, `used`, `certified`. |
| `fuelType` | select | any | `ELE` electric, `GSL` gasoline, `HYB` hybrid, `PIH` plug-in hybrid, `DSL` diesel, `HYD` hydrogen. |
| `sellerType` | select | `all` | `all`, `dealer`, `private`. |
| `sort` | select | `relevance` | Site ordering: price, mileage, year, newest listings. Matters when `maxItems` caps the run. |
| `includeGallery` | boolean | `false` | Fetch each car's record from the site's listing API: every photo as light JSON (about 54 KB per car). One extra request per car, billed as an additional-data event. Skipped when `includeDetails` is on. |
| `includeDetails` | boolean | `false` | Fetch each vehicle page: full gallery, description, features, warranties, stock number. One extra request per car (about 500 KB), billed as an additional-data event. |
| `enrichEmails` | boolean | `false` | Experimental: find a contact email for each dealer from its own website. Adds `contactEmail`, `contactWebsite`, `emailEnrichment`. |
| `failIfIncomplete` | boolean | `false` | Finish with status FAILED when the collected count is short of the site total by more than the tolerance. Ignored when `maxItems` caps the run. |
| `completenessTolerancePct` | integer | `3` | Allowed shortfall in percent. The larger of this and `completenessToleranceMin` applies. |
| `completenessToleranceMin` | integer | `25` | Allowed shortfall in listings, so a small search is not failed over a handful of cars sold during the run. |
| `maxItems` | integer | `1000` | Maximum cars to collect. Set it above the site's "Matches" count for a complete sweep. |
| `maxConcurrency` / `minConcurrency` | integer | `10` / `1` | Parallel requests. |
| `maxRequestRetries` | integer | `8` | Retries per failed request. |
| `countProbes` | boolean | `true` | Measure search segments through the site's own count endpoint (a few bytes each) instead of full search pages. Falls back to full pages by itself when the endpoint disagrees with the search page or stops answering. |
| `proxy` | object | built-in | Leave empty; paid runs already use the actor's own US residential proxies. |

#### Common scenarios

**Whole-market weekly sweep: every used EV sold by dealers in the USA**

```json
{
  "startUrls": [{ "url": "https://www.autotrader.com/cars-for-sale/used-cars/electric?searchRadius=0&zip=10001&sellerType=d" }],
  "maxItems": 60000,
  "failIfIncomplete": true,
  "completenessTolerancePct": 3,
  "maxConcurrency": 16
}
```

**Filter mode: used Teslas under $30,000 from dealers, cheapest first**

```json
{
  "searchMake": "Tesla",
  "condition": "used",
  "fuelType": "ELE",
  "sellerType": "dealer",
  "priceMax": 30000,
  "sort": "derivedpriceASC",
  "maxItems": 500
}
```

**Specific cars with the full gallery and description**

```json
{
  "startUrls": [
    { "url": "https://www.autotrader.com/cars-for-sale/vehicle/790084839" },
    { "url": "https://www.autotrader.com/cars-for-sale/vehicle/783554741" }
  ],
  "includeDetails": true,
  "maxItems": 10
}
```

***

### Output Overview

One row per vehicle. Each row has three layers:

- **Flat convenience columns first**: `id`, `url`, `vin`, `year`, `makeName`, `modelName`, `trimName`, `title`, `listingType`, `priceUsd`, `mileageMiles`, `fuelTypeName`, `evRangeMiles`, `batteryHealthRating`, `batteryHealthDescription`, `batteryHealthSource`, `dealerName`, `dealerPhone`, `dealerCity`, `dealerState`, `dealerZip`, `dealerWebsite`, `dealerRating`, `dealerRatingCount`, `dealerLevel`. These are what you want in a spreadsheet.
- **The site's own listing object, unchanged**: `make`, `model`, `trim` (code + name), `pricingDetail`, `pricingHistory`, `mileage`, `images`, `specifications`, `electricComponentInfo`, `phone`, `kbbVehicleId`, `daysOnSite`, `listingTypes`, `fuelType`, `packages`, `styles` and everything else the page carries, under their original names.
- **Attachments**: `imageUrls` (plain array of photo URLs), `imagesCount`, `dealer` (the complete seller object, unchanged), `source` (`srp` for search-page data, `lsc` when the listing API was fetched for the gallery, `vdp` when the vehicle page was fetched, `srp-fallback` when a detail fetch failed after retries), `scrapedAt`.

With `includeDetails: true` the row also carries `fullDescription`, `features` (grouped lists), `warranties`, `stockNumber`, `exteriorColorSimple`, `driveGroup`, `videos` and the full gallery. Nested fields flatten to `dealer.location.address.city` style columns in CSV exports.

***

### Output Samples

#### Search-page start with `includeDetails: true`, trimmed to the useful fields

```json
{
  "id": 790084839,
  "url": "https://www.autotrader.com/cars-for-sale/vehicle/790084839",
  "vin": "5YJSA1E6XPF510652",
  "year": 2023,
  "makeName": "Tesla",
  "modelName": "Model S",
  "trimName": "Plaid",
  "title": "Used 2023 Tesla Model S Plaid",
  "listingType": "Used",
  "priceUsd": 76870,
  "mileageMiles": 24759,
  "fuelTypeName": "Electric",
  "evRangeMiles": 405,
  "batteryHealthRating": 88,
  "batteryHealthDescription": "GREAT",
  "batteryHealthSource": "Manheim Average",
  "dealerName": "Rolling Hills Auto Plaza",
  "dealerPhone": "8166714500",
  "dealerCity": "Saint Joseph",
  "dealerState": "MO",
  "dealerZip": "64506",
  "dealerWebsite": "https://www.rollinghillshonda.com/used-St+Joseph-2023-Tesla-Model+S-Plaid-5YJSA1E6XPF510652?stocknum=H15044A&atc_ownerid=57200741&utm_source=autotrader.com&utm_medium=referral&utm_campaign=autotrader_listings",
  "dealerRating": 4.8,
  "dealerRatingCount": 1661,
  "dealerLevel": "PARTNER",
  "daysOnSite": 5,
  "kbbVehicleId": 464199,
  "stockNumber": "H15044A",
  "imagesCount": 67,
  "imageUrls": [
    "https://images.autotrader.com/hn/c/c4aebdaa1e0947948dbf93d3e15572ad.jpg",
    "https://images.autotrader.com/hn/c/9efb9bdf7c454054b8aa725a1bbb81e7.jpg",
    "…"
  ],
  "dealer": {
    "id": 57200741,
    "name": "Rolling Hills Auto Plaza",
    "contractDealerLevel": "PARTNER",
    "privateSeller": false,
    "location": {
      "address": {
        "address1": "1617 CROSS STREET",
        "city": "Saint Joseph",
        "latitude": 39.78181,
        "longitude": -94.80043,
        "state": "MO",
        "zip": "64506"
      }
    },
    "phoneNumbers": [
      {
        "label": "Phone number",
        "privateNumber": false,
        "type": "KBB_CALL_TRACKING_USED",
        "value": "8165570415",
        "visible": true
      },
      {
        "label": "Phone number",
        "privateNumber": false,
        "type": "KBB_CALL_TRACKING_NEW",
        "value": "8165570339",
        "visible": true
      }
    ],
    "hours": [
      {
        "close": "8:00 PM",
        "label": "Monday",
        "open": "9:00 AM"
      },
      "…"
    ],
    "rating": {
      "count": 1661,
      "value": 4.8
    },
    "website": {
      "deepLink": true,
      "href": "https://www.rollinghillshonda.com/used-St+Joseph-2023-Tesla-Model+S-Plaid-5YJSA1E6XPF510652?stocknum=H15044A&atc_ownerid=57200741&utm_source=autotrader.com&utm_medium=referral&utm_campaign=autotrader_listings"
    }
  },
  "features": {
    "exterior": [
      "Alloy wheels",
      "Auto High-beam Headlights",
      "Auto-dimming door mirrors",
      "…"
    ],
    "interior": [
      "Air Conditioning",
      "Auto-dimming Rear-View mirror",
      "Driver door bin",
      "…"
    ]
  },
  "fullDescription": "**Home Delivery Available**.<br><br>2023 Tesla Model S Plaid AWD Electric Motor 1-Speed Automatic 4D Hatchback Pearl White Multi-Coat<br><br…",
  "source": "vdp",
  "scrapedAt": "2026-09-08T21:32:21.724Z"
}
```

Dropped for brevity: the remaining `imageUrls`, the full `dealer.phoneNumbers` and `dealer.hours` arrays, `pricingDetail`, `specifications`, `features` beyond the first few, and the rest of the original listing object.

***

### Key Output Fields

#### Vehicle core

`id`, `url`, `vin`, `year`, `makeName`, `modelName`, `trimName`, `title`, `listingType` (`USED`, `NEW`, `CERTIFIED`), `fuelTypeName`, `mileageMiles`, `daysOnSite`, `kbbVehicleId`, `stockNumber` (details)

#### Price

`priceUsd`, `priceLabel` (set when the site shows no price, e.g. "Contact Dealer For Price"), `pricingDetail` (sale, display and pre-fee derived price, dealer fees, KBB fair-price range), `pricingHistory`

#### EV and battery

`evRangeMiles`, `batteryHealthRating` (0 to 100), `batteryHealthDescription`, `batteryHealthSource`, `electricComponentInfo.batteryDegradationInfo` (min/max range, score date and expiry)

#### Photos

`imageUrls`, `imagesCount`, `images` (original object with dimensions and alt text)

#### Dealer

`dealerName`, `dealerPhone`, `dealerCity`, `dealerState`, `dealerZip`, `dealerWebsite`, `dealerRating`, `dealerRatingCount`, `dealerLevel`, and the full `dealer` object: `location.address` (street, city, state, ZIP, latitude, longitude), `phoneNumbers[]` with `type` (`PRIMARY_OFFICE`, `CALL_TRACKING`, ...), `hours[]`, `rating`, `website`, `privateSeller`, `isVirtual`

#### Detail-mode extras (`includeDetails: true`)

`fullDescription`, `features` (exterior, interior, safety, ...), `warranties`, `packages`, `videos`, `exteriorColorSimple`, `driveGroup`

#### Bookkeeping

`source`, `scrapedAt`, and with `enrichEmails`: `contactEmail`, `contactWebsite`, `emailEnrichment`

***

### FAQ

#### Which AutoTrader.com URLs are supported?

Any search results URL under `/cars-for-sale/` (with path filters like `/used-cars/electric` or `/all-cars/tesla/model-3`, and query filters like `zip`, `searchRadius`, `minPrice`, `maxPrice`, `startYear`, `endYear`, `makeCodeList`, `sellerType`) and vehicle pages under `/cars-for-sale/vehicle/{id}`. Dealer pages and anything behind a login are not supported.

#### The site only shows 400 results. How do you get 43,000?

AutoTrader.com silently returns page 1 again for anything past record 400. The actor treats every search as a segment: if its "Matches" total is above the window it is split by make, then by price band (using the price distribution of the page as the pivot), then by model year, then by model, and as a last resort re-read through several sort orders. Every segment is paged in 100-record windows, the partial last page is read through a backward-aligned window the site does accept, and listing ids are deduplicated across overlapping segments. A nationwide used-EV dealer sweep of ~44,000 cars resolves into a few hundred segments: roughly 2,500 count probes of a few bytes each plus about 1,100 full search pages, finishing in around 10 minutes at the default concurrency.

#### What does `failIfIncomplete` compare against?

The "Matches" total the site reported on the very first search page of the run. That number keeps moving while a long run is in progress (cars are listed and sold every minute), which is why a tolerance exists: the larger of `completenessTolerancePct` and `completenessToleranceMin` listings. Every run writes a `COMPLETENESS` record to its key-value store (site total at start, collected, shortfall, deviation, the tolerance that applied, segment statistics) and puts the same summary in the run status message. With `failIfIncomplete: true` the run ends with status FAILED when the shortfall exceeds the tolerance, so a scheduled sweep can never pass off a partial dataset as complete. A run capped by `maxItems` is never judged incomplete.

#### What about cars listed as "Contact Dealer For Price"?

They are collected too. AutoTrader.com drops unpriced cars from any search that carries a price bound, which is exactly how big searches have to be split, so the actor runs a separate pass for them: the same segment cut by model year, model, colour and trim instead of price, reading the tail of the price-sorted order where unpriced cars sit. Their rows have `priceUsd: null` and `priceLabel: "Contact Dealer For Price"`.

#### Do I get dealers or private sellers?

Whatever your search asks for. `sellerType=d` (or the `dealer` filter) restricts to dealers, `sellerType=p` to private sellers, and the `dealer.privateSeller` flag on every row tells you which one you got. When a filter combination has no exact matches the site pads the page with similar cars from outside the filters; the actor detects that and drops them.

#### Is battery health available for every EV?

For most: in nationwide used-EV tests about 95% of listings carried a `batteryDegradationInfo` block (rating, description, source such as Manheim, min/max range). Where the dealer did not provide it the fields are `null`.

#### Why do search-page rows have only a few photos?

Search pages embed 1 to 4 photos per car. Turn on `includeGallery` to fetch each car's record from the site's listing API: every photo (30 to 70 is typical) as light JSON, one extra request per car, about a tenth of the traffic of a vehicle page. Turn on `includeDetails` instead when you also need the full description, feature list, warranties and stock number; that opens each vehicle page and includes the gallery.

#### What does the actor NOT scrape?

Vehicle history reports (Carfax, AutoCheck), dealer inventory and profile pages, consumer reviews, KBB valuations beyond the fair-price fields already embedded in the listing, financing offers, and any data that requires an account. Emails are not on the site; the experimental `enrichEmails` option discovers them from the dealer's own website.

#### How fast is it and what concurrency should I use?

Search pages weigh about 1.3 MB each and answer in a few seconds through residential proxies; count probes answer in under a second. A default `maxConcurrency` of 10 is safe; whole-market sweeps run comfortably at 16 to 24. A search-only sweep of ~44,000 cars finishes in about 10 minutes at concurrency 16. With `includeGallery` every car is one more light request (about 1.5 seconds each; a ~44,000-car sweep takes 1 to 2.5 hours at `maxConcurrency` 16 to 32). With `includeDetails` the vehicle pages are heavier and slower, so plan a multi-hour run at `maxConcurrency` 24 to 32 with 1 GB of memory.

#### Can I schedule it?

Yes. Run it weekly with `failIfIncomplete: true` and connect a webhook or the Apify integration of your choice; the completeness figures are in the log and in the run's status message when it fails.

***

### Support

- Report a problem or request a field in the **Issues** tab of the actor page.
- Website: [muhameddidovic.com](https://muhameddidovic.com)
- Email: <muhameddidovic@gmail.com>

***

### Additional Services

Need a tailored export (custom columns, deduplication against your CRM, delivery to S3, BigQuery or a webhook), a private version of this actor, or another automotive marketplace covered? Get in touch through the email above.

***

### Explore More Scrapers

- [AutoTrader.co.uk Scraper](https://apify.com/memo23/autotrader-cheerio) — the UK marketplace, richest output
- [AutoTrader.ca Scraper](https://apify.com/memo23/autotrader-ca-scraper) — Canada, filter search plus VIN/CarFax
- [AutoTrader.com.au Scraper](https://apify.com/memo23/autotrader-australia-cheerio) — Australia
- [Cars.com Scraper](https://apify.com/memo23/cars-scraper) — VIN, price history, dealer data
- [All memo23 actors](https://apify.com/memo23)

***

### 🤖 For AI Agents & LLM Apps

Compact reference for AI agents calling this actor via the [Apify MCP server](https://mcp.apify.com) or the Apify API (actor: `memo23/autotrader-com-scraper`).

**Purpose:** Scrape AutoTrader.com (USA) vehicle listings by pasted search/vehicle URL or by filters (make, model code, ZIP, radius, price, year, mileage, condition, fuel, seller type). Every row carries VIN, price, mileage, EV battery health and the full dealer record.

**Minimal input:**

```json
{
  "searchMake": "Tesla",
  "fuelType": "ELE",
  "sellerType": "dealer",
  "priceMax": 30000,
  "maxItems": 25
}
```

URL alternative: `{ "startUrls": [{ "url": "https://www.autotrader.com/cars-for-sale/used-cars/electric?searchRadius=0&zip=10001&sellerType=d" }], "maxItems": 25 }`.

**Output:** one row per vehicle — id, url, vin, year, makeName, modelName, trimName, title, listingType, priceUsd, priceLabel, mileageMiles, fuelTypeName, evRangeMiles, batteryHealthRating, batteryHealthDescription, batteryHealthSource, dealerName, dealerPhone, dealerCity, dealerState, dealerZip, dealerWebsite, dealerRating, dealerRatingCount, dealerLevel, imageUrls\[], imagesCount, dealer {name, location.address {address1, city, state, zip, latitude, longitude}, phoneNumbers\[], hours\[], rating, website, privateSeller}, plus the original listing object (pricingDetail, pricingHistory, specifications, electricComponentInfo, daysOnSite, kbbVehicleId, ...), source, scrapedAt. With includeDetails: fullDescription, features, warranties, stockNumber, full gallery.

**Behaviors an agent should know:**

- `startUrls` win when present; otherwise the filters are used. `searchRadius: 0` means the whole USA.
- Always set `maxItems` (default 1000). Searches bigger than 400 cars are split automatically; `maxItems` caps the total.
- `includeGallery: true` fetches one light API record per car (every photo); `includeDetails: true` fetches the vehicle page instead (gallery plus description, features, warranties). Both off by default.
- `failIfIncomplete: true` ends the run with FAILED when the collected count is short of the site total by more than the tolerance (the larger of `completenessTolerancePct`, default 3, and `completenessToleranceMin`, default 25 listings). Every run stores a `COMPLETENESS` record in its key-value store with the site total, collected count and deviation.
- `dealer.privateSeller` tells dealer rows from private sellers; `priceUsd` is `null` when the site shows "Contact Dealer For Price".
- Pay-per-result billing: one dataset row per vehicle, plus one additional-data event per vehicle page when `includeDetails` is on. See the Pricing tab on the actor page.

***

### ⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Autotrader.com, Autotrader, Inc., Cox Automotive, Inc., Cox Enterprises, Inc., or any of their subsidiaries or affiliates. All trademarks mentioned are the property of their respective owners.

The scraper accesses only publicly available vehicle-listing data — no authenticated endpoints, dealer-only features, or content behind an AutoTrader.com login. Users are responsible for ensuring their use complies with AutoTrader.com's Terms of Service, applicable data-protection law (CCPA, GDPR, etc.), and any contractual obligations of their own organisation.

***

### SEO Keywords

autotrader.com scraper, autotrader scraper, scrape autotrader, autotrader api, autotrader usa scraper, used car listings scraper, us car listings api, car dealer data scraper, dealer phone numbers scraper, used ev listings data, ev battery health data, tesla listings scraper, vehicle listings dataset usa, car price data usa, automotive market data, car inventory scraper, autotrader csv export, autotrader json export, apify autotrader, scrape car listings usa, cars.com alternative scraper, cargurus alternative scraper, used car market data

# Actor input Schema

## `startUrls` (type: `array`):

Search pages (<code>/cars-for-sale/used-cars/electric?zip=10001\&searchRadius=0</code>) or vehicle pages (<code>/cars-for-sale/vehicle/{id}</code>). Page numbers in the URL are ignored; the whole result set is collected.

## `searchMake` (type: `string`):

Vehicle make, e.g. <strong>Tesla</strong>, <strong>Ford</strong>, <strong>Mercedes-Benz</strong>. Optional.

## `searchModel` (type: `string`):

Model code as it appears in an AutoTrader.com URL after <code>modelCodeList=</code>, e.g. <strong>GMCHUMMER</strong>. Only applied when a Make is set.

## `zip` (type: `string`):

US ZIP code to centre the search on, e.g. <strong>10001</strong>. With radius 0 it only anchors the search and the whole country is covered.

## `searchRadius` (type: `integer`):

Distance in miles around the ZIP code. <strong>0 = nationwide</strong>.

## `priceMin` (type: `integer`):

Lowest asking price. Clear or use 0 for no minimum.

## `priceMax` (type: `integer`):

Highest asking price. Clear for no maximum.

## `yearMin` (type: `integer`):

Oldest model year to include, e.g. 2020. Clear for no minimum.

## `yearMax` (type: `integer`):

Newest model year to include, e.g. 2025. Clear for no maximum.

## `maxMileage` (type: `integer`):

Highest odometer reading in miles, e.g. 50000. Clear for no maximum.

## `condition` (type: `string`):

New, used, manufacturer-certified, or everything.

## `fuelType` (type: `string`):

Restrict to one fuel type. Leave on Any for all.

## `sellerType` (type: `string`):

Dealers, private sellers, or both.

## `sort` (type: `string`):

Result ordering on the site. Only affects which cars come first when Max results caps the run.

## `includeGallery` (type: `boolean`):

Search pages carry 1-4 photos per car. This fetches each car's record from the site's listing API to add every photo (often 30-70) as light JSON, about a tenth of the cost of a full vehicle page. Skipped when 'Fetch vehicle pages' is on, which includes the gallery. Billed as an <em>additional data</em> event.

## `includeDetails` (type: `boolean`):

Search pages carry 1-4 photos per car. Enable this to open each vehicle page and add the full gallery (often 30+ photos), the full description, the feature list, warranties and stock number. One extra request per vehicle, billed as an <em>additional data</em> event.

## `enrichEmails` (type: `boolean`):

If enabled, finds a contact email for each dealer from its own website (or by discovering it from the name). Adds contactEmail + contactWebsite columns plus a detailed emailEnrichment object. Best-effort.

## `failIfIncomplete` (type: `boolean`):

Finish with status FAILED when the collected count is short of the site's total by more than the tolerance (the larger of the percentage and the absolute number below). The site total keeps moving while a run is in progress. Ignored when Max results caps the run. The figures are always written to the run's COMPLETENESS record in the key-value store and to the run status message.

## `completenessTolerancePct` (type: `integer`):

Allowed shortfall in percent before the run is marked FAILED. The deviation is always logged.

## `completenessToleranceMin` (type: `integer`):

Allowed shortfall as an absolute number of listings. The larger of this and the percentage applies, so small searches are not failed over a handful of cars that sold during the run.

## `maxItems` (type: `integer`):

Maximum number of vehicles to collect. Set it above the site's "Matches" count for a complete sweep.

## `maxConcurrency` (type: `integer`):

Maximum parallel requests.

## `minConcurrency` (type: `integer`):

Minimum parallel requests.

## `maxRequestRetries` (type: `integer`):

Retries per failed request before giving up.

## `countProbes` (type: `boolean`):

Measures each search segment through AutoTrader's own listing count endpoint (a few bytes per probe) instead of downloading full search pages, which makes whole-market sweeps several times cheaper and faster. The actor falls back to full pages on its own if the endpoint disagrees with the search page or stops answering.

## `proxy` (type: `object`):

Leave empty — the actor already routes all traffic through its own built-in US residential proxy at no extra cost to you. Only set this if you want to use your own proxies.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.autotrader.com/cars-for-sale/used-cars/electric?searchRadius=0&zip=10001&sellerType=d"
    }
  ],
  "searchMake": "Tesla",
  "zip": "10001",
  "searchRadius": 0,
  "condition": "all",
  "fuelType": "",
  "sellerType": "all",
  "sort": "relevance",
  "includeGallery": false,
  "includeDetails": false,
  "enrichEmails": false,
  "failIfIncomplete": false,
  "completenessTolerancePct": 3,
  "completenessToleranceMin": 25,
  "maxItems": 1000,
  "maxConcurrency": 10,
  "minConcurrency": 1,
  "maxRequestRetries": 8,
  "countProbes": true
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `allItems` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://www.autotrader.com/cars-for-sale/used-cars/electric?searchRadius=0&zip=10001&sellerType=d"
        }
    ],
    "searchMake": "Tesla",
    "zip": "10001"
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/autotrader-com-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [{ "url": "https://www.autotrader.com/cars-for-sale/used-cars/electric?searchRadius=0&zip=10001&sellerType=d" }],
    "searchMake": "Tesla",
    "zip": "10001",
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/autotrader-com-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.autotrader.com/cars-for-sale/used-cars/electric?searchRadius=0&zip=10001&sellerType=d"
    }
  ],
  "searchMake": "Tesla",
  "zip": "10001"
}' |
apify call memo23/autotrader-com-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/autotrader-com-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/RfVSzcKolp7ztmIcN/builds/Y2XjeaPOCUhB6NP8B/openapi.json
