Carsales.com.au Scraper: Price, Odometer, Year avatar

Carsales.com.au Scraper: Price, Odometer, Year

Pricing

from $1.20 / 1,000 vehicles

Go to Apify Store
Carsales.com.au Scraper: Price, Odometer, Year

Carsales.com.au Scraper: Price, Odometer, Year

Scrape Carsales.com.au vehicle listings by make and model: price, year, odometer, listing URL and photos. Australia residential proxy, no login, pay per vehicle.

Pricing

from $1.20 / 1,000 vehicles

Rating

0.0

(0)

Developer

The Mine Works

The Mine Works

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

15 hours ago

Last modified

Share

A single Carsales results page per search, fetched over an Australian residential proxy — no browser involved.

You are only charged for a vehicle that actually lands in your dataset. A blocked or empty search is never billed.

Overview

Carsales is Australia's dominant vehicle marketplace, and this actor turns any make and model search into structured rows: title, year, price, odometer reading, body type and a direct link, with photos.

Give it a make such as "toyota", optionally a model such as "camry", and it returns the current listings for sale exactly as carsales itself lists them — one results page per search, roughly 20 to 30 vehicles on Carsales' own "Featured" sort.

Price and odometer parsed as real numbers ✅ · Year parsed from the listing title ✅ · Photos included ✅ · MCP ready for AI agents ✅

How this gets past Carsales' bot defence, and why it only returns one page

Carsales protects its listing pages with DataDome. A plain HTTP request that mimics a real browser's TLS and header fingerprint is enough to clear it on a fresh residential IP — no interactive challenge, no login, no cookies from a prior visit required. That is the entire transport: one request, one Australian residential proxy session, the same schema.org listing data (JSON-LD) Carsales embeds on every search page for its own SEO.

What this version does not do is turn the page. Carsales does not expose page 2 as a URL you can construct — the "Next" control submits a same-page form carrying an opaque, single-use token the server mints only when you click it, so there is no ?page=2 to ask for and no safe way to replay that click without a real browser executing the click itself. Asking for more than one page's worth of vehicles from a single search is therefore not currently possible without reintroducing the exact browser-based blocking this actor exists to avoid. maxItems above what one page returns simply gets you everything on that page.

Input

{
"make": "toyota",
"model": "camry",
"maxItems": 40,
"minYear": 2020,
"maxPrice": 40000
}
FieldWhat it takes
makeVehicle make, for example "toyota" or "ford". Leave blank to search all makes.
modelVehicle model, for example "camry" or "ranger". Leave blank to search every model of the chosen make.
maxItemsHard cap for the run. Each search fetches one Carsales results page (roughly 20 to 30 vehicles), so this mostly matters if you want fewer than that.
minYearOptional. Only return vehicles from this model year or newer.
minPrice / maxPriceOptional price band in AUD.

Year and price filters are applied after fetching the page, because Carsales does not expose them as a URL parameter the way it exposes make and model. This costs nothing extra: the page is already being fetched, and this only decides which rows are worth billing you for.

Output

{
"listing_id": "OAG-AD-25834030",
"title": "2026 Toyota Camry Ascent Auto",
"year": 2026,
"make": "Toyota",
"model": "Camry",
"price": 43990,
"odometer_km": 2346,
"url": "https://www.carsales.com.au/cars/details/2026-toyota-camry-ascent-auto/OAG-AD-25834030/",
"scraped_at": "2026-08-13T21:00:00.000Z"
}
FieldDescription
🆔 listing_idCarsales advert ID, stable for deduplication across runs
📄 titleListing title as displayed
📅 yearModel year, parsed from the title
🚗 make / modelVehicle make and model
💰 priceListed price in AUD, as a number
🛣️ odometer_kmOdometer reading in kilometres
🚙 body_typeBody type, when the listing discloses it
🖼️ image_url / image_countPrimary photo and total photo count
🔗 urlDirect link to the listing on Carsales

Common use cases

Pricing research. Build a real price distribution for a make and model by year and odometer, instead of relying on a single valuation guide figure.

Dealer and private seller monitoring. Track what is actually listed for a model right now, and how quickly stock turns over.

Buying alerts. Run on a schedule against a model and price band to catch new listings the day they go live.

Fleet and remarketing analysis. Pull current market supply for specific models to time a fleet disposal or a private sale.

AI agents. Feed live Carsales listings into an agent that answers "what is a fair asking price for a 2021 Camry with under 60,000 kilometres right now?"

Pricing

EventPriceYou pay when
Vehicle delivered$0.0011A vehicle lands in your dataset

$1.10 per 1,000 vehicles. A search that returns nothing costs nothing.

Run it on a schedule

  1. Run once with the make and model you want repeated, then click Save as a task.
  2. In the Apify Console go to Schedules, Create new.
  3. Pick a frequency and attach the saved task.
  4. Wire the dataset to Sheets, Slack or a webhook from the Integrations tab.

Deduplicate on listing_id so a repeated schedule only surfaces genuinely new listings.

FAQ

Do I need a Carsales account? No. The actor reads Carsales's own public search results only.

Why do I only get one page of results? Because Carsales does not expose "page 2" as a URL — its "Next" control submits a same-page form carrying a single-use token the server mints only when clicked, with no simpler pattern behind it. Fetching further pages would mean either a real browser clicking through (the approach that used to get this actor DataDome-blocked in production, delivering nothing) or replaying that click over plain HTTP, which Carsales also blocks. One page per search is the honest ceiling today.

Can I filter by state or location? Not in this version. Carsales's location filtering is not exposed as a simple URL parameter the way make and model are, so it is left out rather than shipped half working. Make, model, year and price cover the most common use cases.

Why did I get fewer vehicles than my cap? Because the search has fewer matching vehicles than your cap, your year or price filter narrowed the results, or the one available page returned fewer than maxItems. The run reports what it actually found rather than padding the count.

Use from Claude, ChatGPT and any MCP agent

https://mcp.apify.com/?tools=themineworks/carsales-scraper

Or call it programmatically:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('themineworks/carsales-scraper').call({
make: 'toyota',
model: 'camry',
maxItems: 40,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Questions, or need a field we do not return yet? Reach out through the Apify profile.