# AutoTrader.ca Scraper — Used Car Listings & Prices (`akhil_rajesh/autotrader-canada-scraper`) Actor

Scrape used and new car listings from AutoTrader.ca. Search by make, model, province or city, set price, year and mileage limits, and get price, mileage, trim, dealer, location and photos as structured data. Export to JSON, CSV or Excel, or use the API.

- **URL**: https://apify.com/akhil\_rajesh/autotrader-canada-scraper.md
- **Developed by:** [Akhil rajesh](https://apify.com/akhil_rajesh) (community)
- **Categories:** E-commerce, Lead generation
- **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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

Extract **used and new car listings** from [AutoTrader.ca](https://www.autotrader.ca/) with **prices, mileage, trim, dealer and location** as clean, structured data. Search by make and model, narrow the search to a province or city, set price, year and mileage limits, and get up to thousands of vehicles in one run.

**Try it now:** keep the example input (Honda Civic in Toronto under $25,000) and press **Start**. You'll have up to 100 vehicles in under a minute.

### What data can you extract from AutoTrader.ca?

One row per vehicle, with up to 38 fields:

| Group | Fields |
|---|---|
| **Vehicle** | `title`, `year`, `make`, `model`, `modelGroup`, `trim`, `vehicleType`, `condition`, `description` |
| **Pricing** | `price`, `priceFormatted`, `priceRating`, `previousPrice`, `reducedPrice` |
| **Condition** | `mileageKm`, `mileageText`, `transmission`, `fuel`, `isDamaged` |
| **Location** | `city`, `province`, `postalCode`, `street`, `distanceKm` |
| **Seller** | `sellerType` (Dealer/Private), `sellerName`, `sellerId`, `sellerPhone` |
| **Media & availability** | `imageCount`, `images` (up to 10 URLs), `availableNow`, `availableFrom`, `isNewListing` |
| **Provenance** | `url`, `listingId`, `searchScope`, `source`, `scrapedAt` |

Price, mileage, year and distance are **numbers**, and the site's original text is kept alongside, so you can filter and compare without parsing. `priceRating` is AutoTrader.ca's own price-evaluation code (such as `1`, `2` or `3`) when the site shows one.

Export the results as JSON, CSV, Excel or HTML, read them through the API, schedule regular runs to track prices over time, or connect the Actor to other tools with Apify integrations.

### How to scrape AutoTrader.ca

1. Enter a **make** and, optionally, a **model** (for example `Honda` and `Civic`).
2. Narrow the area with a **province** (`ON` or `Ontario`) and/or a **city** (`Toronto`). Leave both empty to search all of Canada.
3. Optionally set a **max price**. Open **Advanced filters** for model year, minimum price and mileage limits.
4. Press **Start**, then open the **Output** tab or export the dataset.

#### Run it from the API

```bash
curl -X POST "https://api.apify.com/v2/actors/akhil_rajesh~autotrader-canada-scraper/run-sync-get-dataset-items" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "make": "Toyota",
    "model": "RAV4",
    "province": "ON",
    "city": "Toronto",
    "maxPrice": 35000,
    "maxMileageKm": 120000,
    "maxResults": 200
  }'
```

This call waits for the run and returns the vehicles directly. It waits up to 5 minutes, so for very large runs start the run instead and read its dataset when it finishes.

#### Run it from Python

```python
from apify_client import ApifyClient  # pip install apify-client

client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("akhil_rajesh/autotrader-canada-scraper").call(run_input={
    "make": "Honda",
    "model": "Civic",
    "province": "BC",
    "maxPrice": 20000,
    "maxResults": 100,
})
for car in client.dataset(run.default_dataset_id).iterate_items():
    print(car["title"], car.get("trim"), car.get("price"), car.get("mileageKm"), car.get("sellerName"))
```

Fields without a value are left out of a row, so read optional fields with `.get()`.

### How much does it cost to scrape AutoTrader.ca?

This Actor uses pay-per-event pricing, and platform usage is included, so there's nothing else to pay. You pay for each vehicle returned, plus **$0.001** each time a run starts (charged per GB of memory; the default is 1 GB). The price per vehicle depends on your Store discount tier, which comes with your Apify plan:

| Discount tier | Per 1,000 vehicles | Example run (100 vehicles) |
|---|---|---|
| Free | $1.00 | $0.101 |
| Bronze | $1.00 | $0.101 |
| Silver | $0.65 | $0.066 |
| Gold and above | $0.50 | $0.051 |

The example run fits comfortably in Apify's free monthly credits. To cap spending, set a maximum cost per run in the run options; the Actor stops cleanly when it reaches the limit.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `make` | string | — | Vehicle make, e.g. `Honda`, `Toyota`. Leave empty for every make |
| `model` | string | — | Model, e.g. `Civic` (used together with `make`) |
| `province` | string | — | `ON`, `BC`, `Alberta`, … Leave empty to search all of Canada |
| `city` | string | — | City name, e.g. `Toronto`. Works on its own, no province needed |
| `maxPrice` | integer | — | Only vehicles at or below this price (CAD) |
| `maxResults` | integer | `100` | Stop after this many vehicles (1–5,000) |
| `maxPages` | integer | `5` | Result pages to walk per search area (up to 100 vehicles each). The Actor walks more pages when **Max results** needs them, up to 40 |
| `sort` | enum | `default` | `price_asc`, `price_desc`, `km_asc`, `km_desc`, `year_desc`, `posted_desc`, `distance`, … |
| `widenSearch` | boolean | `true` | Widen to the province and then all of Canada when your area has too few vehicles |

<details>
<summary><strong>Advanced filters</strong></summary>

| Field | Type | Description |
|---|---|---|
| `minYear` / `maxYear` | integer | Restrict by model year |
| `minPrice` | integer | Lowest price to include (CAD) |
| `maxMileageKm` | integer | Exclude vehicles above this mileage |
| `proxy` | object | Optional Apify Proxy, only needed if you hit rate limits |
| `debug` | boolean | Verbose logging for troubleshooting |

</details>

### Sample output

A vehicle from the example search (dealer details replaced with placeholders):

```json
{
  "listingId": "70000001",
  "url": "https://www.autotrader.ca/offers/honda-civic-sport-...",
  "title": "2020 Honda Civic",
  "trim": "SPORT | Sunroof | Heated Seats | ACC | CarPlay",
  "description": "Clean CarFax. 18-inch alloy wheels | Power moonroof | ...",
  "make": "Honda",
  "model": "Civic",
  "modelGroup": "Civic",
  "year": 2020,
  "vehicleType": "Car",
  "condition": "Used",
  "price": 19950,
  "priceFormatted": "$ 19,950",
  "priceRating": "1",
  "previousPrice": 20450,
  "reducedPrice": true,
  "mileageKm": 97000,
  "mileageText": "97,000 km",
  "transmission": "Automatic",
  "fuel": "Gasoline",
  "isDamaged": false,
  "city": "TORONTO",
  "province": "ON",
  "postalCode": "M3J0A1",
  "street": "100 EXAMPLE AVE",
  "distanceKm": 9,
  "sellerType": "Dealer",
  "sellerName": "Example Motors",
  "sellerId": "10000001",
  "sellerPhone": "416-555-0142",
  "imageCount": 35,
  "images": ["https://prod.pictures.autoscout24.net/listing-images/..."],
  "availableNow": true,
  "isNewListing": false,
  "source": "autotrader.ca",
  "scrapedAt": "2026-09-16T15:25:49.589894+00:00"
}
```

### How the search area works

The Actor first walks the result pages for your city or province. If there are fewer vehicles than **Max results**, it widens the search, **city → province → all of Canada**, instead of handing back a short list. Widened rows say how far the search reached in `searchScope` (for example `across ON`), so nothing is hidden. Rows from your requested area leave it empty.

Turn off **Widen search** if you want strictly local results.

### Use cases

- **Car shopping research**: find every listing that matches your budget and mileage limits
- **Price benchmarking**: track asking prices by make, model, year and region
- **Dealer and market analysis**: inventory volume and price spread by city or brand
- **Lead generation**: build lists of dealers by city or brand
- **Price-drop monitoring**: `previousPrice` and `reducedPrice` flag discounted vehicles

### FAQ

#### Is it legal to scrape AutoTrader.ca?

This Actor reads only publicly available listings. Listings can still contain personal data, such as a private seller's name or phone number, which privacy laws (for example Canada's PIPEDA) protect. Use such data only for a legitimate purpose, and ask a lawyer if you're unsure.

#### Why do I get vehicles from outside my city?

Your area had fewer vehicles than **Max results**, so the search widened. Check `searchScope` on those rows, lower **Max results**, or turn off **Widen search**.

#### What happens if I misspell a make, model or city?

- **Make or model:** the run ends with the message "No vehicles matched … Check the make and model spelling" and returns no rows.
- **City:** AutoTrader.ca ignores a city it doesn't recognise, so the Actor moves on to the province (or all of Canada) and marks those rows in `searchScope`. With **Widen search** off, the run ends with a message naming the city.

#### Why is a car listed at $1?

Some dealers publish a placeholder price, such as `$1`, to mean "call for price". Prices are reported exactly as published, so set a **Min price** if these get in the way.

### Other Actors by this developer

- [Canadian Job Market Scraper — Job Bank](https://apify.com/akhil_rajesh/canadian-jobs-scraper): Canadian job postings with salary, employer, location and NOC code
- [Price Scraper for Bot-Protected Stores](https://apify.com/akhil_rajesh/bot-wall-price-scraper): live price comparison across major Canadian retailers

### Data source

All data comes from **AutoTrader.ca**, a public vehicle marketplace. This Actor reads publicly available listings only and stores nothing beyond the dataset you request.

> **Disclaimer:** This is an independent tool. It is **not affiliated with, endorsed by, or sponsored by** AutoTrader.ca, Trader Corporation or any related entity. All product and company names are the property of their respective owners.

### Limitations

- **AutoTrader.ca only**: vehicles listed exclusively elsewhere aren't included
- **Placeholder prices exist**: see the FAQ above
- **Year, mileage and minimum-price filters are applied after fetching**, so a page may yield fewer rows than it lists
- **Damage history** is limited to the flag the site publishes; this is not a vehicle history report
- **Dealer street addresses** are only present when the seller publishes them
- **Listings change constantly**: a vehicle can sell between runs

# Changelog

This Actor's version history is a separate document: https://apify.com/akhil\_rajesh/autotrader-canada-scraper/changelog.md

# Actor input Schema

## `make` (type: `string`):

Vehicle make, e.g. 'Honda', 'Toyota', 'Ford'. Leave empty to include every make.

## `model` (type: `string`):

Vehicle model, e.g. 'Civic'. Only used when Make is set.

## `province` (type: `string`):

Province code or name, e.g. 'ON' or 'Ontario'. Leave empty to search all of Canada, or to match on the City alone.

## `city` (type: `string`):

City name, e.g. 'Toronto'. Works on its own — no province required. If it returns too few vehicles the Actor widens to the whole province and then Canada.

## `maxPrice` (type: `integer`):

Only return vehicles at or below this price.

## `maxResults` (type: `integer`):

Stop after this many vehicles. Each search page returns up to 100 listings.

## `maxPages` (type: `integer`):

How many result pages to walk per search area (up to 100 vehicles per page). The Actor walks more pages when Max results needs them, up to 40.

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

How to order the listings.

## `widenSearch` (type: `boolean`):

Recommended ON. The Actor always walks as many local pages as needed first. If your city or province still has fewer vehicles than Max results, it then widens — city, then province, then all of Canada — so you never get a short list. Widened rows carry a 'searchScope' field showing where they came from. Turn OFF for strictly local results only.

## `minYear` (type: `integer`):

Lowest model year to include.

## `maxYear` (type: `integer`):

Highest model year to include.

## `minPrice` (type: `integer`):

Lowest price to include. Useful for skipping placeholder prices such as $1 ("call for price").

## `maxMileageKm` (type: `integer`):

Exclude vehicles with more than this many kilometres.

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

Optional. AutoTrader.ca is a public site and normally needs no proxy; use an Apify proxy only if you hit rate limits.

## `debug` (type: `boolean`):

Verbose logging for troubleshooting.

## Actor input object example

```json
{
  "make": "Honda",
  "model": "Civic",
  "province": "ON",
  "city": "Toronto",
  "maxPrice": 25000,
  "maxResults": 100,
  "maxPages": 5,
  "sort": "default",
  "widenSearch": true,
  "proxy": {
    "useApifyProxy": false
  },
  "debug": false
}
```

# Actor output Schema

## `dataset` (type: `string`):

Vehicle records produced by this run.

# 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 = {
    "make": "Honda",
    "model": "Civic",
    "province": "ON",
    "city": "Toronto",
    "maxPrice": 25000,
    "proxy": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("akhil_rajesh/autotrader-canada-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 = {
    "make": "Honda",
    "model": "Civic",
    "province": "ON",
    "city": "Toronto",
    "maxPrice": 25000,
    "proxy": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("akhil_rajesh/autotrader-canada-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 '{
  "make": "Honda",
  "model": "Civic",
  "province": "ON",
  "city": "Toronto",
  "maxPrice": 25000,
  "proxy": {
    "useApifyProxy": false
  }
}' |
apify call akhil_rajesh/autotrader-canada-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,akhil_rajesh/autotrader-canada-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/HwM90oxiUuaegljma/builds/LbZhZPzC6aSXRudzM/openapi.json
