# AutoTrader.ca Scraper - Canada Car Listings | $0.49/1K (`crawloop/autotrader-ca-scraper`) Actor

Scrape AutoTrader.ca car listings across Canada: price, year, mileage, VIN, dealer, location and photos. Search by make/model, province, postal code or URL; monitor new ads. $0.49 per 1,000 cars.

- **URL**: https://apify.com/crawloop/autotrader-ca-scraper.md
- **Developed by:** [Andrej Kiva](https://apify.com/crawloop) (community)
- **Categories:** E-commerce, Lead generation, Automation
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 1,000 listings

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

## AutoTrader.ca Scraper — Canada Car Listings, Prices & Dealers

> **Disclaimer:** Unofficial tool — not affiliated with, sponsored by, or endorsed by Trader Corporation (AutoTrader.ca) or its affiliates. Data is read from publicly accessible search and offer pages only. No login. You are responsible for complying with applicable law (including GDPR and Canadian privacy law where personal data appears) and the site’s terms. No warranty on accuracy or availability. Provided for informational and research use.

> **Contact-data controls:** Dealer phone numbers are omitted from the dataset by default. Enable `includePhones` only for business numbers already published on public dealer listings and only when you have a lawful basis. Private-seller phone numbers are not collected. Any phone example below assumes that explicit opt-in; otherwise `dealerPhone` is absent.

**AutoTrader.ca scraper** for Canada’s car marketplace — scrape new and used listings into JSON or CSV via Apify. Search by make and model, province, price, year, and kilometres, or paste a `/cars/` results URL or an `/offers/` listing URL. Each row includes the CAD price, the site’s price rating, mileage in km, fuel, transmission, city, province, postal code, and dealer name. Turn on listing pages for drivetrain, colours, equipment, and the description. Use it as an **AutoTrader.ca API alternative** from **Python**, **Node.js**, cURL, or **MCP** / AI assistants.

**Best for:** Canadian used-car price research, dealer inventory checks, and watching new ads or price drops on a schedule.

| I need… | Actor |
| :--- | :--- |
| Canada car listings | **AutoTrader.ca Scraper** ◄ you are here |
| UK car listings | [AutoTrader UK Scraper](https://apify.com/crawloop/autotrader-uk-scraper) |
| US car listings | [Cars.com Scraper](https://apify.com/crawloop/cars-com-scraper) · [Cars & Bids](https://apify.com/crawloop/cars-and-bids-scraper) |
| Europe car listings | [AutoScout24](https://apify.com/crawloop/autoscout24-scraper) · [Mobile.de](https://apify.com/crawloop/mobile-de-scraper) |
| Used part prices | [Car-Part Scraper](https://apify.com/crawloop/car-part-scraper) |

### When to use this Actor

- **Canadian price comps** — Prices in CAD, the site’s price rating, year, and kilometres for a make and model.
- **Province or national search** — One model across Canada, or a province path such as Ontario (`/reg_on/`).
- **Dealer inventory** — Dealer name, city, province, and postal code from the search card. Dealer phones only if you opt in.
- **Copied search** — Set filters in the browser, copy the `/cars/…` URL, and paste it into Start URLs.
- **New ads and price drops** — `monitorMode` emits only listings that are new or cheaper than the last run.

### When not to use this Actor

- **Private-seller personal data** — Names and phone numbers of private sellers are not collected. Dealer business phones require `includePhones`.
- **VIN lookup** — AutoTrader.ca does not publish a VIN on these pages.
- **US Autotrader.com or AutoTrader UK** — Those are different sites. Use [Cars.com Scraper](https://apify.com/crawloop/cars-com-scraper) for the US and [AutoTrader UK Scraper](https://apify.com/crawloop/autotrader-uk-scraper) for the UK.
- **Account features** — No login, saved searches, or messaging.

### Key features

- **Search and offer URLs** — `/cars/…` result pages and `/offers/…` listings.
- **Filter builder** — Make and model slugs, year (`fregfrom` / `fregto`), price (`pricefrom` / `priceto`), kilometres (`kmto`), condition (`offer` N or U), province (`/reg_on/`), postal code (`zip`, spaces removed), radius (`radius`, only with a postal code), and sort.
- **Price rating** — The site’s price evaluation, mapped the same way as AutoScout24 (`Very good price`, `Good price`, `Fair price`, …).
- **Search cards are already useful** — Price, km, fuel, transmission, city, province, postal code, and dealer name without opening each offer. `scrapeDetails` adds description, equipment, warranty, colours, drivetrain, doors, and seats.
- **Monitor mode** — Named key-value store. The first run seeds a baseline and saves no rows. Later runs save **new** listings and **price drops**.
- **Lightweight HTTP** — Chrome TLS impersonation, 256 MB default memory, no headless browser. No proxy by default. If a request is blocked, the run switches once to Apify residential CA and continues.
- **Flat rows** — One dataset item per listing, ready for CSV.

### Input

| Parameter | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `startUrls` | Array | — | `/cars/…` search URLs or `/offers/…` listing URLs. |
| `make` / `model` | String | — | URL slugs, e.g. `toyota` and `camry` → `/cars/toyota/camry/`. |
| `yearFrom` / `yearTo` | Integer | — | Model year, sent as `fregfrom` / `fregto`. |
| `priceFrom` / `priceTo` | Integer | — | CAD range, sent as `pricefrom` / `priceto`. |
| `mileageTo` | Integer | — | Max kilometres, sent as `kmto`. |
| `condition` | String | `all` | `new`, `used`, or `all` → `offer` N, U, or N,U. |
| `province` | String | — | Code or name (`ON`, `Ontario`). Path segment `/reg_on/`. |
| `postalCode` | String | — | Canadian postal code. Sent as `zip` with spaces removed and letters upper-cased (`m5v 3l9` → `M5V3L9`). |
| `radiusKm` | Integer | 100 with a postal code | Kilometres around the postal code, sent as `radius`. Narrows results only when `postalCode` is set. |
| `sort` | String | `standard` | `price`, `mileage`, `model_year`, `age`, `distance`, `standard`, and the other site sort keys. |
| `maxItems` | Integer | `100` | Listings to save. `0` means no row cap. |
| `maxPages` | Integer | `20` | Pages to open. The run also stops at the site’s `numberOfPages`. `0` follows `numberOfPages` only. |
| `scrapeDetails` | Boolean | `false` | Open each offer page for description, equipment, and specs. |
| `includePhones` | Boolean | `false` | Include public dealer phone numbers. |
| `monitorMode` | Boolean | `false` | Save only new listings and price drops after a seed run. |
| `monitorStoreName` | String | `autotrader-ca-monitor` | Named key-value store for the baseline. |
| `resetMonitorState` | Boolean | `false` | Drop the baseline and seed again. |
| `proxyConfiguration` | Object | No proxy | Direct connection. Residential CA is used only as an automatic fallback after a block. |

#### Example input

```json
{
  "make": "toyota",
  "model": "camry",
  "yearFrom": 2015,
  "priceFrom": 5000,
  "province": "ON",
  "radiusKm": 100,
  "condition": "used",
  "maxItems": 50,
  "maxPages": 3,
  "scrapeDetails": true,
  "includePhones": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

Start-URL mode (filters already on the page are kept):

```json
{
  "startUrls": [
    { "url": "https://www.autotrader.ca/cars/toyota/camry/?page=2&pricefrom=5000&fregfrom=2015&radius=100" }
  ],
  "maxItems": 40,
  "scrapeDetails": false
}
```

### Output

Each dataset row is one vehicle. Missing values are null. Search cards fill price, kilometres, fuel, transmission, location, and dealer. `scrapeDetails` fills description, equipment, warranty, colours, drivetrain, doors, and seats.

| Field | Type | Description |
| :--- | :--- | :--- |
| `listingId` / `url` / `title` | String | Listing UUID, offer URL, and title. |
| `make` / `model` / `modelVersion` / `year` | Mixed | Identity and model year. |
| `price` / `priceFormatted` / `currency` | Number / String | Asking price as a number, display string, and `CAD`. |
| `priceRating` | String | Price evaluation label. |
| `condition` | String | `new` or `used`. |
| `mileageKm` / `transmission` / `fuel` / `bodyType` / `engine` | Mixed | Specs from the card, in kilometres. |
| `drivetrain` / `doors` / `seats` / `exteriorColor` / `interiorColor` | Mixed | From the offer page. |
| `city` / `province` / `postalCode` | String | Where the vehicle is listed. Province is a code such as `ON`. |
| `sellerType` / `dealerName` / `dealerId` | String | `dealer` or `private`, plus the dealership when it is a dealer. |
| `dealerPhone` | String | Public dealer phone. Absent unless `includePhones` is true. |
| `imageUrls` / `imageCount` | Array / Integer | Photo URLs and how many. |
| `description` / `equipment` / `warranty` | Mixed | Plain text, equipment names, and warranty text. Offer page only. |
| `searchUrl` | String | Search page that returned the row. |
| `changeType` / `previousPrice` | Mixed | Monitor mode: `new` or `price_drop`, and the previous CAD price on a drop. |
| `scrapedAt` | String | ISO timestamp. |

Example from a Toyota Camry offer (one photo shown; the saved page has `imageCount` 32):

```json
{
  "listingId": "376ebed1-bef8-466a-846c-c94b9022db61",
  "url": "https://www.autotrader.ca/offers/toyota-camry-le-fully-certified-with-warranty-gasoline-black-cat_ma70gr201456va2093mt3767tr11711-376ebed1-bef8-466a-846c-c94b9022db61",
  "title": "2012 Toyota Camry Sedan 2.5",
  "make": "Toyota",
  "model": "Camry",
  "modelVersion": "LE | FULLY CERTIFIED WITH WARRANTY",
  "year": 2012,
  "price": 10990,
  "priceFormatted": "$ 10,990",
  "currency": "CAD",
  "priceRating": "Very good price",
  "condition": "used",
  "mileageKm": 130875,
  "transmission": "Automatic",
  "fuel": "Gasoline",
  "bodyType": "Sedan",
  "drivetrain": "Front Wheel Drive",
  "engine": "2.5 · 4 cyl",
  "doors": 4,
  "seats": null,
  "exteriorColor": "Black",
  "interiorColor": "Grey",
  "city": "North York",
  "province": "ON",
  "postalCode": "M3J 2E5",
  "sellerType": "dealer",
  "dealerName": "First Choice Motors",
  "dealerId": "47941856",
  "imageUrls": [
    "https://prod.pictures.autoscout24.net/listing-images/376ebed1-bef8-466a-846c-c94b9022db61_28d3e251-42d4-4a38-9cac-e82bb85b3291.jpg/1280x960.webp"
  ],
  "imageCount": 32,
  "description": "2012 TOYOTA CAMRY LE\nFULLY CERTIFIED WITH WARRANTY",
  "equipment": ["AM/FM Stereo", "Anti-lock braking system (ABS)"],
  "warranty": null,
  "searchUrl": "https://www.autotrader.ca/cars/toyota/camry/",
  "scrapedAt": "2026-11-02T18:00:00+00:00"
}
```

### Monitor mode

Turn on `monitorMode` and schedule the same input. The Actor stores listing id and price in the key-value store named by `monitorStoreName` (default `autotrader-ca-monitor`).

- **First run (or `resetMonitorState`)** — Builds the baseline. No dataset rows.
- **Later runs** — Saves a row when the listing is **new**, or when the price is **lower** than the stored price (`changeType` `price_drop`, `previousPrice` set). Unchanged listings and price increases are not saved.
- The run stops early after several already-known listings in a row, which keeps scheduled polls short when you sort by newest.

### Use cases

| Use case | What you get |
| :--- | :--- |
| **Used Camry comps in Ontario** | CAD price, price rating, km, year, city |
| **National model sweep** | Same make/model with `maxPages` raised and no province |
| **Dealer stock watch** | Monitor mode on a `/cars/…` URL |
| **Spec export** | `scrapeDetails` for colours, drivetrain, equipment, and description |
| **AI / MCP pipelines** | Flat JSON for assistants and spreadsheets |

### Integration examples

#### Node.js

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('crawloop/autotrader-ca-scraper').call({
  make: 'toyota',
  model: 'camry',
  yearFrom: 2015,
  priceFrom: 5000,
  province: 'ON',
  radiusKm: 100,
  maxItems: 50,
  scrapeDetails: true,
  proxyConfiguration: { useApifyProxy: false },
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.slice(0, 5));
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient(token)
run = client.actor("crawloop/autotrader-ca-scraper").call(
    run_input={
        "make": "toyota",
        "model": "camry",
        "yearFrom": 2015,
        "province": "ON",
        "condition": "used",
        "maxItems": 50,
        "scrapeDetails": True,
        "proxyConfiguration": {"useApifyProxy": False},
    }
)
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items[:5])
```

#### cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/crawloop~autotrader-ca-scraper/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "make": "toyota",
    "model": "camry",
    "maxItems": 20,
    "proxyConfiguration": {
      "useApifyProxy": false
    }
  }'
```

### MCP and AI assistants

Use this Actor from AI tools via [Apify MCP](https://docs.apify.com/platform/integrations/mcp). Connect your Apify account, then call `crawloop/autotrader-ca-scraper`.

Example prompts:

- "Run AutoTrader.ca Scraper for used Toyota Camry listings in Ontario from 2015, maxItems 40, and return title, price, mileageKm, city, and priceRating as JSON"
- "Scrape AutoTrader.ca Honda Civic listings and summarize median CAD price by year"
- "Chain AutoTrader.ca Scraper then [Cars.com Scraper](https://apify.com/crawloop/cars-com-scraper) to compare a Camry price band in Canada and the US"

### Suite next step

After the Canadian search, compare the same kind of car in the US with [Cars.com Scraper](https://apify.com/crawloop/cars-com-scraper) or in Europe with [AutoScout24](https://apify.com/crawloop/autoscout24-scraper). For used-part prices rather than whole cars, run [Car-Part Scraper](https://apify.com/crawloop/car-part-scraper).

### FAQ

**Is this an AutoTrader.ca API?**\
There is no public read API for this search. This Actor is an AutoTrader.ca API alternative that returns dataset items you can call from Python, Node.js, or MCP.

**Are prices in CAD and mileage in kilometres?**\
Yes. `price` is a number, `currency` is `CAD`, and `mileageKm` is the odometer in km.

**Why is there no VIN?**\
These public pages do not include a VIN.

**How many listings are on a page?**\
About 20. The page reports `numberOfPages`, and `maxPages` (default 20) stops earlier when you set a lower cap.

**Does this return phone numbers?**\
Only when `includePhones` is true, and only the dealer business number published on the listing. The field is absent otherwise.

**Can I watch price drops?**\
Yes. Enable `monitorMode`. The first run only stores a baseline. Later runs save new listings and price drops.

**Start URLs or make/model?**\
Paste a `/cars/…` or `/offers/…` URL to keep every filter already in the link. Leave Start URLs empty and set `make` and `model` to build `/cars/<make>/<model>/`.

**Search cards or full specs?**\
Leave `scrapeDetails` off for price, km, fuel, location, and dealer. Turn it on for description, equipment, colours, and drivetrain.

### Related Actors

- [AutoTrader UK Scraper](https://apify.com/crawloop/autotrader-uk-scraper) — UK car listings
- [Cars.com Scraper](https://apify.com/crawloop/cars-com-scraper) — US car listings
- [Cars & Bids](https://apify.com/crawloop/cars-and-bids-scraper) — US enthusiast auctions
- [AutoScout24](https://apify.com/crawloop/autoscout24-scraper) — Europe car listings
- [Mobile.de](https://apify.com/crawloop/mobile-de-scraper) — German car listings
- [Car-Part Scraper](https://apify.com/crawloop/car-part-scraper) — used part prices

# Actor input Schema

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

AutoTrader.ca search URLs (/cars/...) or listing URLs (/offers/...). Filters already in the URL are kept. When this is empty, the Actor builds a search from Make, Model, and the filters below.

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

Make slug as it appears in the URL path, for example toyota or honda. Used when Start URLs are empty.

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

Model slug as it appears in the URL path, for example camry. Combined with Make into /cars/<make>/<model>/.

## `yearFrom` (type: `integer`):

Earliest model year. Sent as fregfrom.

## `yearTo` (type: `integer`):

Latest model year. Sent as fregto.

## `priceFrom` (type: `integer`):

Minimum price in Canadian dollars. Sent as pricefrom.

## `priceTo` (type: `integer`):

Maximum price in Canadian dollars. Sent as priceto.

## `mileageTo` (type: `integer`):

Maximum odometer reading in kilometres. Sent as kmto.

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

New, used, or both. Sent as offer=N, offer=U, or offer=N,U.

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

Province code or name (ON, QC, BC, Alberta, …). Added as a path segment such as /reg_on/, which is how AutoTrader.ca links provinces. Leave empty for all of Canada.

## `postalCode` (type: `string`):

Canadian postal code, for example M5V 2T6. Sent as zip with spaces removed and letters upper-cased (M5V3L9). A space in the code is dropped by the site.

## `radiusKm` (type: `integer`):

Search radius in kilometres, sent as radius. Narrows results only when a postal code is set. Defaults to 100 km when a postal code is given and this is left empty.

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

Sort order. Values match the site sorting keys (price, mileage, model_year, age, distance, standard, …).

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

Maximum listings to save. 0 means no cap (still limited by Max pages and the site's numberOfPages).

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

Maximum search pages to open. Each page has about 20 listings. The run also stops at the site's numberOfPages. 0 means follow numberOfPages with no extra cap.

## `scrapeDetails` (type: `boolean`):

Open each offer page and add description, equipment, warranty, colours, drivetrain, doors, and seats. Off by default: search cards already include price, kilometres, fuel, transmission, location, and dealer.

## `includePhones` (type: `boolean`):

Off by default. When on, dealerPhone is the business number already shown on the dealer listing. Private-seller numbers are not collected.

## `monitorMode` (type: `boolean`):

The first run stores a baseline and saves no rows. Later runs save only new listings and price drops.

## `monitorStoreName` (type: `string`):

Named key-value store that keeps the monitor baseline between runs.

## `resetMonitorState` (type: `boolean`):

Ignore the saved baseline and seed it again on this run. No listing rows are saved on a seed run.

## `proxyConfiguration` (type: `object`):

No proxy by default. If a request is blocked (403, 429, or a challenge page), the run switches once to Apify Proxy RESIDENTIAL in CA and continues. Your group and country are used exactly as set. Country CA is filled in only when you choose RESIDENTIAL and leave country empty.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.autotrader.ca/cars/toyota/camry/"
    }
  ],
  "make": "toyota",
  "model": "camry",
  "condition": "all",
  "sort": "standard",
  "maxItems": 100,
  "maxPages": 20,
  "scrapeDetails": false,
  "includePhones": false,
  "monitorMode": false,
  "monitorStoreName": "autotrader-ca-monitor",
  "resetMonitorState": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Default dataset items (one AutoTrader.ca listing per row).

# 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.ca/cars/toyota/camry/"
        }
    ],
    "make": "toyota",
    "model": "camry",
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawloop/autotrader-ca-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.ca/cars/toyota/camry/" }],
    "make": "toyota",
    "model": "camry",
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("crawloop/autotrader-ca-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.ca/cars/toyota/camry/"
    }
  ],
  "make": "toyota",
  "model": "camry",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call crawloop/autotrader-ca-scraper --silent --output-dataset

```

## MCP server setup

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