# 🇨🇦 Used Car Data Scraper – Canada (`jordan-byte/used-car-multiple-source`) Actor

Scrape Canadian used-car listings from AutoTrader.ca, CarGurus.ca, Kijiji, Craigslist, Carpages.ca, and UsedCarCanada.ca. Get normalized vehicle data including prices, mileage, VINs, seller details, locations, images, and listing URLs.

- **URL**: https://apify.com/jordan-byte/used-car-multiple-source.md
- **Developed by:** [Jordan Byte](https://apify.com/jordan-byte) (community)
- **Categories:** Automation, E-commerce, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

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

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

## 🍁 Used Car Data Scraper Canada

**Scrape used car listings from AutoTrader.ca, CarGurus.ca, Kijiji, Craigslist, Carpages.ca, and UsedCarCanada.ca — one search, six sites, one clean dataset.**

### What does Used Car Data Scraper Canada do?

This actor searches Canada's biggest used-car marketplaces at once and hands back every listing in one normalized shape — same field names, same structure, no matter which site it came from. Give it a make and model (like "Ford F-150") and it collects matching used listings from every site you select; leave make and model blank and it pulls used inventory across every brand instead, so you're never boxed into a single vehicle. Run it directly from the [Apify Console](https://console.apify.com), schedule it to run daily/weekly, or call it from your own app via the [Apify API](https://docs.apify.com/api/v2) — proxy rotation, retries, and anti-bot handling are all built in, so you don't have to manage any of that yourself.

### Why use Used Car Data Scraper Canada?

- **Market research and pricing intelligence** — pull real asking prices across every major Canadian used-car site to see what a given make/model is actually selling for, city by city.
- **Dealer inventory monitoring** — track a competitor's or your own dealership's listings across multiple marketplaces from a single run.
- **Lead generation** — collect seller names, phone numbers, and listing URLs for outreach or CRM enrichment.
- **Data feeds and aggregator sites** — power your own used-car search tool or price-comparison site with a single clean data source instead of building six separate scrapers.
- **Full-market pulls** — turn on **Full run** and get everything a site has for your search (or every used listing on the site if you leave make/model blank), not just a quick sample. This is built for the client who wants the whole market, not a preview.

### How to scrape used car listings from AutoTrader.ca, Kijiji, CarGurus and more in Canada

1. Click **Try for free** (or **Run** if you're already in the Console).
2. On the **Input** tab, optionally enter a `make` and `model` — or leave both blank to search every used listing across your selected sites.
3. Pick which sites to search, and turn on **Full run** if you want the complete market instead of a small sample.
4. Optionally paste a **Webhook URL** to get notified the moment the run finishes.
5. Click **Start** and watch results land in the dataset in real time.
6. Export your results as JSON, CSV, Excel, or HTML from the **Storage** tab, or pull them programmatically via the [Dataset API](https://docs.apify.com/api/v2#/reference/datasets).

### Input

Nothing is required — every field has a sensible default, grouped into sections so the input form stays simple unless you need to go further. Full schema is on the **Input** tab; here's what each field does.

#### Search

| Field                 | Type    | Description                                                                                                                      |
| --------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------- |
| `make`                | string  | Optional. e.g. `"Ford"`. Leave blank to search every make.                                                                       |
| `model`               | string  | Optional. e.g. `"F-150"`. Leave blank to search every model of the given make (or every model of every make, if both are blank). |
| `yearMin` / `yearMax` | integer | Optional year range, where the site supports it.                                                                                 |
| `priceMax`            | integer | Optional max price (CAD), where the site supports it.                                                                            |

#### Sites & result limits

| Field             | Type    | Description                                                                                                                                                                                                                                                              |
| ----------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `sites`           | array   | Which sites to query — one checkbox per site. Defaults to the 2 fastest and most reliable, AutoTrader.ca and CarGurus.ca; add Kijiji, Craigslist, Carpages.ca, or `usedcarcanada` for fuller coverage (usedcarcanada needs a real browser and takes longer).             |
| `maxItemsPerSite` | integer | Stop each site once this many listings are collected. Default `10`. Ignored entirely when Full run is on.                                                                                                                                                                |
| `fullRun`         | boolean | Turn this on to pull as much real used inventory as each site actually has (up to a 2,000-per-site ceiling) instead of a small sample. This is the option for a full-market pull rather than a quick check — runs take proportionally longer and use more compute units. |

Every site is queried at the same time from the moment the run starts, so the total run time is close to whichever site is slowest, not the sum of all of them.

#### Caching

`useCache` (boolean, default `true`) — an identical search run before is served instantly from cache instead of re-scraping. Cached results never expire on their own; turn this off to force a fresh scrape.

#### Notifications

`webhookUrl` (string, optional) — posts a JSON summary here when the run finishes (result count per site, or errors). Works with a Slack incoming webhook, a Discord webhook, or a generic endpoint like Zapier, Make, or n8n. A failed webhook post never fails the run.

#### Proxy

`proxyConfiguration` (object) — required. Every site here blocks or aggressively rate-limits non-proxied traffic, so a Canadian residential proxy isn't optional. Defaults to one automatically.

### Output

One row per listing, normalized to the same shape regardless of source site:

```json
{
    "source": "cargurus",
    "url": "https://www.cargurus.ca/details/451150221",
    "title": "2023 Toyota RAV4 Hybrid",
    "image": "https://static.cargurus.com/images/forsale/2026/07/23/toyota_rav4-pic.jpeg",
    "make": "Toyota",
    "model": "RAV4 Hybrid",
    "price": 34590,
    "vin": "2T3RWRFV5PW123456",
    "location": "Toronto, ON",
    "sellerName": "Downtown Toyota",
    "sellerPhone": "(416) 555-0134",
    "currency": "CAD",
    "trim": "XLE AWD",
    "year": 2023,
    "condition": "used",
    "mileage": 28450,
    "exteriorColor": "Blueprint",
    "listedAt": null
}
```

You can download the dataset in JSON, CSV, Excel, HTML, or several other formats straight from the Console, or fetch it via the API.

#### Data fields

| Field                                    | Description                                               |
| ---------------------------------------- | --------------------------------------------------------- |
| `source`                                 | Which site the listing came from.                         |
| `url`                                    | Link to the original listing.                             |
| `title`, `make`, `model`, `trim`, `year` | Vehicle identification.                                   |
| `price`, `currency`                      | Asking price.                                             |
| `mileage`, `exteriorColor`, `condition`  | Vehicle condition details.                                |
| `vin`                                    | Vehicle identification number, where the site exposes it. |
| `location`                               | City/province of the listing or seller.                   |
| `sellerName`, `sellerPhone`              | Seller contact info, where public.                        |
| `image`                                  | Listing's primary photo.                                  |
| `listedAt`                               | When the listing was posted, where the site exposes it.   |

Not every field is available from every site — `null` means that site doesn't expose that field for that listing, not a scraping error.

### How much does it cost to scrape used car listings in Canada?

This actor runs on the [Pay-Per-Result](https://apify.com/pricing) model - you pay for the platform usage, not per listing. A small default search (2 sites, 10 results each) typically costs a fraction of a cent to a few cents in compute units; a **Full run** across all six sites costs proportionally more since it collects far more data. Apify's free tier includes monthly platform credits, so light or occasional use can run at no cost. Check the **Pricing** tab for exact current numbers.

### Tips for faster, cheaper runs

- Leave `usedcarcanada` off unless you specifically need it — it's the slowest site here since it requires a real browser to get past that site's own bot defences.
- Use `maxItemsPerSite` for a quick sample and reserve `fullRun` for when you actually need full market depth.
- Leave `useCache` on (the default) if you run the same search repeatedly - a cache hit costs almost nothing.
- Narrow with `make`/`model`/`priceMax` when you know what you're after; a full "every used car in Canada" pull is powerful but naturally the largest and slowest option.

### FAQ

**Is this legal?** This actor collects publicly available listing data. You're responsible for using the data in line with each site's terms of service and applicable law in your jurisdiction.

**Why did a site return 0 results?** Sites occasionally change their page structure or apply temporary blocks. If this happens repeatedly, please report it via the **Issues** tab so it can be fixed.

**Can I search a make this actor doesn't already know?** Yes — `make` and `model` are free-text fields, not a fixed list. Enter anything the site itself supports.

**Something not working, or want a custom feature?** Please open an issue on the Actor's **Issues** tab.

# Actor input Schema

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

Optional. e.g. "Ford", "Honda", "Toyota". Leave blank to search every make - this actor isn't limited to a single brand.

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

Optional. e.g. "F-150", "Civic", "Camry". Leave blank to search all models of the given make (or every model, if make is also blank).

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

Optional. Only used by sites that support a year-range filter.

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

Optional. Only used by sites that support a year-range filter.

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

Optional. Only used by sites that support a price filter.

## `sites` (type: `array`):

Which sites to query. Defaults to the 2 fastest and most reliable ones (autotrader, cargurus), both plain HTTP with structured JSON responses. kijiji, craigslist and carpages are available here too, and usedcarcanada needs a real browser and can take noticeably longer to get past that site's own bot defences - none of those four are on by default.

## `maxItemsPerSite` (type: `integer`):

Stop each site once this many listings have been collected. Set to 0 for "no limit" (each site pages through as much inventory as it actually has, up to a 2,000/site safety ceiling). Ignored entirely when "Full run" below is on.

## `fullRun` (type: `boolean`):

Turn this on to pull as much real used inventory as each selected site actually has (up to a 2,000-per-site safety ceiling) instead of a small sample - overrides "Max results per site" entirely. This is the option for a full-market pull rather than a quick check: every used listing for a make/model across every site you selected, or every used listing on the site at all if make/model are left blank. Runs will take proportionally longer and cost more compute units.

## `useCache` (type: `boolean`):

If an identical search (same make/model/filters/sites/limit) was already run before, instantly return those stored results instead of re-scraping every site again. Cached results never expire on their own - turn this off if you specifically want a fresh scrape.

## `webhookUrl` (type: `string`):

Optional. Posts a JSON summary here (result count per site, or errors) when the run finishes - works with a Slack incoming webhook, a Discord webhook, or a generic endpoint like Zapier/Make/n8n. A failed webhook post never fails the run.

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

Required. Every site here blocks or aggressively rate-limits non-proxied traffic - a Canadian residential proxy is not optional, and each site fails fast with a clear error if one isn't available.

## Actor input object example

```json
{
  "make": "Ford",
  "model": "F-150",
  "sites": [
    "autotrader",
    "cargurus"
  ],
  "maxItemsPerSite": 10,
  "fullRun": false,
  "useCache": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "CA"
  }
}
```

# Actor output Schema

## `results` (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 = {
    "make": "Ford",
    "model": "F-150"
};

// Run the Actor and wait for it to finish
const run = await client.actor("jordan-byte/used-car-multiple-source").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": "Ford",
    "model": "F-150",
}

# Run the Actor and wait for it to finish
run = client.actor("jordan-byte/used-car-multiple-source").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": "Ford",
  "model": "F-150"
}' |
apify call jordan-byte/used-car-multiple-source --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jordan-byte/used-car-multiple-source"
        }
    }
}

```

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/2PcsRRuLPhjjRoxyI/builds/4PooeF4gNQa7YgeLL/openapi.json
