AutoTrader.ca Vehicle Listings Scraper
Pricing
from $0.35 / 1,000 vehicle listings
AutoTrader.ca Vehicle Listings Scraper
Extracts Canadian vehicle listings and detail data from AutoTrader.ca search and listing pages.
Pricing
from $0.35 / 1,000 vehicle listings
Rating
0.0
(0)
Developer
Camilo Aguilar
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
0
Monthly active users
6 days ago
Last modified
Categories
Share
Fast, reliable scraper for AutoTrader.ca — Canada's largest vehicle marketplace. Give it one or more search URLs (or individual listing URLs) and it returns clean, structured vehicle records: specs, pricing, mileage, dealer contact info, images, equipment, and more. Export as JSON, CSV, Excel, or XML straight from the Apify dataset.
Use it to track used car prices across Canada, build dealer inventory feeds, power price-alert tools, or run market research on Canadian vehicle listings — without writing a single line of scraping code.
A typical 100-listing search with full detail enrichment completes in under 10 seconds; fast mode (search results only) can finish in a few seconds when the proxy path is healthy.
Quick start with published tasks
Get started instantly with published tasks. Each task is a pre-configured, ready-to-run example for a common use case. Click any task below, modify the search URL or parameters to match your needs, and run — no code or setup required.
| Task | Purpose | Configuration |
|---|---|---|
| Monitor Dealer Inventory | Track competitor stock, pricing, days-on-lot | Full enrichment, real-time |
| Track Used Car Prices in Canada | Schedule recurring runs to detect price drops and market trends | Full enrichment, scheduling-friendly |
| Research Canadian EV Market | Study EV adoption, pricing, equipment availability by region | Full enrichment, high listings cap |
| Find Affordable Used Cars Under $25k | Budget-focused vehicle search | Fast mode (cost-optimized) |
| Market Research: Luxury Vehicle Trends | Premium segment analysis and competitive pricing | Full enrichment, large cap |
| Scrape All Honda Civics in Ontario | Popular model + regional example | Full enrichment |
| Find Tesla & EV Listings Across Canada | Electric vehicle inventory and equipment analysis | Full enrichment |
| Track Used Trucks (Full-Size) | Pickup truck market tracking | Full enrichment |
| Scrape All Listings in Toronto | Major metro discovery | Full enrichment |
| Monitor Used Cars in Vancouver Metro Area | Regional monitoring and multi-area searches | Full enrichment |
| Search Atlantic Canada Inventory | Multi-province regional sweep | Fast mode (cost-optimized) |
Each task comes with an example search URL and pre-configured parameters. To use it with your own criteria, click the task, modify startUrls or other inputs (e.g., change the postal code, vehicle make/model, or listing cap), and run. Tasks can be scheduled for recurring runs via Apify's built-in scheduler.
How it works
- Concurrent fetching. Search pages and listing detail pages are fetched in parallel (
maxConcurrency, default 20), so even large searches finish in seconds rather than minutes. - Optional detail enrichment. Keep
scrapeDetailPagesenabled for full detail enrichment, or disable it for search-result rows only. Search results give the core fields; each listing's detail page adds equipment lists, coordinates, drivetrain, colors, fuel economy, financing flags, and Carfax links. - Runtime logs. Each run reports search, detail-enrichment, dataset-write, and total timings so speed comparisons are easy to verify.
- Automatic retries. Failed requests are retried (configurable count and delay). A failed detail page never kills the run — you still get the search-level record for that vehicle.
- Proxy included, with automatic escalation. Runs use a built-in residential proxy by default — no proxy setup or extra proxy costs on your side — and automatically escalate to rotating Apify Proxy residential sessions if AutoTrader.ca ever blocks a request. Prefer your own provider? Pass it via the
proxyUrloption and the actor uses yours instead.
What you get
Every record always contains the full schema — fields the listing doesn't expose are null, so your downstream pipeline never hits missing columns. listing_url and ad_id are always populated.
- Vehicle specs: make, model, year, trim, body type, transmission, drivetrain, fuel type, doors, cylinders, seats, displacement, power, colors, upholstery
- Pricing: formatted price, numeric CAD price, price evaluation, average market price, final/negotiable flags, strike-through/original price and price-drop fields
- Mileage & fuel: formatted and numeric km, city/highway/combined fuel consumption, CO2 emissions, electric range
- History & condition: accident-free flag, damage conditions, service history, previous owners, non-smoking, rental history, Carfax URL
- Location: city, province, postal code, country, latitude/longitude
- Seller / dealer: name, type (dealer vs private), phone numbers, SMS number, full address, website, Google rating and Maps link, inventory URL, logo, dealer ID
- Identifiers & links: dealer stock number, deal-builder (online checkout) URLs in English and French
- Media: image URLs (normalized to 1280x960), image count, header image, video URLs, 360-view flag
- Metadata: ad ID, listing URL, status, created timestamp, deliverability, search result type, vehicle age, financing/leasing/warranty flags
Sample output
{"data_source": "AutoTrader.ca","ad_id": "c6a245cd-7afe-4cca-aecc-4748747157e3","listing_url": "https://www.autotrader.ca/offers/mazda-cx-5-example","make": "Mazda","model": "CX-5","year": 2021,"vehicle_age": 5,"trim": "GT Turbo","status": "Used","vehicle_status": "Used","price_formatted": "$ 27,980","price_cad": 27980,"mileage_formatted": "36,999 km","mileage_km": 36999,"transmission": "Automatic","drivetrain": "AWD","fuel_type": "Gasoline","city": "SAINT-HUBERT","province": "QC","country": "CA","latitude": 45.47818,"longitude": -73.44749,"seller_name": "Example Auto","dealer_phone": "855-587-8248","dealer_address_full": "123 Example St, SAINT-HUBERT, J4T 0A1","image_urls": ["https://prod.pictures.example.test/listing.jpg/1280x960.webp"],"image_count": 31,"comfort_equipment": ["Air conditioning"],"entertainment_equipment": ["Bluetooth Connection"],"safety_equipment": ["Adaptive Cruise Control"],"extras_equipment": ["Alloy wheels"],"all_equipment": ["Air conditioning","Bluetooth Connection","Adaptive Cruise Control","Alloy wheels"],"listing_status": "Active","financing_available": true,"warranty_exists": true,"carfax_url": "https://www.example.test/carfax"}
Input
| Option | Type | Default | Description |
|---|---|---|---|
startUrls | array | — (required) | AutoTrader.ca search URLs or /offers/... listing URLs |
maxListings | integer | 300 | Hard cap on saved listings across all start URLs |
scrapeDetailPages | boolean | true | Fetch each listing's detail page for the full field set. Disable it for faster search-result-only runs |
maxConcurrency | integer | 20 | Parallel page fetches (1–100). The default is conservative to avoid tripping AutoTrader.ca's anti-bot protection; raise it for speed if your runs stay healthy, or lower it further if you see rate limiting in the run log |
startPage | integer | 1 | First search-results page to scrape |
endPage | integer | all | Last search-results page to scrape (inclusive) |
proxyUrl | string | built-in | Your own proxy URL (http://user:pass@host:port); leave empty to use the actor's built-in residential proxy, which automatically escalates to rotating Apify Proxy sessions if a request gets blocked |
requestDelayMillis | integer | 0 | Optional politeness delay per request; raise only if rate-limited |
requestRetries | integer | 2 | Retries per failed request |
retryDelayMillis | integer | 1000 | Base delay for exponential backoff between retries — later retries wait progressively longer, not a flat delay |
requestTimeoutSecs | integer | 30 | Per-request HTTP timeout |
Example:
{"startUrls": [{ "url": "https://www.autotrader.ca/lst/mazda/mazda3?loc=K1T1M9" }],"maxListings": 300,"scrapeDetailPages": true}
Need faster (and cheaper) runs?
Set "scrapeDetailPages": false and the actor only reads search-result pages — one page fetch can produce up to 100 records, which also means lower compute cost.
You keep: make/model/year/trim, prices, mileage, fuel type, displacement, transmission, city/province/postal code, seller name and phone numbers, full dealer address, images, description, and listing metadata.
You lose (these come from detail pages only): equipment lists, latitude/longitude, drivetrain, body type, exterior/interior color, doors, cylinders, seats, CO2 emissions, accident-free flag, market-price comparison, stock number, dealer website, dealer Google rating and Maps link, header image, and created timestamp.
If your pipeline only needs pricing, mileage, and dealer contact data, fast mode is the better deal.
Recent benchmark, exact 100-result CX-5 URL:
| Mode | Input difference | Runtime | Records |
|---|---|---|---|
| Search only | scrapeDetailPages: false | 5.6s | 100 |
| Complete | scrapeDetailPages: true, retries 1, timeout 20s | 7.5s | 100 |
| Complete default | scrapeDetailPages: true, default retries/timeouts | 9.9s | 100 |
Recent benchmark, same CX-5 search with rcp=200&size=200 and maxListings=200:
| Mode | Input difference | Runtime | Records |
|---|---|---|---|
| Search only | scrapeDetailPages: false | 9.4s | 200 |
| Complete | scrapeDetailPages: true, retries 1, timeout 20s | 11.2s | 200 |
Full-detail runs can be slower when AutoTrader.ca or the proxy path has a bad tail, but the run summary logs show where the time went.
Migrating from other AutoTrader.ca actors
The actor also accepts snake_case input keys used by other AutoTrader Canada scrapers — start_urls (plain strings or {url} objects), start_page, end_page, and proxy_url — so existing run configurations work unchanged. If both spellings are present, the camelCase option wins.
Older saved tasks that include a proxyConfiguration field keep working — it now controls the rotating Apify Proxy residential sessions the actor automatically escalates to if the fast default proxyUrl path ever gets blocked.
Use cases
- Dealer inventory monitoring — track competitor stock, pricing moves, and days-on-lot across Canadian dealerships
- Market research & price analytics — build pricing models from live Canadian vehicle listing data; compare regional price trends by province or city
- Price tracking & alerts — schedule regular runs and diff results to detect price drops, new listings, or sold inventory
- Lead generation — surface private-seller and dealer listings matching your criteria by make, model, trim, and location
- Aggregators & apps — feed normalized Canadian vehicle data into search products, comparison tools, and price-alert apps
- Insurance & financing — enrich vehicle valuations with real-market pricing, mileage distributions, and accident-free counts from live listings
- Academic & policy research — study Canadian automotive market trends, EV adoption by region, or pricing disparities across provinces
Use via API
Call the actor from any language using the Apify API. Find your API token under Account → Integrations in the Apify console.
Python
import requests, timeAPI_TOKEN = "YOUR_APIFY_API_TOKEN"run = requests.post("https://api.apify.com/v2/acts/kmiloaguilar~autotrader-ca-scraper/runs",headers={"Authorization": f"Bearer {API_TOKEN}"},json={"startUrls": [{"url": "https://www.autotrader.ca/cars/honda/civic?loc=M5V3A8"}],"maxListings": 100,"scrapeDetailPages": False,},).json()run_id = run["data"]["id"]while True:status = requests.get(f"https://api.apify.com/v2/actor-runs/{run_id}",headers={"Authorization": f"Bearer {API_TOKEN}"},).json()["data"]["status"]if status in ("SUCCEEDED", "FAILED", "ABORTED"):breaktime.sleep(2)dataset_id = run["data"]["defaultDatasetId"]items = requests.get(f"https://api.apify.com/v2/datasets/{dataset_id}/items?format=json",headers={"Authorization": f"Bearer {API_TOKEN}"},).json()
JavaScript / Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_API_TOKEN' });const run = await client.actor('kmiloaguilar/autotrader-ca-scraper').call({startUrls: [{ url: 'https://www.autotrader.ca/cars/honda/civic?loc=M5V3A8' }],maxListings: 100,scrapeDetailPages: false,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
curl (run + wait + download in one call)
curl -s -X POST \"https://api.apify.com/v2/acts/kmiloaguilar~autotrader-ca-scraper/run-sync-get-dataset-items?token=YOUR_API_TOKEN&format=json&clean=true" \-H "Content-Type: application/json" \-d '{"startUrls": [{"url": "https://www.autotrader.ca/cars/honda/civic?loc=M5V3A8"}],"maxListings": 50,"scrapeDetailPages": false}'
FAQ
Do I need a proxy? No — runs use a built-in residential proxy automatically, and automatically escalate to rotating Apify Proxy residential sessions if AutoTrader.ca ever blocks a request. To route through your own provider instead, set proxyUrl.
Can it scrape a single listing? Yes — put the /offers/... URL in startUrls and you get one fully enriched record.
What export formats are supported? Anything the Apify dataset supports: JSON, JSONL, CSV, Excel, XML, RSS.
What happens when AutoTrader.ca changes its site? The actor is built to tolerate site changes and is actively maintained. If a field stops populating, report it and it gets fixed quickly.
Can I scrape all cars in a specific city or postal code? Yes — build your search URL on AutoTrader.ca with the loc= parameter (e.g. loc=K1T1M9 for Ottawa) and paste it into startUrls. The actor returns whatever AutoTrader shows for that query.
Can I monitor price changes over time? Yes — schedule the actor to run on a regular interval (e.g. daily) via Apify's built-in scheduler. Each run produces a fresh dataset; compare datasets to detect price drops, new listings, or removed vehicles.
How do I get more than 200 results? Raise maxListings (up to 10,000) and set endPage to cover more search-result pages. Use rcp=100 or size=100 in your search URL to pull 100 listings per page.
Can I run multiple searches in one actor run? Yes — add multiple URLs to startUrls. The actor processes them all and deduplicates by ad_id, so overlapping results are counted once against maxListings.
Missing something? Need another scraper?
If a field you need is missing, something looks off, or you want a scraper built for another website, please reach out — open an issue on this actor's Apify page (Issues tab) and I'll get back to you. Custom scraper requests are welcome.