# Carsales Scraper 💰 $0.47/1K — Australian New & Used Cars (`dz_omar/carsales-scraper`) Actor

Scrape carsales.com.au car listings from any search link or from filters, beyond the 440-listing page limit. Get price, odometer, specs, price rating, photos, full spec sheet, dealer comments, phone and listing details exactly as carsales returns them.

- **URL**: https://apify.com/dz_omar/carsales-scraper.md
- **Developed by:** [FlowExtract API](https://apify.com/dz_omar) (community)
- **Categories:** E-commerce, Lead generation, Automation
- **Features:** Limited permissions
- **Stats:** 3 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

**[Carsales Scraper](https://apify.com/dz_omar/carsales-scraper?fpr=smcx63)** extracts **carsales.com.au car listings** from any search link you copy from the website, or from simple filters such as make, model, price and year. Paste a link, choose how many listings you want, and get **carsales' own listing data, complete and unchanged** — price, odometer, year, specs, price rating, seller, location, dealer comments, dealer phone number and every photo.

Perfect for **car dealers**, **vehicle traders and auction buyers**, **market analysts** and **lead-generation teams** who need up-to-date Australian vehicle stock without copying listings by hand.

### What does Carsales Scraper do?

- **Any carsales search link** — set your filters on the website (make, model, price, year, odometer, state, fuel, body style…) and paste the address. A make or model page such as `carsales.com.au/cars/mazda/cx-5/` works too.
- **Or build the search from filters** — no link needed: make, model, condition, seller type, state, body style, fuel, transmission, price, year and odometer.
- **Searches beyond carsales' 440-listing limit** — carsales stops a single search at about 440 listings. The scraper splits big searches by year, state and price so that tens of thousands of matches can still be collected.
- **Complete data, as carsales returns it** — the search card and the full listing page keep carsales' own field names and nesting. Nothing is mapped, renamed or flattened, and empty fields stay in. Only technical noise with no meaning for you (tracking, tokens, page chrome, ads) is removed.
- **Full listing page** — specification sheet, features, warranty and service, comments from the dealer, dealer profile and licence, and the dealer's phone number.
- **Single listings** — paste a listing link or just the listing number, for example `SSE-AD-19119170`.
- **Duplicates removed** — a listing found by several of your searches is delivered and charged once.

#### What data can you extract from carsales.com.au?

Each record has three parts:

| Part | What it holds |
|---|---|
| `search` | The listing card exactly as carsales' search results return it: title, price and price badge (for example **FAIR PRICE**), key details (body style, transmission, fuel, odometer), seller type and state, gallery, and carsales' own listing data (network ID, make, model, year, price, state, condition, seller ID). |
| `details` | The full listing page exactly as carsales returns it: specification accordions (engine, transmission and drivetrain, wheels and tyres, warranty and service, features, driver assistance), vehicle description, comments from the dealer, dealer profile and licence, call-the-dealer details and listing metadata. |
| `_meta` | What the scraper adds: network ID and URL, vehicle type, detail status, **all phone numbers in one list**, **all photo links in one list**, a short summary (title, make, model, year, price, odometer, state, condition, seller type, seller ID) for table views, the source URL and the time. |

Field names inside `search` and `details` are carsales' own, so any field carsales adds or renames shows up as carsales sends it.

#### Why use Carsales Scraper on Apify?

Running it on Apify gives you **API access**, **scheduling**, **monitoring**, **integrations** (Make, Zapier, n8n, Google Sheets, webhooks) and **proxy rotation** without managing any infrastructure. A 100-listing run with full pages costs about **$0.09**.

### How to scrape carsales.com.au

1. Open [Carsales Scraper](https://apify.com/dz_omar/carsales-scraper?fpr=smcx63) in Apify Console.
2. On carsales.com.au, run your search with the filters you want and copy the page address.
3. Paste one or more links into **carsales.com.au links**. To search without a link, leave that list empty and fill in the **Option B** filters.
4. Set **Maximum listings per search** (start small: `20`).
5. Click **Start**, then download the results as JSON, CSV or Excel, or fetch them over the API.

### How much does it cost to scrape carsales.com.au?

Pay only for what you get. Prices per event by Apify plan:

| Event | FREE | BRONZE | SILVER | GOLD+ |
|---|---|---|---|---|
| Listing (search-results data) | $0.0005 | $0.00049 | $0.00048 | $0.00047 |
| Listing details add-on | $0.0004 | $0.00039 | $0.00038 | $0.00037 |
| Run start (per GB of memory) | $0.003 | $0.0025 | $0.002 | $0.002 |

- **1,000 listings with full pages** cost about **$0.90** on the FREE plan and **$0.84** on GOLD (+ the run-start fee).
- **1,000 listings without full pages** cost about **$0.50** on FREE and **$0.47** on GOLD.
- **Include each listing's full page** applies to **searches**. A **single-listing link always comes with its full page** and is charged the listing event plus the details add-on.
- The details add-on is never charged when the full page is turned off or could not be read.
- Example: 2 searches and 4 listing links, Maximum listings per search = 10, full pages off → up to 20 listing events for the searches, plus 4 listing events and 4 details add-ons for the listing links.
- Start with `maxResults: 10` to see your data for a fraction of a cent.

### Input and output examples

#### Input

```json
{
    "startUrls": [
        "https://www.carsales.com.au/cars/mazda/cx-5/",
        "https://www.carsales.com.au/cars/details/2018-mazda-cx-3-maxx-dk-manual/OAG-AD-25629209/",
        "SSE-AD-19119170"
    ],
    "maxResults": 100,
    "includeDetails": true
}
```

Or build the search from filters instead of links:

```json
{
    "make": "Toyota",
    "model": "HiLux",
    "condition": "used",
    "state": "Queensland",
    "priceMax": 40000,
    "maxResults": 500
}
```

| Input value | What it extracts |
|---|---|
| Search link (`carsales.com.au/cars/?q=…`) | Up to **Maximum listings per search** listings matching the link's filters |
| Make or model page (`carsales.com.au/cars/mazda/cx-5/`) | Up to **Maximum listings per search** listings for that make or model |
| Listing link or listing number (`SSE-AD-19119170`) | That one listing, always with its full page |
| No links, filters set | The same, built from your make, model, price, year and other filters |

The run collects up to **Maximum listings per search × number of searches**, plus one listing per listing link: 3 searches with 100 gives up to 300 listings.

#### Output

#### Listing record

A real record from a test run, shortened (`…`) for the page; the dealer phone number is partly masked here — the dataset has every field in full.

```json
[
    {
        "search": {
            "type": "ListingCard",
            "id": "8ff3c2b6-352a-4244-a03e-8ae155445cff",
            "action": {
                "data": {
                    "url": "/cars/details/2018-mazda-cx-3-maxx-dk-manual/OAG-AD-25629209/",
                    "silo": "stock",
                    "prefetchTitle": "2018 Mazda CX-3 Maxx DK Manual",
                    "prefetchLocation": "NSW",
                    "prefetchSellerType": "dealer",
                    "…": "…"
                },
                "tracking": {
                    "providers": {
                        "csnInsights": {
                            "metaData": {
                                "make": "Mazda",
                                "model": "CX-3",
                                "year": "2018",
                                "price": "16888",
                                "state": "NSW",
                                "type": "Used",
                                "adtype": "Dealer used",
                                "networkId": "OAG-AD-25629209",
                                "sellerId": "AGC-SELLER-62533",
                                "…": "…"
                            }
                        }
                    }
                }
            },
            "gallery": { "type": "InlineCarousel", "children": [{ "type": "Image", "url": "https://carsales.pxcrush.net/…" }, "…"] },
            "title": { "…": "2018 Mazda CX-3 · Maxx Manual F" },
            "keyDetailsTexts": ["SUV", "Manual", "…"],
            "price": { "…": "$16,888" },
            "priceBadge": { "…": "FAIR PRICE" },
            "sellerTitle": { "type": "Text", "value": "Dealer used • NSW" },
            "…": "every other part of carsales' listing card"
        },
        "details": {
            "root": {
                "…": "Specifications, Warranty & Service, Features, Comments from the dealer, Dealer profile, as carsales returns them"
            },
            "metaData": [
                { "type": "KeyValueMetaData", "key": "tracking/page/details/year", "value": "2018" },
                { "type": "KeyValueMetaData", "key": "tracking/page/details/state", "value": "NSW" },
                "…"
            ],
            "…": "every other part of the listing page"
        },
        "_meta": {
            "network_id": "OAG-AD-25629209",
            "url": "https://www.carsales.com.au/cars/details/2018-mazda-cx-3-maxx-dk-manual/OAG-AD-25629209/",
            "vehicle_type": "car",
            "detail_status": "ok",
            "promoted": false,
            "phones": ["(07) •••• ••••"],
            "image_urls": [
                "https://carsales.pxcrush.net/carsales/cars/dealer/ezwoiezv6lq5rfzeu5rn1nn75.jpg?pxc_method=gravityfill&pxc_bgtype=self&pxc_size=900%2c600",
                "…"
            ],
            "title": "2018 Mazda CX-3 Maxx DK Manual",
            "make": "Mazda",
            "model": "CX-3",
            "year": 2018,
            "price": 16888,
            "odometer_km": 86613,
            "state": "NSW",
            "condition": "Used",
            "seller_type": "dealer",
            "seller_id": "AGC-SELLER-62533",
            "main_image": "https://carsales.pxcrush.net/carsales/cars/dealer/ezwoiezv6lq5rfzeu5rn1nn75.jpg?pxc_method=gravityfill&pxc_bgtype=self&pxc_size=900%2c600",
            "source_url": "https://www.carsales.com.au/cars/?q=%28And.Make.Mazda.%29",
            "scraped_at": "2026-11-02T11:18:54.832Z",
            "source": "carsales_scraper"
        }
    }
]
```

### Other Actors you might need

| Actor | What it adds |
|---|---|
| **[AutoTrader UK Scraper](https://apify.com/dz_omar/autotrader-uk-scraper?fpr=smcx63)** | UK cars, vans, bikes and motorhomes — compare Australian and UK stock, pricing and specs. |
| **[Salvagebid Scraper](https://apify.com/dz_omar/salvagebid-scraper?fpr=smcx63)** | Salvage and damaged-vehicle auction listings — useful next to carsales prices for trade buyers and repairers. |

### Frequently asked questions

#### Is it legal to scrape carsales.com.au?

The scraper collects publicly available listing data. You are responsible for using it in line with carsales' terms and with Australian privacy law, especially for seller contact details. This is not legal advice.

#### Do I need a carsales account?

No. Paste public search or listing links — no login, cookies or API key.

#### Which carsales links are accepted?

Search links, make and model pages, and single listing links for **cars** (`carsales.com.au/cars…`). Links copied without `https://` work too, and the sort order and page number in a link are ignored. Other websites and other carsales sections (bikes, boats, trucks) are rejected before the run starts, so nothing is charged.

#### Can I collect more than 440 listings from one search?

Yes. carsales itself stops a single search at about 440 listings. When a search shows more, the scraper splits it by year, then state, then price, so every part fits inside carsales' limit and the pieces add up to the whole search. Listings found twice are delivered once.

#### Why are some fields empty?

The data is carsales' own, so a field is empty when carsales has nothing for it — for example about 1% of listings have no price, and not every dealer fills in every detail. Empty fields are kept as carsales sends them.

#### Where are the dealer's phone numbers?

In the call-the-dealer part of `details`, and all of them together in `_meta.phones`. A listing that carries no phone number shows an empty list.

#### What does `detail_status` mean?

| Value | Meaning |
|---|---|
| `ok` | The full listing page is in `details`. |
| `not_requested` | **Include each listing's full page** was off; `details` is `null`. Not charged for details. |
| `unavailable` | The listing page could not be read in this run. Not charged for details. |
| `route_limited` | The connection in use at that point did not allow reading listing pages. Not charged for details; run again later for those. |
| `gone` | The listing was removed from carsales. Not charged for details. |
| `limit_reached` | Your maximum cost per run left no room for the details add-on, so the row carries search data only. |

#### What if carsales changes its data?

`search` and `details` are passed through as carsales returns them, so new or renamed fields appear in your data as carsales names them — nothing silently turns empty.

#### Why did my run return fewer listings than I asked for?

| Situation | What you see | What to do |
|---|---|---|
| The search has fewer matches | The run finishes with the number of matches in its status line | Widen the filters |
| A listing was already delivered by another of your links | Delivered once | Nothing — duplicates are removed on purpose |
| Your maximum cost per run was reached | The status line says the cost limit was reached | Raise the limit and run again |
| carsales was not reachable | The status line says how many listings were delivered; the run still ends normally | Run again later |

#### Does the run fail if carsales blocks it?

No. Every run ends as **Succeeded**, and its status line says what was delivered and why it stopped. You are only charged for listings that were delivered.

#### Can I use Carsales Scraper in Make, Zapier, n8n or my own code?

Yes — through Apify's integrations, the Apify API and the client libraries for JavaScript and Python.

#### What happens if a run is interrupted?

It saves progress and resumes where it left off, without delivering or charging the same listing twice.

### Support

- 🌐 **Website:** [flowextractapi.com](https://flowextractapi.com)
- 📧 **Email:** <flowextractapi@outlook.com>
- 💬 **GitHub:** [FlowExtractAPI](https://github.com/FlowExtractAPI)
- 💼 **LinkedIn:** [flowextract-api](https://www.linkedin.com/in/flowextract-api/)
- 🐦 **X (Twitter):** [@FlowExtractAPI](https://x.com/FlowExtractAPI)
- 📱 **Facebook:** [flowextractapi](https://www.facebook.com/flowextractapi)
- 🎵 **TikTok:** [@flowextractapi](https://www.tiktok.com/@flowextractapi)

### Legal & compliance

- **Public data only** — processes publicly available data.
- **Rate limiting** — respects source-service limits and terms of use.
- **Data protection** — no storage of personal information or unauthorized data collection.
- **Commercial use** — suitable for business intelligence and research.
- No affiliation with or endorsement by carsales.com.au is implied.

***

*Carsales Scraper — by FlowExtract API. Turn any website into structured data.*

# Actor input Schema

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

One <b>carsales.com.au</b> link per line. <ul><li><b>A search</b>: set your filters on the website and copy the address, or use a make/model page such as <code>https://www.carsales.com.au/cars/mazda/cx-5/</code>. Every matching listing is collected, even when carsales shows tens of thousands of results.</li><li><b>One listing</b>: e.g. <code>https://www.carsales.com.au/cars/details/2018-mazda-cx-5-gt-kf-series-auto-i-activ-awd/SSE-AD-19119170/</code>, or just the listing number <code>SSE-AD-19119170</code>. A listing link always comes with its full page.</li></ul>The sort order and paging in a link are not used. Other websites and other carsales sections (bikes, boats, trucks) are rejected before the run starts. <b>When this list has links, Option B below is ignored.</b>

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

e.g. <code>Toyota</code>, <code>Mazda</code>, <code>Land Rover</code>. Leave empty for every make.

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

e.g. <code>HiLux</code>, <code>CX-5</code>. Needs a Make.

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

New stock, or used stock (which includes demo cars).

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

Dealer stock, private sellers, or both.

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

Limits the search to one state or territory. The edge of a state can include a few listings just across the border.

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

Limits the search to one body style.

## `fuelType` (type: `string`):

Limits the search to one fuel type.

## `transmission` (type: `string`):

Automatic or manual gearbox.

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

Listings with no price are not matched when a price limit is set.

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

Highest asking price in AUD. Listings with no price are not matched when a price limit is set.

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

Oldest model year to include.

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

Newest model year to include.

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

Highest odometer reading in kilometres.

## `maxResults` (type: `integer`):

How many listings to collect from <b>each search</b>. The total is this number × the number of searches: 3 searches with 100 gives up to 300 listings. A listing link gives one. Listings found by more than one search are delivered once. Searches over carsales' own 440-result limit are split automatically.

## `includeDetails` (type: `boolean`):

For <b>searches</b>: also read every listing's own page — the full specification sheet, dealer comments, dealer phone number, dealer profile and listing metadata. Turn it off for search-result data only: about 5× faster and cheaper per listing. <b>Single-listing links always include the full page</b>, whatever this setting.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.carsales.com.au/cars/mazda/cx-5/"
  ],
  "condition": "any",
  "sellerType": "any",
  "state": "any",
  "bodyStyle": "any",
  "fuelType": "any",
  "transmission": "any",
  "maxResults": 10,
  "includeDetails": true
}
```

# 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 = {
    "startUrls": [
        "https://www.carsales.com.au/cars/mazda/cx-5/"
    ],
    "maxResults": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("dz_omar/carsales-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": ["https://www.carsales.com.au/cars/mazda/cx-5/"],
    "maxResults": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("dz_omar/carsales-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": [
    "https://www.carsales.com.au/cars/mazda/cx-5/"
  ],
  "maxResults": 10
}' |
apify call dz_omar/carsales-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dz_omar/carsales-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/LTkwW4YK4Vymb4oqS/builds/v6smxxXx8bCLlS7uS/openapi.json
