# Carsales.com.au Used & New Car Listings Scraper (`solidcode/carsales-com-au-scraper`) Actor

\[💰 $0.6 / 1K] Extract new and used car listings from Carsales.com.au across all 8 Australian states and territories. Get AUD prices, odometer readings, make, model, variant, year, dealer or private seller, photos and the site's own market price indicator. Export to JSON, CSV or Excel.

- **URL**: https://apify.com/solidcode/carsales-com-au-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 3 total users, 2 monthly users, 16.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.60 / 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/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

## Carsales.com.au Used & New Car Listings Scraper

Pull live car listings from Carsales.com.au at scale — AUD asking prices, odometer
readings, make, model, variant and year, dealer or private seller, photo galleries, and
the market price indicator the site itself puts on each ad. Built for dealer groups,
automotive analysts, and lead-generation teams who need current Australian new and used
inventory as clean, comparable rows instead of copying cars out of search pages thirty at
a time.

### Why This Scraper?

- **31 fields on every listing** — coverage measured across 440 listings spanning all 8
  Australian states and territories and 6 vehicle categories. 28 of the 31 fields came
  back populated on 100% of them.
- **Prices you can actually compare** — the AUD price, the price exactly as displayed, and
  the qualifier that says what it includes (`Drive away`, `Excl. Govt. Charges`,
  `Indicative drive away`). All three on 440 of 440 sampled listings, so a $63,990
  drive-away ad is never averaged against a $63,990 excl.-charges ad.
- **The site's own market price indicator** — `Around market price`, `Below market price`
  or `Well below market price`, captured on 76% of listings. That is Carsales.com.au's
  valuation call on the ad, not one this actor invents.
- **Promoted placements flagged, never hidden** — every row carries a true/false promoted
  flag plus the placement type (`showcase`, `spotlight`, `topspot`). 116 of the 440
  sampled listings were paid placements. Filter them out for an organic-only view, or keep
  them to see who is buying visibility in your segment.
- **Honest odometer readings** — 426 of 440 read as a real distance, from 3 km to
  369,125 km. The 14 brand-new cars that carry `Built: December 2025` instead are kept
  verbatim rather than coerced into a fake "2,025 km".
- **10 filters, no URL building required** — state or territory (all 8), body style (8,
  including Ute, Cab Chassis and People Mover), dealer vs private seller, make, model,
  price range, year range, and maximum kilometres. Set the ones you care about and run.
- **Goes deeper than a single result page** — any one Carsales.com.au search shows about
  30 cars however you page it, so this actor automatically splits a broad search into
  narrower price bands and keeps going until it reaches your Max results.
- **Real media counts** — up to 5 preview image URLs, plus the listing's true photo total
  (1 to 72 in the sample, median 23), its video count, and its 360-degree interior tour
  count. The photo total is the listing's own, not the length of the preview list.
- **Seller identified on every row** — dealer or private, plus a stable seller ID on 440
  of 440, so you can group one dealership's entire advertised stock or isolate private
  sellers only.

### Use Cases

#### Dealer & Inventory Intelligence

- Track a competing dealership's advertised stock by seller ID and watch what turns over
  week to week
- Compare your asking prices against every same make, model and year listing in your state
- Spot which body styles are oversupplied in your market before you commit on a trade-in
- Measure how much of the first result page in your segment is paid placement

#### Pricing & Valuation

- Build make/model/year/kilometre price curves from live asking prices in AUD
- Separate drive-away prices from excl.-government-charges prices before averaging
- Use the market price indicator to surface under-priced stock the day it appears
- Re-run a saved filter on a schedule and diff on listing ID to catch price movements

#### Lead Generation

- Build lists of private sellers by state, make and price band
- Identify dealers advertising specific models for franchise and wholesale outreach
- Find high-kilometre or older stock for wholesale, parts and export buyers

#### Market Research & Reporting

- Measure EV, hybrid, petrol and diesel supply by state straight from the engine field
- Quantify the dealer vs private split across states, body styles and price bands
- Chart the new, demo and used mix in a segment over time

#### Data Enrichment & Integration

- Feed listings into your CRM or DMS keyed on a stable listing ID and a direct listing URL
- Enrich internal valuation models with live market comparables
- Push new matches to Google Sheets or Slack on a schedule with webhooks

### Getting Started

#### Simplest run

```json
{
  "maxItems": 100
}
```

#### One state, one make

```json
{
  "state": "VIC",
  "make": "Toyota",
  "bodyStyle": "SUV",
  "maxItems": 200
}
```

#### A tight, priced search

```json
{
  "state": "NSW",
  "make": "Mazda",
  "model": "CX-5",
  "sellerType": "Dealer",
  "priceMin": 20000,
  "priceMax": 35000,
  "yearMin": 2019,
  "odometerMax": 80000,
  "maxItems": 500
}
```

#### Private sellers only, under $15,000

```json
{
  "sellerType": "Private",
  "state": "QLD",
  "priceMax": 15000,
  "maxItems": 300
}
```

### Input Reference

#### What to Scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `maxItems` | integer | `100` | Maximum listings per search (0 = collect everything the search returns). Carsales.com.au shows about 30 listings for any one search directly, so the actor splits a large search into narrower ones to reach this number. |
| `searchUrls` | array | — | Advanced. Runs prepared search addresses exactly as given, instead of building a search from the filters below. Leave it empty — the filters cover every search option and are the supported way to run this actor. |

#### Search Filters

Combine as many as you like, or leave them all blank to sweep everything.

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `state` | string | — | One Australian state or territory: New South Wales, Victoria, Queensland, Western Australia, South Australia, Tasmania, Australian Capital Territory or Northern Territory. |
| `bodyStyle` | string | — | One body style: SUV, Sedan, Ute, Wagon, Hatch, Cab Chassis, People Mover or Van. |
| `sellerType` | string | — | Dealer listings only, or private-seller listings only. |
| `make` | string | — | One vehicle make, e.g. Toyota. Spell it the way Carsales.com.au lists it. |
| `model` | string | — | One model, e.g. CX-5. Only used together with `make` — ignored when `make` is blank. |
| `priceMin` | integer | — | Only listings priced at or above this amount, in AUD. |
| `priceMax` | integer | — | Only listings priced at or below this amount, in AUD. |
| `yearMin` | integer | — | Only listings built in or after this year. |
| `yearMax` | integer | — | Only listings built in or before this year. |
| `odometerMax` | integer | — | Only listings with an odometer reading at or below this many kilometres. |

#### Options

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `concurrency` | integer | `8` | How many requests to run in parallel. Lower this if you see failures. |
| `proxyConfiguration` | object | Apify Proxy | Proxy settings for the run. |

### Output

Every listing is one dataset row.

A real captured listing, shown exactly as the actor returned it. Null fields are
dropped from a row rather than shipped empty, so a row carries only what the
listing actually had.

```json
{
  "id": "OAG-AD-25711722",
  "url": "https://www.carsales.com.au/cars/details/2021-mazda-cx-5-gt-kf-series-auto-i-activ-awd/OAG-AD-25711722/?gts=OAG-AD-25711722&gtsSaleId=OAG-AD-25711722&gtsViewType=showcase&rankingType=showcase",
  "title": "2021 Mazda CX-5 GT KF Series Auto i-ACTIV AWD",
  "make": "Mazda",
  "model": "CX-5",
  "variant": "GT Auto i-ACTIV AWD",
  "year": 2021,
  "bodyStyle": "SUV",
  "engine": "4cyl 2.5L Petrol",
  "transmission": "Automatic",
  "odometerText": "44,905 km",
  "condition": "Used",
  "price": 28980,
  "priceDisplay": "$28,980",
  "priceQualifier": "Excl. Govt. Charges",
  "priceIndicator": "Below market price",
  "state": "NT",
  "sellerType": "dealer",
  "listingType": "Dealer used",
  "sellerId": "AGC-SELLER-58595",
  "mainImage": "https://carsales.pxcrush.net/carsales/cars/dealer/dfo39rs4jjb5yjwni2gtl6wop.jpg?pxc_method=fitfill&pxc_bgtype=self&pxc_size=720,480",
  "previewImages": [
    "https://carsales.pxcrush.net/carsales/cars/dealer/dfo39rs4jjb5yjwni2gtl6wop.jpg?pxc_method=fitfill&pxc_bgtype=self&pxc_size=720,480",
    "https://carsales.pxcrush.net/carsales/cars/dealer/c3fum8ysjxl6r2wygc1yfzh5y.jpg?pxc_method=fitfill&pxc_bgtype=self&pxc_size=720,480",
    "https://carsales.pxcrush.net/carsales/cars/dealer/etu8y7sfxu6ubpb53l9aj66ov.jpg?pxc_method=fitfill&pxc_bgtype=self&pxc_size=720,480",
    "https://carsales.pxcrush.net/carsales/cars/dealer/3nnatby5tzk6au7y25tcoccp5.jpg?pxc_method=fitfill&pxc_bgtype=self&pxc_size=720,480"
  ],
  "photoCount": 32,
  "videoCount": 1,
  "interior360Count": 0,
  "listingId": "20d4c27c-0833-4a3e-b1f4-ba2acd577d8f",
  "isPromoted": true,
  "promotionType": "showcase",
  "searchRank": 3,
  "searchResultCount": 3926
}
```

#### Core Fields

| Field | Type | Description |
|-------|------|-------------|
| `id` | string | Listing ID |
| `url` | string | Listing URL |
| `title` | string | Full title |
| `make` | string | Make |
| `model` | string | Model |
| `variant` | string | Badge / variant |
| `year` | number | Year |
| `bodyStyle` | string | Body style |
| `engine` | string | Engine / fuel |
| `transmission` | string | Transmission |
| `odometerText` | string | Odometer reading as shown, e.g. `44,905 km`. Brand-new cars carry a build date instead, e.g. `Built: December 2025` |
| `condition` | string | `Used`, `Demo` or `New` |

#### Price & Value & Location

| Field | Type | Description |
|-------|------|-------------|
| `price` | number | Price (AUD) |
| `priceDisplay` | string | Price as displayed |
| `priceQualifier` | string | What the price includes: `Drive away`, `Excl. Govt. Charges` or `Indicative drive away` |
| `priceIndicator` | string | The site's own valuation call: `Around market price`, `Below market price` or `Well below market price` |
| `state` | string | State or territory code, e.g. `NSW`, `VIC`, `QLD` |

#### Contacts

| Field | Type | Description |
|-------|------|-------------|
| `sellerType` | string | `dealer` or `private` |
| `listingType` | string | e.g. `Dealer used`, `Dealer Demo`, `Dealer new car in stock`, `Private` |
| `sellerId` | string | Stable seller ID — group a dealership's whole advertised stock by it |
| `dealerName` | string | Dealership trading name, where the listing shows one |

#### Media

| Field | Type | Description |
|-------|------|-------------|
| `mainImage` | string | Main photo URL |
| `previewImages` | array | Preview photo URLs (up to 5) |
| `photoCount` | number | The listing's full photo count — independent of the 5-image preview |
| `videoCount` | number | Videos |
| `interior360Count` | number | 360-degree tours |

#### Details & Timestamps

| Field | Type | Description |
|-------|------|-------------|
| `listingId` | string | Internal listing GUID |
| `isPromoted` | boolean | `true` when the listing is a paid placement rather than an organic result |
| `promotionType` | string | Which placement was bought: `showcase`, `spotlight` or `topspot`. Only present on promoted rows |
| `searchRank` | number | Position this listing held in the result set |
| `searchResultCount` | number | How many listings the site reports for this search overall |

### Tips for Best Results

- **Narrow the filters to go deeper.** Any single Carsales.com.au search shows about 30
  cars. The actor splits a broad search into narrower price bands on its own, but the most
  complete coverage on a very large search comes from combining state + make + a price
  band and running a few of those rather than one sweep.
- **`odometerText` is a reading, not a number.** About 3% of rows — brand-new cars — carry
  `Built: December 2025` in place of a distance, kept verbatim so nothing silently reads it
  as 2,025 km. Check for ` km` before converting, or filter on `condition` first.
- **Check `priceQualifier` before you average anything.** `Drive away` includes on-road
  costs and `Excl. Govt. Charges` does not. Mixing the two in one average moves it by
  thousands of dollars per car.
- **Filter on `isPromoted` for an organic view.** Roughly a quarter of results are paid
  placements and they sit at the top, so an unfiltered first 30 over-represents them.
  `searchRank` tells you the position each row held, and `promotionType` tells you which
  placement was bought.
- **`photoCount` is the listing's real total; `previewImages` stops at 5.** Rank listings
  by `photoCount` to find the well-documented cars, then follow `url` for the full gallery.
- **`model` needs `make`.** A model on its own is ignored, and the spelling has to match
  the site's — `CX-5`, not `CX5`.
- **Listing IDs are stable, so schedule it.** Re-run the same filters on a schedule and
  diff on `id` to separate genuinely new stock from price movements on cars you already
  have.

### Pricing

**From $0.60 per 1,000 results.**

| Results | Price |
|---------|-------|
| 100 | $0.06 |
| 1,000 | $0.60 |
| 10,000 | $6.00 |
| 100,000 | $60.00 |

Those are the rates on Gold and above. Higher-volume plans pay less per result:

| Your Apify plan | Price |
|-----------------|-------|
| No discount | $0.72 |
| Bronze | $0.68 |
| Silver | $0.64 |
| **Gold and above** | **$0.60** |

Per 1,000 results.

A "result" is any listing row in the output dataset. When you run several searches at once, a listing matching more than one of them is de-duplicated before it reaches the dataset, so you are never charged twice for the same listing. Platform fees (compute, storage) are additional and depend on your Apify plan.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

**This is an unofficial scraper. It is not affiliated with, endorsed by, or connected to Carsales.com.au or its operators in any way.** All trademarks belong to their respective owners.

This actor is intended for legitimate market research and analytics. You are responsible for complying with applicable laws and with Carsales.com.au's Terms of Service.

Results may include personal data such as contact details. Treat them accordingly: do
not use them for spam, harassment, or any unlawful purpose, and follow applicable
privacy rules when storing or processing them.

# Actor input Schema

## `searchUrls` (type: `array`):

Advanced: paste one or more Carsales.com.au search URLs to run them directly. Leave this empty to build a search from the filters below instead — most users should do that.

## `state` (type: `string`):

Limit results to one Australian state or territory.

## `bodyStyle` (type: `string`):

Limit results to one vehicle body style.

## `sellerType` (type: `string`):

Limit results to dealer or private-seller listings.

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

Limit results to one vehicle make, e.g. Toyota. Spelling must match how Carsales.com.au itself lists the make.

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

Limit results to one model, e.g. Corolla. Only used together with Make above — ignored if Make is left blank.

## `priceMin` (type: `integer`):

Only include listings priced at or above this amount.

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

Only include listings priced at or below this amount.

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

Only include listings built in or after this year.

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

Only include listings built in or before this year.

## `odometerMax` (type: `integer`):

Only include listings with an odometer reading at or below this many kilometres.

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

Maximum listings per search (0 = collect everything each search returns). Carsales.com.au returns at most about 30 listings per search directly, so the actor automatically splits a large search into narrower ones to reach this number.

## `concurrency` (type: `integer`):

How many requests to run in parallel. Lower this if you see failures.

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

Proxy settings for the run.

## Actor input object example

```json
{
  "searchUrls": [],
  "maxItems": 100,
  "concurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `core` (type: `string`):

Core Fields for each listing.

## `financial` (type: `string`):

Price & Value for each listing.

## `location` (type: `string`):

Location for each listing.

## `contact` (type: `string`):

Contacts for each listing.

## `media` (type: `string`):

Media for each listing.

## `meta` (type: `string`):

Details & Timestamps for each listing.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/carsales-com-au-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/carsales-com-au-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call solidcode/carsales-com-au-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=solidcode/carsales-com-au-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/sgxhoFhVfLeCTmM3w/builds/53VMOlhd5mHCdFRCQ/openapi.json
