# AutoTrader Vehicle Listings Scraper (US & UK) (`usestring/autotrader-listings`) Actor

Scrape AutoTrader car listings from a ZIP code, a UK postcode or a search URL you built on the site. Rows carry year, make, model and trim, numeric price and mileage, VIN, body style, fuel and transmission, plus the selling dealer's name, city and state. Covers autotrader.com and autotrader.co.uk.

- **URL**: https://apify.com/usestring/autotrader-listings.md
- **Developed by:** [String](https://apify.com/usestring) (community)
- **Categories:** E-commerce, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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 Scraper — car listings, price, mileage and dealer

This Actor scrapes AutoTrader vehicle listings in the United States (`autotrader.com`) and the United
Kingdom (`autotrader.co.uk`). Give the AutoTrader Scraper a ZIP code, a UK postcode or a full
AutoTrader search URL and it returns up to **100 US listings per search** with year, make, model,
trim, **numeric** price, mileage, VIN and the selling dealer.

No AutoTrader account, login or cookies are used — this reads what a logged-out visitor sees. Paid
spotlight and boost placements are excluded from US results, so a row is an answer to the search
rather than an advert.

### What it returns

| Field | Type | Notes |
| --- | --- | --- |
| `listingId` | string | AutoTrader's own listing ID — stable across runs, use it to de-duplicate |
| `title` | string | e.g. `"New 2026 Hyundai Santa Fe SEL"` |
| `year` | number | |
| `make`, `model`, `trim` | string | Split, not one blob |
| `price` | number | `43413`, not `"$43,413"`. UK prices are the total including fees |
| `priceText` | string | The formatted price, or the dealer's own label when no price is published |
| `mileage` | number | Numeric, e.g. `126431` |
| `vin` | string | US listings only |
| `bodyStyle` | string | US listings only, e.g. `Sport Utility` |
| `fuelType` | string | US listings only, e.g. `Gasoline` |
| `transmission` | string | US listings only, e.g. `Automatic` |
| `dealerName` | string | The selling dealer |
| `city` | string | Dealer city (US) or vehicle location (UK) |
| `state` | string | US listings only |
| `detailUrl` | string | Link to the AutoTrader listing page |
| `sourceUrl`, `collectedAt` | string | Provenance for every row |

`autotrader.com` and `autotrader.co.uk` are separate products sharing a brand, and their result data
differs. UK rows carry `listingId`, `title`, `year`, `make`, `model`, `trim`, `price`, `priceText`,
`mileage`, `dealerName`, `city` and `detailUrl`; `vin`, `bodyStyle`, `fuelType`, `transmission` and
`state` are `null` on UK rows because the UK results API does not return them.

### Input

```json
{ "searches": ["78701", "https://www.autotrader.com/cars-for-sale/all-cars?zip=10001"], "market": "us" }
```

| Field | Description |
| --- | --- |
| `searches` | US ZIP codes, UK postcodes, or full AutoTrader search URLs. Required, 1–100. |
| `market` | `us` (default) for `autotrader.com` or `uk` for `autotrader.co.uk`. |
| `maxItems` | Cap on dataset items. Default 1000. Free plans stop at 250 requests and 250 results — see below. |
| `concurrency` | Searches run in parallel. Default 5, maximum 10. |

A bare US ZIP code searches all cars within 50 miles and asks for 100 records — the most one
autotrader.com results page serves. A bare UK postcode searches from that postcode. Pass a full
search URL instead to keep the filters you built on the site: for the UK market, `postcode`, `make`,
`model`, `radius`, `price-from`, `price-to`, `year-from`, `year-to`, `minimum-mileage`, `maximum-mileage`,
`fuel-type`, `body-type`, `transmission`, `colour`, `doors`, `seller-type`, `sort` and `page` are
carried through.

### Use cases

- Used-car pricing and market analysis by make, model, trim and mileage band
- Dealer inventory monitoring — which cars a dealership is listing, and at what price
- Building a VIN-keyed dataset of US listings for valuation or history work
- Lead lists of dealerships by market, from `dealerName`, `city` and `state`
- Tracking price drops and days on the lot by re-running a search on a schedule

### Reliability

The AutoTrader Scraper reads the US market from the search page's own hydrated state — the same
listing objects AutoTrader's private listing API returns — so prices, mileages and VINs are exact
values rather than card text. The UK market ships an empty document and calls a GraphQL gateway from
the browser, so the AutoTrader Scraper calls that gateway directly and takes only natural listings,
leaving adverts out of the result set.

A search that cannot be read is recorded in the run's `SUMMARY` under `failures` rather than silently
returning fewer rows, and a run where every search failed exits with an error.

There are no retries by design: the String Unblocker owns proxy rotation and anti-bot solver
selection, so a retry loop here would only re-roll the same block.

### Frequently asked questions

**Do I need an AutoTrader account, API key or cookies?** No. The AutoTrader Scraper reads public
search results as a logged-out visitor, and never signs in.

**Which countries does the AutoTrader Scraper support?** The United States and the United Kingdom,
selected with the `market` field. `autotrader.com` and `autotrader.co.uk` are the only sites read.

**How many listings does one search return?** Up to 100 in the US market, which is the maximum one
autotrader.com results page serves. The UK market returns one page of gateway results per search; add
`page=2` to a UK search URL to read the next page.

**Does every listing have a VIN?** US listings carry `vin` when AutoTrader publishes it. UK listings
never do — the UK results API returns no VIN, fuel type, transmission or body style.

**Are sponsored listings included?** No. The US market takes only the active search results, so
spotlight and boost placements — which are paid slots rather than answers to your search — are left
out.

**Why does a row have `priceText` but no `price`?** Because the dealer publishes no price. `priceText`
then carries the dealer's own label, such as `"Contact Dealer For Price"`.

### Limitations

Search results only: vehicle history reports, photo sets, full option and feature lists, seller phone
numbers and financing terms are out of scope. One results page per search, so run several narrower
searches — by make, model or price band — to widen coverage. UK rows omit VIN, body style, fuel type
and transmission, and only `autotrader.com` and `autotrader.co.uk` URLs are accepted.

### Free plan limit

Runs started from an Apify **free plan** stop at **250 requests and 250 results**, and the run
reports that it reached the limit. Any paid plan runs the full input and `maxItems` you set.

The limit exists because this Actor fetches through our own infrastructure, which Apify does not
cover for free-plan runs. It binds on requests as well as results so that a large input list cannot
spend those fetches for rows the run will not return.

# Actor input Schema

## `searches` (type: `array`):

ZIP/postcode, or a full AutoTrader search URL.

## `market` (type: `string`):

Which AutoTrader site to read.

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

Global cap on dataset items. Runs started from an Apify free plan stop at 250 requests and 250 results; any paid plan runs the full amount.

## `concurrency` (type: `integer`):

Targets fetched in parallel.

## Actor input object example

```json
{
  "searches": [
    "78701"
  ],
  "market": "us",
  "maxItems": 1000,
  "concurrency": 5
}
```

# Actor output Schema

## `results` (type: `string`):

Collect AutoTrader vehicle listings - price, mileage, trim - US and UK.

## `summary` (type: `string`):

Item count, failure count and every target that failed, with its error.

# 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 = {
    "searches": [
        "78701"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("usestring/autotrader-listings").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 = { "searches": ["78701"] }

# Run the Actor and wait for it to finish
run = client.actor("usestring/autotrader-listings").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 '{
  "searches": [
    "78701"
  ]
}' |
apify call usestring/autotrader-listings --silent --output-dataset

```

## MCP server setup

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

```

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/ROnc7SIuFKp6fLhH7/builds/KFafkh8LXutdxXykh/openapi.json
