# Used Car Data Scraper Australia 🚘🇦🇺 (`mrdoe/used-car-data-scraper-australia`) Actor

Scrape used car listings from 6 major Australian sites — carsales, autotrader, carsguide, pickles, drive & justcars — in one run. Get price, year, mileage, trim, photos & dealer info in a normalized dataset. Fast, no browser needed, built-in caching & Slack/Discord alerts

- **URL**: https://apify.com/mrdoe/used-car-data-scraper-australia.md
- **Developed by:** [MrDoe](https://apify.com/mrdoe) (community)
- **Categories:** E-commerce, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / 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 Australia

**Search 6 major Australian car sites at once for used/second-hand vehicle listings — one make/model, one run, one dataset.**

Instead of running six separate scrapers and stitching the results together yourself, this car market data API queries carsales.com.au, autotrader.com.au, carsguide.com.au, pickles.com.au, drive.com.au, and justcars.com.au in a single run and returns used listings from all six marketplaces in one normalized dataset — same field names, same structure, regardless of which site it came from (5 listings per site by default — raise or remove that limit in the input if you want deeper coverage). Built as a vehicle listings dataset for Australia's used car market and a competitor price monitoring tool at a scale a single-site scraper can't cover.

### 🇦🇺 Part of the Australia Car Data Scraper collection

Want new inventory included too, not just used? Use **[All Car Data Scraper Australia](https://apify.com/jordan-byte/all-car-data-scraper-australia)** instead — same 6 sites, plus a `condition` filter for new/used/both.

Each site below also exists as its own standalone, independently-maintained actor in case a single-site scraper is all you need (cheaper to run if you genuinely only care about one site):

- [Carsales.com.au Car Data Scraper](https://apify.com/jordan-byte/carsales-com-au-scraper)
- [AutoTrader.com.au Car Data Scraper](https://apify.com/jordan-byte/autotrader-com-au-scraper)
- [CarsGuide.com.au Car Data Scraper](https://apify.com/jordan-byte/carsguide-com-au-scraper)
- [Pickles.com.au Car Data Scraper](https://apify.com/jordan-byte/pickles-com-au-scraper)
- [Drive.com.au Car Data Scraper](https://apify.com/jordan-byte/drive-com-au-scraper)
- [JustCars.com.au Car Data Scraper](https://apify.com/jordan-byte/justcars-com-au-scraper)

This actor doesn't call or depend on any of them — it's a fully separate implementation.

### 🧑‍💼 Who uses this

- **Car dealers** using this as a competitor price monitoring tool across every major Australian used car marketplace at once, not just one
- **Market researchers** building a used car data extraction pipeline to track Australian second-hand price trends across the whole market
- **Classified sites, dropship platforms & marketplaces** aggregating used listings from multiple sources into one feed
- **Investors & analysts** studying vehicle depreciation and demand across sites, makes, and models
- **Developers** using this as a car market data API on top of six used-car sources without maintaining six separate integrations

### ✨ Why use this instead of six separate scrapers

- 🔎 **One search, six sites** — `make`/`model`/year/price filters apply everywhere at once, so you get one clean comparison set instead of six inconsistent ones.
- 💾 **Skips repeat work** — an identical search run recently is served instantly from cache instead of re-scraping everything. ⚠️ Cached results never expire on their own — a repeat search returns the exact same data until you turn "Use cached results" off, so don't mistake identical numbers for a stuck run; force a fresh scrape whenever you specifically need current data.
- 🔔 **Notifies you when it's done** — optional Slack/Discord webhook, no extra credentials needed, so you don't have to babysit the run.
- ⚡ **Built for speed** — every site is queried at the same time, and none of them needs a real browser, so a run finishes in seconds, not minutes.
- 🚗 **Used-only by design** — no `condition` toggle to worry about; every result across all 6 sites is second-hand inventory.
- 🖼️ **Photos included** — listing images are pulled through to the output wherever the site has one.
- 🧩 **Resilient by design** — one site failing or getting temporarily blocked never brings down the other five; you still get everything the rest could find.

### 🗺️ Sites covered

| Site | Notes |
|---|---|
| carsales (carsales.com.au) | Australia's largest general car marketplace |
| autotrader (autotrader.com.au) | Dealer + private listings |
| carsguide (carsguide.com.au) | Runs on the same backend as autotrader.com.au, different branding |
| pickles (pickles.com.au) | Used/ex-fleet auction marketplace |
| drive (drive.com.au) | Dealer-only marketplace |
| justcars (justcars.com.au) | Classic, vintage & unique cars |

All 6 sites are plain HTTP/JSON API calls under the hood — none of them needs a real browser — so every site runs by default and a full run stays fast. One site failing or getting temporarily blocked never affects the others — every site is independently retried and fully isolated from the rest of the run.

### 💰 Pricing

None of the 6 sites need a browser, so per-listing compute cost stays low even though six sources are queried in one run. See the **Pricing** tab on this actor's Store page for current rates before running at scale.

### ⚙️ Input

Only `make` is required — everything else has a sensible default, grouped into sections so the input form stays simple unless you need to go further.

#### 🔍 Search

| Field | Type | Description |
|---|---|---|
| `make` | string | Required. e.g. `"Ford"`. |
| `model` | string | Optional. e.g. `"Ranger"`. Leave blank to search all models of the make. |
| `yearMin` / `yearMax` | integer | Optional year range, where supported. |
| `priceMax` | integer | Optional max price (AUD), where supported. |

#### 🌍 Sites & result limits

| Field | Type | Description |
|---|---|---|
| `sites` | array | Which sites to query — one checkbox per site. Defaults to all 6. |
| `maxItemsPerSite` | integer | Stop each site once this many listings are collected. Default `5`. Set to `0` for "no limit" (up to a 5,000/site safety ceiling). |

Every site is queried at the same time from the moment the run starts, so results come back roughly as fast as the quickest sites can deliver them, and the total run time doesn't stack up site by site.

#### ⚡ Caching

| Field | Type | Description |
|---|---|---|
| `useCache` | boolean | Default `true`. 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 a specific run needs to force a fresh scrape. |

> ⚠️ **Cached data doesn't refresh automatically.** Re-running the exact same search (same make/model/year/price/sites/limit) will keep returning the same stored results — even hours or days later — until you set `useCache` to `false` for that run. If prices or listings look "stuck," this is why; it isn't a scraping failure.

The cache persists across runs, keyed to the exact search (make/model/year/price/sites/limit, case-insensitive). Change any of those and it's a cache miss — a fresh scrape — by design.

#### 🔔 Notifications

| Field | Type | Description |
|---|---|---|
| `slackWebhookUrl` | string | Optional. Posts a summary (result count per site, or errors) here when the run finishes. Create one under Slack → Apps → Incoming Webhooks. |
| `discordWebhookUrl` | string | Optional. Same summary, posted to a Discord channel. Create one under a channel's Integrations → Webhooks settings. |

Both are plain webhook POSTs — no extra credentials needed from you beyond the URL itself, and a failed webhook post never fails the run.

#### 🛡️ Proxy

| Field | Type | Description |
|---|---|---|
| `proxyConfiguration` | object | Required. Most of these sites block or rate-limit non-proxied traffic. Defaults to an AU-targeted residential proxy. |

### 📦 Output

One row per listing, normalized to the same shape regardless of source site — fields are ordered for how a shopper would actually scan a listing:

```json
{
  "source": "drive",
  "url": "https://www.drive.com.au/cars-for-sale/car/970342672/",
  "title": "2022 Ford Ranger PX MkIII XL Pick-up Double Cab 4dr Spts Auto 6sp 4x4 3.2DT [MY21.75]",
  "image": "https://media.drive.com.au/obj/driveau/upload/vehicles/used/ford/ranger/2022/43f9ebba-72aa-5051-905b-46e5f1750000",
  "make": "Ford",
  "model": "Ranger",
  "price": 22500,
  "vin": null,
  "location": "Perth, WA",
  "sellerName": null,
  "sellerPhone": null,
  "currency": "AUD",
  "trim": "PX MkIII XL Pick-up Double Cab 4dr Spts Auto 6sp 4x4 3.2DT [MY21.75]",
  "year": 2022,
  "condition": "used",
  "mileage": 211633,
  "exteriorColor": null,
  "listedAt": null
}
```

Not every field is available from every site — `null` means that particular site doesn't expose that field (or it wasn't available for that listing), not a scraping error. Dealer name/phone are currently only reliably populated by autotrader and carsguide (both share the same underlying dealer data).

### 📝 Notes

- An Australian residential proxy is recommended — most of these sites block or rate-limit non-proxied traffic at any real volume.
- pickles.com.au is an auction marketplace — `price` is `null` for listings where the auction hasn't started or received a bid yet, which reflects the site's own data, not a scraping gap.
- justcars.com.au's own `condition` field is only sometimes filled in by sellers (mostly on newer listings), so `condition` shows `null` for many of its classic/vintage results even though the listing is real used inventory — those are still included, just without that one field populated.

### ❓ FAQ

**Is this actor affiliated with carsales.com.au, autotrader.com.au, or the other sites it queries?**
No. This is an independent, unofficial scraper built on Apify — it isn't operated by, endorsed by, or affiliated with any of the 6 sites it searches.

**Do I need to know how to code?**
No. Fill in make/model, click "Start", and download results as JSON, CSV, or Excel from the run's Dataset tab.

**Is scraping this data legal?**
This actor only collects publicly visible listing data. You're responsible for how you use the output — check each site's terms of service and applicable law for your specific use case.

**How much does this cost to run?**
None of the 6 sites need a browser, so per-listing compute cost stays low even though six sources are queried. See the Pricing tab on the Store page for exact current rates.

**How is this different from the single-site actors?**
Each site also has its own standalone actor (linked above), which is cheaper to run if you genuinely only need one source. Use this actor when you want all 6 in one normalized used-car dataset instead of running and merging six runs yourself.

**Can I schedule this to run automatically?**
Yes — use Apify's built-in Scheduler to run this actor on a recurring basis (hourly, daily, weekly) with no code, so your cross-site dataset stays current without manual runs.

**I want new inventory too, not just used — is there a version for that?**
Yes — see [All Car Data Scraper Australia](https://apify.com/jordan-byte/all-car-data-scraper-australia), linked above.

# Actor input Schema

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

Vehicle make, e.g. "Ford", "Toyota", "Holden".

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

Vehicle model, e.g. "Ranger", "Corolla", "Commodore". Leave blank to search all models of the given make.

## `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 all 6 - every site here is a plain HTTP/JSON call (no real browser needed for any of them) and every one carries used inventory, so there's no fast/slow or coverage tradeoff to opt in or out of.

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

Stop each site once this many listings have been collected. Set to 0 for "no limit" (each site will page through as much used inventory as it actually has for the query, up to a 5,000/site safety ceiling).

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

## `slackWebhookUrl` (type: `string`):

Optional. If set, a summary of the run (result count per site, or errors) is posted here when the run finishes. Create one under Slack → Apps → Incoming Webhooks.

## `discordWebhookUrl` (type: `string`):

Optional. Same summary as the Slack webhook, posted to a Discord channel instead. Create one under a channel's Integrations → Webhooks settings.

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

Required. Most of these sites block or rate-limit non-proxied traffic - an Australian residential proxy is recommended for every site to work reliably at volume.

## Actor input object example

```json
{
  "make": "Ford",
  "model": "Ranger",
  "sites": [
    "carsales",
    "autotrader",
    "carsguide",
    "pickles",
    "drive",
    "justcars"
  ],
  "maxItemsPerSite": 5,
  "useCache": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AU"
  }
}
```

# 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": "Ranger"
};

// Run the Actor and wait for it to finish
const run = await client.actor("mrdoe/used-car-data-scraper-australia").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": "Ranger",
}

# Run the Actor and wait for it to finish
run = client.actor("mrdoe/used-car-data-scraper-australia").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": "Ranger"
}' |
apify call mrdoe/used-car-data-scraper-australia --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mrdoe/used-car-data-scraper-australia"
        }
    }
}

```

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/4sAasxPjFLuI1UdW1/builds/nxYd1Rm2afWpHaPhm/openapi.json
